]> git.draconx.ca Git - dxcommon.git/blobdiff - scripts/fix-gnulib.pl
Avoid gratuitous library dependencies linking gnulib.
[dxcommon.git] / scripts / fix-gnulib.pl
index 3876f93e4b8639fcc0420ef51f17f8fc8f9a6c85..834fb7a2e6fe0f0b3f4a11c7eaa11d3fb800422c 100755 (executable)
@@ -93,7 +93,9 @@ while (<STDIN>) {
 # 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)
+gnulib_core_headers = $(gnulib_orderonly)
+gnulib_src_headers = $(gnulib_core_headers)
+gnulib_headers = $(gnulib_src_headers)
 EOF
 
                $printed_header = 1;
@@ -109,6 +111,14 @@ EOF
        # useful for non-recursive builds.  Strip them out.
        drop if (/^(AM_CPPFLAGS|AM_CFLAGS)/);
 
+       # Library dependencies are added automatically to libgnu.la by
+       # gnulib-tool.  Unfortunately, this means that everything linking
+       # against libgnu.la is forced to pull in the same deps, even if they're
+       # unneeded.  Furthermore, a libtool linker flag reordering bug prevents
+       # --as-needed from stripping out the useless deps, so it's better to
+       # handle them all manually.
+       drop if (/LDFLAGS/);
+
        # Rewrite automake hook targets to be more generic.
        if (s/^(.*)-local:/\1-gnulib:/) {
                print ".PHONY: $1-gnulib\n";
@@ -133,7 +143,7 @@ EOF
        # 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/;
+       s/BUILT_SOURCES/gnulib_core_headers/;
 
        # Targets are similar to variables: the target and its dependencies
        # need to be mangled.
@@ -158,7 +168,7 @@ EOF
 
 print <<'EOF';
 gnulib_lt_objects = $(libgnu_la_OBJECTS) $(gl_LTLIBOBJS)
-$(gnulib_lt_objects): $(gnulib_headers)
+$(gnulib_lt_objects): $(gnulib_src_headers)
 EOF
 print @cleanfiles;
 
@@ -172,9 +182,21 @@ if (defined $m4output) {
 
        open(M4OUT, '>', $m4output) or die "$m4output: $!\n";
 
-       print M4OUT "dnl This file was generated by fix-gnulib.pl\n";
-       print M4OUT "AC_DEFUN([$m4macro], [dnl\n";
+       print M4OUT <<EOF;
+dnl This file was generated by fix-gnulib.pl
+dnl
+dnl Usage: DX_FIX_GNULIB([symbol-prefix])
+dnl   where symbol-prefix is the application-specific symbol prefix to apply
+dnl   to Gnulib's symbols.  Defaults to \${PACKAGE}__.
+dnl   top-level source directory; e.g. lib.
+AC_DEFUN([$m4macro], [dnl
+EOF
        print M4OUT <<'EOF';
+GLSRC=lib
+GLSYM_PREFIX='ifelse([$1], [], [${PACKAGE}__], [$1])'
+AC_SUBST([GLSRC])
+AC_SUBST([GLSYM_PREFIX])
+
 m4_foreach([gl_objvar], [[gl_LIBOBJS], [gl_LTLIBOBJS]], [dnl
 set x $gl_objvar; shift
 gl_objvar=
@@ -183,7 +205,6 @@ while test ${#} -gt 0; do
 done
 ])
 EOF
-
        foreach (@vars) {
                print M4OUT "$_=\${$_:+lib/\$$_}\n";
        }