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

Pie*_*rre 3 makefile

(我的问题与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
Run Code Online (Sandbox Code Playgroud)

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

make tmpA
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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

Eta*_*ner 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
Run Code Online (Sandbox Code Playgroud)


Mad*_*ist 5

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

__dummy := $(shell echo "Makefile was run." >> config.txt)
Run Code Online (Sandbox Code Playgroud)

由于它已立即扩展,因此将在读入makefile时调用一次shell脚本。无需定义dump_params目标或将其作为先决条件。这是比较老套的方法,但是它的优点是它将在每次调用make 时都运行,而不必经历并确保每个目标都定义了正确的仅订购先决条件。