欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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 显示:
【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

输入make -e new=lyy 显示:
【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

2、目标变量(局部变量)

-作用域只在指定的目标以及连带的规则中
【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

3、模式变量

-模式变量是目标变量的扩展

-作用域只在符合模式的目标及连带规则中

【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

下面看一个例子:


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 显示:
【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

可以看见变量var最终是取的:test : var := test-var 这个目标变量,而不是文件变量:var := D.T.Software

输入 make rule 显示:
【Makefile由浅入深完全学习记录7】Makefile中变量的高级主题下

可以看出,new这个变量,取的是:%e : override new := test-new 模式匹配的变量,而不是文件变量new := TDelphi

总结:

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