Makefile 美元(@:.h=.h.d)在GNU make中是什么意思?
我正在维护一个(极其复杂的)Makefile,在一些菜谱中我看到了以下内容:Makefile 美元(@:.h=.h.d)在GNU make中是什么意思?,makefile,Makefile,我正在维护一个(极其复杂的)Makefile,在一些菜谱中我看到了以下内容: $(@:.h=.h.d) 我完全不知道如何解释这个,也不知道是否有关于这些字符的任何文档。显然,谷歌不会工作,因为它认为我在胡言乱语 我看到了一个关于@:H的相关问题,但这是GNU make而不是BSD make。这是一个:$(VAR:FROM=TO)。它表示变量VAR的值,但对于值中每个以空格分隔的单词,如果单词以后缀FROM结尾,它将被后缀TO替换 在这种情况下,变量是@,即(对存档成员进行特殊处理)。如果规则的
$(@:.h=.h.d)
我完全不知道如何解释这个,也不知道是否有关于这些字符的任何文档。显然,谷歌不会工作,因为它认为我在胡言乱语
我看到了一个关于@:H
的相关问题,但这是GNU make而不是BSD make。这是一个:$(VAR:FROM=TO)
。它表示变量VAR
的值,但对于值中每个以空格分隔的单词,如果单词以后缀FROM
结尾,它将被后缀TO
替换
在这种情况下,变量是@
,即(对存档成员进行特殊处理)。如果规则的目标以.h
结尾,则在末尾添加.d
常见的文件命名约定是使用.d
作为依赖项列表。文件foo.h.d
可能包含编译包含foo.h
的源文件的规则的依赖项(因此,在实践中,foo.d.h
将包含foo.h
及其包含的头)
顺便说一下,这是可移植语法。还有另一种更为冗长的语法(GNU和BSD make都支持),但POSIX不支持:
$(@:%.h=%.h.d)
,其中%
充当通配符;此语法允许在后缀之外替换前缀。在GNU make中还有另一种语法可以做同样的事情:函数,编写为$(patsubst%.h,%.h.d,$@)
-它可以说不那么神秘,但因为可移植语法已经存在了几十年,所以即使在需要GNU make的make文件中也普遍使用它。天哪,这太疯狂了。幸好我不是Perl程序员。非常感谢@但在这种情况下,找到手册的正确部分并不容易。