Makefile 中的四个美元符号

Posted

技术标签:

【中文标题】Makefile 中的四个美元符号【英文标题】:Four Dollar signs in Makefile 【发布时间】:2010-11-22 03:46:00 【问题描述】:

我正在阅读 GNU Make 的文档。这是一个例子

%.d: %.c

    @set -e; rm -f $@; \

     $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \

     sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ < $@.$$$$ > $@; \

     rm -f $@.$$$$

我在一个 C++ 程序上试过这个,得到了文件列表

init3d.d init3d.d.18449 input.d input.d.18444 main.d main.d.18439

这是我发现但不理解的相同document

如果您启用了二级扩展并且希望在先决条件列表中使用文字美元符号,则实际上必须编写四个美元符号('$$$$')。

我想知道四个美元符号“$$$$”实际上是什么意思?他们是18449、18444还是18439?

感谢和问候!

【问题讨论】:

【参考方案1】:

如果启用“二次扩展”,则需要$$$$ 才能在实际输出中生成单个$$ 通常用于扩展变量、调用 make 函数等。启用二级扩展的 $$ 会执行其他操作,否则会在输出中生成实际的 $

用于在类 Unix 系统上执行命令行的 shell 通常将 $$ 解释为扩展为 shell 进程 ID。因此,在不启用二次扩展的情况下,$$$$ 将在输出中变为$$,shell 将其扩展为进程 ID。

(使用 shell 进程 ID 作为后缀是一种尝试保证临时文件的文件名唯一性的简单方法。)

【讨论】:

二次扩展不影响配方内容。只是先决条件列表。所以$$$$ 将始终在配方上下文中产生$$。您只需要先决条件列表中的$$$$ 即可在启用辅助扩展时获得单个$(当它不使用$$ 时会得到)。 这不是答案。二次扩展无关紧要。 @reinierpost 看来你和 Etan Reisner 有同样的理解困难 :) 原始发帖人谈到了二次扩展,这就是我写它的原因。实际的解释在第二段中,使用该结构的最可能原因在括号中的第三段中。 好的...我认为您解释它的顺序令人困惑。【参考方案2】:

$$ 将转换为 $,但在 Makefile 规则(它们是 shell 表达式)中,您还必须使用 \ 或使用单引号 ' 转义生成的 $你的表情。

这是一个演示它的示例:

DOLLAR:=$$
dollar:
    echo '$$'  >  $@
    echo "\$$" >> $@
    echo '$(DOLLAR)'  >> $@
    echo "\$(DOLLAR)" >> $@
    cat dollar

【讨论】:

天哪,我爱你。我一直在寻找为什么$$ 对我来说会变成虚无。【参考方案3】:

18449、18444 或 18439 看起来像进程 ID,所以可能是进程 ID?

【讨论】:

以上是关于Makefile 中的四个美元符号的主要内容,如果未能解决你的问题,请参考以下文章

Makefile的理论学习记录

Makefile的理论和实践的学习记录

Makefile的理论和实践的学习记录

makefile中的特殊符号及关键字

四个规则入门Makefile,从入门到高薪

Makefile 重复符号