mbox series

[bug#54394,core-updates,00/12] Remove old GNU utilities from early bootstrap

Message ID 87v8wg40dl.fsf@ngyro.com
Headers show
Series Remove old GNU utilities from early bootstrap | expand

Message

Timothy Sample March 14, 2022, 10:47 p.m. UTC
Hi all!

This is culmination of a lot of work, so I’m excited to be submitting
it!  The main thrust of this series is to update Gash and Gash-Utils,
and then remove most of the old GNU utilities we use during early
bootstrap.  To elaborate, the current situation is that we climb a
ladder through time: first we build Bash 2, then we build Bash 4, and
finally we build Bash 5.  This is true for most GNU utilities: Sed,
Gawk, Coreutils, etc.  The reason?  Until now, our Scheme
implementations of those utilities (Gash and Gash-Utils) were very
limited.  Bash 2 used to be a lot more useful then Gash, for example.
Now, with recent releases of Gash and Gash-Utils, the Scheme utilities
are, in general, capable of powering the builds of modern GNU software.

To be clear, we still climb the time-ladder in a few cases.  The main
ones are GCC, Glibc, and Binutils.  For example, we have to use GCC 2 to
transition from TCC To GCC 4 (which is the last non-C++ GCC [1]).
Fixing this would require quite a bit of TCC hacking, I imagine.  There
are others, though.  We still use old versions of Gzip, Make, patch, and
Gawk.  The fact that Gawk is still there disappoints me quite a bit, but
‘glibc-mesboot’ fails in a way that I just can’t figure out when
building with Gash-Utils.  Gzip is not strictly necessary, but also
pretty easy to replace.  I’m not sure, but I think patch is only there
to avoid using patches in ‘origin’ records during bootstrap.  We now
have a way to do that, so it may no longer be necessary.  Make will
likely need to be rewritten in Scheme, but we have a head start: Potato
Make [2].

[1] https://bootstrappable.org/projects.html
[2] https://github.com/spk121/potato-make

Here’s some detailed info for reviewers.

The first patch is pretty independent.  That testing package has been
broken since GNU Hello was upgraded to 2.11.

The next two patches spruce up the ‘gnu-bootstrap’ module.  One fixes an
omission, and the other gets it ready to handle Gash-Utils 0.2.0, which
unfortunately has two module directories.

The next three are updates.  The bootar update optimistically assumes
that someone with access will upload the source file to the Guix mirror
URL: “mirror://gnu/guix/...” as was done with previous versions.

The rest hopefully speak for themselves.  Sadly, the last one is
something of a jumble.  Originally I wanted to remove the utilities one
at a time, but it turns out there are interference effects.  I can’t
remember the exact details now, but to get an idea, removing both old
Bash and old Grep might work, but removing one and then the other (in
either order) might not.  Hence, many utilities get updated in one
commit.

I have built this series all the way to the ‘hello’ package (the regular
one, not the ‘-mesboot’ one).  Based on that, I assume that everything
should be fine.  There’s always room for surprises, though!  :)

Let me know what you think.

Timothy Sample (12):
  gnu: hello-mesboot: Downgrade to 2.10.
  gnu-bootstrap: Configure PACKAGE_NAME.
  gnu-bootstrap: Allow multiple module directories.
  gnu: gash-utils: Update to 0.2.0.
  gnu: bootar: Update to 1b.
  gnu: gash: Update to 0.3.0.
  gnu: gash-utils-boot: Create 'echo' wrapper.
  gnu: bzip2-mesboot: Remove package.
  gnu: sed-mesboot0: Remove package.
  gnu: binutils-mesboot0: Update to 2.20.1a.
  gnu: %boot-tcc-inputs: Remove extra "gash-utils".
  gnu: commencement: Remove many old utilities.

 gnu/local.mk                                  |   1 -
 gnu/packages/commencement.scm                 | 895 ++++--------------
 gnu/packages/patches/gash-utils-ls-test.patch |  25 -
 gnu/packages/shells.scm                       |  27 +-
 guix/build/gnu-bootstrap.scm                  |  32 +-
 5 files changed, 192 insertions(+), 788 deletions(-)
 delete mode 100644 gnu/packages/patches/gash-utils-ls-test.patch


-- Tim

Comments

Ludovic Courtès March 16, 2022, 5:25 p.m. UTC | #1
Hello!

Timothy Sample <samplet@ngyro.com> skribis:

> This is culmination of a lot of work, so I’m excited to be submitting
> it!  The main thrust of this series is to update Gash and Gash-Utils,
> and then remove most of the old GNU utilities we use during early
> bootstrap.  To elaborate, the current situation is that we climb a
> ladder through time: first we build Bash 2, then we build Bash 4, and
> finally we build Bash 5.  This is true for most GNU utilities: Sed,
> Gawk, Coreutils, etc.  The reason?  Until now, our Scheme
> implementations of those utilities (Gash and Gash-Utils) were very
> limited.  Bash 2 used to be a lot more useful then Gash, for example.
> Now, with recent releases of Gash and Gash-Utils, the Scheme utilities
> are, in general, capable of powering the builds of modern GNU software.

