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继续执行。