变量名称扩展在 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 ;\
...
我正在尝试根据规则在 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 ;\
...