GNU Makefile目标内变量名展开失效,目录创建失败问题咨询
GNU Makefile模式目标中shell变量未正确展开的问题解决
问题重现
我尝试在GNU Makefile的模式目标里基于规则创建目录,但变量
$(OUT_DIR)始终是空的,导致mkdir -p命令没法正常工作。初始代码如下:target_%: /home/user/%/.file : file.c export OUT_DIR = /home/user/$* ; \ mkdir -p $(OUT_DIR) ;\ . . .
问题原因
说白了,GNU Make是个“急性子”——它会在把命令交给shell执行之前,先把命令行里所有用$(...)包裹的Make变量提前展开。而你这里的OUT_DIR是shell变量,不是Make变量:Make解析到$(OUT_DIR)的时候,export OUT_DIR=...这个shell命令还没执行呢,所以Make会把它当成未定义的变量,直接展开成空字符串。最后实际执行的命令就变成了mkdir -p ,自然没法创建目录。
解决方法
要让shell变量在shell执行时才被展开,你需要给$加一层转义:用$${OUT_DIR}代替$(OUT_DIR)。这样Make在解析的时候,会把$$转成单个$,传递给shell的命令就变成了$OUT_DIR,这时候shell已经执行了export 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/...
额外小提示
如果这个路径只需要用一两次,其实可以直接用$*,不用特意定义shell变量,比如直接写mkdir -p /home/user/$*,这样代码更简洁,也能避免变量展开的坑。但如果需要多次引用这个路径,定义shell变量还是更清晰易读的。
内容的提问来源于stack exchange,提问作者tulamba
相关产品推荐
相关产品推荐

