This patch fixes a long-standing bug in gnulib-tool: Library-specific CPPFLAGS and CFLAGS, i.e. libgnu_a_CPPFLAGS and libgnu_a_CFLAGS, would only apply to object files declared through
lib_SOURCES += foobar.c but not to object files declared through AC_LIBOBJ([foobar]) For the latter, the $(AM_CPPFLAGS) and $(AM_CFLAGS) were used. Which is problematic, because these variables are under control of the maintainer of the package that uses Gnulib and thus ignores Gnulib preferences regarding warning options. The fix exploits the fact that Automake already generates a Makefile rule for libgnu_a_foobar.o and libgnu_a_foobar.obj. Where gl_LIBOBJS contains "foobar.o", we only have to create a new variable gl_libgnu_LIBOBJS which contains "libgnu_a-foobar.o" and use that variable for libgnu_a_LIBADD and libgnu_a_DEPENDENCIES. 2025-02-03 Bruno Haible <br...@clisp.org> gnulib-tool: Apply libgnu.{,l}a specific CFLAGS to all its object files. * gnulib-tool.sh (func_emit_initmacro_end): Define ${macro_prefix}_${libname}_{LIBOBJS,LTLIBOBJS,LIBOBJDEPS} macros, that include libname in the base name of the object files. (func_emit_lib_Makefile_am): Use ${macro_prefix}_${libname}_*LIBOBJS values instead of ${macro_prefix}_*LIBOBJS values. * pygnulib/GLEmiter.py (GLEmiter.initmacro_end): Define {macro_prefix_arg}_{libname}_{LIBOBJS,LTLIBOBJS,LIBOBJDEPS} macros, that include libname in the base name of the object files. (GLEmiter.lib_Makefile_am):Use {macro_prefix}_{libname}_*LIBOBJS values instead of {macro_prefix}_*LIBOBJS values. diff --git a/gnulib-tool.sh b/gnulib-tool.sh index e1188eeb20..eedeb306bc 100755 --- a/gnulib-tool.sh +++ b/gnulib-tool.sh @@ -4030,8 +4030,8 @@ func_emit_lib_Makefile_am () fi # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@. - echo "${libname}_${libext}_LIBADD = \$(${macro_prefix}_${perhapsLT}LIBOBJS)" - echo "${libname}_${libext}_DEPENDENCIES = \$(${macro_prefix}_${perhapsLT}LIBOBJS)" + echo "${libname}_${libext}_LIBADD = \$(${macro_prefix}_${libname}_${perhapsLT}LIBOBJS)" + echo "${libname}_${libext}_DEPENDENCIES = \$(${macro_prefix}_${libname}_${perhapsLT}LIBOBJS)" echo "EXTRA_${libname}_${libext}_SOURCES =" if test "$libtool" = true; then echo "${libname}_${libext}_LDFLAGS = \$(AM_LDFLAGS)" @@ -4067,7 +4067,7 @@ func_emit_lib_Makefile_am () # Extend the 'distclean' rule. echo "distclean-local: distclean-gnulib-libobjs" echo "distclean-gnulib-libobjs:" - echo " -rm -f @${macro_prefix}_LIBOBJDEPS@" + echo " -rm -f @${macro_prefix}_${libname}_LIBOBJDEPS@" # Extend the 'maintainer-clean' rule. echo "maintainer-clean-local: distclean-gnulib-libobjs" rm -f "$tmp"/allsnippets @@ -4537,6 +4537,7 @@ func_emit_initmacro_start () # - gentests true if a tests Makefile.am is being generated, # false otherwise # - automake_subdir true if --automake-subdir was given, false otherwise +# - libname library name # - libtool true if --libtool was given, false if --no-libtool was # given, blank otherwise func_emit_initmacro_end () @@ -4568,14 +4569,16 @@ func_emit_initmacro_end () echo " ${macro_prefix_arg}_libobjs=" echo " ${macro_prefix_arg}_ltlibobjs=" echo " ${macro_prefix_arg}_libobjdeps=" + echo " ${macro_prefix_arg}_${libname}_libobjs=" + echo " ${macro_prefix_arg}_${libname}_ltlibobjs=" + echo " ${macro_prefix_arg}_${libname}_libobjdeps=" echo " if test -n \"\$${macro_prefix_arg}_LIBOBJS\"; then" echo " # Remove the extension." echo "changequote(,)dnl" echo " sed_drop_objext='s/\\.o\$//;s/\\.obj\$//'" echo " sed_dirname1='s,//*,/,g'" echo " sed_dirname2='s,\\(.\\)/\$,\\1,'" - echo " sed_dirname3='s,^[^/]*\$,.,'" - echo " sed_dirname4='s,\\(.\\)/[^/]*\$,\\1,'" + echo " sed_dirname3='s,[^/]*\$,,'" echo " sed_basename1='s,.*/,,'" echo "changequote([, ])dnl" if $automake_subdir && ! "$2" && test -n "$sourcebase" && test "$sourcebase" != '.'; then @@ -4588,18 +4591,25 @@ func_emit_initmacro_end () echo " for i in \`for i in \$${macro_prefix_arg}_LIBOBJS; do echo \"\$i\"; done | sed -e \"\$sed_drop_objext\" | sort | uniq\`; do" echo " ${macro_prefix_arg}_libobjs=\"\$${macro_prefix_arg}_libobjs ${subdir}\$i.\$ac_objext\"" echo " ${macro_prefix_arg}_ltlibobjs=\"\$${macro_prefix_arg}_ltlibobjs ${subdir}\$i.lo\"" - echo " i_dir=\`echo \"\$i\" | sed -e \"\$sed_dirname1\" -e \"\$sed_dirname2\" -e \"\$sed_dirname3\" -e \"\$sed_dirname4\"\`" + echo " i_dir=\`echo \"\$i\" | sed -e \"\$sed_dirname1\" -e \"\$sed_dirname2\" -e \"\$sed_dirname3\"\`" echo " i_base=\`echo \"\$i\" | sed -e \"\$sed_basename1\"\`" + echo " ${macro_prefix_arg}_${libname}_libobjs=\"\$${macro_prefix_arg}_${libname}_libobjs ${subdir}\$i_dir\"\"${libname}_a-\$i_base.\$ac_objext\"" + echo " ${macro_prefix_arg}_${libname}_ltlibobjs=\"\$${macro_prefix_arg}_${libname}_ltlibobjs ${subdir}\$i_dir\"\"${libname}_la-\$i_base.lo\"" if test "$libtool" = true; then - echo " ${macro_prefix_arg}_libobjdeps=\"\$${macro_prefix_arg}_libobjdeps ${subdir}\$i_dir/\\\$(DEPDIR)/\$i_base.Plo\"" + echo " ${macro_prefix_arg}_libobjdeps=\"\$${macro_prefix_arg}_libobjdeps ${subdir}\$i_dir\\\$(DEPDIR)/\$i_base.Plo\"" + echo " ${macro_prefix_arg}_${libname}_libobjdeps=\"\$${macro_prefix_arg}_${libname}_libobjdeps ${subdir}\$i_dir\\\$(DEPDIR)/${libname}_la-\$i_base.Plo\"" else - echo " ${macro_prefix_arg}_libobjdeps=\"\$${macro_prefix_arg}_libobjdeps ${subdir}\$i_dir/\\\$(DEPDIR)/\$i_base.Po\"" + echo " ${macro_prefix_arg}_libobjdeps=\"\$${macro_prefix_arg}_libobjdeps ${subdir}\$i_dir\\\$(DEPDIR)/\$i_base.Po\"" + echo " ${macro_prefix_arg}_${libname}_libobjdeps=\"\$${macro_prefix_arg}_${libname}_libobjdeps ${subdir}\$i_dir\\\$(DEPDIR)/${libname}_a-\$i_base.Po\"" fi echo " done" echo " fi" echo " AC_SUBST([${macro_prefix_arg}_LIBOBJS], [\$${macro_prefix_arg}_libobjs])" echo " AC_SUBST([${macro_prefix_arg}_LTLIBOBJS], [\$${macro_prefix_arg}_ltlibobjs])" echo " AC_SUBST([${macro_prefix_arg}_LIBOBJDEPS], [\$${macro_prefix_arg}_libobjdeps])" + echo " AC_SUBST([${macro_prefix_arg}_${libname}_LIBOBJS], [\$${macro_prefix_arg}_${libname}_libobjs])" + echo " AC_SUBST([${macro_prefix_arg}_${libname}_LTLIBOBJS], [\$${macro_prefix_arg}_${libname}_ltlibobjs])" + echo " AC_SUBST([${macro_prefix_arg}_${libname}_LIBOBJDEPS], [\$${macro_prefix_arg}_${libname}_libobjdeps])" echo " ])" } diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py index 42cd616f6e..a8f22ed97c 100644 --- a/pygnulib/GLEmiter.py +++ b/pygnulib/GLEmiter.py @@ -540,6 +540,7 @@ def initmacro_end(self, macro_prefix_arg: str, gentests: bool) -> str: testsbase = self.config['testsbase'] automake_subdir = self.config['automake_subdir'] automake_subdir_tests = self.config['automake_subdir_tests'] + libname = self.config['libname'] libtool = self.config['libtool'] emit = '' # Check the presence of files that are mentioned as AC_LIBSOURCES @@ -553,9 +554,11 @@ def initmacro_end(self, macro_prefix_arg: str, gentests: bool) -> str: else: subdir = '' if libtool: - libobjdeps = f'{macro_prefix_arg}_libobjdeps="${macro_prefix_arg}_libobjdeps {subdir}$i_dir/\\$(DEPDIR)/$i_base.Plo"' + libobjdeps_line1 = f'{macro_prefix_arg}_libobjdeps="${macro_prefix_arg}_libobjdeps {subdir}$i_dir\\$(DEPDIR)/$i_base.Plo"' + libobjdeps_line2 = f'{macro_prefix_arg}_{libname}_libobjdeps="${macro_prefix_arg}_{libname}_libobjdeps {subdir}$i_dir\\$(DEPDIR)/{libname}_la-$i_base.Plo"' else: - libobjdeps = f'{macro_prefix_arg}_libobjdeps="${macro_prefix_arg}_libobjdeps {subdir}$i_dir/\\$(DEPDIR)/$i_base.Po"' + libobjdeps_line1 = f'{macro_prefix_arg}_libobjdeps="${macro_prefix_arg}_libobjdeps {subdir}$i_dir\\$(DEPDIR)/$i_base.Po"' + libobjdeps_line2 = f'{macro_prefix_arg}_{libname}_libobjdeps="${macro_prefix_arg}_{libname}_libobjdeps {subdir}$i_dir\\$(DEPDIR)/{libname}_a-$i_base.Po"' emit += fr''' m4_ifval({macro_prefix_arg}_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([{macro_prefix_arg}_LIBSOURCES_DIR])[ || for gl_file in ]{macro_prefix_arg}_LIBSOURCES_LIST[ ; do @@ -578,27 +581,35 @@ def initmacro_end(self, macro_prefix_arg: str, gentests: bool) -> str: {macro_prefix_arg}_libobjs= {macro_prefix_arg}_ltlibobjs= {macro_prefix_arg}_libobjdeps= + {macro_prefix_arg}_{libname}_libobjs= + {macro_prefix_arg}_{libname}_ltlibobjs= + {macro_prefix_arg}_{libname}_libobjdeps= if test -n "${macro_prefix_arg}_LIBOBJS"; then # Remove the extension. changequote(,)dnl sed_drop_objext='s/\.o$//;s/\.obj$//' sed_dirname1='s,//*,/,g' sed_dirname2='s,\(.\)/$,\1,' - sed_dirname3='s,^[^/]*$,.,' - sed_dirname4='s,\(.\)/[^/]*$,\1,' + sed_dirname3='s,[^/]*$,,' sed_basename1='s,.*/,,' changequote([, ])dnl for i in `for i in ${macro_prefix_arg}_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do {macro_prefix_arg}_libobjs="${macro_prefix_arg}_libobjs {subdir}$i.$ac_objext" {macro_prefix_arg}_ltlibobjs="${macro_prefix_arg}_ltlibobjs {subdir}$i.lo" - i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3" -e "$sed_dirname4"` + i_dir=`echo "$i" | sed -e "$sed_dirname1" -e "$sed_dirname2" -e "$sed_dirname3"` i_base=`echo "$i" | sed -e "$sed_basename1"` - {libobjdeps} + {macro_prefix_arg}_{libname}_libobjs="${macro_prefix_arg}_{libname}_libobjs {subdir}$i_dir""{libname}_a-$i_base.$ac_objext" + {macro_prefix_arg}_{libname}_ltlibobjs="${macro_prefix_arg}_{libname}_ltlibobjs {subdir}$i_dir""{libname}_la-$i_base.lo" + {libobjdeps_line1} + {libobjdeps_line2} done fi AC_SUBST([{macro_prefix_arg}_LIBOBJS], [${macro_prefix_arg}_libobjs]) AC_SUBST([{macro_prefix_arg}_LTLIBOBJS], [${macro_prefix_arg}_ltlibobjs]) AC_SUBST([{macro_prefix_arg}_LIBOBJDEPS], [${macro_prefix_arg}_libobjdeps]) + AC_SUBST([{macro_prefix_arg}_{libname}_LIBOBJS], [${macro_prefix_arg}_{libname}_libobjs]) + AC_SUBST([{macro_prefix_arg}_{libname}_LTLIBOBJS], [${macro_prefix_arg}_{libname}_ltlibobjs]) + AC_SUBST([{macro_prefix_arg}_{libname}_LIBOBJDEPS], [${macro_prefix_arg}_{libname}_libobjdeps]) ]) ''' return emit @@ -904,8 +915,8 @@ def lib_Makefile_am(self, destfile: str, modules: list[GLModule], moduletable: G emit += '%s_%s_CFLAGS = $(AM_CFLAGS) $(GL_CFLAG_GNULIB_WARNINGS)\n' % (libname, libext) # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@. - emit += '%s_%s_LIBADD = $(%s_%sLIBOBJS)\n' % (libname, libext, macro_prefix, perhapsLT) - emit += '%s_%s_DEPENDENCIES = $(%s_%sLIBOBJS)\n' % (libname, libext, macro_prefix, perhapsLT) + emit += '%s_%s_LIBADD = $(%s_%s_%sLIBOBJS)\n' % (libname, libext, macro_prefix, libname, perhapsLT) + emit += '%s_%s_DEPENDENCIES = $(%s_%s_%sLIBOBJS)\n' % (libname, libext, macro_prefix, libname, perhapsLT) emit += 'EXTRA_%s_%s_SOURCES =\n' % (libname, libext) if libtool: emit += '%s_%s_LDFLAGS = $(AM_LDFLAGS)\n' % (libname, libext) @@ -944,7 +955,7 @@ def lib_Makefile_am(self, destfile: str, modules: list[GLModule], moduletable: G # Extend the 'distclean' rule. emit += 'distclean-local: distclean-gnulib-libobjs\n' emit += 'distclean-gnulib-libobjs:\n' - emit += '\t-rm -f @%s_LIBOBJDEPS@\n' % (macro_prefix) + emit += '\t-rm -f @%s_%s_LIBOBJDEPS@\n' % (macro_prefix, libname) # Extend the 'maintainer-clean' rule. emit += 'maintainer-clean-local: distclean-gnulib-libobjs\n' return emit