1. export 的作用
export 是 Shell(如 bash、csh)中的一个命令,用于将一个 shell 变量设置为环境变量。环境变量会被传递给所有的子进程和外部程序。因此,export 可以确保变量不仅在当前的 Shell 中可用,还能传递到 make 以及它启动的任何子进程中。
在 Makefile 中,export 可以用来设置变量,并确保它被作为环境变量传递给 make 及其子进程。
基本语法
在 Makefile 中,export 的用法如下:
1 | export var_name = value |
这表示将 var_name 变量设置为环境变量,并将它传递给 make 和 make 启动的所有子进程。
2. export 在 Makefile 中的作用
当你在 Makefile 中使用 export 时,make 会将这些变量传递给它所启动的所有子进程(包括其他规则中的命令和目标)。因此,任何在 Makefile 中设置并导出的变量都会在后续的命令执行中保持可用。
示例:export 用法
1 | export sim = sdf |
在这个例子中:
export sim = sdf将变量sim设置为环境变量并传递给所有的子进程(包括make的子命令)。@echo $(sim)会打印出sdf,因为sim是通过export设置为环境变量的,且它被传递给make。
如果你在命令行上传递了 sim 的值:
1 | make all sim=rtl |
**make 会优先使用命令行传递的值 sim=rtl**。所以 echo 输出的是 rtl,而不是 sdf。这是因为命令行传递的变量值会覆盖 Makefile 中的赋值。
3. export 和环境变量
export 的一个关键点是它会将变量 变成环境变量,并传递给 make 和 make 启动的子进程。如果你没有使用 export,那么该变量只会在 Makefile 的当前上下文中有效,而不会被传递给 make 的子进程。
对比:没有 export 和有 export 的区别
- 没有
export:
1 | sim = sdf |
在这种情况下,sim 只是一个普通的 Makefile 变量,它在 Makefile 中可用。如果你在命令行传递了 sim 变量:
1 | make all sim=rtl |
**输出会是 rtl**,因为命令行中的 sim=rtl 会覆盖 Makefile 中的 sim 值。
- 使用
export:
1 | export sim = sdf |
如果你执行:
1 | make all sim=rtl |
**输出会是 rtl**,因为命令行传递的变量 sim=rtl 会覆盖 Makefile 中的默认值 sdf,但 export 确保了变量是作为环境变量传递给 make 和它的子进程的。
4. export 和命令行传递的变量
当你传递变量给 make 时,比如 make all sim=rtl,make 会优先使用命令行中的值。因此,即使你在 Makefile 中使用了 export sim = sdf,如果在命令行上传递了 sim=rtl,make 会使用命令行中的值。
5. export 在不同 Shell 环境中的差异
- 在
bash中,export设置环境变量后,该变量会传递给make以及make启动的子进程。Shell 会优先使用命令行中传递的变量值(如果有)。 - 在
csh中,如果你在Makefile中使用export,同样会将变量设置为环境变量,但在csh中,Shell 本身的行为可能会稍有不同,处理命令行参数时会有不同的方式,但export也会确保将变量传递给make。
本文链接: https://talent-tudou.github.io/2024/12/28/makefile/Makefile-export关键字/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!