2

我有一个简单的线性数据处理管道,需要为多个输入文件运行,所以我将此过程指定为一组 Make 规则:

file1.abc: file1.input
    do some stuff

file1.def: file1.abc
    do some stuff

file1.ghi: file1.def some_script.py
    do some stuff

...ETC。

当我运行make file1.ghi一切正常。而且,如果我更新 some_script.py 并再次运行该命令,则只会重新运行最后一步,正如我所料。

现在,如果我将 Makefile 重写为更通用并适用于 file1 以外的文件:

all: $(patsubst %.input, %.ghi, $(wildcard *.input))

%.abc: %.input
    do some stuff

%.def: %.abc
    do some stuff

%.ghi: %.def some_script.py
    do some stuff

...并运行make,它将自动创建我所有的产品。但是,如果我对 some_script.py 进行更改并make再次运行,它会为每个输出文件重新运行整个管道,而不仅仅是最后一步。我希望由于只有最后一步的依赖项发生了变化,所以只有最后一步会重新运行。我怀疑问题是我对 Make 如何处理依赖关系的理解不完整。

为什么会发生这种情况,是否有解决方案?

4

1 回答 1

2

您的中间文件可能正在被删除。来自 GNU make 手册:

10.4 隐式规则链

[...]

第二个区别是,如果“make”确实创建了 B 以更新其他内容,它会在不再需要 B 后删除它。因此,在“make”之前不存在的中间文件在“make”之后也不存在。“make”通过打印“rm -f”命令向您报告删除,显示它正在删除哪个文件。

为了避免这种情况,用.SECONDARY(声明目标具有.PRECIOUS相同的效果,但如果被中断,也可以避免删除文件make,这可能是您不想要的。) 例如

.二级:%.def

于 2013-09-26T02:07:15.067 回答