From: Nick Bowler Date: Mon, 19 Sep 2011 03:01:18 +0000 (-0400) Subject: Eliminate use of BUILT_SOURCES from Gnulib. X-Git-Tag: v1~108 X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/commitdiff_plain/a71929ae4a4be5b9924b2cb2b4cd98e9cc61c21f Eliminate use of BUILT_SOURCES from Gnulib. As with recursive make, BUILT_SOURCES is harmful because of inadequate dependency information. We can achieve a similar effect with by using order-only dependencies: These force the headers to be up-to-date before anything that might require them is built: but rebuilds are only triggered based on the accurate dependency information generated by the normal mechanisms. Unfortunately, order-only dependencies are a GNU make feature, so we use a hack which should fall back to ordinary dependencies on other make implementations. The worst effect of using ordinary dependencies will be that files might be needlessly rebuilt when a header changes. --- diff --git a/Makefile.am b/Makefile.am index dcc43c6..f42b95c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -7,7 +7,6 @@ ACLOCAL_AMFLAGS = -I m4 # For Gnulib -BUILT_SOURCES = MOSTLYCLEANFILES = noinst_LTLIBRARIES = @@ -37,10 +36,12 @@ libcdecl_la_LDFLAGS = -export-symbols-regex '^cdecl_[[:lower:]]' libcdecl_la_SOURCES = src/scan.c src/parse.c src/parse-decl.c src/typemap.c \ src/output.c src/explain.c src/declare.c src/i18n.c libcdecl_la_LIBADD = $(LTLIBINTL) $(LTLIBTHREAD) +$(libcdecl_la_OBJECTS): $(gnulib_headers) bin_PROGRAMS = cdecl99 cdecl99_SOURCES = src/cdecl99.c cdecl99_LDADD = libcdecl.la libgnu.la +$(cdecl99_OBJECTS): $(gnulib_headers) src/parse.lo: src/scan.h src/scan.lo: src/parse.h diff --git a/fix-gnulib.pl b/fix-gnulib.pl index 6663e6e..b93cf22 100755 --- a/fix-gnulib.pl +++ b/fix-gnulib.pl @@ -87,7 +87,14 @@ while () { next if (/^#/); if (!$printed_header) { - print "# Postprocessed by ", basename($0), "\n"; + print "# Postprocessed by ", basename($0), "\n\n"; + print <<'EOF'; +# This trick should define gnulib_orderonly to | iff we're using GNU make. +gnulib_have_orderonly = $(findstring order-only,$(.FEATURES)) +gnulib_orderonly = $(gnulib_have_orderonly:order-only=|) +gnulib_headers = $(gnulib_orderonly) +EOF + $printed_header = 1; drop; } @@ -122,6 +129,11 @@ while () { } } + # BUILT_SOURCES has similar problems to recursive make: inadequate + # dependencies lead to incorrect builds. Collect them into an + # ordinary variable so we can deal with them later. + s/BUILT_SOURCES/gnulib_headers/; + # Targets are similar to variables: the target and its dependencies # need to be mangled. if (/:/) { @@ -133,6 +145,8 @@ while () { s:\$\(builddir\):\$\(top_builddir\)/lib:g; } continue { print }; +print "\$(libgnu_la_OBJECTS): \$(gnulib_headers)\n"; + # Some filenames are AC_SUBSTed by the Gnulib macros, and thus we need to # prepend lib/ if and only if they're not empty. Unfortunately, make is not # powerful to do this, so we need to put this transformation into configure