GNU Make 4.3:命令行变量T如何在多Makefile间传递?
GNU Make 4.3中命令行变量的传递生效逻辑(针对给定场景)
场景还原
现有两个Makefile文件:
- Makefile内容:
all: make -f Makefile.app
- Makefile.app内容:
T=1 all: @echo $(T)
执行命令make T=10后,输出结果为10,其变量传递生效的过程如下:
1. 命令行变量的优先级
GNU Make中,命令行传入的变量优先级高于Makefile内定义的普通变量。当执行make T=10时,T=10会被设置为当前主make进程的全局变量。
2. 主make到子make的变量传递
主Makefile的all目标执行make -f Makefile.app时,GNU Make默认会将当前进程中已定义的全局变量(除部分特殊内置变量外)传递给子make进程。这里的T=10就被自动传递到了执行Makefile.app的子make进程中。
3. 子Makefile的变量覆盖规则
在Makefile.app里,T=1属于普通变量定义,但由于命令行传入的变量优先级更高,子make进程会忽略这个本地定义,直接使用传递过来的T=10,最终执行@echo $(T)时输出10。
补充:如果想让子Makefile的本地变量定义覆盖命令行传递的变量,可以在Makefile.app中使用
override关键字,比如写成override T=1,此时执行make T=10会输出1。
内容的提问来源于stack exchange,提问作者ϹοδεMεδιϲ
相关产品推荐
相关产品推荐

