X-Git-Url: https://git.draconx.ca/gitweb/dxcommon.git/blobdiff_plain/e218d4445fa5a2015163cf50d847980ff3240b36..9cacb902a5d6f6c4271ee3066e2efe13663f145a:/scripts/fix-gnulib.pl diff --git a/scripts/fix-gnulib.pl b/scripts/fix-gnulib.pl index 51bdf59..640f1cd 100755 --- a/scripts/fix-gnulib.pl +++ b/scripts/fix-gnulib.pl @@ -1,6 +1,6 @@ #!/usr/bin/env perl # -# Copyright © 2011-2014, 2020-2021 Nick Bowler +# Copyright © 2011-2014, 2020-2023 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 @@ -63,6 +63,7 @@ open STDOUT, ">", $output or die "$output: $!\n" if (defined $output); open STDIN, "<", $input or die "$input: $!\n" if (defined $input); my $printed_header = 0; +my $check_mkdir; my @cleanfiles; # Hashes to record make variables used in the automake source. The allvars @@ -168,12 +169,12 @@ EOF # something actually depends on it (which is typically the case). if (/^noinst_LIBRARIES.*libgnu.a/) { s/^noinst/EXTRA/; - $for_library //= 0; + $for_library = 0 unless defined $for_library; $use_libtool = 0; } if (/^noinst_LTLIBRARIES.*libgnu.la/) { s/^noinst/EXTRA/; - $for_library //= 1; + $for_library = 1 unless defined $for_library; $use_libtool = 1; } @@ -186,6 +187,16 @@ EOF # useful for non-recursive builds. Strip them out. drop if (/^(AM_CPPFLAGS|AM_CFLAGS)/); + # We don't care about upstream warning flags that just result in adding + # massive amounts of additional build rules for no reason. + if (/_CFLAGS/) { + s/ *\$\(GL_CFLAG_GNULIB_WARNINGS\)// if /_CFLAGS\s*=/; + } + + # Drop superfluous CFLAGS assignments (which may be created by above + # transformation). + drop if /_CFLAGS\s*=\s*\$\(AM_CFLAGS\)\s*$/; + # 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 @@ -211,7 +222,7 @@ EOF if (/^([[:word:]]+)[[:space:]]*\+?=/) { $allvars{$1} = 1; - if (/_SOURCES|CLEANFILES|EXTRA_DIST|[[:upper:]]+_H/) { + if ($1 =~ /(_SOURCES|CLEANFILES|EXTRA_DIST|[[:upper:]]+_H)$/) { $_ = mangle_variable($_); } } @@ -221,9 +232,23 @@ EOF # ordinary variable so we can deal with them later. s/BUILT_SOURCES/gnulib_core_headers/; + # Rules for "toplevel" header files do not include commands to create + # the target directory; let's add that. + if (defined $check_mkdir) { + if (/gl_V_at/ || /AM_V_GEN/ and not /MKDIR_P/) { + my $dir = "lib/$check_mkdir"; + $dir =~ s|/[^/]*||; + + print "\t\$(AM_V_GEN)\$(MKDIR_P) $dir\n"; + s/AM_V_GEN|gl_V_at/AM_V_at/; + } + undef $check_mkdir + } + # Targets are similar to variables: the target and its dependencies # need to be mangled. - if (/^[^\t].*:/) { + if (/^([^\t:]*):/) { + $check_mkdir = $1; $_ = mangle_target($_); } @@ -246,18 +271,21 @@ EOF # component. s/t-\$@/\$\@-t/g; - # Finally, references to $(srcdir) and $(builddir) need to be fixed up. + # Finally, $(srcdir), $(builddir) and %reldir% need to be fixed up. s:\$\(srcdir\):\$\(top_srcdir\)/lib:g; s:\$\(builddir\):\$\(top_builddir\)/lib:g; + s:%reldir%:lib:g; } continue { s/(\n.)/\\\1/g; print; }; print <<'EOF' if ($use_libtool); gnulib_lt_objects = $(libgnu_la_OBJECTS) $(gl_LTLIBOBJS) gnulib_objects = $(gnulib_lt_objects) +gnulib_all_symfiles = $(gnulib_lt_objects:.lo=.glsym) $(gnulib_objects): $(gnulib_headers) EOF print <<'EOF' if (!$use_libtool); gnulib_objects = $(libgnu_a_OBJECTS) $(gl_LIBOBJS) +gnulib_all_symfiles = $(gnulib_objects:.@OBJEXT@=.glsym) $(gnulib_objects): $(gnulib_headers) EOF @@ -271,9 +299,9 @@ AC_SUBST([GLSRC], [lib]) AC_CONFIG_LIBOBJ_DIR([lib]) AC_DEFUN_ONCE([DX_GLSYM_PREFIX], -[AC_REQUIRE([DX_AUTOMAKE_COMPAT])AC_REQUIRE([DX_EXPORTED_SH]) -AC_SUBST([GLSYM_PREFIX], [$1]) -]) +[AC_REQUIRE([DX_AUTOMAKE_COMPAT])AC_REQUIRE([DX_EXPORTED_SH])dnl +AC_SUBST([GLSYM_PREFIX], [$1])dnl +AC_SUBST([gnulib_symfiles], ['$(gnulib_all_symfiles)'])]) EOF print <<'EOF' if ($for_library);