我在makefile中看到GCC的以下命令选项:
... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)" -o "$@" "$<"
如何解读?
我搜索了makefile文件,但到目前为止没有运气。
(这不仅仅是关于Automatic Variables)
答案 0 :(得分:10)
$(:=)
执行string replacement
$@
是the name of the file being generated(目标)
因此$(@:%.o=%.d)
是文件的名称,.o
扩展名已更改为.d
。
此命令行为每个.d
文件生成一个.o
依赖项文件。
答案 1 :(得分:1)
(感谢@ Quentin的线索。我刚发现它!)
有些引用:
替换引用用变量替换变量的值 您指定的更改。它的格式为“
$(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
。