DEADSOFTWARE

Precompile .ih files and cache dependencies based on .ih files
[odcread.git] / Makefile
index e03bf66b81765e6def5abb7a416c956c6c589aa5..415e3250cebaf0cde6ad7c7995e9f02e2ba2c42a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,53 @@
-HEADERS=oberon.h store.h reader.h domain.h
+# Modules, each containing:
+#  * $(MODULE)/Make.inc -- makefile include
+#  * $(MODULE)/$(MODULE).h -- minimal "interface" header file
+#  * $(MODULE)/$(MODULE).ih -- internal/implementation header file
+#    (only to be included by sources within the module)
+#  * $(MODULE)/*.cc -- module source files
+MODULES := main reader store alien typeregister textmodel fold typepath
 
-odcread: odcread.o reader.o store.o util.o
+CFLAGS := -I.
+
+# Variables for the modules to write to
+SRCS := 
+
+# Include module definitions
+include $(patsubst %,%/Make.inc,$(MODULES))
+
+# This rule just links the object files together
+odcread: $(SRCS:.cc=.o)
        g++ -o $@ $^
 
-%.o: %.cc $(HEADERS)
-       g++ -c -I. -o $@ $<
+%.o: %.cc
+       g++ $(CFLAGS) $< -c -o $@
+
+# For each implementation header (.ih) generate a dependency (.d) file which
+# will ensure that the compiled header (.ih.gch) is rebuilt whenever the header
+# files included by the .ih 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 .ih.gch needs to be rebuilt.
+%.ih.gch: %.ih
+       g++ $(CFLAGS) -x c++-header $< -MM -MF $(dir $@)module.d -MP -MT $@
+       g++ $(CFLAGS) -x c++-header $< -o $@
+
+# This rule build an object (.o) from a source (.cc). 
+# Each module has a .ih file that should be *the only* include from the .cc
+# files. These .ih files are pre-compiled to .ih.gch, and dependency caching
+# is based on the .ih files, not the .cc files.
+define depend_on_compiled_header
+$(patsubst %.cc,%.o,$(1)) : $(dir $(1))$(patsubst %/,%,$(dir $(1))).ih.gch
+endef
+$(foreach src,$(SRCS),$(eval $(call depend_on_compiled_header,$(src))))
+
+clean:
+       rm -f odcread *.o */*.o */*.d */*.ih.gch
+
+# Include the generated dependency files (if they exist)
+-include $(patsubst %,%/module.d,$(MODULES))
+
+# TODO: rename all %/%.ih files to %/module.ih for simplicity of matching rules