From 149d7ca4cf84c3c9b7eb55b02d6b152fb00894bf Mon Sep 17 00:00:00 2001 From: Gert van Valkenhoef Date: Tue, 15 Nov 2011 13:12:11 +0000 Subject: [PATCH] Makefile: proper dependency management --- Makefile | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index f54dabe..441faf9 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,27 @@ -HEADERS=oberon.h store.h reader.h alien.h typeregister.h textmodel.h fold.h visitor.h +# List all source files to be compiled +SRCS=odcread.cc reader.cc store.cc util.cc alien.cc typeregister.cc \ + textmodel.cc fold.cc -odcread: odcread.o reader.o store.o util.o alien.o typeregister.o textmodel.o fold.o +# This rule just links the object files together +odcread: $(SRCS:.cc=.o) g++ -o $@ $^ -%.o: %.cc $(HEADERS) - g++ -c -I. -o $@ $< +# This rule build an object (.o) from a source (.cc). It first builds a +# dependency (.d) file which will ensure that the .o is rebuilt whenever the +# header files included by the .cc are updated. +# The options given to GCC for this are as follows: +# -MM : calculate dependencies, but exclude system headers +# -MF : output dependencies to the given file +# -MP : generate "header.h:" rules to avoid errors on deletion of headers +# -MT : the main rule has the given target (to handle subdirs correctly) +# The .d file is not an explicit target because it will need to be (re-)built +# if and only if the .o needs to be rebuilt. +%.o: %.cc + g++ -I. $< -MM -MF $*.d -MP -MT $@ + g++ -I. $< -c -o $@ + +clean: + rm -f odcread *.d *.o + +# Include the generated dependency files (if they exist) +-include $(SRCS:.cc=.d) -- 2.29.2