学习自狄泰软件学院唐佐临老师Makefile课程,文章中图片取自老师的PPT,仅用于个人笔记。
实验1:在不同的makefile中传递变量的方式1 :直接定义环境变量
试验2:在不同的makefile中传递变量的方式2:通过 export 定义临时环境变量 使得 makefile1能够访问makefile2中定义的变量
试验3:在不同的makefile中传递变量的方式3:在不同的makefile 中通过命令行变量的方式传递变量
实验4 :目标变量实战(局部变量),作用域在指定目标以及其连带规则中
实验5 :目标变量实战(局部变量),作用域在指定目标以及其连带规则中
实验6 :模式变量的作用域在 符合模式的目标及其连带规则中
实验1 :当makefile 中的定义的变量个环境变量冲突的时候
#定义JAVA_HOME环境变量,用于记录当前操作系统中 JAVA 的安装目录。
JAVA_HOME := java home
test :
@echo "JAVA_HOME => $(JAVA_HOME)"
//打印了我们在makefile里面定义的 环境变量
mhr@ubuntu:~/work/makefile1$
mhr@ubuntu:~/work/makefile1$ make test
JAVA_HOME => java home
mhr@ubuntu:~/work/makefile1$
查看当前系统中的 环境变量 JAVA_HOME,打印当前系统中的 JAVA_HOME环境变量,记录当前操作系统中 JAVA 的安装目录。
思考:为什么我们 make test 的结果没有打印系统环境变量JAVA_HOME 的值呢?
答案:由于makfile里面规定,如果makefile中定义的变量和环境变量重名,环境变量将会被覆盖,以makefile中的变量为准。
但是我们就是想 这个变量代表环境变量怎么办,加上 -e
实验2 :通过 export 定义临时环境变量 使得 makefile1能够访问makefile2中定义的变量
makefile
#在当前 makefile执行的时候,将系统中JAVA_HOME 环境变量的值改写成 java home,这个改写将会传递到其他makefile中
JAVA_HOME := java home
var := D.T.Software
test :
@echo "JAVA_HOME => $(JAVA_HOME)"
@echo "make another file ..."
# $(MAKE) 这个变量是当前make解释器的文件名
@$(MAKE) -f makefile.2
makefile2
test:
@echo "JAVA_HOME => $(JAVA_HOME)"
@echo "var => $(var)"
问题1:为什么 两个makefile 中的打印的 JAVA_HOME 都是自定义的 java home,而不是系统的环境变量
答案1:在当前 makefile执行的时候,将系统中JAVA_HOME 环境变量的值改写成 java home,这个改写将会传递到其他makefile中
问题2:为什么 makefile2中打印的 var 是一个空值呢?
答案2:var是在makefile 中的定义的,作用域是在 makefile中,不可能传递到其他makefile中,另外var也不是一个系统环境变量,所以传递不过去,如果想传递过去 就要加上 export 修饰符,如下:
JAVA_HOME := java home
export var := D.T.Software
test :
@echo "JAVA_HOME => $(JAVA_HOME)"
@echo "make another file ..."
@$(MAKE) -f makefile.2
这样就可以将 var 传递到 makefie2中去了。export 用于临时的创建一个换件变量,这样 其他的makefile中就可以访问这个临时环境变量的值了。为什么说他是一个临时的环境变量呢? 就是因为他不会真正的修改当前系统的环境变量了。
结果如下:
实验3 :在不同的makefile 中通过命令行变量的方式传递变量
makefile
JAVA_HOME := java home
export var := D.T.Software
new := TDelphi
test :
@echo "JAVA_HOME => $(JAVA_HOME)"
@echo "make another file ..."
#第一次 直接 make makefile2 结果是显而易见的,makefile2中不会打印 new的值,因为传递不过去
@$(MAKE) -f makefile.2
#第二次通过命令行变量的方式传递 变量new ,结果是可以在 makefile中打印 new 的
@$(MAKE) -f makefile.2 new:=$(new)
makefile2
test:
@echo "JAVA_HOME => $(JAVA_HOME)"
@echo "var => $(var)"
@echo "new => $(new)"
说明:
#文件变量var 相当于 C/C++中的全局变量
var := D.T.Software
#相当于 C/C++中的局部变量,虽然和全局变量同名,但是在函数内部 会覆盖全局变量
test : var := test-var
test :
@echo "test:"
#所以打印局部变量 test-var
@echo "var => $(var)"
#定义文件变量new,作用域在当前文件有效
new := TDelphi
#%e :makefile中的模式,%代表的是一个通配符,代表所有以 e结尾的目标
#当前要定义一个名为 new 的局部变量,该局部变量的作用域是所有以e字符结束的目标以及连带关系当中,并且该局部变量 屏蔽了命令行变量。
%e : override new := test-new
rule :
@echo "rule:"
# 应该打印 test-new,因为目标明是 以 e字符结尾的
@echo "new => $(new)"
实验4 :目标变量实战(局部变量),作用域在指定目标以及其连带规则中
var := D.T.Software
test : var := test-var
test : another
@echo "test :"
@echo "var => $(var)"
another :
@echo "another :"
@echo "var => $(var)"
//因为 test 依赖于 another ,目标变量的作用域在 指定目标以及连带规则中,自然也包括 another
mhr@ubuntu:~/work/makefile1$ make
another :
var => test-var
test :
var => test-var
mhr@ubuntu:~/work/makefile1$
实验2
实验5 目标变量实战(局部变量),作用域在指定目标以及其连带规则中
var := D.T.Software
test : var := test-var
test :
@echo "test :"
@echo "var => $(var)"
another :
@echo "another :"
@echo "var => $(var)"
//此时 目标test 和 目标another没有关系,所以 目标变量的作用域仅仅在 目标test中。another打印"全局变量"
mhr@ubuntu:~/work/makefile1$
mhr@ubuntu:~/work/makefile1$ make test another
test :
var => test-var
another :
var => D.T.Software
mhr@ubuntu:~/work/makefile1$
实验6 :模式变量的作用域在 符合模式的目标及其连带规则中
new := TDelphi
%e : override new := test-new
another :
@echo "another :"
@echo "new => $(new)"
rule :
@echo "rule :"
@echo "new => $(new)"
mhr@ubuntu:~/work/makefile1$ make
another :
new => TDelphi
mhr@ubuntu:~/work/makefile1$