在Make中运行deferred shell命令

时间:2018-12-10 15:34:41

标签: makefile

在我的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调用中?还是通过&&将它们链接起来?

1 个答案:

答案 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变量,但这不太可能)。