什么“$(@:%。o =%。d)”在makefile中是什么意思?

时间:2016-07-06 09:03:28

标签: makefile gnu-make

我在makefile中看到GCC的以下命令选项:

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

如何解读?

我搜索了makefile文件,但到目前为止没有运气。

(这不仅仅是关于Automatic Variables

2 个答案:

答案 0 :(得分:10)

$(:=)执行string replacement $@the name of the file being generated(目标) 因此$(@:%.o=%.d)是文件的名称,.o扩展名已更改为.d

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

答案 1 :(得分:1)

(感谢@ Quentin的线索。我刚发现它!)

它被称为Substitution Reference

有些引用:

  

替换引用用变量替换变量的值   您指定的更改。它的格式为“$(var:a=b)”(或   '${var:a=b}')及其含义是取变量的值   var,用该值中的b替换单词末尾的每个a,和   替换结果字符串。

     

当我们说“在一个单词的最后”时,我们的意思是必须出现   然后是空格或值的末尾   更换;值的其他出现不会改变。对于   例如:

     

foo := a.o b.o c.o

     

bar := $(foo:.o=.c)

     

将“bar”设置为“a.c b.c c.c”。请参阅Setting Variables

     

替换引用实际上是使用的缩写   patsubst扩展功能(参见Functions for String Substitution and Analysis)。我们提供替代参考以及patsubst   与make的其他实现兼容。

所以,以下命令的完整解释:

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

是:

  

使用gcc编译第一个必备文件($<)并生成   以当前规则目标名称(%@)命名的输出文件。而且   这样,生成一个名为*.d的makefile,其中包含规则,以描述当前规则目标的依赖关系。并更改规则目标的名称   从*.d生成*.o生成文件到*.d