在一个makefile中,"$(@:%.o=%.d)"是什么意思?

10

我在一个 makefile 中看到了以下 GCC 命令选项:

... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)"  -o "$@" "$<"

如何解释它?

我已经搜索了makefile文档,但迄今为止没有找到。

(这不仅仅涉及自动变量


可能是What do the makefile symbols $@ and $< mean?的重复问题。 - Tim
1
这不仅仅涉及自动变量。 - smwikipedia
2个回答

16

$(:=) 执行字符串替换
$@正在生成的文件名(目标文件)。
因此,$(@:%.o=%.d) 是文件名,将 .o 扩展名更改为 .d

这个命令行为每个 .o 文件生成一个 .d 依赖文件。


1
我从未想过 () 可以与 $@ 交错使用。 - smwikipedia
3
@smwikipedia说道,Make语法并不是最漂亮的,我得承认:p - Quentin

3

感谢 @Quentin 提供的线索,我找到了它!

它被称为 替换引用

一些引用:

替换引用是一种将变量值与您指定的更改进行替换的方法。它采用‘$(var:a=b)’(或‘${var:a=b}’)的形式,其含义是获取变量var的值,在该值中将每个以a结尾的单词替换为b,并替换生成的字符串。当我们说“在单词末尾”时,我们的意思是a必须出现在空格后面或值的末尾才能被替换;值中的其他a出现不会受到影响。例如:foo := a.o b.o c.obar := $(foo:.o=.c) 将‘bar’设置为‘a.c b.c c.c’。有关详细信息,请参见设置变量。替换引用实际上是使用patsubst扩展函数的缩写(请参见字符串替换和分析功能)。我们提供替换引用以及patsubst以与其他make实现兼容。
所以,以下命令的完整解释是:
... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)"  -o "$@" "$<"

是:

使用gcc编译第一个先决条件文件($<)并生成以当前规则目标名称(%@)命名的输出文件。顺便生成一个名为*.d的makefile,其中包含一个规则来描述当前规则目标的依赖关系。并将生成的*.d makefile中规则目标的名称从*.o更改为*.d


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接