高级Makefile技巧
特殊的宏 Special Macros
如果你需要细粒度控制(fine-grained control)目标的行为,你就需要用到一些特殊的宏,他们的值基于指定的目标和依赖。所有的特殊宏都以美元符号$开始,并且不需要使用括弧。
$@
$@表示目标名。通过它,不同的目标可以产生不同的输出。例如,下面两个目标产生的输出文件将分别以client和server命名。
client: client.c $(CC) client.c -o $@ server: server.c $(CC) server.c -o $@
$?
$?储存了一系列依赖文件(通常是源文件——译者注),这些依赖文件要比目标文件(编译器生成的文件——译者注)要新。通过使用这个宏,可以把上面例子中的行为变得更一般化:
client: client.c $(CC) $? -o $@ server: server.c $(CC) $? -o $@
$^
$^指当前目标中的所有的依赖文件,它并不关心这些文件是不是比目标文件新。然而,重复的依赖文件名会被移除。这会在你需要将所有的依赖文件输出到屏幕时变得非常有用:
# print the source to the screen viewsource: client.c server.c less $^
$+
$+与$^类似,但是它并不移除重复的名字。所有依赖文件出现的顺序也不改变:
# print the source to the screen viewsource: client.c server.c less $+
$<
当你只需要第一个依赖文件的时候,$<就变得很有用。当你的目标名称后面只有一个依赖的时候,使用$<要比使用$^来的安全。可以想象,如果你今后加上了第二个依赖文件,使用$^可能带来麻烦。当然,你也许就想要所有的依赖文件也说不定。所以,请务必事先仔细考虑清楚。
目标的通配符匹配 Wildcard Matching in Targets
百分号%可以用作通配符匹配以写出更一般的目标。如果%出现在(makefile目标中的)依赖列表中,那么它将由make
命令行中的对应文本替换。如果你想使用目标本身的匹配文本,你需要用到特殊的$*宏。下面的例子假设你输入make <name of .c>
来用一个给定的名字建立一个可执行文件:
%.c: gcc -o $* $*.c
例如,输入:
% make test_executable
将会执行:
gcc -o test_executable test_executable.c
宏修饰符 Macro Modification
使用宏是为了减少冗余的文本,通过使用宏修饰符可以将宏从一种形态转变为另一种形态。
替换文本 Replacing Text
从一个已有的宏创建一个新宏并非不可能。例如宏SRC代表一系列的源文件,你希望生成一个对应的目标文件宏OBJ。要这样做,你只需要指定OBJ = SRC,除了扩展名不同以外:
OBJ = $(SRC:.c=.o)
注意,这条语句更通俗地因该说成“在宏SRC中,扩展名.c被替换成了.o”。
References:
本文由 lesca 翻译自cprogramming.com 的文章 Advanced Makefile Tricks
有关Makefile更多的教程,可以参考opus的The Makefile
您可以在CC许可证下自由转载
myrice
2011-12-18 at 01:48
太好了!
喜欢这文章,+1