在我的Makefile中,我想执行多个步骤作为单个目标的一部分。这些步骤应顺序执行,因为它们相互依赖。这是简化的情况:
target:
git archive --remote=some-remote master --format zip -o ./zipfile.zip
echo "$(VARIABLE_IN_MAKE):$(shell unzip -z ./zipfilezip | tail -1)" > ./textfile
$(shell cat ./textfile)
这里的问题是,一旦“加载”规则,即在zip文件甚至存在之前,便立即执行shell命令-$(shell unzip -z ./zipfilezip | tail -1)
。那会返回错误。 cat
命令的扩展也为时过早。
不是在执行上述所有步骤之后才执行子shell的正确方法是什么?我是否必须将所有命令包装在bash -c
调用中?还是通过&&
将它们链接起来?
答案 0 :(得分:1)
摆脱这些$(shell...)
。制作配方的每一行已经是一个Shell脚本:
target:
git archive --remote=some-remote master --format zip -o ./zipfile.zip
echo "$(VARIABLE_IN_MAKE):$$(unzip -z ./zipfilezip | tail -1)" > ./textfile
cat ./textfile
请注意,在第二行中,$$(unzip -z ./zipfilezip | tail -1)
扩展了两次:第一次是在将配方传递到外壳之前,通过make生成$(unzip -z ./zipfilezip | tail -1)
,第二次是通过将作为命令替换。这就是需要$$
的原因:通过make逃脱第一个扩展。如果您直接使用$(unzip -z ./zipfilezip | tail -1)
,make会将其扩展为空字符串(除非您有一个名为unzip -z ./zipfilezip | tail -1
的make变量,但这不太可能)。