【问题标题】:Makefile: creating a file before building any targetMakefile:在构建任何目标之前创建一个文件
【发布时间】:2013-10-30 14:05:41
【问题描述】:

(我的问题与Force Makefile to execute script before building targets不同)

我有以下 Makefile

.PHONY: dump_params all

all: tmpA

tmpA: tmpB tmpC dump_params
    cat $(filter tmp%,$^) > $@

tmpB: dump_params
    touch $@

tmpC: dump_params
    touch $@

dump_params:
    echo "Makefile was run." >> config.txt

对于目标 dump_params,我想在每次调用新目标时创建/附加一个文件(以跟踪所用工具的版本)。但是,当我打电话时

make tmpA

所有目标都是从头开始构建的

$ make tmpA
echo "Makefile was run " >> config.txt
touch tmpB
touch tmpC
cat tmpB tmpC > tmpA

$ make tmpA
echo "Makefile was run." >> config.txt
touch tmpB
touch tmpC
cat tmpB tmpC > tmpA

如何防止 Make 因为目标“dump_params”而重新构建所有内容?有没有另一种方法来创建这种日志文件?

编辑:我正在使用并行制作(选项 -j)。不能在语句部分定义宏来创建文件。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    使用order-only prerequisites?

    .PHONY: dump_params all
    
    all: tmpA
    
    tmpA: tmpB tmpC | dump_params
        cat $(filter tmp%,$^) > $@
    
    tmpB: | dump_params
        touch $@
    
    tmpC: | dump_params
        touch $@
    
    dump_params:
        echo "Makefile was run." >> config.txt
    

    【讨论】:

      【解决方案2】:

      另一种选择是使用立即扩展的 shell 函数,例如:

      __dummy := $(shell echo "Makefile was run." >> config.txt)
      

      由于它会立即展开,因此会在读入 makefile 时调用一次 shell 脚本。无需定义 dump_params 目标或将其作为先决条件包含在内。这是更老派的做法,但它的优势在于它会在 每次 调用 make 时运行,而无需检查并确保每个目标都定义了正确的仅订单先决条件。

      【讨论】:

      • 非常好的解决方案!
      • 尽管“(我的问题与在构建目标之前强制 Makefile 执行脚本不同)”,但事实证明这也解决了这个问题:)
      【解决方案3】:

      没有答案,但 snakemake(我怀疑还有其他)支持跟踪规则(代码)、参数、输入和可执行版本。

      https://bitbucket.org/johanneskoester/snakemake

      【讨论】:

      猜你喜欢
      • 2020-07-28
      • 2023-03-10
      • 2012-12-04
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多