$(@:。h = .h.d)在GNU make中意味着什么?

时间:2015-06-20 20:24:00

标签: makefile

我正在维护一个(非常复杂的)Makefile,在一些食谱中我看到了以下内容:

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

我完全不知道如何解释这个,或者是否有关于这些字符的任何文档。显然,Google不会工作,因为它认为我输入了乱码。

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

1 个答案:

答案 0 :(得分:3)

这是variable reference with a substitutionVAR。它表示变量FROM的值,但对于值中每个以空格分隔的单词,如果单词以后缀TO结尾,则它将替换为后缀@。< / p>

在这种情况下,变量为.hfilename of the target of the rule(对存档成员进行特殊处理)。如果规则的目标以.d结尾,则最后会添加.d

常见的文件命名约定是使用foo.h.d作为依赖项列表。文件foo.h可能包含用于编译包含foo.d.h的源文件的规则的依赖项(因此,实际上,foo.h将包含$(@:%.h=%.h.d)及其包含的标头。< / p>

顺便说一句,这是可移植的语法。还有一个稍微冗长的罗嗦语法是常见的(由GNU和BSD make支持)但不支持POSIX:%其中$(patsubst %.h,%.h.d,$@)充当通配符;除了后缀之外,此语法还允许替换前缀。还有另一种语法可以在GNU make中执行相同的操作:call函数patsubst,编写THRESHOLD = //some value qpath = //my query path similar_paths = [] for path in path_list: if (comparable width and comparable height and comparable perimeters): similar_paths.append(path) - 它可以说不那么神秘,但是因为可移植语法已经存在了几十年,所以它是通常甚至在需要GNU make的makefile中使用。