【发布时间】:2016-11-08 06:33:41
【问题描述】:
我在 makefile 中看到以下 GCC 的命令选项:
... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)" -o "$@" "$<"
如何解读?
我搜索了makefile文档,但到目前为止没有运气。
(这不仅仅是关于Automatic Variables)
【问题讨论】:
-
这不仅仅是关于自动变量。
我在 makefile 中看到以下 GCC 的命令选项:
... -MMD -MP -MF "$(@:%.o=%.d)" -MT "$(@:%.o=%.d)" -o "$@" "$<"
如何解读?
我搜索了makefile文档,但到目前为止没有运气。
(这不仅仅是关于Automatic Variables)
【问题讨论】:
$(:=) 执行 string replacement。$@ 是 the name of the file being generated(目标)。
所以$(@:%.o=%.d)是文件名,.o扩展名改为.d。
此命令行为每个.o 文件生成一个.d 依赖文件。
【讨论】:
() 可以与$@ 交错。
(感谢@Quentin 的提示。我刚刚找到了!)
引用:
替换引用将变量的值替换为 您指定的更改。它的格式为“
$(var:a=b)”(或 ‘${var:a=b}’),其含义是取变量的值 var,将单词末尾的每个 a 替换为该值中的 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,其中包含一个rule 来描述当前规则目标的依赖关系。并更改 rule 目标的名称 生成从*.o到*.d的*.dmakefile。
【讨论】: