使用条件判断
使用条件判断可以让make根据不同的情况执行不同的分支。
一、示例
举例:判断$(CC)是否是gcc,如果是的话则使用GNU函数编译目标
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
[Tab]$(CC) -o foo $(objects) $(libs_for_gcc)
else
[Tab]$(CC) -o foo $(objects) $(normal_libs)
endif
当我们的$(CC)是gcc时,foo的规则就是
$(CC) -o foo $(objects) $(libs_for_gcc)
当我们的$(CC)不是gcc时,foo的规则是
$(CC) -o foo $(objects) $(normal_libs)
二、语法
第一个:比较arg1和arg2是否相同。相同为真,不相同为假
ifeq (<arg1>, <arg2>)
ifeq '<arg1>' '<arg2>'
ifeq "<arg1>" "<arg2>"
ifeq "<arg1>" '<arg2>'
ifeq '<arg1>' "<arg2>"
第二个:比较arg1和arg2是否相同。不相同为真,相同为假
ifneq (<arg1>, <arg2>)
ifneq '<arg1>' '<arg2>'
ifneq "<arg1>" "<arg2>"
ifneq "<arg1>" '<arg2>'
ifneq '<arg1>' "<arg2>"
第三个:如果变量< variable-name >的值非空,那表达式为真,否则为假。
ifdef <variable-name>
举例:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
根据程序的设定可知,frobozz的值为yes。
第四个: 如果变量< variable-name >的值为空,那表达式为真,否则为假。
ifndef <variable-name>
切记:不是命令的行千万不要以[Tab]键开头,空格和空行不会影响结果
使用函数
函数调用后,函数的返回值可以做变量来使用。
一、函数的调用语法
很想变量的使用规则,也是用$来标识的,语法如下:
$(<function> <arguments>)
或是
${<function> <arguments>}
arguments是参数,参数之间用逗号隔开。
举例:
comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
这段代码的作用就是把foo中的空格替换成逗号,subst函数是一个替换函数,第一个参数时被替换字串,第二个参数替换字串,第三个参数替换操作作用的字串
二、字符串处理函数
函数1:
$(subst <from>,<to>,<text>)
名称:字符串替换函数
功能:把字符串text中的from替换成to
返回:函数返回被替换过后的字串
函数2
$(patsubst <pattern>,<replacement>,<text>)
名称:模式字符串替换函数
功能:查找< text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式< pattern>,如果匹配的话,则以< replacement>替换。这里,< pattern>可以包括通配符“%”,表示任意长度的字串。如果< replacement>中也包含“%”,那么,< replacement>中的这个“%”将是< pattern>中的那个“%”所代表的字串。(可以用“/”来转义,以“/%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。
三、文件名操作函数
每个函数的参数字符串都会被当做一个或者一系列的文件名来对待
函数1:
$(dir <names...>)
名称: 取目录函数
功能: 从文件名序列< names>中取出目录部分。目录部分是指最后一个反斜杠之前的部分,如果没有反斜杠,那么返回“ ./ ”
函数2:
$(notdir <names...>)
名称:取文件函数
功能:从文件名序列< names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分。
返回:返回文件名序列< names>的非目录部分。
参考资料:
https://blog.youkuaiyun.com/haoel/article/details/2894(其他函数请参考大佬写的这篇文章的介绍)