加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

总结:

  1. 全局变量:makefile外部定义的环境变量
  2. 文件变量:makefile中定义的变量
  3. 局部变量:指定目标的变量