Hi Paul,

> * There seem to be similar issues with modules/fnmatch's 
> "gl_CONDITIONAL_HEADER([fnmatch.h])" duplicating fnmatch-h, 
> modules/glob's "gl_CONDITIONAL_HEADER([glob.h])" duplicating glob-h, and 
> modules/iconv_open's "gl_CONDITIONAL_HEADER([iconv.h])".

Yes, there are in total 4 occurrences (currently) of this idiom:

modules/fnmatch:gl_CONDITIONAL_HEADER([fnmatch.h])
modules/glob:gl_CONDITIONAL_HEADER([glob.h])
modules/iconv_open:gl_CONDITIONAL_HEADER([iconv.h])
modules/stdint:gl_CONDITIONAL_HEADER([limits.h])

> I worked around the problem by installing the attached patch.

The patch is not right. If we have, in this order,
  1. an invocation of gl_LIMITS_H that happens to set
     GL_GENERATE_LIMITS_H to false,
  2. an invocation of gl_CONDITIONAL_HEADER([limits.h]) from the
     'limits' module,
  3. an invocation of gl_REPLACE_LIMITS_H, from the 'stdint'
     module,
the Automake invocation will substitute variables
GL_GENERATE_LIMITS_H_TRUE and GL_GENERATE_LIMITS_H_FALSE that
have been computed from step 1, not from step 3.

> this resulted in 'configure' failing with the diagnostic "*** 
> GL_GENERATE_LIMITS_H is not set correctly".

Oops; this is unexpected.

> I tried using the latest Gnulib with Emacs and ran into a problem.

Unfortunately, you didn't tell how to reproduce it. In a current emacs git
checkout, I ran
  $ admin/merge-gnulib $GNULIB_SRCDIR
  $ grep GL_GENERATE_LIMITS_H configure
  GL_GENERATE_LIMITS_H
      GL_GENERATE_LIMITS_H=false
      GL_GENERATE_LIMITS_H=true
    GL_GENERATE_LIMITS_H=true
    case "$GL_GENERATE_LIMITS_H" in
      *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;;
    $GL_GENERATE_LIMITS_H && GL_GENERATE_LIMITS_H=1 || GL_GENERATE_LIMITS_H=
    case "$GL_GENERATE_LIMITS_H" in
      *) echo "*** GL_GENERATE_LIMITS_H is not set correctly" 1>&2; exit 1 ;;
    $GL_GENERATE_LIMITS_H && GL_GENERATE_LIMITS_H=1 || GL_GENERATE_LIMITS_H=

As you can see, there is
  - one expansion of gl_LIMITS_H, that sets GL_GENERATE_LIMITS_H to
    false or true.
  - Then there is an expansion of gl_REPLACE_LIMITS_H, that sets it true always.
  - Then come two copies of gl_CONDITIONAL_HEADER([limits.h]).
But what are the
  '$GL_GENERATE_LIMITS_H && GL_GENERATE_LIMITS_H=1 || GL_GENERATE_LIMITS_H='
lines??

The macro gl_CONDITIONAL_HEADER is written in such a way that it can be
invoked twice. It is not exactly idemponent, because it needs to handle
the case that the first invocation is for the lib/ directory and the
second invocation is for the tests/ directory.

> The resulting 'configure' script executed two copies of the following code:
> 
>    case "$GL_GENERATE_STDINT_H" in 
>      false) STDINT_H='' ;; 
>      true) 
>                    if test -z "$STDINT_H"; then 
>          STDINT_H="${gl_source_base_prefix}stdint.h" 
>        fi 
>        ;; 
>      *) echo "*** GL_GENERATE_STDINT_H is not set correctly" 1>&2; exit 1 ;;
>    esac 

This is harmless.

