Make File符号说明

转自:http://blog.csdn.net/Gemsea/archive/2007/01/26/1495204.aspx

 Make File符号说明

关键词

关键词
用途
define
定义一个“数据包”,是用enddef做结尾,可以包含多行的命令。
ifeq/ifneq
条件判断,可以搭配else使用,endif结尾。原型:ifeq(Arg1,Arg2)。
ifdef/ifndef
变量是否定义的条件判断,可以搭配else使用,endif结尾。原型:ifdef Var。
=
变量赋值语句。如果右值包含另一个变量,则可以在后面定义这个变量。
:=
变量赋值语句。如果右值包含另一个变量,则只能引用已定义的变量。
?=
条件赋值语句。如果此变量未定义才重新赋值。
+=
为当前变量追加内容。
%
通配符
vpath
设置搜索路径,原型vpath %.x <path>,x表示文件扩展名
/
换行符
@
放在命令前面隐藏命令输出
-
放在命令前面忽略命令错误
:
依赖规则定义符,使用方式:目标:依赖
override
用来指示即便此变量是由make的命令行参数设置的,也使用新的赋值。因为默认情况下Makefile中对这个变量的赋值会被忽略。
.PHONY
显式声明伪目标
.SUFFIXES
声明扩展名

 Make函数
按功能字符串、函数名排序):

函数原型
描述
$(subst <from>,<to>,<text>)
把字串<text>中的<from>字符串替换成<to>。
$(patsubst <pattern>,<replacement>,<text>)
查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”,表示任意长度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的这个“%”将是<pattern>中的那个“%”所代表的字串。(可以用“/”来转义,以“/%”来表示真实含义的“%”字符)
$(strip <string>)
去掉<string>字串中开头和结尾的空字符。
$(findstring <find>,<in>)
在字串<in>中查找<find>字串。
$(filter <pattern...>,<text>)
以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。
$(filter-out <pattern...>,<text>)
以<pattern>模式过滤<text>字符串中的单词,去除符合模式<pattern>的单词。可以有多个模式。
$(sort <list>)
给字符串<list>中的单词排序(升序)。
$(word <n>,<text>)
取字符串<text>中第<n>个单词。(从一开始)
$(wordlist <s>,<e>,<text>)
从字符串<text>中取从<s>开始到<e>的单词串。<s>和<e>是一个数字。
$(words <text>)
统计<text>中字符串中的单词个数。
$(firstword <text>)
取字符串<text>中的第一个单词。
$(dir <names...>)
从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。
$(notdir <names...>)
从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分。
$(suffix <names...>)
从文件名序列<names>中取出各个文件名的后缀。
$(basename <names...>)
从文件名序列<names>中取出各个文件名的前缀部分。
$(addsuffix <suffix>,<names...>)
把后缀<suffix>加到<names>中的每个单词后面。
$(addprefix <prefix>,<names...>)
把前缀<prefix>加到<names>中的每个单词后面。
$(join <list1>,<list2>)
把<list2>中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比<list2>的多,那么,<list1>中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,<list2>多出来的单词将被复制到<list2>中。
$(foreach <var>,<list>,<text>)
把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中,<text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
$(if <condition>,<then-part>)
$(if <condition>,<then-part>,<else-part>),<condition>参数是if的表达式,如果其返回的为非空字符串,那么这个表达式就相当于返回真,于是,<then-part>会被计算,否则<else-part>会被计算。
$(call <expression>,<parm1>,<parm2>,<parm3>...)
call函数是唯一一个可以用来创建新的参数化的函数。我们可以写一个非常复杂的表达式,这个表达式中,我们可以定义许多参数,然后我们可以用call函数来向这个表达式传递参数。当make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参数<parm1>,<parm2>,<parm3>依次取代。而<expression>的返回值就是call函数的返回值。
$(origin <variable>)
origin函数不像其它的函数,他并不操作变量的值,他只是告诉我们这个变量是哪里来的。<variable>是变量的名字,不应该是引用。所以我们最好不要在<variable>中使用“$”字符。Origin函数会以其返回值来告诉我们这个变量的“出生情况”,下面,是origin函数的返回值:
“undefined”
      如果<variable>从来没有定义过,origin函数返回这个值“undefined”。
 default”
      如果<variable>是一个默认的定义,比如“CC”这个变量,这种变量我们将在后面讲述。
“environment”
      如果<variable>是一个环境变量,并且当Makefile被执行时,“-e”参数没有被打开。
file”
      如果<variable>这个变量被定义在Makefile中。
“command line”
      如果<variable>这个变量是被命令行定义的。
 “override”
      如果<variable>是被override指示符重新定义的。
“automatic”
      如果<variable>是一个命令运行中的自动化变量。
$(error <text ...>)
产生一个致命的错误,<text ...>是错误信息。退出Make执行。
$(warning <text ...>)
输出一段警告信息,而make继续执行。
$(shell <command>)
使用Shell执行<command>命令

 
4.4.3自动化变量
       自动化变量通常用来在依赖规则的命令行中表示规则的一部分。通常依赖规则是如下定义方式:Target : Prerequisites。

$@
表示规则中的目标文件集Target。在模式(即"%")规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
$%
仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),其值为空。
$<
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$?
所有同目标相比更新的依赖目标的集合。以空格分隔。
$^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
$+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
$*
这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有效。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo"。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,我们应该尽量避免使用"$*",除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么"$*"就是空值。

       上面七个自动化变量可以加上D(Directory)或F(File Name)来分别表示路径和文件名部分。例如,$(@F)表示"$@"的文件部分,如果"$@"值是"dir/foo.o",那么"$(@F)"就是"foo.o","$(@F)"相当于函数"$(notdir $@)";$(@D) 表示"$@"的目录部分(不以斜杠做为结尾),如果"$@"值是"dir/foo.o",那么"$(@D)"就是"dir",而如果"$@"中没有包含斜杠的话,其值就是"."(当前目录)。

 GNUmake教程:http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html#content

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值