Makefile:在构建任何目标之前创建文件

时间:2013-10-30 14:05:42

标签: makefile

(我的问题与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'而重新构建所有内容?是否有另一种方法来创建这种日志文件?

编辑:我正在使用并行make(选项-j)。定义宏以在语句部分中创建文件不是一种选择。

3 个答案:

答案 0 :(得分:5)

使用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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:0)

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

https://bitbucket.org/johanneskoester/snakemake