m4-discuss
[Top][All Lists]
Advanced

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

Re: outdated m4sugar


From: Joel E. Denny
Subject: Re: outdated m4sugar
Date: Tue, 15 Jul 2008 03:40:10 -0400 (EDT)

On Sat, 12 Jul 2008, Joel E. Denny wrote:

> > | Patching Bison so that it works with either LIFO or FIFO m4wrap is
> > | straight-forward.  I just removed the code in m4_wrap in m4_init and
> > | rewrote Bison to invoke it after processing the skeletons.  Only one use
> > | of m4wrap remains, and so order no longer matters.  Bison's make check

> I've updated my m4sugar.m4 patch to rename whichever of m4symbols or 
> symbols is defined, so this should work in all cases.

> > | I also had to make Bison pass -g to m4 just in case POSIXLY_CORRECT is
> > | set.  This does not work with m4 1.4.6, but Bison could just unset
> > | POSIXLY_CORRECT when invoking m4 if we need to support m4 1.4.6 for some
> > | reason.

The following patch, not yet pushed, implements the above as well as the 
-dV fix you mentioned.  Let me know if you see any problems or if you 
think there's a better solution.

Thanks again for looking out for us, Eric.

>From c8eab8147b16375626c2e76569510fb75d80b591 Mon Sep 17 00:00:00 2001
From: Joel E. Denny <address@hidden>
Date: Tue, 15 Jul 2008 03:33:47 -0400
Subject: [PATCH] Ensure forward-compatibility with GNU M4.

Reported by Eric Blake at
<http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>.
* data/m4sugar/m4sugar.m4 (m4_symbols): Rename from either symbols or
m4symbols, depending on which is already defined.
(m4_wrap): Eliminate by moving wrapped code, which dealt with cleaning
up the diversion stack, to...
* data/cleanup.m4: ... this new file.  Only one m4_wrap use remains in
the skeletons (in bison.m4 to check %define and %code usage in the
skeletons), so m4_wrap's future switch from LIFO to FIFO order will be
irrelevant.
* src/output.c (output_skeleton): For the m4 invocation, pass
../data/cleanup.m4, pass -dV first because it may become
position-independent, and unset POSIXLY_CORRECT so Bison's skeletons
have access to GNU M4 extensions.  Add comments explaining these
issues in more detail.
---
 ChangeLog               |   18 ++++++++++++
 data/cleanup.m4         |    4 +++
 data/m4sugar/m4sugar.m4 |   10 ++-----
 src/output.c            |   69 +++++++++++++++++++++++++++++++++++-----------
 4 files changed, 77 insertions(+), 24 deletions(-)
 create mode 100644 data/cleanup.m4

diff --git a/ChangeLog b/ChangeLog
index d450038..32910ec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2008-07-15  Joel E. Denny  <address@hidden>
+
+       Ensure forward-compatibility with GNU M4.  Reported by Eric Blake at
+       <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>.
+       * data/m4sugar/m4sugar.m4 (m4_symbols): Rename from either symbols or
+       m4symbols, depending on which is already defined.
+       (m4_wrap): Eliminate by moving wrapped code, which dealt with cleaning
+       up the diversion stack, to...
+       * data/cleanup.m4: ... this new file.  Only one m4_wrap use remains in
+       the skeletons (in bison.m4 to check %define and %code usage in the
+       skeletons), so m4_wrap's future switch from LIFO to FIFO order will be
+       irrelevant.
+       * src/output.c (output_skeleton): For the m4 invocation, pass
+       ../data/cleanup.m4, pass -dV first because it may become
+       position-independent, and unset POSIXLY_CORRECT so Bison's skeletons
+       have access to GNU M4 extensions.  Add comments explaining these
+       issues in more detail.
+
 2008-07-14  Joel E. Denny  <address@hidden>
 
        Add .gitignore everywhere based on .cvsignore.
diff --git a/data/cleanup.m4 b/data/cleanup.m4
new file mode 100644
index 0000000..9afb158
--- /dev/null
+++ b/data/cleanup.m4
@@ -0,0 +1,4 @@
+# Check the divert push/pop perfect balance.
+m4_divert_pop([KILL])
+m4_ifdef([_m4_divert_diversion],
+         [m4_fatal([$0: unbalanced m4_divert_push:]_m4_divert_n_stack)])
diff --git a/data/m4sugar/m4sugar.m4 b/data/m4sugar/m4sugar.m4
index f3a0901..f939b5d 100644
--- a/data/m4sugar/m4sugar.m4
+++ b/data/m4sugar/m4sugar.m4
@@ -146,7 +146,8 @@ m4_rename([regexp], [m4_bregexp])
 m4_rename_m4([shift])
 m4_undefine([sinclude])
 m4_rename_m4([substr])
