bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Detecting (g)m4


From: Eric Blake
Subject: Re: Detecting (g)m4
Date: Thu, 20 Aug 2009 10:06:24 -0600
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.22) Gecko/20090605 Thunderbird/2.0.0.22 Mnenhy/0.7.6.666

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Joel E. Denny on 7/21/2009 10:03 PM:

[wow, I've been delayed on clearing out my queue of bison work]

>> Better yet, here's my patch that takes advantage of the new checks in
>> serial 8 for 'm4 -g':
>> http://repo.or.cz/w/bison/ericb.git?a=commitdiff;h=4be36955
>>
>> as part of my series in enhancing your work on using gnulib's
>> create_pipe_bidi.
> 
> It's fine with me if you push that to master and branch-2.5.  If it's 
> really stable, you could even push something to branch-2.4.2, but that 
> would require a manual update of m4/m4.m4 because branch-2.4.2 does not 
> have an autoconf submodule.
> 
> Because this change is visible to the user, I'd also appreciate a brief 
> NEWS entry for the earliest release.

Bison already documented that it needed m4 1.4.6, and Autoconf 2.64 now
requires m4 1.4.6 (m4 1.4.5 mishandles some regexp in use by modern
m4sugar).  So it was definitely worth porting all the way back to
branch-2.4.2.  Here's what I pushed to branch-2.4.2; I then cherry-picked
into branch-2.5 and master (modulo the use of the submodule rather than
hand-copying the file).

- --
Don't work too hard, make some time for fun as well!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkqNdH4ACgkQ84KuGfSFAYDnoACfVWT28BWqCGIVMGoNnBcQoQVw
ehsAn0cn2gJQ/keLaIjHw3iT6TAZhMRK
=8p01
-----END PGP SIGNATURE-----
>From b9ad39c1fb2482e1513cdf9800b31e71b7986b39 Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Thu, 20 Aug 2009 08:24:46 -0600
Subject: [PATCH] Import latest m4/m4.m4.

* m4/m4.m4: Copy from autoconf 2.64.
* configure.ac (M4_GNU_OPTION): New define.
* src/output.c (output_skeleton): Use it to resolve FIXME.
* NEWS: Mention this.

Signed-off-by: Eric Blake <address@hidden>
---
 ChangeLog    |    8 ++++++++
 NEWS         |    2 ++
 configure.ac |    2 ++
 m4/m4.m4     |   52 +++++++++++++++++++++++++++++++++++++++-------------
 src/output.c |   33 ++++++++++++++-------------------
 5 files changed, 65 insertions(+), 32 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3874c97..9b5fa94 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-08-20  Eric Blake  <address@hidden>
+
+       Import latest m4/m4.m4.
+       * m4/m4.m4: Copy from autoconf 2.64.
+       * configure.ac (M4_GNU_OPTION): New define.
+       * src/output.c (output_skeleton): Use it to resolve FIXME.
+       * NEWS: Mention this.
+
 2009-08-19  Joel E. Denny  <address@hidden>

        Fix complaints about escape sequences.
diff --git a/NEWS b/NEWS
index 382c89c..4706c1c 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ Bison News

 * Changes in version 2.4.2 (????-??-??):

+** Detection of GNU M4 1.4.6 or newer during configure is improved.
+
 ** %code is now a permanent feature.

   A traditional Yacc prologue directive is written in the form:
diff --git a/configure.ac b/configure.ac
index a3e4292..28bb5c3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -94,6 +94,8 @@ AC_PROG_YACC
 AC_PROG_RANLIB
 AC_PROG_GNU_M4
 AC_DEFINE_UNQUOTED([M4], ["$M4"], [Define to the GNU M4 executable name.])
+AC_DEFINE_UNQUOTED([M4_GNU_OPTION], ["$M4_GNU"], [Define to "-g" if GNU M4
+supports -g, otherwise to "".])
 AM_MISSING_PROG([HELP2MAN], [help2man])
 AC_PATH_PROG([XSLTPROC], [xsltproc])
 AC_SUBST([XSLTPROC])
diff --git a/m4/m4.m4 b/m4/m4.m4
index f1ef4fe..096fb28 100644
--- a/m4/m4.m4
+++ b/m4/m4.m4
@@ -1,34 +1,60 @@
-# m4.m4 serial 5
-dnl Copyright (C) 2000, 2006, 2007, 2008-2009 Free Software Foundation,
-dnl Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
+# m4.m4 serial 9
+
+# Copyright (C) 2000, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.  This file is offered as-is,
+# without warranty of any kind.

 # AC_PROG_GNU_M4
 # --------------
-# Check for GNU M4, at least 1.4.5 (all earlier versions had a bug in
-# trace support:
-# http://lists.gnu.org/archive/html/bug-gnu-utils/2006-11/msg00096.html)
+# Check for GNU M4, at least 1.4.6 (all earlier versions had bugs in
+# trace support and regexp support):
+# http://lists.gnu.org/archive/html/bug-gnu-utils/2006-11/msg00096.html
+# http://lists.gnu.org/archive/html/bug-autoconf/2009-07/msg00023.html
 # Also, check whether --error-output (through 1.4.x) or --debugfile (2.0)
 # is supported, and AC_SUBST M4_DEBUGFILE accordingly.
 AC_DEFUN([AC_PROG_GNU_M4],
-  [AC_ARG_VAR([M4], [Location of GNU M4 1.4.5 or later.  Defaults to the first
+  [AC_ARG_VAR([M4], [Location of GNU M4 1.4.6 or later.  Defaults to the first
     program of `m4', `gm4', or `gnum4' on PATH that meets Autoconf needs.])
   AC_CACHE_CHECK([for GNU M4 that supports accurate traces], [ac_cv_path_M4],
     [rm -f conftest.m4f
+ac_had_posixly_correct=${POSIXLY_CORRECT:+yes}
+AS_UNSET([POSIXLY_CORRECT])
 AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4 gnum4],
       [dnl Creative quoting here to avoid raw dnl and ifdef in configure.
-      # Root out GNU M4 1.4.4, as well as non-GNU m4 that ignore -t, -F.
-      ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)d'nl
+      # Root out GNU M4 1.4.5, as well as non-GNU m4 that ignore -t, -F.
+      ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)'
+      ac_snippet=${ac_snippet}pat'subst(a,\(b\)\|\(a\),\1)d'nl
       test -z "`$ac_path_M4 -F conftest.m4f </dev/null 2>&1`" \
       && test -z "`echo $ac_snippet | $ac_path_M4 --trace=mac 2>&1`" \
       && test -f conftest.m4f \
       && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:
       rm -f conftest.m4f],
       [AC_MSG_ERROR([no acceptable m4 could be found in \$PATH.
-GNU M4 1.4.5 or later is required; 1.4.11 is recommended])])])
+GNU M4 1.4.6 or later is required; 1.4.13 is recommended])])])
   M4=$ac_cv_path_M4
