自动处理头文件依赖
gnu make手册提供的脚本
sources:=foo.c bar.c
include $(sources:.c=.d)
%.d: %.c
set -e; rm -f $@; \
$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\).o[ :]*,\1.o $@: ,g' < $@.$$$$ > $@;\
rm -f $@.$$$$
.PHONY: clean
clean:
-rm *.d
-rm *.o
改写了一下,1) sed 命令使用-E选项,省去了对元字符( )
的转义,2)使用-i选项,就地修改,省去了重定向和临时文件。
sources:=foo.c bar.c
include $(sources:.c=.d)
%.d: %.c
set -e; rm -f $@; \
$(CC) -MM $(CPPFLAGS) $< > $@; \
sed -i -E 's,($*).o[ :]*,\1.o $@: ,g' $@;\
.PHONY: clean
clean:
-rm *.d
-rm *.o
其实gcc -MM
和sed
可以合并成一条:$(CC) $(CPPFLAGS) -MM $< | sed -E 's,($*).o[: ]*,\1.o $@: ,g' > $@
,管道比文件读写速度要快一些。
有点小问题
make clean 之后再make clean的时候,也会生成.d然后再删除。
$ make clean
rm -f *.d
rm -f *.o
$ make