Makefile7--变量的高级主题(下)

学习自狄泰软件学院唐佐临老师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

扫描二维码关注公众号,回复: 8795088 查看本文章

在这里插入图片描述

实验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$ 

在这里插入图片描述

发布了192 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/103624772