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




Reply via email to