X-Git-Url: https://deadsoftware.ru/gitweb?p=odcread.git;a=blobdiff_plain;f=Makefile;h=415e3250cebaf0cde6ad7c7995e9f02e2ba2c42a;hp=4ad7260b49abef09e303cfabd32437671153d4ff;hb=cf88fc04686af2b4a34f9ccebc9f517cd83be491;hpb=d7f2452e20b04d1559b7bdd3aa49b6fbf7d0abaf diff --git a/Makefile b/Makefile index 4ad7260..415e325 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,53 @@ -HEADERS=oberon.h store.h reader.h domain.h alien.h typeregister.h textmodel.h fold.h visitor.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 alien.o typeregister.o textmodel.o fold.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