Makefile学习笔记<流控制函数和其他函数>

1. foreach

$(foreach <var>,<list>,<text>)
功能:把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中,<text>所返回的每个字符串会以空格分隔。
返回:<text>所返回的每个字符串所组成的整个字符串(以空格分隔)

例如:

names := a b c d
files := $(foreach n,$(names),$(n).o)

$(files)的值是“a.o b.o c.o d.o”。

注意,foreach中的参数是一个临时的局部变量,foreach函数执行完后,参数的变量将不在作用,其作用域只在foreach函数当中。

2. if

$(if <condition>,<then-part>)
或是
$(if <condition>,<then-part>,<else-part>)

if函数可以包含“else”部分,或是不含。即if函数的参数可以是两个,也可以是三个。参数是if的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是,会被计算,否则会被计算。
而if函数的返回值是,如果为真(非空字符串),那个会是整个函数的返回值,如果为假(空字符串),那么会是整个函数的返回值,此时如果没有被定义,那么,整个函数返回空字串。
所以,和只会有一个被计算。

3. call

$(call <expression>,<parm1>,<parm2>,<parm3>...)
功能:当make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参数<parm1>,<parm2>,<parm3>依次取代。
返回:<expression>的返回值就是call函数的返回值。

例如:

reverse = $(1) $(2)
foo = $(call reverse,a,b)

$(foo)的值就是“a b”。

3. origin

$(origin <variable>)
功能:获取变量<variable>的出处 
返回:
“undefined” : <variable>从来没有定义过
“default” : <variable>是一个默认的定义,比如“CC”
“environment”:<variable>是一个环境变量,并且当Makefile被执行时,“-e”参数没有被打开。
“file”:<variable>这个变量被定义在Makefile中
“command line”:<variable>这个变量是被命令行定义的。
“override”:<variable>是被override指示符重新定义的。
“automatic”:<variable>是一个命令运行中的自动化变量。

例如:

ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf, gag, etc.
endif
endif

如果变量bletch来源于环境,则重新定义它,否则不重新定义它。
注意:
这里如果用override会同时把从命令行定义的变量也覆盖了,而我们只想重新定义环境传来的,而不想重新定义命令行或从其他Makefile文件传来的。

4. shell函数

$(shell command)
参数:操作系统命令
功能:执行操作系统命令
返回:执行操作系统命令的输出就是返回值

例如:

contents := $(shell cat foo)
files := $(shell echo *.c)

注意,这个函数会新生成一个Shell程序来执行命令,所以你要注意其运行性能,如果你的Makefile中有一些比较复杂的规则,并大量使用了这个函数,那么对于你的系统性能是有害的。特别是Makefile的隐晦的规则可能会让你的shell函数执行的次数比你想像的多得多。

5. 控制make的函数

$(error <text ...>)
参数:<text ...>是错误信息
功能:产生一个致命的错误,导致make不能执行

注意:error函数不会在一被使用就会产生错误信息,所以如果你把其定义在某个变量中,并在后续的脚本中使用这个变量,那么也是可以的。

例如:

示例一:
ifdef ERROR_001
$(error error is $(ERROR_001))
endif

示例二:
ERR = $(error found an error!)
.PHONY: err
err: $(ERR)

示例一会在变量ERROR_001定义了后执行时产生error调用,而示例二则在目录err被执行时才发生error调用。

6. warning

$(warning <text ...>)
参数:<text ...>是警告信息
功能:输出一段警告信息

跟error函数类似,只是它并不会让make退出,只是输出一段警告信息,而make继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值