]> git.draconx.ca Git - cdecl99.git/commitdiff
Eliminate use of BUILT_SOURCES from Gnulib.
authorNick Bowler <nbowler@draconx.ca>
Mon, 19 Sep 2011 03:01:18 +0000 (23:01 -0400)
committerNick Bowler <nbowler@draconx.ca>
Wed, 21 Sep 2011 23:25:09 +0000 (19:25 -0400)
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.

Makefile.am
fix-gnulib.pl

index dcc43c60703dd5029d19851f44ebfc20120bdd23..f42b95c715b1354c7a48333808018daa7a2978bd 100644 (file)
@@ -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
index 6663e6e4b49c333eb95b53fcb10b0657f6d7417c..b93cf22b44dc5fe042057ca4b9ec462c7541c106 100755 (executable)
@@ -87,7 +87,14 @@ while (<STDIN>) {
        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 (<STDIN>) {
                }
        }
 
+       # 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 (<STDIN>) {
        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