Makefile四个美元符号

时间:2009-08-24 02:29:53

标签: makefile expansion dollar-sign

我正在阅读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?

谢谢和问候!

3 个答案:

答案 0 :(得分:21)

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

用于在类Unix系统上执行命令行的shell通常会将$$解释为扩展为shell进程ID。因此,如果未启用辅助扩展,$$$$将在输出中变为$$,shell将扩展为进程ID。

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

答案 1 :(得分:17)

$$将转换为$,但在Makefile规则(shell表达式)中,您还必须使用$转义结果\或在表达式周围使用单引号'

以下是一个演示它的示例:

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

答案 2 :(得分:2)

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