首页 > 解决方案 > 在 Make 中运行延迟的 shell 命令

问题描述

在我的 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)

这里的问题是 shell 命令 -$(shell unzip -z ./zipfilezip | tail -1)一旦规则“加载”就被执行,即在 zipfile 甚至存在之前。这会返回错误。该cat命令也扩展得太早了。

在上述所有步骤完成之后而不是之前执行子shell的正确方法是什么?我是否必须将所有命令包装在一个bash -c调用中?或者通过链接它们&&

标签: makefile

解决方案


摆脱这些$(shell...)。make recipe 的每一行都已经是一个 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 在将配方传递给 shell 之前,导致$(unzip -z ./zipfilezip | tail -1),第二次是 shell 将其视为命令替换。这就是$$需要的原因:通过 make 逃避第一个扩展。如果您$(unzip -z ./zipfilezip | tail -1)直接使用,make 会将其扩展为空字符串(除非您有一个名称为 的 make 变量unzip -z ./zipfilezip | tail -1,但这不太可能)。


推荐阅读