【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下
程序员文章站
2022-05-31 23:29:10
...
加qq:1126137994 微信:liu1126137994 一起学习更多技术~
继续上一篇文章关于变量的学习!
1、环境变量(全局变量)
-makefile中能够直接使用环境变量的值
- 如果makefile中定义了同名变量,则环境变量将被覆盖
- 运行make时,指定“-e”选项,优先使用环境变量
-为什么要在makefile中使用环境变量
优势:
环境变量可以在所有的makefile中使用
劣势:
过多的依赖于环境变量,会导致移植性降低
-变量在不同makefile之间的传递方式
- 直接在外部定义环境变量进行传递
- 使用export定义变量进行传递(定义临时环境变量)
- 定义make命令行变量进行传递(推荐)
下面看两个例子,来深刻理解上面的理论:
下面是makefile 的文件:
JAVA_HOME := java home
export var := D.T.Software
new := TDelphi
test :
@echo "JAVA_HOME => $(JAVA_HOME)"
@echo "make another file ..."
@$(MAKE) -f makefile.2
@$(MAKE) -f makefile.2 new:=$(new)
下面是makefile.2的文件:
test:
@echo "JAVA_HOME => $(JAVA_HOME)"
@echo "var => $(var)"
@echo "new => $(new)"
在命令行输入make 显示:
输入make -e new=lyy 显示:
2、目标变量(局部变量)
-作用域只在指定的目标以及连带的规则中
3、模式变量
-模式变量是目标变量的扩展
-作用域只在符合模式的目标及连带规则中
下面看一个例子:
var := D.T.Software
new := TDelphi
test : var := test-var
%e : override new := test-new
%a : override new := test-new2
test : another
@echo "test :"
@echo "var => $(var)"
@echo "new => $(new)"
another :
@echo "another :"
@echo "var => $(var)"
@echo "new => $(new)"
rule :
@echo "rule :"
@echo "var => $(var)"
@echo "new => $(new)"
输入:make 显示:
可以看见变量var最终是取的:test : var := test-var 这个目标变量,而不是文件变量:var := D.T.Software
输入 make rule 显示:
可以看出,new这个变量,取的是:%e : override new := test-new 模式匹配的变量,而不是文件变量new := TDelphi
总结:
- 全局变量:makefile外部定义的环境变量
- 文件变量:makefile中定义的变量
- 局部变量:指定目标的变量