-m4_rename_m4([symbols])
+m4_ifdef([symbols], [m4_rename_m4([symbols])])
+m4_ifdef([m4symbols], [m4_rename([m4symbols], [m4_symbols])])
 m4_rename_m4([syscmd])
 m4_rename_m4([sysval])
 m4_rename_m4([traceoff])
@@ -1764,11 +1765,6 @@ m4_define([m4_init],
 # for sake of simplicity.
 m4_pattern_forbid([^_?m4_])
 m4_pattern_forbid([^dnl$])
-
-# Check the divert push/pop perfect balance.
-m4_wrap([m4_ifdef([_m4_divert_diversion],
-          [m4_fatal([$0: unbalanced m4_divert_push:]_m4_divert_n_stack)])[]])
-
 m4_divert_push([KILL])
-m4_wrap([m4_divert_pop([KILL])[]])
+# Bison pops KILL in ../close.m4.
 ])
diff --git a/src/output.c b/src/output.c
index 043298b..8cfb93a 100644
--- a/src/output.c
+++ b/src/output.c
@@ -473,18 +473,17 @@ output_skeleton (void)
   FILE *in;
   FILE *out;
   int filter_fd[2];
-  char const *argv[7];
+  char const *argv[8];
   pid_t pid;
 
-  /* Compute the names of the package data dir and skeleton file.
-     Test whether m4sugar.m4 is readable, to check for proper
-     installation.  A faulty installation can cause deadlock, so a
-     cheap sanity check is worthwhile.  */
+  /* Compute the names of the package data dir and skeleton files.  */
   char const m4sugar[] = "m4sugar/m4sugar.m4";
   char const m4bison[] = "bison.m4";
+  char const m4cleanup[] = "cleanup.m4";
   char *full_m4sugar;
   char *full_m4bison;
   char *full_skeleton;
+  char *full_m4cleanup;
   char const *p;
   char const *m4 = (p = getenv ("M4")) ? p : M4;
   char const *pkgdatadir = compute_pkgdatadir ();
@@ -501,31 +500,67 @@ output_skeleton (void)
   full_m4sugar = xstrdup (full_skeleton);
   strcpy (full_skeleton + pkgdatadirlen + 1, m4bison);
   full_m4bison = xstrdup (full_skeleton);
+  strcpy (full_skeleton + pkgdatadirlen + 1, m4cleanup);
+  full_m4cleanup = xstrdup (full_skeleton);
   if (strchr (skeleton, '/'))
     strcpy (full_skeleton, skeleton);
   else
     strcpy (full_skeleton + pkgdatadirlen + 1, skeleton);
+
+  /* Test whether m4sugar.m4 is readable, to check for proper
+     installation.  A faulty installation can cause deadlock, so a
+     cheap sanity check is worthwhile.  */
   xfclose (xfopen (full_m4sugar, "r"));
 
   /* Create an m4 subprocess connected to us via two pipes.  */
 
   if (trace_flag & trace_tools)
-    fprintf (stderr, "running: %s %s - %s %s\n",
-            m4, full_m4sugar, full_m4bison, full_skeleton);
-
-  argv[0] = m4;
-  argv[1] = full_m4sugar;
-  argv[2] = "-";
-  argv[3] = full_m4bison;
-  argv[4] = full_skeleton;
-  argv[5] = trace_flag & trace_m4 ? "-dV" : NULL;
-  argv[6] = NULL;
-
+    fprintf (stderr, "running: %s %s - %s %s %s\n",
+             m4, full_m4sugar, full_m4bison, full_skeleton, full_m4cleanup);
+
+  /* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a
+     position-dependent manner.  Keep it as the first argument so that all
+     files are traced.
+     
+     See the thread starting at
+     <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
+     for details.  */
+  {
+    int i = 0;
+    argv[i++] = m4;
+    if (trace_flag & trace_m4)
+      argv[i++] = "-dV";
+    argv[i++] = full_m4sugar;
+    argv[i++] = "-";
+    argv[i++] = full_m4bison;
+    argv[i++] = full_skeleton;
+    argv[i++] = full_m4cleanup;
+    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_sycmd in a custom skeleton.  For now, Bison makes no
+     promises about the behavior of custom skeletons, so this scenario 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, which in a later release will indicate that POSIXLY_CORRECT should
+     be ignored.  Once the GNU M4 that accepts -g is 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_m4bison);
   free (full_m4sugar);
+  free (full_m4bison);
   free (full_skeleton);
+  free (full_m4cleanup);
 
   out = fdopen (filter_fd[0], "w");
   if (! out)
-- 
1.5.4.3





reply via email to

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