DEADSOFTWARE

Precompile .ih files and cache dependencies based on .ih files
[odcread.git] / Makefile
index 656105b1c1de1d9709988bf77591889dabe78111..415e3250cebaf0cde6ad7c7995e9f02e2ba2c42a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -4,12 +4,12 @@
 #  * $(MODULE)/$(MODULE).ih -- internal/implementation header file
 #    (only to be included by sources within the module)
 #  * $(MODULE)/*.cc -- module source files
-MODULES := reader store alien typeregister textmodel fold typepath
+MODULES := main reader store alien typeregister textmodel fold typepath
 
-CFLAGS += -I.
+CFLAGS := -I.
 
 # Variables for the modules to write to
-SRCS := odcread.cc
+SRCS := 
 
 # Include module definitions
 include $(patsubst %,%/Make.inc,$(MODULES))
@@ -18,28 +18,36 @@ include $(patsubst %,%/Make.inc,$(MODULES))
 odcread: $(SRCS:.cc=.o)
        g++ -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.
+%.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 .o needs to be rebuilt.
-%.o: %.cc
-       g++ $(CFLAGS) $< -MM -MF $*.d -MP -MT $@
-       g++ $(CFLAGS) $< -c -o $@
+# 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 *.d *.o */*.o */*.d
+       rm -f odcread *.o */*.o */*.d */*.ih.gch
 
 # Include the generated dependency files (if they exist)
--include $(SRCS:.cc=.d)
+-include $(patsubst %,%/module.d,$(MODULES))
 
-
-# TODO:
-# Each module has a .ih file that should be *the only* include from the .cc
-# files. These .ih files should be pre-compiled, and dependency caching should
-# be based on the .ih files, not the .cc files.
+# TODO: rename all %/%.ih files to %/module.ih for simplicity of matching rules