2015-06-20 53 views
1

我保持(窘况复杂)的Makefile,以及一些食谱,我看到以下内容:

$(@:.h=.h.d) 

我绝对没有线索,如何解释这一点,或者是否有这些字符的任何文件。显然,谷歌不会工作,因为它认为我打字乱码。

我看到一个关于@:H的相关问题,但是这是GNU make而不是BSD make。

回答

3

这是一个variable reference with a substitution$(VAR:FROM=TO)。它表示变量VAR的值,但对于该值中的每个以空格分隔的单词,如果该单词以后缀FROM结尾,则将其替换为后缀TO

在这种情况下,变量是@filename of the target of the rule(对存档成员有特殊处理)。如果规则的目标以.h结尾,则在末尾添加.d

常见的文件命名约定是使用.d作为依赖关系列表。文件foo.h.d可能包含规则的依赖关系,以编译包含foo.h的源文件(因此,实际上,foo.d.h将包含foo.h及其包含的头文件)。

顺便说一下,这是可移植的语法。还有另一个稍微比较罗嗦的语法(GNU和BSD都支持),但不是POSIX:$(@:%.h=%.h.d),其中%充当通配符;除了后缀之外,该语法还允许替换前缀。还有另一种语法可以在GNU make中做同样的事情:call函数patsubst,编写为$(patsubst %.h,%.h.d,[email protected]) - 它可以说没有那么神秘,但是因为便携语法已经存在了几十年,所以它甚至在需要GNU make的makefile中也经常使用。

+0

耶稣,这是疯了。好东西,我不是一个Perl程序员。非常感谢! – Martin

+1

@reinierpost但是在这种情况下,找到手册的正确部分并不容易。 – Gilles