我正在尝试根据规则在目标内创建一个目录,但由于某种原因,变量没有得到扩展,即$(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
。对此的任何建议都很棒
答案 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 ;\
...