我正在维护一个(非常复杂的)Makefile,在一些食谱中我看到了以下内容:
$(@:.h=.h.d)
我完全不知道如何解释这个,或者是否有关于这些字符的任何文档。显然,Google不会工作,因为它认为我输入了乱码。
我看到了一个关于@:H
的相关问题,但这是GNU make而不是BSD make。
答案 0 :(得分:3)
这是variable reference with a substitution:VAR
。它表示变量FROM
的值,但对于值中每个以空格分隔的单词,如果单词以后缀TO
结尾,则它将替换为后缀@
。< / p>
在这种情况下,变量为.h
,filename 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中使用。