]> git.draconx.ca Git - dxcommon.git/commitdiff
fix-gnulib: Improvements for program-only packages.
authorNick Bowler <nbowler@draconx.ca>
Wed, 12 Feb 2020 00:48:20 +0000 (19:48 -0500)
committerNick Bowler <nbowler@draconx.ca>
Wed, 12 Feb 2020 00:53:48 +0000 (19:53 -0500)
When building a program, we do not generally need the Gnulib symbol
renaming support and we do not need to build a libtool convenience
library (which typically takes twice as long).

It appears the object dependencies are incomplete when not using
libtool with Gnulib, so fix that, and add a new "program" mode which
omits the default call to GLSYM_PREFIX (and thus the DX_EXPORTED_SH
machinery does not not pulled in).

In all cases, switch noinst_(LT)LIBRARIES to EXTRA_(LT)LIBRARIES
which should have no negative impact -- but a program can link in
$(gnulib_objects) instead of the library to save a build step and
possibly increase opportunity for parallelism.

When using libtool, library mode is the default, otherwise program
mode is the default.  The script can be forced one way or the other
based on command-line options.

scripts/fix-gnulib.pl

index b60bced3cff01584df207d4190fe3221102134c5..c407d6faee64f9573ecf578e19ed9ac754d9268d 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/env perl
 #
-# Copyright © 2011-2014 Nick Bowler
+# Copyright © 2011-2014, 2020 Nick Bowler
 #
 # Prepare the Gnulib tree for inclusion into a non-recursive automake build.
 # While the output of gnulib-tool is "include"-able if the --makefile-name
@@ -8,18 +8,18 @@
 # reasons; chief among them is that filenames are not relative to the top
 # source directory.
 #
-# This script postprocesses the gnulib-tool output to produce something that
-# is intended to be suitable for inclusion into such non-recursive build
-# environments.  Since the integration involves both configure.ac and
-# Makefile.am, the output must be included into _both_.  Supposing the output
-# is written to lib/gnulib.mk, you would add:
+# This script postprocesses the gnulib-tool output to produce something
+# that is intended to be suitable for inclusion into such non-recursive
+# build environments.  Since the integration involves both configure.ac
+# and Makefile.am, the output must be included into _both_.  Supposing
+# the output is written to lib/gnulib.mk, you would add:
 #
 #   m4_include([lib/gnulib.mk]) # to configure.ac, after any call to gl_INIT
 #   include $(top_srcdir)/lib/gnulib.mk # to Makefile.am
 #
 # You must also arrange for the Gnulib-generated header files to be built
-# before the object files which depend on them; the most robust way to do this
-# is by explicit prerequisites, for example:
+# before the object files which depend on them; the most robust way to do
+# this is by explicit prerequisites, for example:
 #
 #   bin_PROGRAMS = foo
 #   $(foo_OBJECTS): $(gnulib_headers)
@@ -27,9 +27,9 @@
 # The $(gnulib_headers) variable will expand to GNU-make order-only
 # prerequisites when available, avoiding spurious incremental rebuilds when
 # unused headers are changed.  If this feature is not available, it will
-# expand to ordinary prerequisites.  It is therefore only appropriate for use
-# in target prerequisites; the $(gnulib_raw_headers) variable may be used in
-# other contexts when only the list of header files is required.
+# expand to ordinary prerequisites.  It is therefore only appropriate for
+# use in target prerequisites; the $(gnulib_raw_headers) variable may be
+# used in other contexts when only the list of header files is required.
 #
 # This script also provides machinery for Gnulib symbol renaming via the
 # glconfig.mk Makefile.am snippet; use of this feature is optional.
@@ -46,12 +46,17 @@ use Getopt::Long;
 my $output   = undef;
 my $input    = undef;
 
+my $use_libtool = undef;
+my $for_library = undef;
+
 my $line     = 0;
 
 Getopt::Long::Configure("gnu_getopt", "no_auto_abbrev");
 GetOptions(
        "o|output=s"   => \$output,
        "i|input=s"    => \$input,
+       "library"      => sub { $for_library = 1; },
+       "program"      => sub { $for_library = 0; },
 );
 
 open STDOUT, ">", $output or die "$output: $!\n" if (defined $output);
@@ -155,6 +160,23 @@ EOF
                drop;
        }
 
+       # Locate the libgnu definition to determine whether or not the user is
+       # using libtool mode in gnulib-tool.  Default to program mode if they
+       # are not, which will avoid pulling in the glsym dependencies.
+       #
+       # Convert noinst to EXTRA, that way libgnu will not be built unless
+       # something actually depends on it (which is typically the case).
+       if (/^noinst_LIBRARIES.*libgnu.a/) {
+               s/^noinst/EXTRA/;
+               $for_library //= 0;
+               $use_libtool = 0;
+       }
+       if (/^noinst_LTLIBRARIES.*libgnu.la/) {
+               s/^noinst/EXTRA/;
+               $for_library //= 1;
+               $use_libtool = 1;
+       }
+
        # For some reason, gnulib-tool adds core dumps to "make mostlyclean".
        # Since these files are (hopefully!) not created by make, they should
        # not be cleaned.
@@ -229,10 +251,15 @@ EOF
        s:\$\(builddir\):\$\(top_builddir\)/lib:g;
 } continue { s/(\n.)/\\\1/g; print; };
 
-print <<'EOF';
-gnulib_lt_objects = $(libgnu_la_OBJECTS) $(gl_LTLIBOBJS)
-$(gnulib_lt_objects): $(gnulib_headers)
+print <<'EOF' if ($use_libtool);
+gnulib_objects = $(libgnu_la_OBJECTS) $(gl_LTLIBOBJS)
+$(gnulib_objects): $(gnulib_headers)
+EOF
+print <<'EOF' if (!$use_libtool);
+gnulib_objects = $(libgnu_a_OBJECTS) $(gl_LIBOBJS)
+$(gnulib_objects): $(gnulib_headers)
 EOF
+
 print @cleanfiles;
 
 print <<'EOF';
@@ -246,8 +273,13 @@ AC_DEFUN_ONCE([DX_GLSYM_PREFIX], [dnl
 AC_REQUIRE([DX_EXPORTED_SH])
 AC_SUBST([GLSYM_PREFIX], [$1])
 ])
+EOF
+
+print <<'EOF' if ($for_library);
 AC_CONFIG_COMMANDS_PRE([DX_GLSYM_PREFIX([${PACKAGE}__])])
+EOF
 
+print <<'EOF';
 m4_foreach([gl_objvar], [[gl_LIBOBJS], [gl_LTLIBOBJS]], [dnl
 set x $gl_objvar; shift
 gl_objvar=