bug-gnulib@gnu.org mirror (unofficial)
 help / color / mirror / Atom feed
From: Bruno Haible <bruno@clisp.org>
To: Paul Eggert <eggert@cs.ucla.edu>
Cc: bug-gnulib@gnu.org, Reuben Thomas <rrt@sc3d.org>
Subject: Re: Interference between two installations of gnulib
Date: Sun, 13 Jun 2021 22:55:41 +0200	[thread overview]
Message-ID: <2346037.MTHoLHxhaa@omega> (raw)
In-Reply-To: <111e3305-4023-415b-3631-653b87a09e2c@cs.ucla.edu>

Paul Eggert wrote:
> > Having two separate configure scripts is undesirable, because that would
> > increase the total configure time of the package (and people have already
> > complained about the configure time).
> > 
> > The same problem is seen also in GNU gettext and in GNU poke. I'm fixing it
> > through the attached patch set.
> 
> Unfortunately this broke getopt-gnu on Solaris 10, because it relies on 
> this line in modules/unistd:
> 
> 	      -e 
> 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_${gl_include_guard_prefix}_UNISTD_H_GETOPT)/g' 
> \
> 
> and substitution went awry in this line, resulting in:
> 
>                -e 
> 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GL_GNULIB_GL_UNISTD_H_GETOPT)/g' \
> 
> This caused 'make check' to fail because test-getopt-gnu.c was testing 
> Solaris getopt rather than the Gnulib substitute.
> 
> I discovered the problem after updating GNU grep to use the latest 
> Gnulib, and after someone else's buildbots failed on Solaris 10 with 
> 'grep' and I got notified of their failures:
> 
> https://buildfarm.opencsw.org/buildbot/builders/ggrep-solaris10-i386/builds/227
> https://buildfarm.opencsw.org/buildbot/builders/ggrep-solaris10-sparc/builds/229
> 
> I installed the attached patch to work around the problem.

Oh, I see:
My "Support several gnulib-tool invocations under the same configure.ac."
commit from 2021-04-11 interfered with the
"Fix conflict between two instantiations of module 'unistd'." commit
from 2011-11-26. Both attempt to do the same thing, just with a different
naming conventions of the substituted variables. And the later commit is in
fact a generalization of the older one. So, instead of adding a workaround,
it is simpler to just rework the older patch.

More precisely, we have 3 times the same situation, between module 'unistd'
and modules
  getopt-posix
  nonblocking
  sigpipe.

The simpler fix is to treat GNULIB_UNISTD_H_GETOPT like
GNULIB_UNISTD_H_NONBLOCKING and GNULIB_UNISTD_H_SIGPIPE.
Done through the patch below. It uses gl_MODULE_INDICATOR_INIT_VARIABLE
conditionally, like done in modules/windows-stat-override.
Tested with a current GNU grep checkout, on Solaris 10/x86_64.

> The Python 
> patch is obviously a hack (and I haven't tested it); suggestions for 
> improvements are welcome.

Few people are using the Python-based implementation at this point
(the wget2 people, in particular). If I'm not sure how to keep pygnulib/*
in sync with gnulib-tool, I just leave it out, and leave an entry in
gnulib-tool.py.TODO.


2021-06-13  Bruno Haible  <bruno@clisp.org>

	Align 2011-11-26 patch to 2021-04-11 patch (regression from 2021-04-11).
	Reported by Paul Eggert.
	* m4/unistd_h.m4 (gl_UNISTD_H_REQUIRE_DEFAULTS): Also initialize
	GNULIB_UNISTD_H_GETOPT variable.
	* modules/getopt-posix (configure.ac): Set GNULIB_UNISTD_H_GETOPT
	variable.
	* modules/unistd (Makefile.am): Rely on ${gl_include_guard_prefix}
	processing done by gnulib-tool since 2021-04-11.
	* gnulib-tool: Revert last change.
	* pygnulib/GLEmiter.py: Likewise.

diff --git a/m4/unistd_h.m4 b/m4/unistd_h.m4
index a40a41b..0ce4ea4 100644
--- a/m4/unistd_h.m4
+++ b/m4/unistd_h.m4
@@ -1,4 +1,4 @@
-# unistd_h.m4 serial 88
+# unistd_h.m4 serial 89
 dnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -133,6 +133,7 @@ AC_DEFUN([gl_UNISTD_H_REQUIRE_DEFAULTS],
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_SYMLINKAT])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TRUNCATE])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TTYNAME_R])
+    gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_GETOPT])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_NONBLOCKING])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_SIGPIPE])
     gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNLINK])