Woohoo!  Shortening the ladder, and doing it “the nice way”, is a much
welcome improvement.

> To be clear, we still climb the time-ladder in a few cases.  The main
> ones are GCC, Glibc, and Binutils.  For example, we have to use GCC 2 to
> transition from TCC To GCC 4 (which is the last non-C++ GCC [1]).
> Fixing this would require quite a bit of TCC hacking, I imagine.  There
> are others, though.  We still use old versions of Gzip, Make, patch, and
> Gawk.  The fact that Gawk is still there disappoints me quite a bit, but
> ‘glibc-mesboot’ fails in a way that I just can’t figure out when
> building with Gash-Utils.  Gzip is not strictly necessary, but also
> pretty easy to replace.  I’m not sure, but I think patch is only there
> to avoid using patches in ‘origin’ records during bootstrap.  We now
> have a way to do that, so it may no longer be necessary.  Make will
> likely need to be rewritten in Scheme, but we have a head start: Potato
> Make [2].
>
> [1] https://bootstrappable.org/projects.html
> [2] https://github.com/spk121/potato-make

Yes, the C compiler situation is tricky; Make looks like a fun target.

[...]

> The next three are updates.  The bootar update optimistically assumes
> that someone with access will upload the source file to the Guix mirror
> URL: “mirror://gnu/guix/...” as was done with previous versions.

Sure.

>  5 files changed, 192 insertions(+), 788 deletions(-)

Yay!

Ludo’.
Ludovic Courtès March 16, 2022, 5:32 p.m. UTC | #2
Timothy Sample <samplet@ngyro.com> skribis:

> The next two patches spruce up the ‘gnu-bootstrap’ module.  One fixes an
> omission, and the other gets it ready to handle Gash-Utils 0.2.0, which
> unfortunately has two module directories.
>
> The next three are updates.  The bootar update optimistically assumes
> that someone with access will upload the source file to the Guix mirror
> URL: “mirror://gnu/guix/...” as was done with previous versions.
>
> The rest hopefully speak for themselves.  Sadly, the last one is
> something of a jumble.  Originally I wanted to remove the utilities one
> at a time, but it turns out there are interference effects.  I can’t
> remember the exact details now, but to get an idea, removing both old
> Bash and old Grep might work, but removing one and then the other (in
> either order) might not.  Hence, many utilities get updated in one
> commit.

The patches all LGTM!  I think you can push them to ‘core-updates’ if
there are no objections.

Then Maxim, Ricardo, or myself (I think we’re the three people who can
do that currently) can upload bootar to ftp.gnu.org.  Let us know.

It’s quite something to see these intermediate versions of Bash, Gawk,
tar, grep, coreutils, and sed go away in the last patch, and that tells
something about the magnitude of the work that has gone in this
Gash-Utils release.  Thumbs up, and big thanks!

Ludo’.
Timothy Sample March 19, 2022, 7:53 p.m. UTC | #3
Hello,

Ludovic Courtès <ludo@gnu.org> writes:

> Timothy Sample <samplet@ngyro.com> skribis:
>
>> The next two patches spruce up the ‘gnu-bootstrap’ module.  One fixes an
>> omission, and the other gets it ready to handle Gash-Utils 0.2.0, which
>> unfortunately has two module directories.
>>
>> The next three are updates.  The bootar update optimistically assumes
>> that someone with access will upload the source file to the Guix mirror
>> URL: “mirror://gnu/guix/...” as was done with previous versions.
>>
>> The rest hopefully speak for themselves.  Sadly, the last one is
>> something of a jumble.  Originally I wanted to remove the utilities one
>> at a time, but it turns out there are interference effects.  I can’t
>> remember the exact details now, but to get an idea, removing both old
>> Bash and old Grep might work, but removing one and then the other (in
>> either order) might not.  Hence, many utilities get updated in one
>> commit.
>
> The patches all LGTM!  I think you can push them to ‘core-updates’ if
> there are no objections.

Pushed!  (Maybe I didn’t leave enough time for objections – apologies if
it ends up requiring a revert!  I’ll be around to work through any
issues this might cause.)

> Then Maxim, Ricardo, or myself (I think we’re the three people who can
> do that currently) can upload bootar to ftp.gnu.org.  Let us know.

Yes, please!

> It’s quite something to see these intermediate versions of Bash, Gawk,
> tar, grep, coreutils, and sed go away in the last patch, and that tells
> something about the magnitude of the work that has gone in this
> Gash-Utils release.  Thumbs up, and big thanks!

When the Scheme-only bootstrap landed, it was very exciting, but it made
a real mess of ‘commencement.scm’.  Since I played a part in creating
that mess, I figured I ought to work to fix it.  :)  I’m hoping our
Scheme-heavy approach to bootstrapping will result in something clean
and comprehensible, so taking an explicit step in that direction makes
me happy.


