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

Makefile:在构建任何目标之前创建文件,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 使用

(我的问题与你的不同)

我有以下生成文件

.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
使用target dump_参数,我希望在每次调用新目标时创建/追加一个文件(以跟踪所用工具的版本)。然而,当我打电话时

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)。在语句部分定义宏来创建文件不是一个选项。

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

使用什么


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

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

由于它是立即展开的,所以在读入makefile时,shell脚本将被调用一次。无需定义
dump_params
目标或将其作为先决条件。这是一个比较老套的方法,但它的优点是它将在每次调用make时运行,而不必经过检查,确保每个目标都定义了正确的顺序前提条件。

谢谢Sean,但我还是坚持使用qmake+SGE()非常好的解决方案!尽管“(我的问题不同于在构建目标之前强制Makefile执行脚本)”,但这也解决了这个问题:)
__dummy := $(shell echo "Makefile was run." >> config.txt)