make的"模式"一般是至少含有一个"%"的,所以,我们可以以如下方式给所有以[.o]结尾的目标定义目标变量:
%.o :CFLAGS = -0
使用条件判断
libs_for_gcc = -lgnu
normal_libs =
foo:$(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
条件表达式的语法为:
<conditional-directive>;
<text-if-true>;
endif
第一个是 "ifeq"
ifeq (<arg1>;,<arg2>;)
ifeq ($(strip,$(foo)),)
第二个条件关键字是"ifneq".语法是:
ifneq (<arg1>;,<arg2>;)
第三个是"ifdef",语法是:
ifdef <variable-name>;
如果变量<variable-name>;的值非空,那到表达式为真.否在,表达式为假.当然,<variable-name>;同样可以是一个函数的返回值.注意,ifdef只是测试一个变量是否有值,其并不会把变量扩展到当前位置
第四个是 ifndef <variable-name>;
为了避免混乱,make不允许把整个条件语句分成两部分放在不同的文件中.
函数的调用语法:
函数调用,很像变量的使用,也是以"$"来标示的,其语法如下:
$(<function>;<argument>;)
或是
${<function>;<arguments>;}
这里,<function>;就是函数名,make支持的函数不多.<arguments>;是函数的参数,参数之间以逗号","分隔,而函数名和参数之间以"空格"分隔.函数调用以"$"开头,以圆括号和花括号把函数名和参数括起来.感觉好像一个变量,是不是?函数中的参数可以使用变量,为了风格的统一,函数和变量的括号最好一样,如使用"$(subst a,b,$(x))"这样的形式,而不是"$(subst a,b,${X})"的形式.因为统一会更清楚,也会减少一些不必要的麻烦.
还是来看一个示例:
comma := ,
empty :=
space := $(empty) $(empty)
foo := a b c
bar := $(subst $(space),$(comma),$(foo))
二 , 字符串处理函数
$(subst <from>;,<to>;,<text>;)
名称:字符串替换函数--subst
功能:把字串<text>;中的<from>;字符串替换成<to>;
返回:函数返回被替换过后的字符串
$(patsubst <pattern>;,<replacement>:,<text>;)
名称:模式字符串替换函数--patsubst
功能:查找<text>;中的单词(单词以"空格","Tab"或"回车""换行"分隔)是否符合模式<pattern>;,如果匹配的话,则以<replacement>;替换.这里,<pattern>;可以包括通配符"%",表示任意长度的子串.如果<replacement>:中也包含"%",那么,<replacement>;中的这个"%"将是<pattern>;中的哪个"%"所代表的字串.(可以用"\"来转义,以"\%"来表示真实含义的"%"字符).
返回:函数返回被替换过后的字符串
示例:$(patsubst %.c,%.o,x.c.c bar.c)
如:
$(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))"是一样的
$(strip<string>;)
名称:去空格函数----strip
功能:去掉<string>;字串中开头和结尾的空字符
返回:返回被去掉空格的字符串值
示例:
$(strip a b c )
把字符串"a b c "去掉开头和结尾的空格,结果是"a b c".
$(findstring <find>;,<in>;)
名称:查找字符串函数--findstring.
功能:在字串<in>;中查找<find>;字串.
返回:如果找到,那么返回<find>;,否则返回<find>;,否则返回空字符串.