Makefile四个美元符号

Tim*_*Tim 21 makefile expansion dollar-sign

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

%.d:%.c

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

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

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

     rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)

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

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

这是我发现但在同一文档中不明白的内容

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

我想知道四个美元符号"$$$$"究竟是什么意思?他们如何18449,18444或18439?

感谢致敬!

Bar*_*lly 21

如果启用了"二次扩展",$$$$则需要在$实际输出中生成单个.$通常用于扩展变量,调用make函数等$$,辅助扩展启用其他功能,但否则它会$在输出中生成实际值.

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

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


Séb*_*rre 18

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

这是一个演示它的示例:

DOLLAR:=$$
dollar:
    echo '$$'  >  $@
    echo "\$$" >> $@
    echo '$(DOLLAR)'  >> $@
    echo "\$(DOLLAR)" >> $@
    cat dollar
Run Code Online (Sandbox Code Playgroud)