From 97c7cffdc6e0047bb49a899b013516bc3022e580 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Tue, 10 Nov 2009 08:04:54 -0800 Subject: [PATCH] Makefile: Fix dependency generation to make .d files themselves dependent. I saw this recommendation in the implementation notes for "Recursive Make Considered Harmful" and then the further recommendation for implementing the idea in the GNU make manual. The idea is that if any of the files change then we need to regenerate the dependency file before we regenerate any targets. The approach from the GNU make manual is simpler in that it just uses a sed script to fix up the output of an extra invocation of the compiler, (as opposed to the approach in the implementation notes from the paper's author which use a wrapper script for the compiler that's always invoked rather than the compiler itself). --- Makefile | 23 +++++++++++++++-------- lib/Makefile.local | 31 +++++++++++++++++-------------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 91ab9c02..7743ef52 100644 --- a/Makefile +++ b/Makefile @@ -19,14 +19,21 @@ include lib/Makefile.local %.o: %.c $(CC) -c $(CFLAGS) $(NOTMUCH_CFLAGS) $< -o $@ -.depends: $(SRCS) - $(CXX) -M $(CPPFLAGS) $(NOTMUCH_DEPENDS_FLAGS) \ - $(NOTMUCH_CXX_DEPENDS_FLAGS) $^ > $@ --include .depends +.deps/%.d: %.c + @set -e; rm -f $@; mkdir -p $$(dirname $@) ; \ + $(CC) -M $(CPPFLAGS) $(NOTMUCH_DEPENDS_FLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ -CLEAN := $(CLEAN) .depends +.deps/%.d: %.cc + @set -e; rm -f $@; mkdir -p $$(dirname $@) ; \ + $(CXX) -M $(CPPFLAGS) $(NOTMUCH_CXX_DEPENDS_FLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +DEPS := $(SRCS:%.c=.deps/%.d) +DEPS := $(DEPS:%.cc=.deps/%.d) +-include $(DEPS) clean: - rm -f $(CLEAN) - - + rm -f $(CLEAN); rm -rf .deps diff --git a/lib/Makefile.local b/lib/Makefile.local index b5182bc4..43882a3d 100644 --- a/lib/Makefile.local +++ b/lib/Makefile.local @@ -1,19 +1,22 @@ dir=lib -lib_notmuch_modules = \ - $(dir)/database.o \ - $(dir)/index.o \ - $(dir)/$(dir)sha1.o \ - $(dir)/message.o \ - $(dir)/message-file.o \ - $(dir)/query.o \ - $(dir)/sha1.o \ - $(dir)/tags.o \ - $(dir)/thread.o \ - $(dir)/xutil.o +libnotmuch_c_srcs = \ + $(dir)/libsha1.c \ + $(dir)/message-file.c \ + $(dir)/sha1.c \ + $(dir)/tags.c \ + $(dir)/xutil.c -$(dir)/notmuch.a: $(lib_notmuch_modules) +libnotmuch_cxx_srcs = \ + $(dir)/database.cc \ + $(dir)/index.cc \ + $(dir)/message.cc \ + $(dir)/query.cc \ + $(dir)/thread.cc + +libnotmuch_modules = $(libnotmuch_c_srcs:.c=.o) $(libnotmuch_cxx_srcs:.cc=.o) +$(dir)/notmuch.a: $(libnotmuch_modules) $(AR) rcs $@ $^ -SRCS := $(SRCS) lib/*.c lib/*.cc -CLEAN := $(CLEAN) $(dir)/*.o $(dir)/notmuch.a +SRCS := $(SRCS) $(libnotmuch_c_srcs) $(libnotmuch_cxx_srcs) +CLEAN := $(CLEAN) $(libnotmuch_modules) $(dir)/notmuch.a