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.
next if (/^#/);
if (!$printed_header) {
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;
}
$printed_header = 1;
drop;
}
+ # 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 (/:/) {
# Targets are similar to variables: the target and its dependencies
# need to be mangled.
if (/:/) {
s:\$\(builddir\):\$\(top_builddir\)/lib:g;
} continue { print };
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
# 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