千家信息网

makefile(02)_变量

发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,4.变量与赋值4.1.变量Makefile中支持程序设计语言中变量的概率,但没有变量类型,只代表文本数据;变量命名规则:变量可以包含字符、数字、下划线,单不能包含":","#", "="," ",变量
千家信息网最后更新 2024年11月14日makefile(02)_变量

4.变量与赋值

4.1.变量

Makefile中支持程序设计语言中变量的概率,但没有变量类型,只代表文本数据;
变量命名规则:变量可以包含字符、数字、下划线,单不能包含":","#", "="," ",变量名大小写敏感。
变量的定义和使用:

4.2.赋值

Makefile中有4中变量赋值方式:

4.2.1.简单赋值(:=)

程序设计语言中的通用赋值方式,只针对当前语句有效,等价于C语言中的赋值。建议无特殊要求时使用简单赋值。

x := fooy := $(x)bx := newtest :    @echo "x => $(x)"    @echo "y => $(y)"

输出结果:

4.2.2.递归赋值(=)

赋值操作可能影响多个其它变量,所有与目标变量相关的其他变量都会受到影响。

x = fooy = $(x)bx = newtest :    @echo "x => $(x)"    @echo "y => $(y)"

输出结果:

注意:如果不是必要请尽可能不要使用递归赋值,这里的赋值号完全不等价与C语言中的赋值号。

4.2.3.条件赋值(?=)

如果变量未定义,使用赋值符号中的值定义变量,如果已经定义,赋值无效。

x := fooy := $(x)bx ?= newtest :    @echo "x => $(x)"    @echo "y => $(y)"

输出结果:

4.2.4.追加赋值(+=)

原变量值后加一个新值,原变量与新值之间由空格隔开

x := fooy := $(x)bx += newtest :    @echo "x => $(x)"    @echo "y => $(y)"

输出结果:

5.预定义变量的使用

在Makefile中存在一些预定义的变量,主要分为两类:自动变量和特殊变量。

5.1.自动变量

$@ 当前规则中触发命令被执行的目标
$^ 当前规则中的所有依赖
$< 当前规则中的第一个依赖
自动变量的使用:

.PHONY : all first second third all : first second third    @echo "\$$@ => $@"    @echo "$$^ => $^"    @echo "$$< => $<"firtst:second:third:

输出结果:

注意:
1."$"符号在Makefile中有特殊含义,当打印其字面量时需要加上$进行转义
2."$@"则需要加上\$进行转义

5.2.特殊变量

