[PATCH] gnu: cross-base: Relax check for powerpc64le

  • Done
  • quality assurance status badge
Details
4 participants
  • Andreas Enge
  • Chris Marusich
  • Carl Dong
  • Léo Le Bouter
Owner
unassigned
Submitted by
Carl Dong
Severity
normal
C
C
Carl Dong wrote on 23 Mar 2021 17:02
(address . guix-patches@gnu.org)(name . Carl Dong)(address . contact@carldong.me)
20210323160213.1194843-1-contact@carldong.me
The canonical triplet for powerpc64le-linux-gnu is actually
powerpc64le-unknown-linux-gnu, we should relax our matching here.

* gnu/packages/cross-base.scm (cross-gcc-arguments): Check for
"powerpc64le-" prefix for "--with-long-double-128" instead of matching
full target.
---
gnu/packages/cross-base.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

Toggle diff (15 lines)
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index bea2d69876..180594509b 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -153,7 +153,7 @@ base compiler and using LIBC (which may be either a libc package or #f.)"
"--disable-decimal-float" ;would need libc
"--disable-libcilkrts"
- ,@(if (equal? "powerpc64le-linux-gnu" target)
+ ,@(if (string-prefix? "powerpc64le-" target)
;; On POWER9 (little endian) glibc needs
;; the 128-bit long double type.
'("--with-long-double-128")
--
2.30.1
L
L
Léo Le Bouter wrote on 25 Mar 2021 17:09
(address . 47349@debbugs.gnu.org)(name . Chris Marusich)(address . cmmarusich@gmail.com)
e1a3110d8a9b3602bdb328773124260bac9d339a.camel@zaclys.net
LGTM!

But also wait for marusich's input.
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEEFIvLi9gL+xax3g6RRaix6GvNEKYFAmBctboACgkQRaix6GvN
EKZIiQ//SGXh8EClINJOmC6VTSz/SkNZzpTXBYaxv88LnLum6dUk5T8Csmuhsrhy
2Ww/dCXEPitgefx+W8r3tIys6PAJmU1TVYHtxcmJfxh7ICcQW2lzRkxWy9tGr/qz
tMuNLiqvfj/SDR2HtB78STZAdkVNSSsXwGVc/19EAJkt0NfN2vSxOMoo22rW+wMk
/JgadEHph6X/ASmdFXXoiRnWKooWBNPbxksOQzjmu/oIXF8CwNi/XRpzxV89uMwh
6QfoDJCWr5W4s7gcsKP5x7aAk9uU2TY8eSA60lAO/c+POTjpc73hAp6fglsomC8t
HY6CU8tP0kETu4fkRitTSwSeRQzjJuKZY9CT+zTW2ZhaQuRi1cVgOOSOL6thK0A4
rFe2i4Siq6lr6vOjkvrk6EMIDj4USNgQg2FgnMjuLVNmgu/b6lrQkW9TTANVceJ9
Yq/lvrV3s22MK9QidtXfuq9uqEtklWC3JBY0MCJleBdXfx9YTdVbzcXc6T8KinZy
mXHl1gTRWkq2yTHhiIPHeh8R++l4CGE+JyCnJX10AZKHL2cDtCEMOJtPDsyDbw/X
Yolzp9ydT/M3+R2++J+FDtxtazcVeC/Uu3hqvwWtEMZoYK1y6bAo47ZRj53MegQ3
5wkkIsQCGz+o2jmFp466fKqiKVOYrBoB/OOXQmJLTuH8xzerYmI=
=kVOm
-----END PGP SIGNATURE-----


C
C
Chris Marusich wrote on 26 Mar 2021 07:27
(name . Carl Dong)(address . contact@carldong.me)(address . 47349@debbugs.gnu.org)
871rc2bfb9.fsf@gmail.com
Hi people,

Carl Dong <contact@carldong.me> writes:

Toggle quote (4 lines)
> * gnu/packages/cross-base.scm (cross-gcc-arguments): Check for
> "powerpc64le-" prefix for "--with-long-double-128" instead of matching
> full target.

This patch looks good to me. I confirmed it doesn't rebuild the world.
We can apply it to master. I will do this in the next few days unless
somebody else has further comments on this patch specifically.

While reviewing this patch, I noticed that surprisingly, we do not use
--with-long-double in the following places:

- The gcc package (a GCC v7.5.0 native compiler) on powerpc64le-linux
systems.

- The gcc-final package (a GCC v7.5.0 native compiler) on
powerpc64le-linux systems.

- The %bootstrap-gcc package (a GCC v5.5.0 native compiler) on
powerpc64le-linux systems.

- The %gcc-static package (a GCC v5.5.0 native compiler), when
cross-compiled for the powerpc64le-linux-gnu target on an x86_64-linux
system. (Note that this is actually the same GCC that on
powerpc64le-linux systems is known as %bootstrap-gcc.)

Obviously, %bootstrap-gcc is good enough to build gcc-final, and
gcc-final is good enough to build various things, including GNU Hello
and GNU Guix itself. We have verified this. However, Leo, do you think
it would be a good idea to add --with-long-double to the gcc and
gcc-final package definitions on powerpc64le-linux, anyway? Perhaps it
actually is needed, but we just haven't yet encountered the problems
that it would solve. What do you think, Leo?

You can inspect the packages to see this yourself, but you can also ask
Guix to tell you about the configure options. Here is what Guix says
about the configure options for the gcc and gcc-final packages on a
powerpc64le-linux system using commit
b0eb525ddba77420ff8c0930b9173b10f9ae342d:

Toggle snippet (379 lines)
scheme@(guix-user)> ,pp (bag-arguments (package->bag (@ (gnu packages gcc) gcc)))
$3 = (#:system
"powerpc64le-linux"
#:out-of-source?
#t
#:configure-flags
`("--enable-plugin"
"--enable-languages=c,c++"
"--disable-multilib"
"--with-system-zlib"
"--disable-libstdcxx-pch"
"--with-local-prefix=/no-gcc-local-prefix"
,(string-append
"--with-gxx-include-dir="
(assoc-ref %outputs "out")
"/include/c++")
,(let ((libc (assoc-ref %build-inputs "libc")))
(if libc
(string-append
"--with-native-system-header-dir="
libc
"/include")
"--without-headers")))
#:make-flags
(let* ((libc (assoc-ref %build-inputs "libc"))
(libc-native
(or (assoc-ref %build-inputs "libc-native") libc)))
`(,@(if libc
(list (string-append
"LDFLAGS_FOR_TARGET="
"-B"
libc
"/lib "
"-Wl,-dynamic-linker "
"-Wl,"
libc
"/lib/ld64.so.2"))
'())
,(string-append
"LDFLAGS="
"-Wl,-rpath="
libc-native
"/lib "
"-Wl,-dynamic-linker "
"-Wl,"
libc-native
"/lib/ld64.so.2")
,(string-append "BOOT_CFLAGS=-O2 " "-g0")))
#:tests?
#f
#:phases
(modify-phases
%standard-phases
(add-before
'configure
'pre-configure
(lambda* (#:key inputs outputs #:allow-other-keys)
(let ((libdir
(or (assoc-ref outputs "lib")
(assoc-ref outputs "out")))
(libc (assoc-ref inputs "libc")))
(when libc
(for-each
(lambda (x)
(substitute*
(find-files
"gcc/config"
"^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
(("(#define (GLIBC|GNU_USER)_DYNAMIC_LINKER.*)\\\\\n$"
_
line)
line)))
'(1 2 3))
(substitute*
(find-files
"gcc/config"
"^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
(("#define (GLIBC|GNU_USER)_DYNAMIC_LINKER([^ \t]*).*$"
_
gnu-user
suffix)
(format
#f
"#define ~a_DYNAMIC_LINKER~a \"~a\"~%"
gnu-user
suffix
(string-append libc "/lib/ld64.so.2"))))
(substitute*
(find-files "gcc/config" "^gnu-user.*\\.h$")
(("#define GNU_USER_TARGET_LIB_SPEC (.*)$"
_
suffix)
(format
#f
"#define GNU_USER_TARGET_LIB_SPEC \"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
libc
libc
libdir
suffix))
(("#define GNU_USER_TARGET_STARTFILE_SPEC.*$"
line)
(format
#f
"#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
libc
line)))
(substitute*
"gcc/config/rs6000/sysv4.h"
(("#define LIB_LINUX_SPEC (.*)$" _ suffix)
(format
#f
"#define LIB_LINUX_SPEC \"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
libc
libc
libdir
suffix))
(("#define\tSTARTFILE_LINUX_SPEC.*$" line)
(format
#f
"#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
libc
line))))
(when (file-exists? "gcc/config/rs6000")
(substitute*
(find-files "gcc/config/rs6000")
(("/lib64") "/lib")))
(substitute*
"fixincludes/fixincl.x"
(("static char const sed_cmd_z\\[\\] =.*;")
"static char const sed_cmd_z[] = \"sed\";"))
(when (file-exists? "gcc/config/aarch64")
(substitute*
"gcc/config/aarch64/t-aarch64-linux"
(("lib64") "lib")))
(when (file-exists? "libbacktrace")
(substitute*
"libbacktrace/configure"
(("WARN_FLAGS=(.*)-Werror" _ flags)
(string-append "WARN_FLAGS=" flags)))
(when (file-exists? "libsanitizer/libbacktrace")
(substitute*
"libsanitizer/libbacktrace/Makefile.in"
(("-Werror") ""))))
(substitute*
"libstdc++-v3/src/Makefile.in"
(("^OPT_LDFLAGS = ")
"OPT_LDFLAGS = -Wl,-rpath=$(libdir) "))
(substitute*
"libstdc++-v3/python/Makefile.in"
(("pythondir = .*$")
(string-append
"pythondir = "
libdir
"/share"
"/gcc-$(gcc_version)/python\n")))
(substitute*
"gcc/config.in"
(("PREFIX_INCLUDE_DIR")
"PREFIX_INCLUDE_DIR_isnt_necessary_here"))
#t)))
(add-after
'configure
'post-configure
(lambda _
(substitute*
"Makefile"
(("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
"TOPLEVEL_CONFIGURE_ARGUMENTS=\n"))
#t))))
scheme@(guix-user)> ,pp (bag-arguments (package->bag (@@ (gnu packages commencement) gcc-final)))
$4 = (#:system
"powerpc64le-linux"
#:guile
#<package guile-bootstrap@2.0 gnu/packages/bootstrap.scm:478 7fff75bdcf00>
#:allowed-references
("out"
"lib"
#<package zlib@1.2.11 gnu/packages/commencement.scm:3562 7fff692745a0>
#<package glibc@2.31 gnu/packages/commencement.scm:3462 7fff69274820>
#<package bash-static@5.0.16 gnu/packages/commencement.scm:3402 7fff69274960>)
#:validate-runpath?
#f
#:out-of-source?
#t
#:configure-flags
`("--enable-plugin"
"--enable-languages=c,c++"
"--disable-multilib"
"--with-system-zlib"
"--disable-libstdcxx-pch"
"--with-local-prefix=/no-gcc-local-prefix"
,(string-append
"--with-gxx-include-dir="
(assoc-ref %outputs "out")
"/include/c++")
,(let ((libc (assoc-ref %build-inputs "libc")))
(if libc
(string-append
"--with-native-system-header-dir="
libc
"/include")
"--without-headers")))
#:make-flags
(let ((zlib (assoc-ref %build-inputs "zlib")))
(map (lambda (flag)
(if (string-prefix? "LDFLAGS=" flag)
(string-append
flag
" -L"
(assoc-ref %build-inputs "libstdc++")
"/lib -L"
zlib
"/lib -Wl,-rpath="
zlib
"/lib")
flag))
(let* ((libc (assoc-ref %build-inputs "libc"))
(libc-native
(or (assoc-ref %build-inputs "libc-native") libc)))
`(,@(if libc
(list (string-append
"LDFLAGS_FOR_TARGET="
"-B"
libc
"/lib "
"-Wl,-dynamic-linker "
"-Wl,"
libc
"/lib/ld64.so.2"))
'())
,(string-append
"LDFLAGS="
"-Wl,-rpath="
libc-native
"/lib "
"-Wl,-dynamic-linker "
"-Wl,"
libc-native
"/lib/ld64.so.2")
,(string-append "BOOT_CFLAGS=-O2 " "-g0")))))
#:tests?
#f
#:phases
(modify-phases
(modify-phases
%standard-phases
(add-before
'configure
'pre-configure
(lambda* (#:key inputs outputs #:allow-other-keys)
(let ((libdir
(or (assoc-ref outputs "lib")
(assoc-ref outputs "out")))
(libc (assoc-ref inputs "libc")))
(when libc
(for-each
(lambda (x)
(substitute*
(find-files
"gcc/config"
"^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
(("(#define (GLIBC|GNU_USER)_DYNAMIC_LINKER.*)\\\\\n$"
_
line)
line)))
'(1 2 3))
(substitute*
(find-files
"gcc/config"
"^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
(("#define (GLIBC|GNU_USER)_DYNAMIC_LINKER([^ \t]*).*$"
_
gnu-user
suffix)
(format
#f
"#define ~a_DYNAMIC_LINKER~a \"~a\"~%"
gnu-user
suffix
(string-append libc "/lib/ld64.so.2"))))
(substitute*
(find-files "gcc/config" "^gnu-user.*\\.h$")
(("#define GNU_USER_TARGET_LIB_SPEC (.*)$"
_
suffix)
(format
#f
"#define GNU_USER_TARGET_LIB_SPEC \"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
libc
libc
libdir
suffix))
(("#define GNU_USER_TARGET_STARTFILE_SPEC.*$"
line)
(format
#f
"#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
libc
line)))
(substitute*
"gcc/config/rs6000/sysv4.h"
(("#define LIB_LINUX_SPEC (.*)$" _ suffix)
(format
#f
"#define LIB_LINUX_SPEC \"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
libc
libc
libdir
suffix))
(("#define\tSTARTFILE_LINUX_SPEC.*$" line)
(format
#f
"#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
libc
line))))
(when (file-exists? "gcc/config/rs6000")
(substitute*
(find-files "gcc/config/rs6000")
(("/lib64") "/lib")))
(substitute*
"fixincludes/fixincl.x"
(("static char const sed_cmd_z\\[\\] =.*;")
"static char const sed_cmd_z[] = \"sed\";"))
(when (file-exists? "gcc/config/aarch64")
(substitute*
"gcc/config/aarch64/t-aarch64-linux"
(("lib64") "lib")))
(when (file-exists? "libbacktrace")
(substitute*
"libbacktrace/configure"
(("WARN_FLAGS=(.*)-Werror" _ flags)
(string-append "WARN_FLAGS=" flags)))
(when (file-exists? "libsanitizer/libbacktrace")
(substitute*
"libsanitizer/libbacktrace/Makefile.in"
(("-Werror") ""))))
(substitute*
"libstdc++-v3/src/Makefile.in"
(("^OPT_LDFLAGS = ")
"OPT_LDFLAGS = -Wl,-rpath=$(libdir) "))
(substitute*
"libstdc++-v3/python/Makefile.in"
(("pythondir = .*$")
(string-append
"pythondir = "
libdir
"/share"
"/gcc-$(gcc_version)/python\n")))
(substitute*
"gcc/config.in"
(("PREFIX_INCLUDE_DIR")
"PREFIX_INCLUDE_DIR_isnt_necessary_here"))
#t)))
(add-after
'configure
'post-configure
(lambda _
(substitute*
"Makefile"
(("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
"TOPLEVEL_CONFIGURE_ARGUMENTS=\n"))
#t)))
(add-after
'unpack
'unpack-gmp&co
(lambda* (#:key inputs #:allow-other-keys)
(let ((gmp (assoc-ref %build-inputs "gmp-source"))
(mpfr (assoc-ref %build-inputs "mpfr-source"))
(mpc (assoc-ref %build-inputs "mpc-source")))
(for-each
(lambda (source) (invoke "tar" "xvf" source))
(list gmp mpfr mpc))
(symlink "gmp-6.0.0" "gmp")
(symlink "mpfr-4.0.2" "mpfr")
(symlink "mpc-1.1.0" "mpc")
#t)))))
scheme@(guix-user)>

And here is what Guix says about the configure options for %gcc-static,
when cross-compiled for powerpc64le-linux-gnu on an x86_64-linux system
using commit 662e7e28d576ada91fc9dec7d27c100666114f03, which is the one
we used to build the powerpc64le-linux bootstrap binaries:

Toggle snippet (130 lines)
scheme@(guix-user)> package->bag
$1 = #<procedure package->bag (package #:optional system target #:key graft?)>
scheme@(guix-user)> ,pp (bag-arguments (package->bag (@@ (gnu packages make-bootstrap) %gcc-static) "x86_64-linux" "powerpc64le-linux-gnu"))
$2 = (#:system
"x86_64-linux"
#:target
"powerpc64le-linux-gnu"
#:modules
((srfi srfi-1)
(srfi srfi-26)
(ice-9 regex)
(guix build gnu-build-system)
(guix build utils)
(guix build gremlin)
(guix elf))
#:out-of-source?
#t
#:configure-flags
(append
(list "--disable-bootstrap"
"--with-stage1-ldflags=-static"
"--enable-languages=c,c++"
"--disable-lto"
"--disable-shared"
"--disable-plugin"
"--disable-libmudflap"
"--disable-libatomic"
"--disable-libsanitizer"
"--disable-libitm"
"--disable-libgomp"
"--disable-libcilkrts"
"--disable-libvtv"
"--disable-libssp"
"--disable-libquadmath")
(remove
(cut string-match
"--(.*plugin|enable-languages)"
<>)
`("--enable-plugin"
"--enable-languages=c,c++"
"--disable-multilib"
"--with-system-zlib"
"--disable-libstdcxx-pch"
"--with-local-prefix=/no-gcc-local-prefix"
,(string-append
"--with-gxx-include-dir="
(assoc-ref %outputs "out")
"/include/c++")
,(let ((libc (assoc-ref %build-inputs "libc")))
(if libc
(string-append
"--with-native-system-header-dir="
libc
"/include")
"--without-headers"))
"CC_FOR_TARGET=powerpc64le-linux-gnu-gcc"
"CXX_FOR_TARGET=powerpc64le-linux-gnu-g++"
"LD_FOR_TARGET=powerpc64le-linux-gnu-ld"
"AR_FOR_TARGET=powerpc64le-linux-gnu-ar"
"NM_FOR_TARGET=powerpc64le-linux-gnu-nm"
"OBJDUMP_FOR_TARGET=powerpc64le-linux-gnu-objdump"
"RANLIB_FOR_TARGET=powerpc64le-linux-gnu-ranlib"
"STRIP_FOR_TARGET=powerpc64le-linux-gnu-strip")))
#:make-flags
'("CFLAGS=-g0 -O2")
#:tests?
#f
#:phases
(modify-phases
(modify-phases
%standard-phases
(add-before
'configure
'pre-configure
(lambda* (#:key inputs outputs #:allow-other-keys)
(let ((libdir
(string-append
(or (assoc-ref outputs "lib")
(assoc-ref outputs "out"))
"/"
"powerpc64le-linux-gnu"))
(libc (assoc-ref inputs "libc")))
(when libc
(for-each
(lambda (x)
(substitute*
(find-files
"gcc/config"
"^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
(("(#define (GLIBC|GNU_USER)_DYNAMIC_LINKER.*)\\\\\n$"
_
line)
line)))
'(1 2 3))
(substitute*
(find-files
"gcc/config"
"^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
(("#define (GLIBC|GNU_USER)_DYNAMIC_LINKER([^ \t]*).*$"
_
gnu-user
suffix)
(format
#f
"#define ~a_DYNAMIC_LINKER~a \"~a\"~%"
gnu-user
suffix
(string-append libc "/lib/ld64.so.2"))))
(substitute*
(find-files "gcc/config" "^gnu-user.*\\.h$")
(("#define GNU_USER_TARGET_LIB_SPEC (.*)$"
_
suffix)
(format
#f
"#define GNU_USER_TARGET_LIB_SPEC \"-L~a/lib %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
libc
libc
libdir
suffix))
(("#define GNU_USER_TARGET_STARTFILE_SPEC.*$"
line)
(format
#f
"#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
libc
line)))
(substitute*
"gcc/confi
This message was truncated. Download the full message here.
-----BEGIN PGP SIGNATURE-----

iQJJBAEBCAAzFiEEy/WXVcvn5+/vGD+x3UCaFdgiRp0FAmBdfroVHGNtbWFydXNp
Y2hAZ21haWwuY29tAAoJEN1AmhXYIkadqOEP/3qKb1aTIWAnLbYlBVvWQYk7Ccfd
EvUAksH1MUqdWQQjY7FUY7L6k2qVibTd13KWTyKuLnaTdNAdcBK8BwGroeqTKfVL
OYFSkectd28IPPRvIEr64odg9dbNyq6l4bmJM+KNkRcaxEHbVpzbBvsYBrUBBiRP
cQ0z6LCW8JAgCf4l6P04kIAGNFxQ4KKrVVJ++dhkV9nX5e/CwUn+N9If/hXWuHC9
y7VymOYWc+z0klHdDPW9FmCJl0e4n1OjKvhb2XBggOQwJC4kYI/m2/Mx6/9oeS2P
7nfT2wFeyKe7naTRs1+q4zeJ7fy5kIgWYL6A1+8kXWR9KM/MpewgQT7G+XYsWSs2
LtZme+2e2ptDqD97TClgFpRXKXNijta0K+m1HtidqfEERoV9ZGRLZf88NV7yOSjO
J1ZZ8vgHJ56RzPy4J2HY/obwxebcfvzvSmlmaPvV4gH6Kncwu9owDh6ln0ynf03S
wxHcfh7p2VDpXAGJuqE2szFCe7QoJhymG1accjNsDEDVXwXfU3oSod3G1ipcoSGE
Su1kxRN8YloHTK0nYAG9+ZQWdJxFCSTj4+IAh1ie3W6zPdtg+FNHu3rvU/FyUdSa
cskhsttNw1mhM/1aEQgW/bmx02FPkfup8lL/z5BKu6u1RDpYxCsrqTA4q41teiro
UNV9BZGT9hUWNYwc
=vb+m
-----END PGP SIGNATURE-----

A
A
Andreas Enge wrote on 26 Mar 2021 11:31
Re: [bug#47349] [PATCH] gnu: cross-base: Relax check for powerpc64le
(name . Chris Marusich)(address . cmmarusich@gmail.com)
YF239JK0GpUb1z0k@jurong
Hello Chris,

I have no idea about cross compilers, but it would certainly be nice if
the final gcc supported long doubles.

As a check, you can have a look at the log file for building gmp,
obtained with "guix build --log-file gmp". If you grep for "long double",
it should contain a line
checking for long double... yes
Hm, just "having" long double is maybe not all we want.

From the gcc documentation at https://gcc.gnu.org/install/configure.html:
--with-long-double-128
Specify if long double type should be 128-bit by default on selected GNU/Linux architectures. If using --without-long-double-128, long double will be by default 64-bit, the same as double type. When neither of these configure options are used, the default will be 128-bit long double when built against GNU C Library 2.4 and later, 64-bit long double otherwise.

Of course we would like long double to have 128 bits, since otherwise there
is no difference with double. And at least with the current gcc and a glibc
from 2006 or later, the flag should not be neeed.

On my x86_64 machine, sizeof(long double) is 16 bytes with gcc@10, 5 or 7.
Could you try to compile and run the trivial program
#include <stdio.h>
void main () {
printf ("long double %i\n", sizeof (long double));
}
and see what it outputs on powerpc?

Well, while --with-long-double-128 should not be needed since it should be
the default, you may as well add it to the flags, since it is the desired
behaviour.

Andreas
L
L
Léo Le Bouter wrote on 26 Mar 2021 15:33
(address . 47349@debbugs.gnu.org)
796a3aa4e83a7ae6526b3553970150a91ab8307b.camel@zaclys.net
On Thu, 2021-03-25 at 23:27 -0700, Chris Marusich wrote:
Toggle quote (565 lines)
> Hi people,
>
> Carl Dong <contact@carldong.me> writes:
>
> > * gnu/packages/cross-base.scm (cross-gcc-arguments): Check for
> > "powerpc64le-" prefix for "--with-long-double-128" instead of
> > matching
> > full target.
>
> This patch looks good to me. I confirmed it doesn't rebuild the
> world.
> We can apply it to master. I will do this in the next few days
> unless
> somebody else has further comments on this patch specifically.
>
> While reviewing this patch, I noticed that surprisingly, we do not
> use
> --with-long-double in the following places:
>
> - The gcc package (a GCC v7.5.0 native compiler) on powerpc64le-linux
> systems.
>
> - The gcc-final package (a GCC v7.5.0 native compiler) on
> powerpc64le-linux systems.
>
> - The %bootstrap-gcc package (a GCC v5.5.0 native compiler) on
> powerpc64le-linux systems.
>
> - The %gcc-static package (a GCC v5.5.0 native compiler), when
> cross-compiled for the powerpc64le-linux-gnu target on an x86_64-
> linux
> system. (Note that this is actually the same GCC that on
> powerpc64le-linux systems is known as %bootstrap-gcc.)
>
> Obviously, %bootstrap-gcc is good enough to build gcc-final, and
> gcc-final is good enough to build various things, including GNU Hello
> and GNU Guix itself. We have verified this. However, Leo, do you
> think
> it would be a good idea to add --with-long-double to the gcc and
> gcc-final package definitions on powerpc64le-linux, anyway? Perhaps
> it
> actually is needed, but we just haven't yet encountered the problems
> that it would solve. What do you think, Leo?
>
> You can inspect the packages to see this yourself, but you can also
> ask
> Guix to tell you about the configure options. Here is what Guix says
> about the configure options for the gcc and gcc-final packages on a
> powerpc64le-linux system using commit
> b0eb525ddba77420ff8c0930b9173b10f9ae342d:
>
> --8<---------------cut here---------------start------------->8---
> scheme@(guix-user)> ,pp (bag-arguments (package->bag (@ (gnu packages
> gcc) gcc)))
> $3 = (#:system
> "powerpc64le-linux"
> #:out-of-source?
> #t
> #:configure-flags
> `("--enable-plugin"
> "--enable-languages=c,c++"
> "--disable-multilib"
> "--with-system-zlib"
> "--disable-libstdcxx-pch"
> "--with-local-prefix=/no-gcc-local-prefix"
> ,(string-append
> "--with-gxx-include-dir="
> (assoc-ref %outputs "out")
> "/include/c++")
> ,(let ((libc (assoc-ref %build-inputs "libc")))
> (if libc
> (string-append
> "--with-native-system-header-dir="
> libc
> "/include")
> "--without-headers")))
> #:make-flags
> (let* ((libc (assoc-ref %build-inputs "libc"))
> (libc-native
> (or (assoc-ref %build-inputs "libc-native") libc)))
> `(,@(if libc
> (list (string-append
> "LDFLAGS_FOR_TARGET="
> "-B"
> libc
> "/lib "
> "-Wl,-dynamic-linker "
> "-Wl,"
> libc
> "/lib/ld64.so.2"))
> '())
> ,(string-append
> "LDFLAGS="
> "-Wl,-rpath="
> libc-native
> "/lib "
> "-Wl,-dynamic-linker "
> "-Wl,"
> libc-native
> "/lib/ld64.so.2")
> ,(string-append "BOOT_CFLAGS=-O2 " "-g0")))
> #:tests?
> #f
> #:phases
> (modify-phases
> %standard-phases
> (add-before
> 'configure
> 'pre-configure
> (lambda* (#:key inputs outputs #:allow-other-keys)
> (let ((libdir
> (or (assoc-ref outputs "lib")
> (assoc-ref outputs "out")))
> (libc (assoc-ref inputs "libc")))
> (when libc
> (for-each
> (lambda (x)
> (substitute*
> (find-files
> "gcc/config"
> "^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
> (("(#define
> (GLIBC|GNU_USER)_DYNAMIC_LINKER.*)\\\\\n$"
> _
> line)
> line)))
> '(1 2 3))
> (substitute*
> (find-files
> "gcc/config"
> "^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
> (("#define (GLIBC|GNU_USER)_DYNAMIC_LINKER([^
> \t]*).*$"
> _
> gnu-user
> suffix)
> (format
> #f
> "#define ~a_DYNAMIC_LINKER~a \"~a\"~%"
> gnu-user
> suffix
> (string-append libc "/lib/ld64.so.2"))))
> (substitute*
> (find-files "gcc/config" "^gnu-user.*\\.h$")
> (("#define GNU_USER_TARGET_LIB_SPEC (.*)$"
> _
> suffix)
> (format
> #f
> "#define GNU_USER_TARGET_LIB_SPEC \"-L~a/lib
> %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \"
> ~a"
> libc
> libc
> libdir
> suffix))
> (("#define GNU_USER_TARGET_STARTFILE_SPEC.*$"
> line)
> (format
> #f
> "#define STANDARD_STARTFILE_PREFIX_1
> \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
> libc
> line)))
> (substitute*
> "gcc/config/rs6000/sysv4.h"
> (("#define LIB_LINUX_SPEC (.*)$" _ suffix)
> (format
> #f
> "#define LIB_LINUX_SPEC \"-L~a/lib %{!static:-
> rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
> libc
> libc
> libdir
> suffix))
> (("#define\tSTARTFILE_LINUX_SPEC.*$" line)
> (format
> #f
> "#define STANDARD_STARTFILE_PREFIX_1
> \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
> libc
> line))))
> (when (file-exists? "gcc/config/rs6000")
> (substitute*
> (find-files "gcc/config/rs6000")
> (("/lib64") "/lib")))
> (substitute*
> "fixincludes/fixincl.x"
> (("static char const sed_cmd_z\\[\\] =.*;")
> "static char const sed_cmd_z[] = \"sed\";"))
> (when (file-exists? "gcc/config/aarch64")
> (substitute*
> "gcc/config/aarch64/t-aarch64-linux"
> (("lib64") "lib")))
> (when (file-exists? "libbacktrace")
> (substitute*
> "libbacktrace/configure"
> (("WARN_FLAGS=(.*)-Werror" _ flags)
> (string-append "WARN_FLAGS=" flags)))
> (when (file-exists? "libsanitizer/libbacktrace")
> (substitute*
> "libsanitizer/libbacktrace/Makefile.in"
> (("-Werror") ""))))
> (substitute*
> "libstdc++-v3/src/Makefile.in"
> (("^OPT_LDFLAGS = ")
> "OPT_LDFLAGS = -Wl,-rpath=$(libdir) "))
> (substitute*
> "libstdc++-v3/python/Makefile.in"
> (("pythondir = .*$")
> (string-append
> "pythondir = "
> libdir
> "/share"
> "/gcc-$(gcc_version)/python\n")))
> (substitute*
> "gcc/config.in"
> (("PREFIX_INCLUDE_DIR")
> "PREFIX_INCLUDE_DIR_isnt_necessary_here"))
> #t)))
> (add-after
> 'configure
> 'post-configure
> (lambda _
> (substitute*
> "Makefile"
> (("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
> "TOPLEVEL_CONFIGURE_ARGUMENTS=\n"))
> #t))))
> scheme@(guix-user)> ,pp (bag-arguments (package->bag (@@ (gnu
> packages commencement) gcc-final)))
> $4 = (#:system
> "powerpc64le-linux"
> #:guile
> #<package guile-bootstrap@2.0 gnu/packages/bootstrap.scm:478
> 7fff75bdcf00>
> #:allowed-references
> ("out"
> "lib"
> #<package zlib@1.2.11 gnu/packages/commencement.scm:3562
> 7fff692745a0>
> #<package glibc@2.31 gnu/packages/commencement.scm:3462
> 7fff69274820>
> #<package bash-static@5.0.16 gnu/packages/commencement.scm:3402
> 7fff69274960>)
> #:validate-runpath?
> #f
> #:out-of-source?
> #t
> #:configure-flags
> `("--enable-plugin"
> "--enable-languages=c,c++"
> "--disable-multilib"
> "--with-system-zlib"
> "--disable-libstdcxx-pch"
> "--with-local-prefix=/no-gcc-local-prefix"
> ,(string-append
> "--with-gxx-include-dir="
> (assoc-ref %outputs "out")
> "/include/c++")
> ,(let ((libc (assoc-ref %build-inputs "libc")))
> (if libc
> (string-append
> "--with-native-system-header-dir="
> libc
> "/include")
> "--without-headers")))
> #:make-flags
> (let ((zlib (assoc-ref %build-inputs "zlib")))
> (map (lambda (flag)
> (if (string-prefix? "LDFLAGS=" flag)
> (string-append
> flag
> " -L"
> (assoc-ref %build-inputs "libstdc++")
> "/lib -L"
> zlib
> "/lib -Wl,-rpath="
> zlib
> "/lib")
> flag))
> (let* ((libc (assoc-ref %build-inputs "libc"))
> (libc-native
> (or (assoc-ref %build-inputs "libc-native") libc)))
> `(,@(if libc
> (list (string-append
> "LDFLAGS_FOR_TARGET="
> "-B"
> libc
> "/lib "
> "-Wl,-dynamic-linker "
> "-Wl,"
> libc
> "/lib/ld64.so.2"))
> '())
> ,(string-append
> "LDFLAGS="
> "-Wl,-rpath="
> libc-native
> "/lib "
> "-Wl,-dynamic-linker "
> "-Wl,"
> libc-native
> "/lib/ld64.so.2")
> ,(string-append "BOOT_CFLAGS=-O2 " "-g0")))))
> #:tests?
> #f
> #:phases
> (modify-phases
> (modify-phases
> %standard-phases
> (add-before
> 'configure
> 'pre-configure
> (lambda* (#:key inputs outputs #:allow-other-keys)
> (let ((libdir
> (or (assoc-ref outputs "lib")
> (assoc-ref outputs "out")))
> (libc (assoc-ref inputs "libc")))
> (when libc
> (for-each
> (lambda (x)
> (substitute*
> (find-files
> "gcc/config"
> "^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
> (("(#define
> (GLIBC|GNU_USER)_DYNAMIC_LINKER.*)\\\\\n$"
> _
> line)
> line)))
> '(1 2 3))
> (substitute*
> (find-files
> "gcc/config"
> "^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
> (("#define (GLIBC|GNU_USER)_DYNAMIC_LINKER([^
> \t]*).*$"
> _
> gnu-user
> suffix)
> (format
> #f
> "#define ~a_DYNAMIC_LINKER~a \"~a\"~%"
> gnu-user
> suffix
> (string-append libc "/lib/ld64.so.2"))))
> (substitute*
> (find-files "gcc/config" "^gnu-user.*\\.h$")
> (("#define GNU_USER_TARGET_LIB_SPEC (.*)$"
> _
> suffix)
> (format
> #f
> "#define GNU_USER_TARGET_LIB_SPEC \"-L~a/lib
> %{!static:-rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \"
> ~a"
> libc
> libc
> libdir
> suffix))
> (("#define GNU_USER_TARGET_STARTFILE_SPEC.*$"
> line)
> (format
> #f
> "#define STANDARD_STARTFILE_PREFIX_1
> \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
> libc
> line)))
> (substitute*
> "gcc/config/rs6000/sysv4.h"
> (("#define LIB_LINUX_SPEC (.*)$" _ suffix)
> (format
> #f
> "#define LIB_LINUX_SPEC \"-L~a/lib %{!static:-
> rpath=~a/lib %{!static-libgcc:-rpath=~a/lib -lgcc_s}} \" ~a"
> libc
> libc
> libdir
> suffix))
> (("#define\tSTARTFILE_LINUX_SPEC.*$" line)
> (format
> #f
> "#define STANDARD_STARTFILE_PREFIX_1
> \"~a/lib\"\n#define STANDARD_STARTFILE_PREFIX_2 \"\"\n~a"
> libc
> line))))
> (when (file-exists? "gcc/config/rs6000")
> (substitute*
> (find-files "gcc/config/rs6000")
> (("/lib64") "/lib")))
> (substitute*
> "fixincludes/fixincl.x"
> (("static char const sed_cmd_z\\[\\] =.*;")
> "static char const sed_cmd_z[] = \"sed\";"))
> (when (file-exists? "gcc/config/aarch64")
> (substitute*
> "gcc/config/aarch64/t-aarch64-linux"
> (("lib64") "lib")))
> (when (file-exists? "libbacktrace")
> (substitute*
> "libbacktrace/configure"
> (("WARN_FLAGS=(.*)-Werror" _ flags)
> (string-append "WARN_FLAGS=" flags)))
> (when (file-exists? "libsanitizer/libbacktrace")
> (substitute*
> "libsanitizer/libbacktrace/Makefile.in"
> (("-Werror") ""))))
> (substitute*
> "libstdc++-v3/src/Makefile.in"
> (("^OPT_LDFLAGS = ")
> "OPT_LDFLAGS = -Wl,-rpath=$(libdir) "))
> (substitute*
> "libstdc++-v3/python/Makefile.in"
> (("pythondir = .*$")
> (string-append
> "pythondir = "
> libdir
> "/share"
> "/gcc-$(gcc_version)/python\n")))
> (substitute*
> "gcc/config.in"
> (("PREFIX_INCLUDE_DIR")
> "PREFIX_INCLUDE_DIR_isnt_necessary_here"))
> #t)))
> (add-after
> 'configure
> 'post-configure
> (lambda _
> (substitute*
> "Makefile"
> (("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
> "TOPLEVEL_CONFIGURE_ARGUMENTS=\n"))
> #t)))
> (add-after
> 'unpack
> 'unpack-gmp&co
> (lambda* (#:key inputs #:allow-other-keys)
> (let ((gmp (assoc-ref %build-inputs "gmp-source"))
> (mpfr (assoc-ref %build-inputs "mpfr-source"))
> (mpc (assoc-ref %build-inputs "mpc-source")))
> (for-each
> (lambda (source) (invoke "tar" "xvf" source))
> (list gmp mpfr mpc))
> (symlink "gmp-6.0.0" "gmp")
> (symlink "mpfr-4.0.2" "mpfr")
> (symlink "mpc-1.1.0" "mpc")
> #t)))))
> scheme@(guix-user)>
> --8<---------------cut here---------------end--------------->8---
>
> And here is what Guix says about the configure options for %gcc-
> static,
> when cross-compiled for powerpc64le-linux-gnu on an x86_64-linux
> system
> using commit 662e7e28d576ada91fc9dec7d27c100666114f03, which is the
> one
> we used to build the powerpc64le-linux bootstrap binaries:
>
> --8<---------------cut here---------------start------------->8---
> scheme@(guix-user)> package->bag
> $1 = #<procedure package->bag (package #:optional system target #:key
> graft?)>
> scheme@(guix-user)> ,pp (bag-arguments (package->bag (@@ (gnu
> packages make-bootstrap) %gcc-static) "x86_64-linux" "powerpc64le-
> linux-gnu"))
> $2 = (#:system
> "x86_64-linux"
> #:target
> "powerpc64le-linux-gnu"
> #:modules
> ((srfi srfi-1)
> (srfi srfi-26)
> (ice-9 regex)
> (guix build gnu-build-system)
> (guix build utils)
> (guix build gremlin)
> (guix elf))
> #:out-of-source?
> #t
> #:configure-flags
> (append
> (list "--disable-bootstrap"
> "--with-stage1-ldflags=-static"
> "--enable-languages=c,c++"
> "--disable-lto"
> "--disable-shared"
> "--disable-plugin"
> "--disable-libmudflap"
> "--disable-libatomic"
> "--disable-libsanitizer"
> "--disable-libitm"
> "--disable-libgomp"
> "--disable-libcilkrts"
> "--disable-libvtv"
> "--disable-libssp"
> "--disable-libquadmath")
> (remove
> (cut string-match
> "--(.*plugin|enable-languages)"
> <>)
> `("--enable-plugin"
> "--enable-languages=c,c++"
> "--disable-multilib"
> "--with-system-zlib"
> "--disable-libstdcxx-pch"
> "--with-local-prefix=/no-gcc-local-prefix"
> ,(string-append
> "--with-gxx-include-dir="
> (assoc-ref %outputs "out")
> "/include/c++")
> ,(let ((libc (assoc-ref %build-inputs "libc")))
> (if libc
> (string-append
> "--with-native-system-header-dir="
> libc
> "/include")
> "--without-headers"))
> "CC_FOR_TARGET=powerpc64le-linux-gnu-gcc"
> "CXX_FOR_TARGET=powerpc64le-linux-gnu-g++"
> "LD_FOR_TARGET=powerpc64le-linux-gnu-ld"
> "AR_FOR_TARGET=powerpc64le-linux-gnu-ar"
> "NM_FOR_TARGET=powerpc64le-linux-gnu-nm"
> "OBJDUMP_FOR_TARGET=powerpc64le-linux-gnu-objdump"
> "RANLIB_FOR_TARGET=powerpc64le-linux-gnu-ranlib"
> "STRIP_FOR_TARGET=powerpc64le-linux-gnu-strip")))
> #:make-flags
> '("CFLAGS=-g0 -O2")
> #:tests?
> #f
> #:phases
> (modify-phases
> (modify-phases
> %standard-phases
> (add-before
> 'configure
> 'pre-configure
> (lambda* (#:key inputs outputs #:allow-other-keys)
> (let ((libdir
> (string-append
> (or (assoc-ref outputs "lib")
> (assoc-ref outputs "out"))
> "/"
> "powerpc64le-linux-gnu"))
> (libc (assoc-ref inputs "libc")))
> (when libc
> (for-each
> (lambda (x)
> (substitute*
> (find-files
> "gcc/config"
> "^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
> (("(#define
> (GLIBC|GNU_USER)_DYNAMIC_LINKER.*)\\\\\n$"
> _
> line)
> line)))
> '(1 2 3))
> (substitute*
> (find-files
> "gcc/config"
> "^(linux|gnu|sysv4)(64|-elf|-eabi)?\\.h$")
> (("#define (GLIBC|GNU_USER)_DYNAMIC_LINKER([^
> \t]*).*$"
>
This message was truncated. Download the full message here.
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEEFIvLi9gL+xax3g6RRaix6GvNEKYFAmBd8J8ACgkQRaix6GvN
EKZu8w//TiON1eTAn9yChBzeQh5Nl0Z24vye/f0w4alxLTMKTno2G1wkvD7MS40W
MqNYeUrh50Mwhvrbr+F6wX4iYx6EWoz81mXn895GhI2BEdas2a2Q2ddmrkvlqH+V
sUxjVg3c4hzdo8DB+l5AVvxds4ZqrhddNk93Ljj2w5GHDfLVPt3JBOgbuVzYtIFL
u49GausiAExkBiY/bYBsaWzNnM/YSXAfBkOsR2QZpFHsn7qdSBzIzTw3qswX5/gN
RXSqqZjYc1IP97tYMjO8MiiCLlX5XJJsQDKO4yfCyiiFp9DYjpeBrbmEeOqPTBGj
5FK8scQobvftbf/FJ+dmSyNg8Ir0t+v0nYA2rAY/bfrkXaFG87shwcz7kwcH/hVt
EoYhXmqVI33Vfw3drdeP1/5r6EJGbLa92kLSu/wsMe6kUnX164bXmWeNknb1U5Ue
/2+9YQqdrPkFLXdgkC69LCVxK3u7WHOqkOCJGV9B0VLU97zS8dM6Y4fI65aY/urm
cwD+fEWIOvJcbc8iXB7XGHN496HvUe+tdfQhjCJkHanfNnXFxPH7x4dkWmFAn8xn
sCvHc+4T/ZwZ3sZPn7cAxHVWxU9KmuOnU06v+VZ19g4oXgzDB1zYLgt3VmLYu4KC
a2UMAhGFWgg74rY8IBNUeuH3kA4+i9Gn8WHEg0JoOYiQXODf0bU=
=hIf8
-----END PGP SIGNATURE-----


C
C
Carl Dong wrote on 29 Mar 2021 19:53
Closing 47349
(address . control@debbugs.gnu.org)
EC26E3FB-8428-45E7-8401-FC409AC6B529@carldong.me
close 47349
?