diff --git a/modules/getopt-posix b/modules/getopt-posix
index cbcfff5..1a665e1 100644
--- a/modules/getopt-posix
+++ b/modules/getopt-posix
@@ -25,10 +25,10 @@ gl_FUNC_GETOPT_POSIX
 if test $REPLACE_GETOPT = 1; then
   AC_LIBOBJ([getopt])
   AC_LIBOBJ([getopt1])
-  dnl Arrange for unistd.h to include getopt.h.
-  GNULIB_${gl_include_guard_prefix}_UNISTD_H_GETOPT=1
+  dnl Define the substituted variable GNULIB_UNISTD_H_GETOPT to 1.
+  gl_UNISTD_H_REQUIRE_DEFAULTS
+  gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_UNISTD_H_GETOPT], [1])
 fi
-AC_SUBST([GNULIB_${gl_include_guard_prefix}_UNISTD_H_GETOPT])
 gl_UNISTD_MODULE_INDICATOR([getopt-posix])
 
 Makefile.am:
diff --git a/modules/unistd b/modules/unistd
index 281924f..acc9d86 100644
--- a/modules/unistd
+++ b/modules/unistd
@@ -93,7 +93,7 @@ unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H
 	      -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \
 	      -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \
 	      -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \
-	      -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_${gl_include_guard_prefix}_UNISTD_H_GETOPT)/g' \
+	      -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_UNISTD_H_GETOPT)/g' \
 	      -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \
 	      -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \
 	      -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \
diff --git a/gnulib-tool b/gnulib-tool
index 1ea6580..63a875d 100755
--- a/gnulib-tool
+++ b/gnulib-tool
@@ -3700,7 +3700,7 @@ func_emit_lib_Makefile_am ()
                 -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \
                 -e "$sed_eliminate_LDFLAGS" \
                 -e 's,lib_\([A-Z][A-Z]*\),'"${libname}_${libext}"'_\1,g' \
-                -e 's,\$(\(GNULIB_[A-Z]\),$('"${module_indicator_prefix}"'_\1,' \
+                -e 's,\$(GNULIB_,$('"${module_indicator_prefix}"'_GNULIB_,' \
                 -e 's,lib%_LIBRARIES,lib_LIBRARIES,g' \
                 -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g' \
                 -e "$sed_transform_check_PROGRAMS" \
@@ -3714,7 +3714,7 @@ func_emit_lib_Makefile_am ()
           func_get_automake_snippet_unconditional "$module" |
             LC_ALL=C \
             sed -e 's,lib_\([A-Z][A-Z]*\),'"${libname}_${libext}"'_\1,g' \
-                -e 's,\$(\(GNULIB_[A-Z]\),$('"${module_indicator_prefix}"'_\1,'
+                -e 's,\$(GNULIB_,$('"${module_indicator_prefix}"'_GNULIB_,'
         } > "$tmp"/amsnippet2
         # Skip the contents if it's entirely empty.
         if grep '[^	 ]' "$tmp"/amsnippet1 "$tmp"/amsnippet2 > /dev/null ; then
@@ -4058,7 +4058,7 @@ func_emit_tests_Makefile_am ()
                 -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \
                 -e "$sed_eliminate_LDFLAGS" \
                 -e 's,lib_\([A-Z][A-Z]*\),libtests_a_\1,g' \
-                -e 's,\$(\(GNULIB_[A-Z]\),$('"${module_indicator_prefix}"'_\1,' \
+                -e 's,\$(GNULIB_,$('"${module_indicator_prefix}"'_GNULIB_,' \
                 -e 's,lib%_LIBRARIES,lib_LIBRARIES,g' \
                 -e 's,lib%_LTLIBRARIES,lib_LTLIBRARIES,g' \
                 -e "$sed_transform_check_PROGRAMS" \
