summaryrefslogtreecommitdiffstats
path: root/depend.mk
diff options
context:
space:
mode:
Diffstat (limited to 'depend.mk')
-rw-r--r--depend.mk76
1 files changed, 76 insertions, 0 deletions
diff --git a/depend.mk b/depend.mk
new file mode 100644
index 00000000..51d4cd63
--- /dev/null
+++ b/depend.mk
@@ -0,0 +1,76 @@
+#
+# C / C++ header dependency stuff
+#
+# Needs GNU make and vncmkdepend, a hacked version of makedepend
+
+.SUFFIXES: .d
+
+CMAKEDEPEND = vncmkdepend
+CXXMAKEDEPEND = vncmkdepend
+
+#
+# The recommended method of doing dependency analysis in the GNU make manual
+# turns out to be painfully slow. This method is similar but it's
+# substantially faster and retains the desirable property that the user doesn't
+# need to manually invoke a "make depend" step.
+#
+# As with the method described in the manual, we generate a separate dependency
+# (.d) file for each source file. The .d file records the header files that
+# each C or C++ source file includes. Any source file recorded in SRCS or
+# CXXSRCS will cause us to try and include the corresponding .d file and GNU
+# make then treats each .d file as a target to be remade.
+#
+# Unlike the manual's method, the rule we provide for making the .d file is
+# actually a fake. All it does is record in a temporary file that the .d file
+# needs to be remade. But as well as all the .d files, we also try to include
+# a file called "depend.phony". This file never exists, but it causes GNU make
+# to try and make the target "depend.phony". The rule for depend.phony then
+# looks at the temporary files generated by the .d rules and then invokes the
+# "omkdepend" program on all of the source files in one go.
+#
+
+#
+# We use simple assignment here to remove any of the depend.tmp files
+# at the time make parses this bit.
+#
+
+dummyvariable := $(shell $(RM) cdepend.tmp cxxdepend.tmp)
+
+#
+# Now the "fake" rules for generating .d files.
+#
+
+%.d: %.c
+ @echo "$<" >> cdepend.tmp
+
+%.d: %.cxx
+ @echo "$<" >> cxxdepend.tmp
+
+#
+# The depend.phony rule which actually runs omkdepend.
+#
+
+depend.phony:
+ @if [ -f cdepend.tmp ]; then \
+ echo $(CMAKEDEPEND) $(ALL_CPPFLAGS) `cat cdepend.tmp`; \
+ $(CMAKEDEPEND) $(ALL_CPPFLAGS) `cat cdepend.tmp`; \
+ rm -f cdepend.tmp; \
+ fi; \
+ if [ -f cxxdepend.tmp ]; then \
+ echo $(CXXMAKEDEPEND) $(ALL_CPPFLAGS) `cat cxxdepend.tmp`; \
+ $(CXXMAKEDEPEND) $(ALL_CPPFLAGS) `cat cxxdepend.tmp`; \
+ rm -f cxxdepend.tmp; \
+ fi
+
+#
+# Now include the .d files and the "depend.phony" file which never exists.
+# For some reason GNU make evaluates the targets in reverse order, so we need
+# to include depend.phony first. The "-" tells make not to complain that it
+# can't find the file.
+#
+
+-include depend.phony
+
+ifdef SRCS
+-include $(patsubst %.c,%.d,$(patsubst %.cxx,%.d,$(SRCS)))
+endif