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 进行许可。转载请注明出处!