3

(我的问题与Force Makefile 在构建目标之前执行脚本不同)

我有以下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)。不能在语句部分定义宏来创建文件。

4

3 回答 3

5

使用仅限订单的先决条件?

.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
于 2013-10-30T15:57:37.273 回答
5

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

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

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

于 2013-10-30T19:03:01.283 回答
0

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

https://bitbucket.org/johanneskoester/snakemake

于 2013-10-30T14:47:30.013 回答