diff --git a/Makefile b/Makefile
index c933edc1a60e9aae1f39808e273438968abc6abc..94be64aa62d6a2830bc12d153a9f158d43aeafb6 100644 (file)
--- a/Makefile
+++ b/Makefile
-HEADERS=oberon.h store.h reader.h domain.h alien.h typeregister.h
+MODULES := reader store alien typeregister textmodel fold
-odcread: odcread.o reader.o store.o util.o alien.o typeregister.o textmodel.o
+# Add module directories to the include path
+CFLAGS += -I. $(patsubst %,-I%,$(MODULES))
+
+# Variables for the modules to write to
+SRCS := odcread.cc
+
+# Include module definitions
+include $(patsubst %,%/Make.inc,$(MODULES))
+
+# This rule just links the object files together
+odcread: $(SRCS:.cc=.o)
g++ -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++ $(CFLAGS) $< -MM -MF $*.d -MP -MT $@
+ g++ $(CFLAGS) $< -c -o $@
+
+clean:
+ rm -f odcread *.d *.o */*.o */*.d
+
+# Include the generated dependency files (if they exist)
+-include $(SRCS:.cc=.d)