高级Makefile技巧

作者: lesca 分类: Tutorials 发布时间: 2011-08-20 22:03

特殊的宏 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许可证下自由转载

版权声明

本文出自 Lesca 技术宅,转载时请注明出处及相应链接。

本文永久链接: https://www.lesca.cn/archives/makefile-advanced.html

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

1 Comment
  • myrice

    2011-12-18 at 01:48

    太好了!
    喜欢这文章,+1