diff mbox series

[bug#73118,5/5] Introduce arm-none-eabi 12.3.rel1 toolchain

Message ID 2ff218480c1347aadfc7c976dcb8d89e8f0e5e89.1725779196.git.rutherther@protonmail.com
State New
Headers show
Series Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 | expand

Commit Message

Rutherther Sept. 8, 2024, 7:49 a.m. UTC
The arguments for this toolchain are taken mostly out of here
https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads/12-3-rel1

Change-Id: I9921ab06bc4f2ce59afedb48775017b17e0fd144
---
 gnu/local.mk                                 |   1 +
 gnu/packages/embedded.scm                    | 110 +++++-
 gnu/packages/patches/newlib-getentropy.patch | 380 +++++++++++++++++++
 3 files changed, 490 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/patches/newlib-getentropy.patch
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index cf42e2b6da..71db5ab2ca 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1800,6 +1800,7 @@  dist_patch_DATA =						\
   %D%/packages/patches/ngircd-handle-zombies.patch		\
   %D%/packages/patches/network-manager-plugin-path.patch	\
   %D%/packages/patches/network-manager-meson.patch		\
+  %D%/packages/patches/newlib-getentropy.patch			\
   %D%/packages/patches/nginx-socket-cloexec.patch		\
   %D%/packages/patches/nickle-man-release-date.patch		\
   %D%/packages/patches/nnpack-system-libraries.patch		\
diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index 4093c10916..677bf3f797 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -78,22 +78,27 @@  (define-module (gnu packages embedded)
   #:export (make-gcc-arm-none-eabi-4.9
             make-gcc-arm-none-eabi-6
             make-gcc-arm-none-eabi-7-2018-q2-update
+            make-gcc-arm-none-eabi-12.3.rel1
 
             make-gcc-vc4
 
             make-newlib-arm-none-eabi
             make-newlib-arm-none-eabi-7-2018-q2-update
+            make-newlib-arm-none-eabi-12.3.rel1
 
             make-newlib-nano-arm-none-eabi
             make-newlib-nano-arm-none-eabi-7-2018-q2-update
+            make-newlib-nano-arm-none-eabi-12.3.rel1
 
             make-arm-none-eabi-toolchain-4.9
             make-arm-none-eabi-toolchain-6
             make-arm-none-eabi-toolchain-7-2018-q2-update
+            make-arm-none-eabi-toolchain-12.3.rel1
 
             make-arm-none-eabi-nano-toolchain-4.9
             make-arm-none-eabi-nano-toolchain-6
             make-arm-none-eabi-nano-toolchain-7-2018-q2-update
+            make-arm-none-eabi-nano-toolchain-12.3.rel1
 
             make-gdb-arm-none-eabi
 
@@ -468,12 +473,103 @@  (define make-newlib-nano-arm-none-eabi-7-2018-q2-update
   (mlambda ()
     (make-base-newlib-arm-none-eabi-7-2018-q2-update (make-newlib-nano-arm-none-eabi))))
 
+
+;;; The following definitions are for the "12.3.rel1" variant of the
+;;; ARM cross toolchain as offered on https://developer.arm.com
+(define-public make-gcc-arm-none-eabi-12.3.rel1
+  (mlambda ()
+    (let ((base (make-gcc-arm-none-eabi-7-2018-q2-update))
+          (xgcc-base (cross-gcc "arm-none-eabi"
+                                #:xgcc gcc-12
+                                #:xbinutils (cross-binutils "arm-none-eabi"))))
+      (package
+        (inherit base)
+        (version "12.3.rel1")
+        (source
+         (origin
+           (inherit (package-source xgcc-base))
+           (method git-fetch)
+           (uri (git-reference
+                 (url "git://gcc.gnu.org/git/gcc.git")
+                 (commit "0f54a73b998b72f7c8452a63730ec3b16fc47854")))
+           (sha256
+            (base32 "0r6q0m3d8g3k3rkmnqjw8aw5fcnsrmywf4ispdkxmk1al3whk1vk"))))
+        (arguments
+         (substitute-keyword-arguments (package-arguments base)
+           ((#:phases phases)
+            #~(modify-phases #$phases
+                (replace 'expand-version-string
+                  (lambda _
+                    (make-file-writable "gcc/DEV-PHASE")
+                    (with-output-to-file "gcc/DEV-PHASE"
+                      (lambda ()
+                        (display "12.3.rel1")))))))
+           ((#:configure-flags flags)
+            #~(cons* "--with-multilib-list=aprofile,rmprofile"
+                     "--with-headers=yes"
+                     "--enable-checking=release"
+                     "--with-gnu-as"
+                     "--with-gnu-ld"
+                     (filter
+                      (lambda (flag)
+                        (not (member flag
+                                     '("--with-multilib-list=rmprofile"
+                                       "--enable-plugins"
+                                       "--disable-libffi"))))
+                      #$flags)))))))))
+
+(define make-base-newlib-arm-none-eabi-12.3.rel1
+  (mlambda (original-base)
+    (let ((base (make-base-newlib-arm-none-eabi-7-2018-q2-update original-base))
+          (commit "4c7d0dfec5793cbf5cf3930b91f930479126d8ce")
+          (revision "0"))
+      (package
+        (inherit base)
+        (version (git-version "4.3.0" revision commit))
+        (source
+         (origin
+           (method git-fetch)
+           (uri (git-reference
+                 (url "http://sourceware.org/git/newlib-cygwin.git")
+                 (commit commit)))
+           (sha256
+            (base32
+             "0drs9v8avh4y2h5bs0ixjn9x662jzkkikx8z034wgl41dxmn6786"))))
+        (arguments (substitute-keyword-arguments (package-arguments base)
+                     ((#:configure-flags flags)
+                      #~(cons* "--enable-newlib-mb"
+                               "--enable-newlib-reent-check-verify"
+                               "--enable-newlib-register-fini"
+                               #$flags))))))))
+
+(define make-newlib-arm-none-eabi-12.3.rel1
+  (mlambda ()
+    (make-base-newlib-arm-none-eabi-12.3.rel1 (make-newlib-arm-none-eabi))))
+
+(define make-newlib-nano-arm-none-eabi-12.3.rel1
+  (mlambda ()
+    (make-base-newlib-arm-none-eabi-12.3.rel1 (make-newlib-nano-arm-none-eabi))))
+
 
 (define make-libstdc++-arm-none-eabi
   (mlambda (xgcc newlib)
-    (let ((libstdc++ (make-libstdc++ xgcc)))
+    (let* ((libstdc++ (make-libstdc++ xgcc))
+           (src (package-source libstdc++)))
       (package
         (inherit libstdc++)
+        (source
+         (origin
+           (inherit src)
+           (patches (append
+                     ; libstdc++ cannot be linked with since the configure phase
+                     ; cannot detect properly the presence of getentropy function.
+                     ; The function is inside of a header, but it's not present in the resulting
+                     ; newlib. configure will conclude getentropy is present,
+                     ; random will use getentropy, and any linking with random will fail.
+                     (if (version>=? (package-version xgcc) "12.0")
+                         (search-patches "newlib-getentropy.patch")
+                         '())
+                     (origin-patches src)))))
         (name "libstdc++-arm-none-eabi")
         ; TODO When --libdir is specified, debug output is not produced.
         (outputs '("out"))
@@ -626,6 +722,18 @@  (define make-arm-none-eabi-nano-toolchain-7-2018-q2-update
      (make-gcc-arm-none-eabi-7-2018-q2-update)
      (make-newlib-nano-arm-none-eabi-7-2018-q2-update))))
 
+(define make-arm-none-eabi-toolchain-12.3.rel1
+  (mlambda ()
+    (make-arm-none-eabi-toolchain
+     (make-gcc-arm-none-eabi-12.3.rel1)
+     (make-newlib-arm-none-eabi-12.3.rel1))))
+
+(define make-arm-none-eabi-nano-toolchain-12.3.rel1
+  (mlambda ()
+    (make-arm-none-eabi-toolchain
+     (make-gcc-arm-none-eabi-12.3.rel1)
+     (make-newlib-nano-arm-none-eabi-12.3.rel1))))
+
 (define make-gdb-arm-none-eabi
   (mlambda ()
     (package
diff --git a/gnu/packages/patches/newlib-getentropy.patch b/gnu/packages/patches/newlib-getentropy.patch
new file mode 100644
index 0000000000..a4137d81f0
--- /dev/null
+++ b/gnu/packages/patches/newlib-getentropy.patch
@@ -0,0 +1,380 @@ 
+Patch-Source: https://github.com/zephyrproject-rtos/gcc/pull/8
+
+From 55addb0c0c5ff5e0aab85574aa26abf175af85c8 Mon Sep 17 00:00:00 2001
+From: Stephanos Ioannidis <root@stephanos.io>
+Date: Mon, 25 Jul 2022 23:10:41 +0900
+Subject: [PATCH] libstdc++: Do not check getentropy and arc4random for cross builds
+
+The "getentropy" and "arc4random" check may not yield a correct result
+for the cross compile builds because linking is often not available for
+them and the C library headers (notoriously, newlib) may still declare
+these function prototypes even if they are not actually part of the
+final library -- for this reason, this commit disables the "getentropy"
+and "arc4random" checks for non-native builds.
+
+This effectively prevents the std::random_device from making use of
+these functions when `--with-newlib` is specified, which is indeed a
+correct behaviour because the newlib does not provide a default stub
+for the "getentropy" function (also note that the newlib "arc4random"
+implementation internally calls the missing "getentropy" function).
+
+For other C libraries, the `GLIBCXX_CROSSCONFIG` function may hard-code
+the availability of these functions by manually defining
+`HAVE_GETENTROPY` and `HAVE_ARC4RANDOM`, or by calling the
+`GLIBCXX_CHECK_GETENTROPY` and `GLIBCXX_CHECK_ARC4RANDOM` functions.
+
+libstdc++-v3:
+	* configure.ac: Relocate GLIBCXX_CHECK_GETENTROPY and
+	GLIBCXX_CHECK_ARC4RANDOM
+	* configure: Regenerate.
+
+Signed-off-by: Stephanos Ioannidis <root@stephanos.io>
+---
+ libstdc++-v3/configure    | 300 +++++++++++++++++++-------------------
+ libstdc++-v3/configure.ac |   8 +-
+ 2 files changed, 154 insertions(+), 154 deletions(-)
+
+diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
+index 0ce74e8202443..5d43b56b03ffa 100755
+--- a/libstdc++-v3/configure
++++ b/libstdc++-v3/configure
+@@ -28088,6 +28088,156 @@ $as_echo "#define _GLIBCXX_USE_RANDOM_TR1 1" >>confdefs.h
+ 
+ 
+ 
++  # Check for other random number APIs
++
++
++
++  ac_ext=cpp
++ac_cpp='$CXXCPP $CPPFLAGS'
++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
++
++  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getentropy" >&5
++$as_echo_n "checking for getentropy... " >&6; }
++if ${glibcxx_cv_getentropy+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++
++      if test x$gcc_no_link = xyes; then
++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++#include <unistd.h>
++int
++main ()
++{
++unsigned i;
++	 ::getentropy(&i, sizeof(i));
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_cxx_try_compile "$LINENO"; then :
++  glibcxx_cv_getentropy=yes
++else
++  glibcxx_cv_getentropy=no
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  if test x$gcc_no_link = xyes; then
++  as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
++fi
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++#include <unistd.h>
++int
++main ()
++{
++unsigned i;
++	 ::getentropy(&i, sizeof(i));
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_cxx_try_link "$LINENO"; then :
++  glibcxx_cv_getentropy=yes
++else
++  glibcxx_cv_getentropy=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_getentropy" >&5
++$as_echo "$glibcxx_cv_getentropy" >&6; }
++
++  if test $glibcxx_cv_getentropy = yes; then
++
++$as_echo "#define HAVE_GETENTROPY 1" >>confdefs.h
++
++  fi
++  ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++
++
++
++  ac_ext=cpp
++ac_cpp='$CXXCPP $CPPFLAGS'
++ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
++
++  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for arc4random" >&5
++$as_echo_n "checking for arc4random... " >&6; }
++if ${glibcxx_cv_arc4random+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++
++      if test x$gcc_no_link = xyes; then
++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++#include <stdlib.h>
++int
++main ()
++{
++unsigned i = ::arc4random();
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_cxx_try_compile "$LINENO"; then :
++  glibcxx_cv_arc4random=yes
++else
++  glibcxx_cv_arc4random=no
++fi
++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++else
++  if test x$gcc_no_link = xyes; then
++  as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
++fi
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++#include <stdlib.h>
++int
++main ()
++{
++unsigned i = ::arc4random();
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_cxx_try_link "$LINENO"; then :
++  glibcxx_cv_arc4random=yes
++else
++  glibcxx_cv_arc4random=no
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++fi
++
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_arc4random" >&5
++$as_echo "$glibcxx_cv_arc4random" >&6; }
++
++  if test $glibcxx_cv_arc4random = yes; then
++
++$as_echo "#define HAVE_ARC4RANDOM 1" >>confdefs.h
++
++  fi
++  ac_ext=c
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
++ac_compiler_gnu=$ac_cv_c_compiler_gnu
++
++
++
+   # For TLS support.
+ 
+ 
+@@ -75519,156 +75669,6 @@ $as_echo "#define _GLIBCXX_X86_RDSEED 1" >>confdefs.h
+   fi
+ 
+ 
+-# Check for other random number APIs
+-
+-
+-
+-  ac_ext=cpp
+-ac_cpp='$CXXCPP $CPPFLAGS'
+-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+-
+-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getentropy" >&5
+-$as_echo_n "checking for getentropy... " >&6; }
+-if ${glibcxx_cv_getentropy+:} false; then :
+-  $as_echo_n "(cached) " >&6
+-else
+-
+-      if test x$gcc_no_link = xyes; then
+-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <unistd.h>
+-int
+-main ()
+-{
+-unsigned i;
+-	 ::getentropy(&i, sizeof(i));
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_cxx_try_compile "$LINENO"; then :
+-  glibcxx_cv_getentropy=yes
+-else
+-  glibcxx_cv_getentropy=no
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-else
+-  if test x$gcc_no_link = xyes; then
+-  as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+-fi
+-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <unistd.h>
+-int
+-main ()
+-{
+-unsigned i;
+-	 ::getentropy(&i, sizeof(i));
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_cxx_try_link "$LINENO"; then :
+-  glibcxx_cv_getentropy=yes
+-else
+-  glibcxx_cv_getentropy=no
+-fi
+-rm -f core conftest.err conftest.$ac_objext \
+-    conftest$ac_exeext conftest.$ac_ext
+-fi
+-
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_getentropy" >&5
+-$as_echo "$glibcxx_cv_getentropy" >&6; }
+-
+-  if test $glibcxx_cv_getentropy = yes; then
+-
+-$as_echo "#define HAVE_GETENTROPY 1" >>confdefs.h
+-
+-  fi
+-  ac_ext=c
+-ac_cpp='$CPP $CPPFLAGS'
+-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+-
+-
+-
+-
+-
+-  ac_ext=cpp
+-ac_cpp='$CXXCPP $CPPFLAGS'
+-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+-
+-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for arc4random" >&5
+-$as_echo_n "checking for arc4random... " >&6; }
+-if ${glibcxx_cv_arc4random+:} false; then :
+-  $as_echo_n "(cached) " >&6
+-else
+-
+-      if test x$gcc_no_link = xyes; then
+-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <stdlib.h>
+-int
+-main ()
+-{
+-unsigned i = ::arc4random();
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_cxx_try_compile "$LINENO"; then :
+-  glibcxx_cv_arc4random=yes
+-else
+-  glibcxx_cv_arc4random=no
+-fi
+-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+-else
+-  if test x$gcc_no_link = xyes; then
+-  as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
+-fi
+-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-#include <stdlib.h>
+-int
+-main ()
+-{
+-unsigned i = ::arc4random();
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_cxx_try_link "$LINENO"; then :
+-  glibcxx_cv_arc4random=yes
+-else
+-  glibcxx_cv_arc4random=no
+-fi
+-rm -f core conftest.err conftest.$ac_objext \
+-    conftest$ac_exeext conftest.$ac_ext
+-fi
+-
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_arc4random" >&5
+-$as_echo "$glibcxx_cv_arc4random" >&6; }
+-
+-  if test $glibcxx_cv_arc4random = yes; then
+-
+-$as_echo "#define HAVE_ARC4RANDOM 1" >>confdefs.h
+-
+-  fi
+-  ac_ext=c
+-ac_cpp='$CPP $CPPFLAGS'
+-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+-
+-
+-
+ # This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE.
+ 
+   # Do checks for resource limit functions.
+diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
+index e59bcdb29441f..05cdfcddbc43b 100644
+--- a/libstdc++-v3/configure.ac
++++ b/libstdc++-v3/configure.ac
+@@ -269,6 +269,10 @@ if $GLIBCXX_IS_NATIVE; then
+   # For /dev/random and /dev/urandom for std::random_device.
+   GLIBCXX_CHECK_DEV_RANDOM
+ 
++  # Check for other random number APIs
++  GLIBCXX_CHECK_GETENTROPY
++  GLIBCXX_CHECK_ARC4RANDOM
++
+   # For TLS support.
+   GCC_CHECK_TLS
+ 
+@@ -474,10 +478,6 @@ GLIBCXX_CHECK_X86_RDRAND
+ # Check if assembler supports rdseed opcode.
+ GLIBCXX_CHECK_X86_RDSEED
+ 
+-# Check for other random number APIs
+-GLIBCXX_CHECK_GETENTROPY
+-GLIBCXX_CHECK_ARC4RANDOM
+-
+ # This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE.
+ GLIBCXX_CONFIGURE_TESTSUITE
+