On Mon, Mar 31, 2025 at 05:35:36PM -0400, Dennis Clarke via Bug reports for the 
GNU m4 macro processor wrote:
> 
> This has already been reported and it is known that the m4-1.4.19 will
> no longer build out of the box on a recent Linux machine. Certainly not
> with any recent GCC and perfectly sane configuration options.

Indeed - but I'm about to release 1.4.20, since I just barely proposed
a bug-fix[1] for eval ("eval(1||1/0)" short-circuits, but
"eval(1||(1/0))" fails, and this inconsistency has been present,
unnoticed, since 1.4.8b in 2007).  So that release should fix the
current problems with 1.4.19 failing to build.

[1] https://lists.gnu.org/archive/html/m4-patches/2025-04/msg00003.html

> 
> Perhaps this mail list and the bug-m4 maillist are dead? This has been
> reported before :
> 
>     https://lists.gnu.org/archive/html/m4-discuss/2025-02/msg00000.html

Not quite dead, but I have very little free time to spend on m4, and
it is a relatively stable project with few other volunteers.  (Alas,
although I'm using a Red Hat email, m4 is far enough afield from my
current assignments of Red Hat that I do not get to spend company time
on m4 maintenance - it has to be my personal time, and my life
situation is much different now than it was 15 years ago)

> 
> At the very least a beta for 1.6 could be tested.

Here's my problem with that idea: branch-1.6 is in worse shape than
branch-1.4; its last commit was in 2010, and it is missing a NUMBER of
patches that were added to branch-1.4 as bug fixes, which will need to
be forward-ported.  Keep in mind, back in 2010, I was still relatively
new to git, and did not have as good an idea on how best to insist on
upstream first and backports to stable branches the way I do now; so
this is the opposite problem of what most distros have on
cherry-picking backport candidates from upstream.  Which means the
more patches land in branch-1.4 (such as my fix to eval
short-circuiting), the more work that will be required cherry-picking
those into branch-1.6 before it will be ready for a beta release.

I would love some assistance in the effort, even if it is as simple as
curating a list of ALL commits to branch-1.4 and branch-1.6 since the
two REALLY diverged (warning: back then, I was not using 'git
cherry-pick -x' to identify when a patch was applied to one branch
after appearing on another; and order of patches applied differs
between the branch, so it is not just a linear effort).  A possible
starting point might be commits around Nov 2007; commit ac884556
titled "Stage 1:..." was the start of my efforts to implement a MUCH
faster parser for m4 1.6; or maybe the search needs to go back even
further.

As to the patches named "Stage X:", there's another back-story: 15
years ago, I played with an experiment to make the following faster:

$ m4 <<EOF
changequote([,])define([process])dnl
define([foo], [ifelse([\$1], , , [process([\$1])\$0(shift(\$@))])])dnl
foo($(seq -s, 5000))
EOF

Currently, this has quadratic behavior (on my laptop, running that
with 5000 arguments takes 1.7s, running it with 10000 takes 6.3s;
doubling the parameter list size quadruples the runtime).  In short,
although the m4 parser is only expanding foo 5000 times, it is parsing
approximately 5000*2500 parameters among those 5000 calls, and the
parse-time is non-trivial.  But in an ideal world (and in my
experimental branch), m4 _should_ be able to process that type of tail
recursion in linear time - by special-casing $@ and friends in macro
expansion to be a reference to (a subset of) the incoming parameters,
rather than copying into a new string (another way of looking at it:
the work was teaching the m4 scanner engine to behave more like
preadv() with the ability to join together input from disparate
sources, rather than it's current behavior of having to copy
everything into an obstack so that the scanner engine can then read()
one byte at a time).  I had code that was almost working for that
goal, still visible at the argv_ref branch [2], which was a series of
at least 34 "Stages" of patches that would be needed, but got stumped
near the end on how do reference counting to not leak memory.  But the
experiment was running in parallel with other development, so porting
it to branch-1.6 was non-trivial, and there I only got to Stage 29.

> 
> triton$ git remote show origin
> * remote origin
>   Fetch URL: http://git.savannah.gnu.org/r/m4.git
>   Push  URL: http://git.savannah.gnu.org/r/m4.git
>   HEAD branch: master
>   Remote branches:
>     argv_ref    tracked

[2] THIS is the branch that I would love to see finished and folded
into branch-1.6.

>     branch-1.4  tracked
>     branch-1.6  tracked
>     branch-2.0  tracked
>     include-dso tracked
>     master      tracked
>     stackovf    tracked

> 
> There are plenty of things changing but I do not see where the linkage
> problem is fixed in the git repo.

Ideally, the linkage problem should have been fixed by upgrading to
more recent gnulib.  If it is still broken on the tip of branch-1.4,
that is something that will need to be fixed before 1.4.20 is
released.  I haven't hit a libsigsegv link failure on my development
machine, but part of the release process is trying to build elsewhere.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.
Virtualization:  qemu.org | libguestfs.org


Reply via email to