+  AC_CACHE_CHECK([whether $ac_cv_path_M4 accepts --gnu],
+    [ac_cv_prog_gnu_m4_gnu],
+    [case `$M4 --help < /dev/null 2>&1` in
+      *--gnu*) ac_cv_prog_gnu_m4_gnu=yes ;;
+      *) ac_cv_prog_gnu_m4_gnu=no ;;
+    esac])
+  if test "$ac_cv_prog_gnu_m4_gnu" = yes; then
+    M4_GNU=--gnu
+  else
+    M4_GNU=
+  fi
+  AC_SUBST([M4_GNU])
+  if test x$ac_had_posixly_correct = xyes; then
+    POSIXLY_CORRECT=:
+    if test $ac_cv_prog_gnu_m4_gnu = no; then
+      AC_MSG_WARN([The version of M4 that was found does not support -g.])
+      AC_MSG_WARN([Using it with POSIXLY_CORRECT set may cause problems.])
+    fi
+  fi
   AC_CACHE_CHECK([how m4 supports trace files], [ac_cv_prog_gnu_m4_debugfile],
     [case `$M4 --help < /dev/null 2>&1` in
       *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;;
diff --git a/src/output.c b/src/output.c
index 9af3951..3fbeb30 100644
--- a/src/output.c
+++ b/src/output.c
@@ -473,7 +473,7 @@ output_skeleton (void)
   FILE *in;
   FILE *out;
   int filter_fd[2];
-  char const *argv[9];
+  char const *argv[10];
   pid_t pid;

   /* Compute the names of the package data dir and skeleton files.  */
@@ -524,6 +524,19 @@ output_skeleton (void)
   {
     int i = 0;
     argv[i++] = m4;
+
+    /* When POSIXLY_CORRECT is set, GNU M4 1.6 and later disable GNU
+       extensions, which Bison's skeletons depend on.  With older M4,
+       it has no effect.  M4 1.4.12 added a -g/--gnu command-line
+       option to make it explicit that a program wants GNU M4
+       extensions even when POSIXLY_CORRECT is set.
+
+       See the thread starting at
+       <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
+       for details.  */
+    if (*M4_GNU_OPTION)
+      argv[i++] = M4_GNU_OPTION;
+
     argv[i++] = "-I";
     argv[i++] = pkgdatadir;
     if (trace_flag & trace_m4)
@@ -534,25 +547,7 @@ output_skeleton (void)
     argv[i++] = full_skeleton;
     argv[i++] = NULL;
   }
-  /* When POSIXLY_CORRECT is set, some future versions of GNU M4 (most likely
-     2.0) may drop some of the GNU extensions that Bison's skeletons depend
-     upon.  So that the next release of Bison is forward compatible with those
-     future versions of GNU M4, we unset POSIXLY_CORRECT here.
-
-     FIXME: A user might set POSIXLY_CORRECT to affect processes run from
-     macros like m4_syscmd in a custom skeleton.  For now, Bison makes no
-     promises about the behavior of custom skeletons, so this scenario is not a
-     concern.  However, we eventually want to eliminate this shortcoming.  The
-     next release of GNU M4 (1.4.12 or 1.6) will accept the -g command-line
-     option as a no-op, and later releases will accept it to indicate that
-     POSIXLY_CORRECT should be ignored.  Once the GNU M4 versions that accept
-     -g are pervasive, Bison should use -g instead of unsetting
-     POSIXLY_CORRECT.

-     See the thread starting at
-     <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
-     for details.  */
-  unsetenv ("POSIXLY_CORRECT");
   init_subpipe ();
   pid = create_subpipe (argv, filter_fd);
   free (full_m4sugar);
-- 
1.6.3.3.334.g916e1


reply via email to

[Prev in Thread] Current Thread [Next in Thread]