跟我学Makefile(三)
紧接着跟我学Makefile(二)继续学习:变量高级用法
(1)变量值的替换 :替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。
foo := a.o b.o c.o
bar := $(foo:.o=.c)
第二行:把“$(foo)”中所有以“.o”字串“结尾”全部替换成“.c”,所以我们的“$(bar)”的值就是“a.c b.c c.c”。
(2)把变量的值再当成变量
x = y
y = z
a := $($(x))
$(x)的值是“y”,所以$($(x))就是$(y),于是$(a)的值就是“z”。(注意,是“x=y”,而不是“x=$(y)”) 。
x = variable1
variable2 := Hello
y = $(subst ,,$(x))
z = y
a := $($($(z)))
$(x)的值是“variable1”, subst 函数把“variable1”中的所有“1”字串替换成“2”字串,于是,“variable1”变成“variable2”,再取其值。
追加变量的值:“+=”操作符给变量追加值
objects = main.o foo.o bar.o utils.o
objects += another.o
如果变量之前没有定义过,那么,“+=”会自动变成“=”,如果前面有变量定义,那么“+=”会继承于前次操作的赋值符。如果前一次的是“:=”,那么“+=”会以“:=”作为其赋值符。
当 make 嵌套调用时(参见前面的“嵌套调用”章节),上层 Makefile 中定义的变量会以系统环境变量的方式传递到下层的 Makefile 中。当然,默认情况下,只有通过命令行设置的变量会被传递。而定义在文件中的变量,如果要向下层 Makefile 传递,则需要使用
exprot 关键字来声明。
条件判断语句:
<conditional-directive>
<text-if-true>
endif
或
<conditional-directive>
<text-if-true>
else
<text-if-false>
endif
其中<conditional-directive>表示条件关键字,如“ifeq”。
ifeq ($(strip $(foo)),)
<text-if-empty>
endif
这 个 示 例 中 使 用 了 “strip ” 函 数 , 如 果 这 个 函 数 的 返 回 值 是 空 (Empty ), 那 么<text-if-empty>就生效。
1关键字:“ifeq”:参数“arg1”和“arg2”的值是否相同,如果相同,则为真。
ifeq (<arg1>, <arg2>)
ifeq '<arg1>' '<arg2>'
ifeq "<arg1>" "<arg2>"
ifeq "<arg1>" '<arg2>'
ifeq '<arg1>' "<arg2>"
如果参数两个参数相同就执行后续指令。
2关键字:ifneq ,参数“arg1”和“arg2”的值是否相同,如果不同,则为真。
ifneq (<arg1>, <arg2>)
ifneq '<arg1>' '<arg2>'
ifneq "<arg1>" "<arg2>"
ifneq "<arg1>" '<arg2>'
ifneq '<arg1>' "<arg2>"
3关键字:ifdef
ifdef <variable-name>
变量<variable-name>的值非空,那到表达式为真。否则,表达式为假。当然,<variable-name>同样可以是一个函数的返回值。注意, ifdef 只是测试一个变量是否有值,其并不会把变量扩展到当前位置 。
在<conditional-directive>这一行上,多余的空格是被允许的,但是不能以[Tab]键做为开始(不然就被认为是命令)。而注释符“#”同样也是安全的。“else”和“endif”也一样,只要不是以[Tab]键开始就行了 。
例子1:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
例子2:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
结果:第一个例子中,“$(frobozz)”值是“yes”,第二个则是“no”。
最新文章
- C# 导出到Excel
- Scala on Visual Studio Code
- Inno Setup 安装、卸载前检测进程或服务
- CF 501C Misha and Forest 好题
- 网络传输速度bps与下载文件所需时间的换算
- 20款最优秀的JavaScript编辑器
- PKU Online Judge 1054:Cube (设置根节点)
- SpringMVC(三)——其他知识
- git push和git pull
- JDK常见问题 环境变量配置
- GridView网格线都设置
- proxifier配合ss,实现全局代理
- 201621123060《JAVA程序设计》第十二周学习总结
- AsyncTask函数化的封装,AsyncTask函数式的调用
- docker部署jira破解版
- vi命令复制粘贴
- unity重写软键盘for Android NGUI
- C++指针二(易错模型)
- java多重转型问题
- 2016-2017-2 20155309 南皓芯java第六周学习总结
热门文章
- weblogic安装部署war包——windows
- python--条件判断和循环--3
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserDao' def
- NGUI屏幕自适应(转)
- Cognos入门教程
- win8.1rtm专业版无法安装net3.5还有iis
- java基础---->;多个排序的拓展
- WEB安全番外第六篇--关于通过记录渗透工具的Payload来总结和学习测试用例
- pvm虚拟机基本原理
- 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT