cc-files = $(wildcard */*.cc)
h-files = $(wildcard ../include/*/*.h)
+forward-declarations = ../include/basic/forward-declarations.h
+
# strip subdirectories from cc file names, preprend a "../lib/[g]o"
# and change the suffix. We place the object files with or without
# debug info in different directories, since we want to use the
# rule how to make the file containing all the forward declarations
-../include/basic/forward-declarations.h: $(filter-out %forward-declarations.h,$(h-files))
+# this rule is rather complicated, it works as follows:
+#
+# - if this is the outermost 'make', then create a file $@.old.
+# if the forward declaration file $@ already exists, then copy
+# it over, otherwise leave it empty. this way, we always have
+# a file to run diff on
+# - write the forward declarations for the presently available
+# header files to $@.new
+# - we would like to compare the output of the script generating
+# the forward declarations with the old file, or the empty
+# string if there is no such file; this is why we created $@.old
+# - if the files differ, we would like to copy over the old file.
+# - this can either be done using shell programming using 'if [...]'
+# or using conditionals inside 'make'. the first way is not
+# portable over different shells, however, and I also do not know
+# how to write it. the second way has a problem also: conditionals
+# are evaluated at the time the Makefile is read first, so we
+# can't compare against $@.old, since this file does not exist at
+# that time.
+# - we therefore invoke a second 'make', which can compare the two
+# files against each other in a preconditional clause and
+# copy over the file if necessary.
+# - delete the two temporary files
+$(forward-declarations): $(filter-out $(forward-declarations),$(h-files))
+ifeq (0,${MAKELEVEL})
+ @echo ============================ Checking $@
+ @touch $@.old
+ -@cp $@ $@.old
+ @perl ../Make_forward_declarations $(filter-out $(forward-declarations),$(h-files)) > $@.new
+ @make --silent $@
+ @rm $@.old $@.new
+else
+ ifneq (,$(shell diff $(forward-declarations).old $(forward-declarations).new))
@echo ============================ Generating $@
- @perl ../Make_forward_declarations $(filter-out %forward-declarations.h,$(h-files)) > $@
+ @cp $@.new $@
+ else
+ @echo "============================ $@ needs no change"
+ endif
+endif
+
#programs which use the 2d *and* the 3d library;
#if the files within these libraries had the same names,
#we may get into trouble.
-../lib/Makefile.dep: $(cc-files) $(h-files) Makefile ../Make.global_options
+../lib/Makefile.dep: $(cc-files) $(filter-out $(forward-declarations),$(h-files)) Makefile ../Make.global_options
@echo ============================ Remaking Makefile
@echo "# This Makefile was automatically generated by ../source/Makefile" \
> ../lib/Makefile.dep