have configure generate header dependencies automatically

Darren Tucker dtucker at zip.com.au
Sat Jan 12 13:52:30 EST 2008

On Thu, Jan 10, 2008 at 09:11:18AM +1100, Darren Tucker wrote:
> That said, I think something like that (or mkdep from OpenBSD as 
> mentioned in my original mail) would be OK as long as either the result 
> is checked into CVS (not done at build time) or is an optional extra.
> The down side of this strategy is that the output of those types of 
> tools is usually dependent on the compiler flags passed to the tool. 
> Hence my "if all you have is a hammer, every problem looks like a nail" 
> solution using configure :-)

Here's one possible solution.  It preprocesses the entire tree and
strips out everything except the #includes, processes the tree
with gcc -MM and stores the result. Because the #ifdefs have been
removed, the result is effectively the dependencies for every possible
configuration (all at once).

At configure time, if the dependency info is available then it's
appended to the Makefile, otherwise it's a no-op.  If we check the
depend files into CVS and make sure they're current when building
releases then I think it would work out.

If anyone wants to try this (particularly with a non-gcc compiler
and vendor make) I have put up a snapshot with this change here:

Index: Makefile.in
RCS file: /usr/local/src/security/openssh/cvs/openssh/Makefile.in,v
retrieving revision 1.285
diff -u -p -r1.285 Makefile.in
--- Makefile.in	11 Jun 2007 04:01:42 -0000	1.285
+++ Makefile.in	12 Jan 2008 01:28:23 -0000
@@ -230,6 +230,7 @@ distprep: catman-do
 	-rm -rf autom4te.cache
 	(cd scard && $(MAKE) -f Makefile.in distprep)
+	sh mkdepend.sh
 install: $(CONFIGFILES) ssh_prng_cmds.out $(MANPAGES) $(TARGETS) install-files install-sysconf host-key check-config
 install-nokeys: $(CONFIGFILES) ssh_prng_cmds.out $(MANPAGES) $(TARGETS) install-files install-sysconf
Index: configure.ac
RCS file: /usr/local/src/security/openssh/cvs/openssh/configure.ac,v
retrieving revision 1.389
diff -u -p -r1.389 configure.ac
--- configure.ac	2 Jan 2008 07:08:45 -0000	1.389
+++ configure.ac	12 Jan 2008 01:30:01 -0000
@@ -4003,6 +4003,13 @@ AC_CONFIG_FILES([Makefile buildpkg.sh op
 	scard/Makefile ssh_prng_cmds survey.sh])
+for i in . openbsd-compat; do
+	dep="$srcdir/$i/depend"
+	if test -f "$dep"; then
+		cat $srcdir/$i/depend >>Makefile
+	fi
 # Print summary of options
 # Someone please show me a better way :)
Index: mkdepend.sh
RCS file: mkdepend.sh
diff -N mkdepend.sh
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ mkdepend.sh	12 Jan 2008 01:29:32 -0000
@@ -0,0 +1,41 @@
+# $Id $
+# Author Darren Tucker 2008.  Hereby placed in the public domain.
+rm -rf .depend depend openbsd-compat/depend
+mkdir -p .depend/openbsd-compat
+touch .depend/config.h
+for i in *.c openbsd-compat/*.c; do
+	egrep '#.*include.*"' ${i} >.depend/${i}
+# Generate a stripped source tree containing all of the possible includes.
+# Protect headers against multiple includes to prevent loops.
+for i in *.h openbsd-compat/*.h; do
+	echo "#ifndef ${i}" | tr .\\-/ ___  >.depend/${i}
+	echo "#define ${i}" | tr .\\-/ ___ >>.depend/${i}
+	egrep '#.*include.*"' ${i} >>.depend/${i}
+	echo "#endif" >>.depend/${i}
+echo "# Machine generated output from mkdepend below.  Do not edit." >depend
+cp depend openbsd-compat/depend
+# process stripped tree to produce dependency files
+(cd ${d} && for i in *.c; do
+	gcc -I ${d} -I ${d}/openbsd-compat -MM ${i}
+ done) | perl -pe "s|${d}/||g" >>depend
+(cd ${d}/openbsd-compat && for i in *.c; do
+	gcc -I ${d} -I ${d}/openbsd-compat -MM ${i}
+done) \
+	| perl -pe "s|${d}/openbsd-compat/||g" \
+	| perl -pe "s|${d}/|../|g" >>openbsd-compat/depend
+rm -rf .depend

Darren Tucker (dtucker at zip.com.au)
GPG key 8FF4FA69 / D9A3 86E9 7EEE AF4B B2D4  37C9 C982 80C7 8FF4 FA69
    Good judgement comes with experience. Unfortunately, the experience
usually comes from bad judgement.

More information about the openssh-unix-dev mailing list