Makefile的补充学习2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile的补充学习2相关的知识,希望对你有一定的参考价值。

Makefile中使用通配符
(1)* 若干个任意字符
(2)? 1个任意字符
(3)[] 将[]中的字符依次去和外面的结合匹配

 

技术分享

 

还有个%,也是通配符,表示任意多个字符,和*很相似,但是%一般只用于规则描述中,又叫做规则通配符。

 

 

Makefile的自动变量
(1)为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。
(2)自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。
(3)常见自动变量:
[email protected] 规则的目标文件名
$< 规则的依赖文件名
$^ 依赖的文件集合

[email protected]

规则的目标文件名。如果目标是一个档案成员,则变量[email protected] 档案文件的文件名。对于有多个目标的格式规则(参阅格式规则简介),变量[email protected]是那个导致规则命令运行的目标文件名。

$%

当目标是档案成员时,该变量是目标成员名,参阅使用make更新档案文件。例如,如果目标是‘foo.a(bar.o)‘,则‘$%‘的值是‘bar.o‘,[email protected]的值是‘foo.a‘。如果目标不是档案成员,则‘$%‘是空值。

$<

第一个依赖的文件名。如果目标更新命令来源于隐含规则,该变量的值是隐含规则添加的第一个依赖。参阅使用隐含规则。

$?

所有比目标‘新’的依赖名,名字之间用空格隔开。对于为档案成员的依赖,只能使用已命名的成员。参阅使用make更新档案文件。

$^

所有依赖的名字,名字之间用空格隔开。对于为档案成员的依赖,只能使用已命名的成员。参阅使用make更新档案文件。对同一个目标来说,一个文件只能作为一个依赖,不管该文件的文件名在依赖列表中出现多少次。所以,如果在依赖列表中,同一个文件名出现多次,变量‘$^’的值仍然仅包含该文件名一次。

$+

该变量象‘$^‘,但是,超过一次列出的依赖将按照它们在makefile文件中出现的次序复制。这主要的用途是对于在按照特定顺序重复库文件名很有意义的地方使用连接命令。

$*

和隐含规则匹配的stem(径),参阅格式匹配。如果一个目标为‘dir/a.foo.b‘,目标格式规则为:‘a.%.b‘ ,则stem为‘dir/foo‘。在构建相关文件名时stem 十分有用。在静态格式规则中,stem是匹配目标格式中字符‘%’的文件名中那一部分。在一个没有stem具体规则中;变量‘$*‘ 不能以该方法设置。如果目标名以一种推荐的后缀结尾(参阅过时的后缀规则),变量‘$*‘设置为目标去掉该后缀后的部分。例如,如果目标名是‘foo.c‘,则变量‘$*‘ 设置为‘foo‘, 因为‘.c‘ 是一个后缀。GNU make 处理这样奇怪的事情是为了和其它版本的make兼容。在隐含规则和静态格式规则以外,您应该尽量避免使用变量‘$*‘。在具体规则中如果目标名不以推荐的后缀结尾,则变量‘$*’在该规则中设置为空值。

当您希望仅仅操作那些改变的依赖,变量‘$?‘ 即使在具体的规则中也很有用。例如,假设名为‘lib’的档案文件包含几个OBJ文件的拷贝,则下面的规则仅将发生变化的OBJ文件拷贝到档案文件:

lib: foo.o bar.o lose.o win.o
        ar r lib $?
在上面列举的变量中,有四个变量的值是单个文件名。三个变量的值是文件名列表。这七个变量都有仅仅存放文件的路径名或仅仅存放目录下文件名的变体。变量的变体名是由变量名追加字母‘D’或‘F’构成。这些变体在GNU make中处于半废状态,原因是使用函数T dir和notdir 能够得到相同的结果。参阅文件名函数。注意,‘F‘变体省略所有在dir函数中总是输出的结尾斜杠这里是这些变体的列表:

`$(@D)‘

目标文件名中的路径部分,结尾斜杠已经移走。如果变量`[email protected]的值是`dir/foo.o‘,变体 `$(@D)‘的值是`dir‘。如果变量`[email protected]的值不包含斜杠,则变体的值是`.‘。

`$(@F)‘

目标文件名中的真正文件名部分。如果变量`[email protected]的值是`dir/foo.o‘,变体  `$(@F)‘的值是` foo.o ‘。`$(@F)‘ 等同于 `$(notdir [email protected])‘

`$(*D)‘

`$(*F)‘

stem(径)中的路径名和文件名;在这个例子中它们的值分别为:`dir‘ 和 `foo‘ 。

`$(%D)‘

`$(%F)‘

档案成员名中的路径名和文件名;这仅对采用‘archive(member)’形式的档案成员目标有意义,并且当成员包含路径名时才有用。参阅档案成员目标。

`$(<D)‘

`$(<F)‘

第一个依赖名中的路径名和文件名。

`$(^D)‘

`$(^F)‘

所有依赖名中的路径名和文件名列表。

`$(?D)‘

`$(?F)‘

所有比目标‘新’的依赖名中的路径名和文件名列表。

注意,在我们讨论自动变量时,我们使用了特殊格式的惯例;我们写"the value of‘$<‘", 而不是"the variable <" ;和我们写普通变量,例如变量 objects 和 CFLAGS一样。我们认为这种惯例在这种情况下看起来更加自然。这并没有其它意义,变量‘$<‘的变量名为 < 和变量‘$(CFLAGS)‘ 实际变量名为CFLAGS一样。您也可以使用‘$(<)‘代替‘$<‘。

以上是关于Makefile的补充学习2的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式linux核心课程 2.uboot和系统移植-第2部分-2.2.补基础之shell和Makefile

make和makefile用法补充

Makefile

26个jQuery代码片段使用技巧

makefile中的Cflags用法

30天自制OS笔记:2 汇编语言学习与Makefile入门