变量名扩展在GNU Makefile中的目标内部不起作用

时间:2018-03-21 16:29:19

标签: makefile gnu-make mkdir

我正在尝试根据规则在目标内创建一个目录,但由于某种原因,变量没有得到扩展,即$(OUT_DIR)为空,mkdir -p不起作用。这是代码

target_%:  /home/user/%/.file : file.c
    export OUT_DIR = /home/user/$* ; \
    mkdir -p $(OUT_DIR)     ;\
    .
    .
    .

在进行@Beta建议的更改后,代码如下所示

target_%:  /home/user/%/.file : file.c
    export OUT_DIR=/home/user/$* ; \
    mkdir -p $${OUT_DIR}     ;\
    cd $${OUT_DIR}           ; \
    ln -s /home/user/file1.c  file1.c.link ;\  

当我运行代码时,我得到错误

/bin/sh: line 3:        : command not found

on mkdir -p命令。我通过删除;\来玩,直到mkdir $${OUT_DIR}cd $${OUT_DIR},但我看到在makefile所在的目录中创建的软链接,而不是在应该创建它的OUT_DIR中。

我也不确定何时使用\ vs ; \ vs not using at all。对此的任何建议都很棒

1 个答案:

答案 0 :(得分:1)

制作变量和 shell 变量不是一回事。

如果makefile中有$(OUT_DIR)之类的东西,Make会展开它,并且由于你没有在makefile中定义它,它会扩展为空。您的规则如下:

target_%:  /home/user/%/.file : file.c
    export OUT_DIR = /home/user/$* ; \
    mkdir -p      ;\
    ...

如果命令(export ...)将OUT_DIR定义为shell变量。在shell中扩展shell变量的方法是'$',如下所示:

...$OUT_DIR ...

但是'$'是Make中的一个特殊字符,所以要按照你的意图使用它,你必须转义与另一个'$':

target_%:  /home/user/%/.file : file.c
    export OUT_DIR = /home/user/$* ; \
    mkdir -p $$OUT_DIR     ;\
    ...