Makefile 函数

函数的调用语法

函数调用,很像变量的使用,也是以 $ 来标识的,其语法如下:

$(<function> <arguments>)

# 或者

${<function> <arguments>}

这里, <function> 就是函数名。 <arguments> 为函数的参数, 参数间以逗号 , 分隔,而函数名和参数之间以“空格”分隔。函数调用以 $ 开头,以圆括号 或花括号把函数名和参数括起。函数中的参数可以使用变量,为了风格的统一,函数和变量的括号最好一样。如下所示:

$(subst a,b,$(x)) #推荐使用

$(subst a,b,${x})

示例:

comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))

$(comma) 的值是一个逗号。 $(space) 使用了 $(empty) 定义了 一个空格, $(foo) 的值是 a b c , $(bar) 的定义用,调用了函数 subst , 这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个参数 是替换操作作用的字串。这个函数也就是把 $(foo) 中的空格替换成逗号,所以 $(bar) 的值 是 a,b,c 。

addsuffix

$(addsuffix suffix, names… )

名称:添加后缀

功能:在每个 names 后添加后缀 suffix。多个 names 用空格分开。

返回:返回连接后的字符串,以空格分开。

$(addsuffix .c,foo bar)

# result
# src/foo src/bar

patsubst

$(patsubst <pattern>,<replacement>,<text>)

名称:模式字符串替换

功能:查找 中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式 ,如果匹配的话,则以 替换。这里, 可以 包括通配符 % ,表示任意长度的字串。如果 中也包含 % ,那么, 中的这个 % 将是 中的那个 % 所代表的字串。 (可以用 \ 来转义,以 \% 来表示真实含义的 % 字符)

返回:函数返回被替换过后的字符串。

示例:

$(patsubst %.c,%.o,x.c.c bar.c)

把字串 x.c.c bar.c 符合模式 %.c 的单词替换成 %.o ,返回结果是 x.c.o bar.o

和变量有点相似。

$(var:<pattern>=<replacement>;)
#相当于
$(patsubst <pattern>,<replacement>,$(var))

$(var: <suffix>=<replacement>)
#相当于
$(patsubst %<suffix>,%<replacement>,$(var))

例如有:

objects = foo.o bar.o baz.o,

$(objects:.o=.c)
# 等于
$(patsubst %.o,%.c,$(objects))

foreach

$(foreach <var>,<list>,<text>)

这个函数的意思是,把参数 中的单词逐一取出放到参数 所指定的变量中, 然后再执行 所包含的表达式。每一次 会返回一个字符串,循环过程中, 的所返回的每个字符串会以空格分隔,最后当整个循环结束时, 所返回的 每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

所以, 最好是一个变量名, 可以是一个表达式,而 中一般会 使用 这个参数来依次枚举 中的单词。举个例子:

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

上面的例子中, $(name) 中的单词会被挨个取出,并存到变量 n 中, $(n).o 每次 根据 $(n) 计算出一个值,这些值以空格分隔,最后作为 foreach 函数的返回,所以, $(files) 的值是 a.o b.o c.o d.o 。

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

3 g++ chobj/test1.d chobj/test1.o -I”/usr/local/include” -I”./include” test1.cpp Compiling: test1.cpp g++ -I”/usr/local/include” -I”./include” -c -o chobj/test1.o test1.cpp

2 Linking: bin/test1_debug g++ -o bin/test1_debug chobj/test1.o -L”/usr/local/lib” -L./dchobj

Table of Contents