GNU Make不必要地重新运行模式规则

时间:2013-09-26 01:36:58

标签: makefile gnu-make

我有一个简单的线性数据处理管道,需要为多个输入文件运行,因此我将此过程指定为一组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如何处理依赖关系的不完全理解。

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

1 个答案:

答案 0 :(得分:2)

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

  

第10.4节隐含规则链

     

[...]

     

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

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

  

.SECONDARY:%。def