Subject: Re: bug#63789: Native compilation broken on the Hurd (with patch)

From: Janneke Nieuwenhuizen <[email-masked]>
Date: Fri, 02 Jun 2023 07:27:07 +0200

Ludovic Courtès writes:

Hello,

> Janneke Nieuwenhuizen <[email-masked]> skribis:
>
[..]
>>
>>         (snippet
>>          #~(begin
>>              ;; XXX: The GCC test suite contains files with non-ASCII file
>>              ;; names, which cannot be repacked by BOOTSTRAP-ORIGIN.  Nor
>>              ;; can it be deleted from Guile, so resort to this evil hack.
>>              #$(origin-snippet (package-source gcc))
>>              (system* #$(file-append coreutils-boot0 "/bin/rm") "-rf"
>>                       "gcc/testsuite/go.test/test/fixedbugs/issue27836.dir"))))))
>>
>>
>> This is problematic, because coreutils-boot0 doesn't build for the Hurd:
>> coreutils needs hurd headers, and our hurd-headers-boot0 depends
>> on...coreutils-boot0.
>>
>> Why was coreutils-boot0 used instead of the canonical
>> delete-file-recursively?
>
> That was my first reaction too :-), but it’s explained in the comment:
> there are non-ASCII file names that Guile fails to decode (throwing a
> decoding error at that point.)

Ah, I missed that.  Makes sense.

> Seeing is believing so I had to try:
>
> applying '/gnu/store/5705r4ajxl8lav1hz9xm19w75zdcz1n2-gcc-5.0-libvtv-runpath.patch'...
> applying '/gnu/store/c2f49hzb4scsqaccfr8vf74f06z0yvp1-gcc-10-tree-sra-union-handling.patch'...
> find-files: gcc-11.3.0/gcc/testsuite/go.test/test/fixedbugs/issue27836.dir/Äfoo.go: No such file or directory
> Backtrace:

Ooh...

> When decoded as UTF-8, those file names look like this:
>
> $ export LC_ALL=en_US.UTF-8
> -rw-r--r-- rguenther/users     192 2022-04-21 07:58 gcc-11.3.0/gcc/testsuite/go.test/test/fixedbugs/issue27836.dir/Äfoo.go
> -rw-r--r-- rguenther/users     203 2022-04-21 07:58 gcc-11.3.0/gcc/testsuite/go.test/test/fixedbugs/issue27836.dir/Ämain.go

...interesting!

>> So, until we can correct the gcc-boot0 snippet problem in the next
>> rebuild cycle (how does that work now that we don't have core-updates
>> anymore?, I made coreutils-boot0 build on the Hurd.  See the patch
>> below.
>
> Re “how does that work?”, good question! :-)

:-)

> We should get rid of that hack though.

[..]

>> * gnu/packages/commencement.scm (coreutils-boot0)[arguments]: When building
>> for the hurd, add new phase 'add-hurd_types.h' and use it.  Add
>> "ac_cv_member_struct_stat_st_author=no" and -Wl,-rpath for %bootstrap-libc to
>> configure flags when building for the Hurd.  Add make-flags with
>> "IGNORE_UNUSED_LIBRARIES_CFLAGS=" to avoid -Wl,--as-needed, which undoes
>> previous rpath option.

[..]

> Neat!  This is probably okay but I wonder if we can either shrink this
> patch or use a different strategy.
>
> I tried a few things; I thought we could get ‘coreutils-boot0’ to build
> nothing but ‘rm’ (since the build failure the patch above works around
> is in ‘src/copy.c’), but my attempt below doesn’t work: it insists on
> building other things, including ‘src/copy.c’.  I ran out of time but I
> think it should be possible to make it work.

Nice idea!

> Even better would have been ‘--enable-no-install-program=cp’ but
> ‘src/copy.c’ is still getting built.
>
> (Time passes…)

Hm...

> Just as I was about to give up, I looked at:
>
>   guix graph -e '(@@ (gnu packages commencement) guile-final)' -s i586-gnu -M3 |xdot -
>
> and found the solution:
>
> diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
> index 78cfa4acd0..de3728ae26 100644
> --- a/gnu/packages/commencement.scm
> +++ b/gnu/packages/commencement.scm
> @@ -2333,7 +2333,13 @@ (define gcc-boot0
>               ;; names, which cannot be repacked by BOOTSTRAP-ORIGIN.  Nor
>               ;; can it be deleted from Guile, so resort to this evil hack.
>               #$(origin-snippet (package-source gcc))
> -             (system* #$(file-append coreutils-boot0 "/bin/rm") "-rf"
> +             (system* #$(file-append (let-system system
> +                                       ;; Work around
> +                                       ;; <https://issues.guix.gnu.org/63789>.
> +                                       (if (target-hurd? system)
> +                                           %bootstrap-coreutils&co
> +                                           coreutils-boot0))
> +                                     "/bin/rm") "-rf"
>                        "gcc/testsuite/go.test/test/fixedbugs/issue27836.dir"))))))
>      (arguments
>       (cons*

> How does that sound? :-)

That's great, thanks!  Using this now on my current wip-hurd and it's
working for me!

Greetings,
Janneke

> diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
> index 78cfa4acd0..17745705f7 100644

Some nice tricks here, thanks for sharing!

-- 
Janneke Nieuwenhuizen <[email-masked]>  | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com | Avatar® https://AvatarAcademy.com