Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 美元(@:.h=.h.d)在GNU make中是什么意思?_Makefile - Fatal编程技术网

Makefile 美元(@:.h=.h.d)在GNU make中是什么意思?

Makefile 美元(@:.h=.h.d)在GNU make中是什么意思?,makefile,Makefile,我正在维护一个(极其复杂的)Makefile,在一些菜谱中我看到了以下内容: $(@:.h=.h.d) 我完全不知道如何解释这个,也不知道是否有关于这些字符的任何文档。显然,谷歌不会工作,因为它认为我在胡言乱语 我看到了一个关于@:H的相关问题,但这是GNU make而不是BSD make。这是一个:$(VAR:FROM=TO)。它表示变量VAR的值,但对于值中每个以空格分隔的单词,如果单词以后缀FROM结尾,它将被后缀TO替换 在这种情况下,变量是@,即(对存档成员进行特殊处理)。如果规则的

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

$(@:.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程序员。非常感谢@但在这种情况下,找到手册的正确部分并不容易。