我有一个简单的线性数据处理管道,需要为多个输入文件运行,因此我将此过程指定为一组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
...等
当我运行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如何处理依赖关系的不完全理解。
为什么会发生这种情况,是否有解决方案?
答案 0 :(得分:2)
您的中间文件可能正在删除。从GNU make手册:
第10.4节隐含规则链
[...]
第二个区别是,如果'make' 为了创建B. 更新其他内容后,它会在以后删除B. 需要。因此,之前不存在的中间文件 'make'之后'make'也不存在。 'make'报告删除 通过打印'rm -f'命令来显示它正在删除的文件。
为了避免这种情况,使用.SECONDARY
声明目标(.PRECIOUS
具有相同的效果,但也可以避免在make
被中断时删除文件,这可能是您不想要的。)例如
.SECONDARY:%。def