makefile总结之五

来源:互联网 发布:绝地求生 mac 编辑:程序博客网 时间:2024/05/22 04:27
条件判断:
ifeq
ifneq
else
endif

ifdef/ifndef
 ifeq (<arg1>, <arg2>)
    ifeq '<arg1>' '<arg2>' 
    ifeq "<arg1>" "<arg2>" 
    ifeq "<arg1>" '<arg2>' 
    ifeq '<arg1>' "<arg2>" 
  示例一:
    bar =
    foo = $(bar)
    ifdef foo
    frobozz = yes
    else
    frobozz = no
    endif

    示例二:
    foo =
    ifdef foo
    frobozz = yes
    else
    frobozz = no
    endif

第一个例子中,“$(frobozz)”值是“yes”,第二个则是“no”。

第四个条件关键字是“ifndef”。其语法是:

    ifndef <variable-name>

这个我就不多说了,和“ifdef”是相反的意思。

在<conditional-directive>这一行上,多余的空格是被允许的,但是不能以[Tab]键做为开始(不然就被认为是命令)。而注释符“#”同样也是安全的。“else”和“endif”也一样,只要不是以[Tab]键开始就行了。

特别注意的是,make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如“$@”等)放入条件表达式中,因为自动化变量是在运行时才有的。

而且,为了避免混乱,make不允许把整个条件语句分成两部分放在不同的文件中。  

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

    $(<function> <arguments>)

或是

    ${<function> <arguments>}

字符串替换:$(subst <from>,<to>,<text>)
模式字符串替换:$(patsubst <pattern>,<replacement>,<text>)
去空格:$(strip <string>)
查找字符串:$(findstring <find>,<in>)
过滤函数:$(filter <pattern...>,<text>)
反过滤函数:$(filter-out <pattern...>,<text>)
排序函数:$(sort <list>)
取单词函数:$(word <n>,<text>)
取单词串函数:$(wordlist <s>,<e>,<text>)
单词个数统计函数:$(words <text>)
首单词函数:$(firstword <text>)


取目录名函数:$(dir <names...>)
取文件名函数:$(notdir <names...>)
取后缀函数    :$(suffix <names...>)
取前缀函数    :$(basename <names...>)
加后缀函数    :$(addsuffix <suffix>,<names...>)
加前缀函数    :$(addprefix <prefix>,<names...>)
链接函数        :$(join <list1>,<list2>)


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

if函数:$(if <condition>,<then-part>) 
$(if <condition>,<then-part>,<else-part>)


call函数:call函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式,这个表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参数。其语法是:
    $(call <expression>,<parm1>,<parm2>,<parm3>...)
当make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参数<parm1>,<parm2>,<parm3>依次取代。而<expression>的返回值就是call函数的返回值。


origin函数:origin函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里来的?其语法是:
    $(origin <variable>)
注意,<variable>是变量的名字,不应该是引用。所以你最好不要在<variable>中使用“$”字符。Origin函数会以其返回值来告诉你这个变量的“出生情况”。

shell函数:
shell函数也不像其它的函数。顾名思义,它的参数应该就是操作系统Shell的命令。它和反引号“`”是相同的功能。这就是说,shell函数把执行操作系统命令后的输出作为函数返回。于是,我们可以用操作系统命令以及字符串处理命令awk,sed等等命令来生成一个变量,如:
    contents := $(shell cat foo)
    files := $(shell echo *.c)

控制make函数:
make提供了一些函数来控制make的运行。通常,你需要检测一些运行Makefile时的运行时信息,并且根据这些信息来决定,你是让make继续执行,还是停止。
$(error <text ...>)
    产生一个致命的错误,<text ...>是错误信息。注意,error函数不会在一被使用就会产生错误信息,所以如果你把其定义在某个变量中,并在后续的脚本中使用这个变量,那么也是可以的。