我有一个简单的线性数据处理管道,需要为多个输入文件运行,所以我将此过程指定为一组 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 如何处理依赖关系的理解不完整。
为什么会发生这种情况,是否有解决方案?