The error message (which I can't reproduce) occurs when
gl_CONDITIONAL_HEADER([limits.h]) comes before any of gl_LIMITS_H and
gl_REPLACE_LIMITS_H.

>    $GL_GENERATE_STDINT_H && GL_GENERATE_STDINT_H=1 || GL_GENERATE_STDINT_H=

> * Should the shell script use a different variable name for the "1" vs 
> "" value, than for the "true" vs "false" value? This might help avoid 
> similar confusion in the future.

Where do these lines come from? They apparently arise from the
AM_CONDITIONAL invocation. But /usr/share/aclocal-1.16/cond.m4
produces different code for AM_CONDITIONAL than this one.

It comes from emacs' configure.ac !!!

  AC_DEFUN([AM_CONDITIONAL],
    [$2 && $1=1 || $1=
     AC_SUBST([$1])])

The original AM_CONDITIONAL macro supports a condition that has the
same name as a shell variable, e.g.
  AM_CONDITIONAL([FOO], [$FOO])
The emacs overridden one does not!

So, that is the problem.

There are two ways to fix this:
  (A) Change Emacs AM_CONDITIONAL to support equal names.
  (B) Change 27 Gnulib modules to use different names for the
      conditional variable.

My preference (by far) is (A). Change emacs/configure.ac to use this:

  AC_DEFUN([AM_CONDITIONAL],
    [$2 && $1_CONDITION=1 || $1_CONDITION=
     AC_SUBST([$1_CONDITION])])

and at the same time, change gnulib-tool through the attached patch.

Bruno

>From 51fd2f6aa67c9402720c683a318dc6ed8ae2daf9 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sat, 18 Dec 2021 14:52:18 +0100
Subject: [PATCH] stdint: Fix handling of limits.h (regression 2021-12-16).

* modules/stdint (configure.ac): Revert last change.
* gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
If --gnu-make is used, assume that AC_SUBSTed variables for conditionals
are constructed by appending the suffix '_CONDITION'.
---
 ChangeLog      | 8 ++++++++
 gnulib-tool    | 8 ++++----
 modules/stdint | 2 ++
 3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 07fce5e48..45a4bac3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2021-12-18  Bruno Haible  <br...@clisp.org>
+
+	stdint: Fix handling of limits.h (regression 2021-12-16).
+	* modules/stdint (configure.ac): Revert last change.
+	* gnulib-tool (func_emit_lib_Makefile_am, func_emit_tests_Makefile_am):
+	If --gnu-make is used, assume that AC_SUBSTed variables for conditionals
+	are constructed by appending the suffix '_CONDITION'.
+
 2021-12-18  Bruno Haible  <br...@clisp.org>
 
 	Fix support for --gnu-make in tests (regression 2021-12-15).
diff --git a/gnulib-tool b/gnulib-tool
index d15c79513..0a0314e3c 100755
--- a/gnulib-tool
+++ b/gnulib-tool
@@ -3775,7 +3775,7 @@ func_emit_lib_Makefile_am ()
           echo "## begin gnulib module $module"
           if $gnu_make; then
             echo "ifeq (,\$(OMIT_GNULIB_MODULE_$module))"
-            convert_to_gnu_make_1='s/^if \(.*\)/ifneq (,$(\1))/'
+            convert_to_gnu_make_1='s/^if \(.*\)/ifneq (,$(\1_CONDITION))/'
             convert_to_gnu_make_2='s|%reldir%/||g'
             convert_to_gnu_make_3='s|%reldir%|.|g'
           fi
@@ -3784,7 +3784,7 @@ func_emit_lib_Makefile_am ()
             if func_cond_module_p "$module"; then
               func_module_conditional_name "$module"
               if $gnu_make; then
-                echo "ifneq (,\$($conditional))"
+                echo "ifneq (,\$(${conditional}_CONDITION))"
               else
                 echo "if $conditional"
               fi
@@ -4156,7 +4156,7 @@ func_emit_tests_Makefile_am ()
           { echo "## begin gnulib module $module"
             if $gnu_make; then
               echo "ifeq (,\$(OMIT_GNULIB_MODULE_$module))"
-              convert_to_gnu_make_1='s/^if \(.*\)/ifneq (,$(\1))/'
+              convert_to_gnu_make_1='s/^if \(.*\)/ifneq (,$(\1_CONDITION))/'
               convert_to_gnu_make_2='s|%reldir%/||g'
               convert_to_gnu_make_3='s|%reldir%|.|g'
             fi
@@ -4165,7 +4165,7 @@ func_emit_tests_Makefile_am ()
               if func_cond_module_p "$module"; then
                 func_module_conditional_name "$module"
                 if $gnu_make; then
-                  echo "ifneq (,\$($conditional))"
+                  echo "ifneq (,\$(${conditional}_CONDITION))"
                 else
                   echo "if $conditional"
                 fi
diff --git a/modules/stdint b/modules/stdint
index 3053a132e..bdec953df 100644
--- a/modules/stdint
+++ b/modules/stdint
@@ -21,6 +21,8 @@ sys_types
 configure.ac:
 gl_STDINT_H
 gl_CONDITIONAL_HEADER([stdint.h])
+dnl Because of gl_REPLACE_LIMITS_H:
+gl_CONDITIONAL_HEADER([limits.h])
 AC_PROG_MKDIR_P
 
 Makefile.am:
-- 
2.25.1

Reply via email to