]> git.draconx.ca Git - dxcommon.git/blobdiff - scripts/fix-gnulib.pl
Rewrite Gnulib symbols to be in libcdecl's namespace.
[dxcommon.git] / scripts / fix-gnulib.pl
index 6663e6e4b49c333eb95b53fcb10b0657f6d7417c..b8185fa642107538128023f844d76eb03191f286 100755 (executable)
@@ -30,6 +30,7 @@ open STDIN,  "<", $input  or die "$input: $!\n"  if (defined $input);
 
 my $printed_header = 0;
 my (%allvars, %sourcevars);
+my @cleanfiles;
 
 sub drop {
        undef $_;
@@ -87,7 +88,16 @@ 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_core_headers = $(gnulib_orderonly)
+gnulib_src_headers = $(gnulib_core_headers)
+gnulib_headers = $(gnulib_src_headers)
+EOF
+
                $printed_header = 1;
                drop;
        }
@@ -122,17 +132,38 @@ 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_core_headers/;
+
        # Targets are similar to variables: the target and its dependencies
        # need to be mangled.
        if (/:/) {
                $_ = mangle_target($_);
        }
 
+       # When using conditional-dependencies, *CLEANFILES can end up
+       # depending on the configuration.  This means that "make distclean"
+       # may not actually delete everything if the configuration changes
+       # after building the package.  Stash all the variables for later so
+       # they can be moved outside of any conditional.
+       if (/CLEANFILES/) {
+               push(@cleanfiles, $_);
+               drop;
+       }
+
        # Finally, references to $(srcdir) and $(builddir) need to be fixed up.
        s:\$\(srcdir\):\$\(top_srcdir\)/lib:g;
        s:\$\(builddir\):\$\(top_builddir\)/lib:g;
 } continue { print };
 
+print <<'EOF';
+gnulib_lt_objects = $(libgnu_la_OBJECTS) $(gl_LTLIBOBJS)
+$(gnulib_lt_objects): $(gnulib_src_headers)
+EOF
+print @cleanfiles;
+
 # 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
@@ -143,8 +174,29 @@ 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=
+while test ${#} -gt 0; do
+       gl_objvar="$gl_objvar lib/${1}"; shift
+done
+])
+EOF
        foreach (@vars) {
                print M4OUT "$_=\${$_:+lib/\$$_}\n";
        }