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

variable name expansion not working inside target in GNU Makefile

我正在尝试根据规则在 target 内创建一个目录,但由于某种原因,该变量没有得到扩展,即 $(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

mkdir -p 命令上。我已经通过删除 ;\ 进行了播放,它一直有效到 mkdir $${OUT_DIR}cd $${OUT_DIR} 但我看到在 makefile 所在的目录中创建了软 link 而不是在 OUT_DIR 应该在哪里创建它。

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

制作变量和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 中是一个特殊字符,所以要按你的意图使用它,你必须 escape 是另一个 '$':

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