-- Tim
Janneke Nieuwenhuizen March 20, 2022, 11:38 a.m. UTC | #4
Timothy Sample writes:

Hello!

> This is culmination of a lot of work, so I’m excited to be submitting
> it!  The main thrust of this series is to update Gash and Gash-Utils,
> and then remove most of the old GNU utilities we use during early
> bootstrap.  To elaborate, the current situation is that we climb a
> ladder through time: first we build Bash 2, then we build Bash 4, and
> finally we build Bash 5.  This is true for most GNU utilities: Sed,
> Gawk, Coreutils, etc.  The reason?  Until now, our Scheme
> implementations of those utilities (Gash and Gash-Utils) were very
> limited.  Bash 2 used to be a lot more useful then Gash, for example.
> Now, with recent releases of Gash and Gash-Utils, the Scheme utilities
> are, in general, capable of powering the builds of modern GNU software.

What an amazing piece of work.  Not only adding support for this in Gash
and Gash-Utils, also adding the "follow-up" for the Guix bootstrap.
Wow!

Not meaning to create more unwanted work for you, but I believe this
could do with a blog post.  I very much like your "climb a ladder
through time" description.

> To be clear, we still climb the time-ladder in a few cases.  The main
> ones are GCC, Glibc, and Binutils.  For example, we have to use GCC 2 to
> transition from TCC To GCC 4 (which is the last non-C++ GCC [1]).
> Fixing this would require quite a bit of TCC hacking

Yes, that needs work on MesCC, especially the Mes C Library, and TCC.
Possibly some work on mpz/gmp.  We definately want to jump from TCC to
GCC 4.6 (the last modular distribution) in the (near) future.

> We still use old versions of Gzip, Make, patch, and
> Gawk.  The fact that Gawk is still there disappoints me quite a bit, but
> ‘glibc-mesboot’ fails in a way that I just can’t figure out when
> building with Gash-Utils.

Yeah, I can imagine, especially after your (2nd?) rewrite of AWK.

> Gzip is not strictly necessary, but also pretty easy to replace.

and replacing possibly has quite a speed penalty.

> I’m not sure, but I think patch is only there
> to avoid using patches in ‘origin’ records during bootstrap.  We now
> have a way to do that, so it may no longer be necessary.

Yes, I believe patch is needed for the manual "apply-boot-patch" stages
to avoid adding a dependency on xz, created by adding patches to
"origin" records.

> Make will likely need to be rewritten in Scheme, but we have a head
> start: Potato Make [2].
>
> [2] https://github.com/spk121/potato-make

Interesting!

    POSIX Makefile Parser

     Recipes can contain the following parser function

     (parse ...) reads a standard Makefile and creates
     rules based on its contents.

Building glibc without GNU Make may be pretty difficult, though.

> Here’s some detailed info for reviewers.

> Ludovic Courtès writes:
> > The patches all LGTM!  I think you can push them to ‘core-updates’ if
> > there are no objections.

> Pushed!  (Maybe I didn’t leave enough time for objections – apologies if
> it ends up requiring a revert!  I’ll be around to work through any
> issues this might cause.)

Patches LGTM, and thanks for pushing.

> The rest hopefully speak for themselves.  Sadly, the last one is
> something of a jumble.  Originally I wanted to remove the utilities one
> at a time, but it turns out there are interference effects.  I can’t
> remember the exact details now, but to get an idea, removing both old
> Bash and old Grep might work, but removing one and then the other (in
> either order) might not.  Hence, many utilities get updated in one
> commit.

That's quite understandable, and certainly acceptable.  Much of this
time-ladder was created by me, it was an enormous effort to find old
(and some ancient) versions of the tools that worked well together.
There are undocumented build dependencies all around.  Some newer
packages cannot be used to build older versions of other packages, etc.

So, while this kludge was a necessary evil, I'm extremely happy we can
now do without it.  We should work towards a bootstrap that depends
mainly on current packages, and strive to keep current packages
bootstrappable.

To summarize what you removed:

    bzip2 (not an old version)
    sed-1.18
    sed-4.0.6
    binutils-2.14 (really great!)
    bash-2.05b
    bash-4.4
    gawk-3.0.0
    tar-1.22
    grep-2.0
    coreutils-5.0
    xz-5.0.0 (wow, that was difficult to build)

that's 11 old and ancient packages, if have counted correctly.

Greetings,
Janneke
Ludovic Courtès March 21, 2022, 3:17 p.m. UTC | #5
Hi,

Timothy Sample <samplet@ngyro.com> skribis:

>> Then Maxim, Ricardo, or myself (I think we’re the three people who can
>> do that currently) can upload bootar to ftp.gnu.org.  Let us know.
>
> Yes, please!

Done!

  https://ftp.gnu.org/gnu/guix/mirror/

Ludo’.