@@ -4072,7 +4072,7 @@ func_emit_tests_Makefile_am ()
           func_get_automake_snippet_unconditional "$module" |
             LC_ALL=C \
             sed -e 's,lib_\([A-Z][A-Z]*\),libtests_a_\1,g' \
-                -e 's,\$(\(GNULIB_[A-Z]\),$('"${module_indicator_prefix}"'_\1,'
+                -e 's,\$(GNULIB_,$('"${module_indicator_prefix}"'_GNULIB_,'
         } > "$tmp"/amsnippet2
         # Skip the contents if it's entirely empty.
         if grep '[^	 ]' "$tmp"/amsnippet1 "$tmp"/amsnippet2 > /dev/null ; then
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index 729862b..e6b5a2a 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -716,12 +716,8 @@ AC_DEFUN([%V1%_LIBSOURCES], [
                 pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
                 amsnippet1 = pattern.sub('%s_%s_\\1' %
                                          (libname, libext), amsnippet1)
-                # FIXME: Use regular expression substitution instead
-                # of this hack.
-                amsnippet1 = amsnippet1.replace('$(GNULIB_$', '$(GNULIB!@#$%')
                 amsnippet1 = amsnippet1.replace(
                     '$(GNULIB_', '$(' + module_indicator_prefix + '_GNULIB_')
-                amsnippet1 = amsnippet1.replace('$(GNULIB!@#$%', '$(GNULIB_$')
                 amsnippet1 = amsnippet1.replace(
                     'lib%_LIBRARIES', 'lib_LIBRARIES')
                 amsnippet1 = amsnippet1.replace(
@@ -745,12 +741,8 @@ AC_DEFUN([%V1%_LIBSOURCES], [
                 pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
                 amsnippet2 = pattern.sub('%s_%s_\\1' %
                                          (libname, libext), amsnippet2)
-                # FIXME: Use regular expression substitution instead
-                # of this hack.
-                amsnippet2 = amsnippet2.replace('$(GNULIB_$', '$(GNULIB!@#$%')
                 amsnippet2 = amsnippet2.replace(
                     '$(GNULIB_', '$(' + module_indicator_prefix + '_GNULIB_')
-                amsnippet1 = amsnippet2.replace('$(GNULIB!@#$%', '$(GNULIB_$')
                 if type(amsnippet1) is bytes:
                     amsnippet1 = amsnippet1.decode(ENCS['default'])
                 if type(amsnippet2) is bytes:
@@ -1019,12 +1011,8 @@ AC_DEFUN([%V1%_LIBSOURCES], [
                     snippet = pattern.sub('', snippet)
                 pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M)
                 snippet = pattern.sub('libtests_a_\\1', snippet)
-                # FIXME: Use regular expression substitution instead
-                # of this hack.
-                snippet = snippet.replace('$(GNULIB_$', '$(GNULIB!@#$%')
                 snippet = snippet.replace(
                     '$(GNULIB_', '$(' + module_indicator_prefix + '_GNULIB_')
-                snippet = snippet.replace('$(GNULIB!@#$%', '$(GNULIB_$')
                 snippet = snippet.replace('lib%_LIBRARIES', 'lib_LIBRARIES')
                 snippet = snippet.replace(
                     'lib%_LTLIBRARIES', 'lib_LTLIBRARIES')



  reply	other threads:[~2021-06-13 20:55 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-10  7:38 Interference between two installations of gnulib Reuben Thomas
2021-04-11 19:32 ` Bruno Haible
2021-04-12  7:50   ` Reuben Thomas
2021-04-17 15:17   ` Bruno Haible
2021-04-18 11:16     ` Bruno Haible
2021-06-13 17:41   ` Paul Eggert
2021-06-13 20:55     ` Bruno Haible [this message]
2021-06-13 21:11     ` general comments about gnulib Bruno Haible

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://lists.gnu.org/mailman/listinfo/bug-gnulib

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2346037.MTHoLHxhaa@omega \
    --to=bruno@clisp.org \
    --cc=bug-gnulib@gnu.org \
    --cc=eggert@cs.ucla.edu \
    --cc=rrt@sc3d.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).