在GNU make中,$(@ :. h = .h.d)是什么意思?
问题描述:
我保持(窘况复杂)的Makefile,以及一些食谱,我看到以下内容:
$(@:.h=.h.d)
我绝对没有线索,如何解释这一点,或者是否有这些字符的任何文件。显然,谷歌不会工作,因为它认为我打字乱码。
我看到一个关于@:H
的相关问题,但是这是GNU make而不是BSD make。
答
这是一个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中也经常使用。
耶稣,这是疯了。好东西,我不是一个Perl程序员。非常感谢! – Martin
@reinierpost但是在这种情况下,找到手册的正确部分并不容易。 – Gilles