$(MAKE) 当前make解释器的文件名
$(MAKECMDGOALS) 命令行中指定的目标名,(make的命令行参数)
$(MAKEFILE_LIST) make需要要处理的makefile文件列表,注意当前Makefile的文件名总是位于列表最后,文件名之间使用空格分隔。
$(MAKE_VERSION) 当前make解释器的版本
$(CURDIR) 当前make解释器的工作目标
$(.VARIABLES) 所有已经定义的变量名和列表(预定义变量和自定义变量)
$(RM) rm -f
通常我们会打印$(.VARIABLES) 查看当前操作系统所支持的自定变量,然后对照make 手册(可从官网下载:http://www.gnu.org/software/make/manual/make.html),查看每个变量的意义。

.PHONY : all out first second third testall out :     @echo "$(MAKE)"    @echo "$(MAKECMDGOALS)"    @echo "$(MAKEFILE_LIST)"first :    @echo "first"second :    @echo "second"third :    @echo "third"test :    @$(MAKE) first    @$(MAKE) second    @$(MAKE) third

输出结果:

6.变量的高级主题-上

6.1.变量值的替换

6.1.1.后缀替换

使用指定字符串替换变量中的后缀:
语法规则: $(var:cc=o)或 ${src1:cc=o}
替换表达式中不能有任何的空格,make中支持使用${}对变量进行取值

src1 := a.cc b.cc c.ccobj1 := $(src1:cc=o)test1 :    @echo "obj1 => $(obj1)"

输出结果:

6.1.2.模式替换

变量的模式替换,使用%保留变量值中的指定字符,替换其他字符
语法格式:$(var:a%b=x%y)或 ${src1:a%b=x%y}

src2 := a11b.c a22b.c a33b.cobj2 := $(src2:a%b.c=x%y)test2 :    @echo "obj2 => $(obj2)"

输出结果:

6.1.3.规则中的模式替换


意义:
通过target-patten从targets中匹配子目标;再通过prereq-patten从子目标生成依赖;进而构成完成的规则。

src1 := a.cc b.cc c.ccobj1 := $(src1:cc=o)test1 :    @echo "obj1 => $(obj1)"src2 := a11b.c a22b.c a33b.cobj2 := $(src2:a%b.c=x%y)test2 :    @echo "obj2 => $(obj2)"

输出结果:

6.2.变量的嵌套引用

一个变量名之中可以包含对其他变量的引用,本质上是使用一个变量表示另一个变量。

6.3.命令行变量

运行make时,可以在命令行中定义变量,命令行变量默认覆盖Makefile中定义的变量。

6.4.override关键字

用于指示Makefile中定义的变量不能被覆盖,变量的定义和赋值都需要使用override关键字

6.5.define关键字

用于定义Makefile中的多行变量,多行变量的定义从变量名开始到endef结束,可以使用override关键字防止变量被覆盖,define定义的变量等价于使用=定义的变量。

hm := hello makefileoverride var := override-testdefine fooI'm fool!endefoverride define cmd    @echo "run cmd ls ..."    @lsendeftest :    @echo "hm => $(hm)"    @echo "var => $(var)"    @echo "foo => $(foo)"    ${cmd}

直接运行makefile的结果:

命令行传参的结果:
make makefile foo="i am cmd foomake -f makefile.3" var="cmd line var"

显然我们改变了foo变量的值,因为foo变量没有被override修饰,但不能改变var变量的值。

7.变量的高级主题-下

7.1.环境变量

Makefile中能够使用环境变量的值,如果定义的普通变量和环境变量同名,环境变量将被覆盖,运行make时指定-e选项,优先使用环境变量
优势:环境变量可以在所有文件中使用;
劣势:过多的环境变量会导致移植性降低
变量在不同Makefile之间传递的方式:
1.直接在外部定义环境变量进行传递
2.使用export定义变量进行传递(定义临时环境变量)
3.使用make命令行变量进行传递(推荐)

PATH := pathexport var := D.T.Softwarenew := TDelphitest :    @echo "PATH => $(PATH)"    @echo "make another file ..."    @$(MAKE) -f makefile.2    @$(MAKE) -f makefile.2 new:=$(new)

makefile.2的内容:

test:    @echo "PATH => $(PATH)"     #1.直接在外部定义环境变量进行传递    @echo "var => $(var)"       #2.使用export定义变量进行传递(定义临时环境变量)    @echo "new => $(new)"       #3.使用make命令行变量进行传递(推荐)

输出结果:

7.2.目标变量(局部变量)

作用域只在指定目标及连带规则中。
target : name value
target : voerride name value

7.3.模式变量(局部变量)

模式变量是目标变量的扩展,作用域只在符合的目标及连带规则中。
pattrn : name value
pattrn : voerride name value

var := D.T.Softwarenew := TDelphitest : var := test-var          # 目标变量%e : override new := test-new   # 模式变量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 rule运行结果:

变量 结果 环境 目标 输出 命令 规则 模式 文件 运行 特殊 关键 关键字 字符 语言 之间 文件名 方式 空格 解释器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 ibm服务器系统引导盘 苏州任子行网络技术有限公司 银川软件开发参考价 中关村网络安全区选址 orcl数据库怎么查询当前时间 铸造产品数据库 湖南省网络安全基地 大学网络安全宣传主题班会 我的世界服务器怎么回自己的空岛 考三级数据库技术的要求 谁在履行网络安全管理监管 方舟服务器下线会被野怪打死吗 安卓软件开发短期培训 吉林网络技术服务活动简介 打开exe提示网络安全警告 系统日志怎么添加数据库 漫画警示标语网络安全 ncbi是一个数据库吗 台湾论文数据库叫什么名字 数据库安全技术的研究现状 学生信息网络安全管理制度 内蒙古专业软件开发推广 网络安全工程师叫什么 阿里云购买服务器做开发安全吗 华为服务器改管理口地址 百宝云和简道云服务器 查数据库 虚ip 软件开发师工作年限 c 连接数据库 conn 公检法网络安全问题
0