make的参数以及Makefile中的自动变量

最近把Makefile相关的内容稍微梳理了一遍,记录下一些常用的内容,这篇写下参数和自动变量吧,首先make的参数:

make的参数

常用:

“-q”

“--question”

这个参数的行为是找目标的意思,也就是说,如果目标存在,那么其什么也不会输出,

当然也不会执行编译,如果目标不存在,其会打印出一条出错信息。

“-B”

“--always-make”

认为所有的目标都需要更新(重编译)。

“-C <dir>”

“--directory=<dir>”

指定读取makefile的目录。如果有多个“-C”参数,make的解释是后面的路径以前面的

作为相对路径,并以最后的目录作为被指定目录。如:“make –C /home/test –C prog”

等价于“make –C /home /test/prog”。

“-e”

“--environment-overrides”

指明环境变量的值覆盖makef

“-f=<file>”

“--file=<file>”

“--makefile=<file>”

指定需要执行的makefile。

“-h”

“--help”

显示帮助信息。

“-i”

“--ignore-errors”

在执行时忽略所有的错误。

“-I <dir>”

“--include-dir=<dir>”

指定一个被包含makefile的搜索目标。可以使用多个“-I”参数来指定多个目录。

“-k”

“--keep-going”

出错也不停止运行。如果生成一个目标失败了,那么依赖于其上的目标就不会被执行了。

“-l <load>”

“--load-average[=<load]”

“—max-load[=<load>]”

指定make运行命令的负载。

“-o <file>”

“--old-file=<file>”

“--assume-old=<file>”

不重新生成的指定的<file>,即使这个目标的依赖文件新于它。

“-r”

“--no-builtin-rules”

禁止make使用任何隐含规则。

“-s”

“--silent”

“--quiet”

在命令运行时不输出命令的输出。

“-v”

“--version”

输出make程序的版本、版权等关于make的信息。

“-w”

“--print-directory”

输出运行makefile之前和之后的信息。这个参数对于跟踪嵌套式调用make时很有用。

自动化变量

所谓自动化变量,就是这种变量会把模式中所定义的一系列的文件自动地挨个取出,直至所有的符合模式的文件都取完了。这种自动化变量

只应出现在规则的命令中。

常用自动化变量:

$@

表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于

目标中模式定义的集合。

$%

仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"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"或"F"字样。"D"的含义就是

Directory,就是目录,"F"的含义就是File,就是文件。

$(@D)

表示"$@"的目录部分(不以斜杠作为结尾),如果"$@"值是"dir/foo.o",那

么"$(@D)"就是"dir",而如果"$@"中没有包含斜杠的话,其值就是"."(当前目录)。

$(@F)

表示"$@"的文件部分,如果"$@"值是"dir/foo.o",那么"$(@F)" 就

是"foo.o","$(@F)"相当于函数"$(notdir$@)"。

"$(%D)"

"$(%F)"

分别表示了函数包文件成员的目录部分和文件部分。

"$(<D)"

"$(<F)"

分别表示依赖文件的目录部分和文件部分。

"$(^D)"

"$(^F)"

分别表示所有依赖文件的目录部分和文件部分。(无相同的)

"$(+D)"

"$(+F)"

分别表示所有依赖文件的目录部分和文件部分。(可以有相同的)

"$(?D)"

"$(?F)"

分别表示被更新的依赖文件的目录部分和文件部分。

对于"$<",为了避免产生不必要的麻烦,我们最好给$后面的那个特定字符都加上圆括号,比如,"$(<)"就要比"$<"要好一些。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值