2012-07-29 48 views
3

我的Makefile不会删除中间文件。我已经设置了.INTERMEDIATE。这是我的Makefile:Makefile不会删除中间文件

OBJECTS=prefixer.o stack.o 
CFLAGS=-Werror -Wmissing-prototypes -g 
LIBS=-lm 
CC=gcc 

prefixer : $(OBJECTS) 
    $(CC) -o prefixer $(OBJECTS) $(LIBS) 

prefixer.o : stack.h 
    $(CC) -c prefixer.c -o [email protected] $(CFLAGS) 
stack.o : stack.c stack.h 
    $(CC) -c stack.c -o [email protected] $(CFLAGS) 

.INTERMEDIATE: %.o 

.PHONY: clean 
clean : 
    -rm prefixer *.o 

有什么不对.INTERMEDIATE

+4

旁边的问题:我不知道'.INTERMEDIATE',但我能问你为什么要这样做吗? Makefile很好,所以你可以避免重建'.o'文件,其源文件是不变的。如果您想每次重建所有内容,为什么不使用脚本? – Shahbaz 2012-07-29 13:07:18

+0

你错过了依赖''prefixer.c' - >'前缀。o' – 2012-07-29 15:32:06

+0

@BasileStarynkevitch你是什么意思?它的第二个'prefixer.o:stack.h ....' – darksky 2012-07-29 15:37:30

回答

8

.INTERMEDIATE

角色见Gnu make special targets你大概的意思

.SECONDARY: $(OBJECTS) 

,因为我认为,如果你把.INTERMEDIATE那么对象将永远被删除,你可能不希望出现这种情况。我认为你不能有意义地把%.o作为特殊目标的先决条件。

我会建议保留目标文件,以免浪费时间重新编译它们。

运行一次make -p会教你很多关于make知道的规则。

使用remake -x(即remake)非常有帮助,至少可以调试复杂的Makefile -s。你也可以使用make -d,但我觉得它太冗长了。

您可能想要使用比make例如更好的构建器,例如, omake

+0

但是这并没有做什么,是吗? '.SECONDARY $(OBJECTS)'会做什么?我想清理目录中的混乱,因此使用'.INTERMEDIATE'。其次,如果源已被修改,我将如何进行重新编译?有任何想法吗? – darksky 2012-07-29 15:05:02

+0

如果你没有做任何特殊的目标技巧,'* .o'被构建并保存在目录中(因为''确实处理传递依赖性),并且'make'将会适当地重新编译。当然你需要给* source * - > * object * dependencies。 – 2012-07-29 15:09:09

+0

出于某种原因,当我更改其中一个源文件并再次运行'make'时,它说'prefixer'是最新的..当它不是。我在这里错过了什么?我认为这个“功能”默认为“make”,并且不需要任何额外的命令。 – darksky 2012-07-29 15:14:48

0

据我所知,.INTERMEDIATE不应该删除中间文件,如果它已经存在。这是来自gnu make的文档:

中间文件与其他所有文件一样使用它们的规则重新编写。但是中间文件的处理方式有两种。

第一个区别是如果中间文件不存在会发生什么情况。如果一个普通文件b不存在,并且考虑一个依赖于b的目标,它总是创建b,然后从b更新目标。但是如果b是一个中间文件,那么make可以单独保留足够好。它不会打扰更新b或最终目标,除非b的某些先决条件比目标更新或者有更新目标的其他原因。

第二个不同之处在于,如果make为了更新其他内容而创建了b,则在不再需要b之后就会删除b。因此,make之前不存在的中间文件也不存在。通过打印一个'rm -f'命令来向你显示删除报告,显示它正在删除哪个文件。

因此,确保在运行make之前目录中没有*.o

5

特殊目标.INTERMEDIATE不能与%通配符一起使用。试试这个:

.INTERMEDIATE: stack.o prefixer.o