all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [bug#73118] [PATCH 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1
@ 2024-09-08  7:42 Rutherther via Guix-patches via
  2024-09-08  7:48 ` [bug#73118] [PATCH 1/5] Fix native-search-paths of arm-none-eabi toolchains Rutherther via Guix-patches via
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-08  7:42 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

Hello everyone,

the aim of this patch series is to fix the arm ebedded toolchains that
had a few issues, some of those have been reported already, but didn't
get much attention.

The issues:
- CROSS_CPLUS_INCLUDE_PATH had C include first, C++ second. Since <cstdlib> uses include_next for stdlib.h, stdlib.h was not found
- libstdc++ outputted files to /lib, but cross lib path has arm-none-eabi/lib inside of it. I think that the env var is correct, to allow using both cross toolchain and normal one in a profile. But then the path of libstdc++ is wrong
- libstdc++ didn't provide nano variant. This meant that even with the nano toolchain it was impossible to use nano.specs with C++
- the 7-2018-q2-update toolchain didn't provide nano variant of newlib, its newlib-nano was just a copy of newlib with name modified

Apart from that, I've also made 12.3.rel1 toolchain available. At first
I wanted to try the latest, but I was having some issues with it, so
decided to try one major version back, and that worked fine. The problem
with the older toolchains is that I cannot get them to compile stuff
like qmk or pico-sdk that rely on newer gcc features. There was one issue
with this toolchain, namely that libstdc++ thought getentropy function was present,
but getentropy is not present in the resulting library, only in headers.
I've found it's an issue in gcc and foun a patch published on GitHub repo
of Zephyr project.

Unanswered questions:
- Since the libraries go onto small embedded targets, should they be compiled with more optimization flags? This doesn't have to be solved as part of this issue.
- How does the debug output work internally in Guix ecosystem? I had to remove the debug output after changing "--libdir" of the libstdc++, since the debug output was not produced. I am not sure if this is a blocker for merge.

I think it would be good to refactor the embedded arm toolchains a bit in the future,
to provide variants that would accept arbitrary gcc, newlib and libstdc++
and when compiling these, decide on the flags based on the major versions.
(Something like the avr toolchain has, though they don't modify the flags,
it's probably simpler for the avr toolchain in some ways)
Then provide a few preselected toolchains with gcc, newlib, libstdc++
with the versions supported by developer.arm.com.
I would be willing to do this work, but I didn't want to have
it part of this issue, because I can imagine there
will be some discussion about it, whereas I hope this issue could
be merged without much discussion.

PS: Sorry if you see this cover letter, and not the rest of the patches.
I have an issue with sending e-mails from protonmail where they appear
only after a few hours. So after I get id of this issue after few hours
from sending this cover letter, there will be another few-hour wait for
the patches to apper... :/

Rutherther (5):
  Fix native-search-paths of arm-none-eabi toolchains
  Fix lib directory of arm-none-eabi libstdc++
  Add libstdc++-nano for arm-none-eabi
  Fix arm-none-eabi 7 newlib nano variant
  Introduce arm-none-eabi 12.3.rel1 toolchain

 gnu/local.mk                                 |   1 +
 gnu/packages/embedded.scm                    | 223 +++++++++--
 gnu/packages/patches/newlib-getentropy.patch | 380 +++++++++++++++++++
 3 files changed, 572 insertions(+), 32 deletions(-)
 create mode 100644 gnu/packages/patches/newlib-getentropy.patch


base-commit: 8485eb6e96dc2f539bac0298e12b07392da1e49e
--
2.45.2






^ permalink raw reply	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH 1/5] Fix native-search-paths of arm-none-eabi toolchains
  2024-09-08  7:42 [bug#73118] [PATCH 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
@ 2024-09-08  7:48 ` Rutherther via Guix-patches via
  2024-09-08  7:49 ` [bug#73118] [PATCH 2/5] Fix lib directory of arm-none-eabi libstdc++ Rutherther via Guix-patches via
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-08  7:48 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

The toolchains CROSS_CPLUS_INCLUDE_PATH had C include directory
first, and the C++ as second. Since <cstdlib> does #include_next <stdlib.h>,
the toolchains could not build anything using <cstdlib>. The C include
has to come later than C++ one. This is already fixed in xgcc search-path.
---
 gnu/packages/embedded.scm | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index bee65663b6..a7ba9ebe98 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -201,9 +201,9 @@ (define make-gcc-arm-none-eabi-4.9
                 (files '("arm-none-eabi/include")))
                (search-path-specification
                 (variable "CROSS_CPLUS_INCLUDE_PATH")
-                (files '("arm-none-eabi/include"
-                         "arm-none-eabi/include/c++"
-                         "arm-none-eabi/include/c++/arm-none-eabi")))
+                (files '("arm-none-eabi/include/c++"
+                         "arm-none-eabi/include/c++/arm-none-eabi"
+                         "arm-none-eabi/include")))
                (search-path-specification
                 (variable "CROSS_LIBRARY_PATH")
                 (files '("arm-none-eabi/lib")))))))))
@@ -423,9 +423,9 @@ (define make-gcc-arm-none-eabi-7-2018-q2-update
                        (files '("arm-none-eabi/include")))
                       (search-path-specification
                        (variable "CROSS_CPLUS_INCLUDE_PATH")
-                       (files '("arm-none-eabi/include"
-                                "arm-none-eabi/include/c++"
-                                "arm-none-eabi/include/c++/arm-none-eabi")))
+                       (files '("arm-none-eabi/include/c++"
+                                "arm-none-eabi/include/c++/arm-none-eabi"
+                                "arm-none-eabi/include")))
                       (search-path-specification
                        (variable "CROSS_LIBRARY_PATH")
                        (files '("arm-none-eabi/lib")))))))))
-- 
2.45.2






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH 2/5] Fix lib directory of arm-none-eabi libstdc++
  2024-09-08  7:42 [bug#73118] [PATCH 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
  2024-09-08  7:48 ` [bug#73118] [PATCH 1/5] Fix native-search-paths of arm-none-eabi toolchains Rutherther via Guix-patches via
@ 2024-09-08  7:49 ` Rutherther via Guix-patches via
  2024-09-08  7:49 ` [bug#73118] [PATCH 3/5] Add libstdc++-nano for arm-none-eabi Rutherther via Guix-patches via
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-08  7:49 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

The libstdc++ made for arm-none-eabi puts the contents
into "lib" folder, but that's unexpected when the resulting
toolchain is a cross toolchain.
The folder should be "arm-none-eabi/lib"
---
 gnu/packages/embedded.scm | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index a7ba9ebe98..59ffd9a661 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -481,6 +481,8 @@ (define make-libstdc++-arm-none-eabi
       (package
         (inherit libstdc++)
         (name "libstdc++-arm-none-eabi")
+        ; TODO When --libdir is specified, debug output is not produced.
+        (outputs '("out"))
         (arguments
          (substitute-keyword-arguments (package-arguments libstdc++)
            ((#:configure-flags _)
@@ -493,6 +495,9 @@ (define make-libstdc++-arm-none-eabi
                "--disable-tls"
                "--disable-plugin"
                "--with-newlib"
+               ,(string-append "--libdir="
+                               (assoc-ref %outputs "out")
+                               "/arm-none-eabi/lib")
                ,(string-append "--with-gxx-include-dir="
                                (assoc-ref %outputs "out")
                                "/arm-none-eabi/include/c++")))))
-- 
2.45.2






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH 3/5] Add libstdc++-nano for arm-none-eabi
  2024-09-08  7:42 [bug#73118] [PATCH 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
  2024-09-08  7:48 ` [bug#73118] [PATCH 1/5] Fix native-search-paths of arm-none-eabi toolchains Rutherther via Guix-patches via
  2024-09-08  7:49 ` [bug#73118] [PATCH 2/5] Fix lib directory of arm-none-eabi libstdc++ Rutherther via Guix-patches via
@ 2024-09-08  7:49 ` Rutherther via Guix-patches via
  2024-09-08  7:49 ` [bug#73118] [PATCH 4/5] Fix arm-none-eabi 7 newlib nano variant Rutherther via Guix-patches via
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-08  7:49 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

The arm-none-eabi nano toolchain had same libstdc++ as the non-nano variant.
The libstdc++ should be compiled with -fno-exceptions to make a nano
toolchain.

Additionally, since the "_nano.a" variants were not present, it was impossible
to compile C++ programs with libstdc++ using --specs=nano.specs,
since libstdc++_nano.a was not found.
---
 gnu/packages/embedded.scm | 76 ++++++++++++++++++++++++++++++++-------
 1 file changed, 64 insertions(+), 12 deletions(-)

diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index 59ffd9a661..1ea794724c 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -486,7 +486,14 @@ (define make-libstdc++-arm-none-eabi
         (arguments
          (substitute-keyword-arguments (package-arguments libstdc++)
            ((#:configure-flags _)
-            ``("--target=arm-none-eabi"
+            ``("CFLAGS=-ffunction-sections -fdata-sections"
+               "CXXFLAGS=-ffunction-sections -fdata-sections"
+               ; This is more of a hack. This option doesn't really seem
+               ; to change what subdir is used eventually, but without it there is
+               ; error: Link tests are not allowed after GCC_NO_EXECUTABLES with
+               ; The 12.3 toolchain
+               "--with-target-subdir=\".\""
+               "--target=arm-none-eabi"
                "--host=arm-none-eabi"
                "--disable-libstdcxx-pch"
                "--enable-multilib"
@@ -506,21 +513,65 @@ (define make-libstdc++-arm-none-eabi
            ("xgcc" ,xgcc)
            ,@(package-native-inputs libstdc++)))))))
 
+(define make-libstdc++-nano-arm-none-eabi
+  (mlambda (xgcc newlib-nano)
+    (let ((base (make-libstdc++-arm-none-eabi xgcc newlib-nano)))
+      (package
+        (inherit base)
+        (name "libstdc++-nano-arm-none-eabi")
+        (arguments (substitute-keyword-arguments (package-arguments base)
+                     ((#:configure-flags flags)
+                      #~(cons* "CFLAGS=-ffunction-sections -fdata-sections -fno-exceptions"
+                               "CXXFLAGS=-ffunction-sections -fdata-sections -fno-exceptions"
+                               (filter
+                                  (lambda (flag)
+                                    (not (or (string-prefix? "CFLAGS=" flag)
+                                             (string-prefix? "CXXFLAGS=" flag))))
+                                  #$flags)))
+                     ((#:phases phases)
+                      #~(modify-phases #$phases
+                          (add-after 'install 'hardlink-libstdc++
+                            ;; XXX: Most arm toolchains offer both *.a and *_nano.a as
+                            ;; newlib and newlib-nano respectively.  The headers are
+                            ;; usually arm-none-eabi/include/newlib.h for newlib and
+                            ;; arm-none-eabi/include/newlib-nano/newlib.h for newlib-nano.
+                            ;; We have two different toolchain packages for each which
+                            ;; works but is a little strange.
+                            (lambda* (#:key outputs #:allow-other-keys)
+                              (let ((out (assoc-ref outputs "out")))
+                                ;; The nano.specs file says that newlib-nano files should
+                                ;; end in "_nano.a" instead of just ".a".  Note that this
+                                ;; applies to all the multilib folders too.
+                                (for-each
+                                 (lambda (file)
+                                   (link file
+                                         (string-append
+                                          ;; Strip ".a" off the end
+                                          (substring file 0 (- (string-length file) 2))
+                                          ;; Add "_nano.a" onto the end
+                                          "_nano.a")))
+                                 (find-files
+                                  out "^(libstdc\\+\\+.a|libsupc\\+\\+.a)$")))))))))))))
+
 (define make-arm-none-eabi-toolchain
   (mlambda (xgcc newlib)
     "Produce a cross-compiler toolchain package with the compiler XGCC and the
 C library variant NEWLIB."
-    (let ((newlib-with-xgcc
-           (package
-             (inherit newlib)
-             (native-inputs
-              (alist-replace "xgcc" (list xgcc)
-                             (package-native-inputs newlib))))))
+    (let* ((nano? (string=? (package-name newlib)
+                            "newlib-nano"))
+           (newlib-with-xgcc
+            (package
+              (inherit newlib)
+              (native-inputs
+               (alist-replace "xgcc" (list xgcc)
+                              (package-native-inputs newlib)))))
+           (libstdc++
+            (if nano?
+                (make-libstdc++-nano-arm-none-eabi xgcc newlib-with-xgcc)
+                (make-libstdc++-arm-none-eabi xgcc newlib-with-xgcc))))
       (package
         (name (string-append "arm-none-eabi"
-                             (if (string=? (package-name newlib-with-xgcc)
-                                           "newlib-nano")
-                                 "-nano" "")
+                             (if nano? "-nano" "")
                              "-toolchain"))
         (version (package-version xgcc))
         (source #f)
@@ -537,9 +588,10 @@ (define make-arm-none-eabi-toolchain
                              directories))))))
         (propagated-inputs
          `(("binutils" ,(cross-binutils "arm-none-eabi"))
-           ("libstdc++" ,(make-libstdc++-arm-none-eabi xgcc newlib-with-xgcc))
+           ("libstdc++" ,libstdc++)
            ("gcc" ,xgcc)
-           ("newlib" ,newlib-with-xgcc)))
+           ("newlib" ,newlib-with-xgcc)
+           ))
         (synopsis "Complete GCC tool chain for ARM bare metal development")
         (description "This package provides a complete GCC tool chain for ARM
 bare metal development.  This includes the GCC arm-none-eabi cross compiler
-- 
2.45.2






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH 4/5] Fix arm-none-eabi 7 newlib nano variant
  2024-09-08  7:42 [bug#73118] [PATCH 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
                   ` (2 preceding siblings ...)
  2024-09-08  7:49 ` [bug#73118] [PATCH 3/5] Add libstdc++-nano for arm-none-eabi Rutherther via Guix-patches via
@ 2024-09-08  7:49 ` Rutherther via Guix-patches via
  2024-09-08  7:49 ` [bug#73118] [PATCH 5/5] Introduce arm-none-eabi 12.3.rel1 toolchain Rutherther via Guix-patches via
  2024-09-13 11:41 ` [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
  5 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-08  7:49 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

The nano variant was not nano. It was just a copy of the original
one with different name. This meant there were no _nano.a files present
at all.
---
 gnu/packages/embedded.scm | 26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index 1ea794724c..4093c10916 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -247,10 +247,7 @@ (define make-newlib-arm-none-eabi
          (modify-phases %standard-phases
            (add-after 'unpack 'fix-references-to-/bin/sh
              (lambda _
-               (substitute* '("libgloss/arm/cpu-init/Makefile.in"
-                              "libgloss/arm/Makefile.in"
-                              "libgloss/libnosys/Makefile.in"
-                              "libgloss/Makefile.in")
+               (substitute* (find-files "libgloss" "^Makefile\\.in$")
                  (("/bin/sh") (which "sh")))
                #t)))))
       (native-inputs
@@ -430,12 +427,11 @@ (define make-gcc-arm-none-eabi-7-2018-q2-update
                        (variable "CROSS_LIBRARY_PATH")
                        (files '("arm-none-eabi/lib")))))))))
 
-(define make-newlib-arm-none-eabi-7-2018-q2-update
+(define make-base-newlib-arm-none-eabi-7-2018-q2-update
   ;; This is the same commit as used for the 7-2018-q2-update release
   ;; according to the release.txt.
-  (mlambda ()
-    (let ((base (make-newlib-arm-none-eabi))
-          (commit "3ccfb407af410ba7e54ea0da11ae1e40b554a6f4")
+  (mlambda (base)
+    (let ((commit "3ccfb407af410ba7e54ea0da11ae1e40b554a6f4")
           (revision "0"))
       (package
         (inherit base)
@@ -464,15 +460,13 @@ (define make-newlib-arm-none-eabi-7-2018-q2-update
            ("xgcc" ,(make-gcc-arm-none-eabi-7-2018-q2-update))
            ("texinfo" ,texinfo)))))))
 
-(define-public make-newlib-nano-arm-none-eabi-7-2018-q2-update
+(define make-newlib-arm-none-eabi-7-2018-q2-update
   (mlambda ()
-    (let ((base (make-newlib-arm-none-eabi-7-2018-q2-update)))
-      (package
-        (inherit base)
-        (name "newlib-nano")
-        (arguments
-         (package-arguments base))
-        (synopsis "Newlib variant for small systems with limited memory")))))
+    (make-base-newlib-arm-none-eabi-7-2018-q2-update (make-newlib-arm-none-eabi))))
+
+(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))))
 
 \f
 (define make-libstdc++-arm-none-eabi
-- 
2.45.2






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH 5/5] Introduce arm-none-eabi 12.3.rel1 toolchain
  2024-09-08  7:42 [bug#73118] [PATCH 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
                   ` (3 preceding siblings ...)
  2024-09-08  7:49 ` [bug#73118] [PATCH 4/5] Fix arm-none-eabi 7 newlib nano variant Rutherther via Guix-patches via
@ 2024-09-08  7:49 ` Rutherther via Guix-patches via
  2024-09-13 11:41 ` [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
  5 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-08  7:49 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

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 --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))))
 
+\f
+;;; 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))))
+
 \f
 (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
+ 
-- 
2.45.2






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1
  2024-09-08  7:42 [bug#73118] [PATCH 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
                   ` (4 preceding siblings ...)
  2024-09-08  7:49 ` [bug#73118] [PATCH 5/5] Introduce arm-none-eabi 12.3.rel1 toolchain Rutherther via Guix-patches via
@ 2024-09-13 11:41 ` Rutherther via Guix-patches via
  2024-09-13 11:41   ` [bug#73118] [PATCH v2 1/5] gnu: make-gcc-arm-none-eabi: reorder C++ native search paths Rutherther via Guix-patches via
                     ` (4 more replies)
  5 siblings, 5 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-13 11:41 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

Hello all,

I've poked around the questions I raised last time. The debugging symbols
are quite easy. The only thing missing was that I did not point strip-directories
to the correct directory with the libraries.

I figured out the make flags I introduced did not really take any effect as they were
in the #:configure-flags and not in #:make-flags. So I fixed that as well.

I also did another contribution where I learned a bit about chane log format,
and that it should be used with Guix. So I changed the commits to better reflect
this format. Sorry if it's still wrong, I have hard time wrapping my head around
the exact rules of it.

Regards,
Rutherther

Rutherther (5):
  gnu: make-gcc-arm-none-eabi: reorder C++ native search paths
  gnu: make-libstdc++-arm-none-eabi: output libstdc++ to arm-none-eabi.
  gnu: make-libstdc++-arm-none-eabi: add nano variant
  gnu: newlib arm-none-eabi-7-2018-q2-update: Add proper newlib-nano
    variant.
  gnu: arm-none-eabi toolchain 12.3.rel1

 gnu/local.mk                                 |   1 +
 gnu/packages/embedded.scm                    | 223 +++++++++--
 gnu/packages/patches/newlib-getentropy.patch | 380 +++++++++++++++++++
 3 files changed, 572 insertions(+), 32 deletions(-)
 create mode 100644 gnu/packages/patches/newlib-getentropy.patch


base-commit: f977cb2b609f7122db2cf026cac5ab9d6d44a206
--
2.46.0






^ permalink raw reply	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH v2 1/5] gnu: make-gcc-arm-none-eabi: reorder C++ native search paths
  2024-09-13 11:41 ` [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
@ 2024-09-13 11:41   ` Rutherther via Guix-patches via
  2024-09-13 11:42   ` [bug#73118] [PATCH v2 2/5] gnu: make-libstdc++-arm-none-eabi: output libstdc++ to arm-none-eabi Rutherther via Guix-patches via
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-13 11:41 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

This fixes native-search-paths of arm-none-eabi toolchains
The toolchains CROSS_CPLUS_INCLUDE_PATH had C include directory
first, and the C++ as second. Since <cstdlib> does #include_next <stdlib.h>,
the toolchains could not build anything using <cstdlib>. The C include
has to come later than C++ one. This is already fixed in xgcc search-path.

* gnu/packages/embedded.scm (make-gcc-arm-none-eabi-4.9,
make-gcc-arm-none-eabi-7-2018-q2-update): [native-search-paths]: Put C include
path as last.

Change-Id: Ib7e36e57e510ac87960375cad40ff0b9e749101c
---
 gnu/packages/embedded.scm | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index bee65663b6..a7ba9ebe98 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -201,9 +201,9 @@ (define make-gcc-arm-none-eabi-4.9
                 (files '("arm-none-eabi/include")))
                (search-path-specification
                 (variable "CROSS_CPLUS_INCLUDE_PATH")
-                (files '("arm-none-eabi/include"
-                         "arm-none-eabi/include/c++"
-                         "arm-none-eabi/include/c++/arm-none-eabi")))
+                (files '("arm-none-eabi/include/c++"
+                         "arm-none-eabi/include/c++/arm-none-eabi"
+                         "arm-none-eabi/include")))
                (search-path-specification
                 (variable "CROSS_LIBRARY_PATH")
                 (files '("arm-none-eabi/lib")))))))))
@@ -423,9 +423,9 @@ (define make-gcc-arm-none-eabi-7-2018-q2-update
                        (files '("arm-none-eabi/include")))
                       (search-path-specification
                        (variable "CROSS_CPLUS_INCLUDE_PATH")
-                       (files '("arm-none-eabi/include"
-                                "arm-none-eabi/include/c++"
-                                "arm-none-eabi/include/c++/arm-none-eabi")))
+                       (files '("arm-none-eabi/include/c++"
+                                "arm-none-eabi/include/c++/arm-none-eabi"
+                                "arm-none-eabi/include")))
                       (search-path-specification
                        (variable "CROSS_LIBRARY_PATH")
                        (files '("arm-none-eabi/lib")))))))))
-- 
2.46.0






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH v2 2/5] gnu: make-libstdc++-arm-none-eabi: output libstdc++ to arm-none-eabi.
  2024-09-13 11:41 ` [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
  2024-09-13 11:41   ` [bug#73118] [PATCH v2 1/5] gnu: make-gcc-arm-none-eabi: reorder C++ native search paths Rutherther via Guix-patches via
@ 2024-09-13 11:42   ` Rutherther via Guix-patches via
  2024-09-13 11:42   ` [bug#73118] [PATCH v2 3/5] gnu: make-libstdc++-arm-none-eabi: add nano variant Rutherther via Guix-patches via
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-13 11:42 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

The libstdc++ made for arm-none-eabi puts the contents
into "lib" folder, but that's unexpected when the resulting
toolchain is a cross toolchain.
The folder should be "arm-none-eabi/lib", that's the path
added to CROSS_C_LIBRARY_PATH

* gnu/packages/embedded.scm (make-libstdc++-arm-none-eabi):
[arguments]<#:configure-flags>: Point --libdir to arm-none-eabi/lib.
[arguments]<#:strip-directories>: Set to arm-none-eabi/lib.

Change-Id: Ia8b867a1c6ebeedeae9564e0a6a1e0401b35bd5b
---
 gnu/packages/embedded.scm | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index a7ba9ebe98..2a482f7e52 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -493,9 +493,14 @@ (define make-libstdc++-arm-none-eabi
                "--disable-tls"
                "--disable-plugin"
                "--with-newlib"
+               ,(string-append "--libdir="
+                               (assoc-ref %outputs "out")
+                               "/arm-none-eabi/lib")
                ,(string-append "--with-gxx-include-dir="
                                (assoc-ref %outputs "out")
-                               "/arm-none-eabi/include/c++")))))
+                               "/arm-none-eabi/include/c++")))
+           ((#:strip-directories _ #f)
+            ''("arm-none-eabi/lib"))))
         (native-inputs
          `(("newlib" ,newlib)
            ("xgcc" ,xgcc)
-- 
2.46.0






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH v2 3/5] gnu: make-libstdc++-arm-none-eabi: add nano variant
  2024-09-13 11:41 ` [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
  2024-09-13 11:41   ` [bug#73118] [PATCH v2 1/5] gnu: make-gcc-arm-none-eabi: reorder C++ native search paths Rutherther via Guix-patches via
  2024-09-13 11:42   ` [bug#73118] [PATCH v2 2/5] gnu: make-libstdc++-arm-none-eabi: output libstdc++ to arm-none-eabi Rutherther via Guix-patches via
@ 2024-09-13 11:42   ` Rutherther via Guix-patches via
  2024-09-13 11:42   ` [bug#73118] [PATCH v2 4/5] gnu: newlib arm-none-eabi-7-2018-q2-update: Add proper newlib-nano variant Rutherther via Guix-patches via
  2024-09-13 11:42   ` [bug#73118] [PATCH v2 5/5] gnu: arm-none-eabi toolchain 12.3.rel1 Rutherther via Guix-patches via
  4 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-13 11:42 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

The arm-none-eabi nano toolchain had same libstdc++ as the non-nano variant.
The libstdc++ should be compiled with -fno-exceptions to make a nano
toolchain.

Additionally, since the "_nano.a" variants were not present, it was impossible
to compile C++ programs with libstdc++ using --specs=nano.specs,
since libstdc++_nano.a was not found.

The `--with-target-subdir="."` flag is a preparation for gcc-12 introduction
since the libstdc++ doesn't build without that, failing on GCC_NO_EXECUTABLES
error in configure stage. I have not been able to find out another workaround.

* gnu/packages/embedded.scm (make-libstdc++-arm-none-eabi):
[arguments]<#:make-flags>: Add CFLAGS and CXXFLAGS.
[arguments]<#:configure-flags>: Add --with-target-subdir.
* gnu/packages/embedded.scm (make-libstdc++-nano-arm-none-eabi): Add variable.

Change-Id: I06a507fef07352a4ec80d84e4d97065343fc2295
---
 gnu/packages/embedded.scm | 74 +++++++++++++++++++++++++++++++++------
 1 file changed, 63 insertions(+), 11 deletions(-)

diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index 2a482f7e52..847eb8059c 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -483,8 +483,17 @@ (define make-libstdc++-arm-none-eabi
         (name "libstdc++-arm-none-eabi")
         (arguments
          (substitute-keyword-arguments (package-arguments libstdc++)
+           ((#:make-flags flags #f)
+            #~(cons* "CFLAGS=-g -O2 -fdata-sections -ffunction-sections"
+                     "CXXFLAGS=-g -O2 -fdata-sections -ffunction-sections"
+                     (or #$flags '())))
            ((#:configure-flags _)
-            ``("--target=arm-none-eabi"
+            ``(; This is more of a hack. This option doesn't really seem
+               ; to change what subdir is used eventually, but without it there is
+               ; error: Link tests are not allowed after GCC_NO_EXECUTABLES with
+               ; The 12.3 toolchain
+               "--with-target-subdir=\".\""
+               "--target=arm-none-eabi"
                "--host=arm-none-eabi"
                "--disable-libstdcxx-pch"
                "--enable-multilib"
@@ -506,21 +515,64 @@ (define make-libstdc++-arm-none-eabi
            ("xgcc" ,xgcc)
            ,@(package-native-inputs libstdc++)))))))
 
+(define make-libstdc++-nano-arm-none-eabi
+  (mlambda (xgcc newlib-nano)
+    (let ((base (make-libstdc++-arm-none-eabi xgcc newlib-nano)))
+      (package
+        (inherit base)
+        (name "libstdc++-nano-arm-none-eabi")
+        (arguments (substitute-keyword-arguments (package-arguments base)
+                     ((#:make-flags flags)
+                      #~(map (lambda (flag)
+                               (if (or (string-prefix? "CFLAGS=" flag)
+                                       (string-prefix? "CXXFLAGS=" flag))
+                                   (string-append flag " -fno-exceptions")
+                                   flag))
+                             #$flags))
+                     ((#:phases phases)
+                      #~(modify-phases #$phases
+                          (add-after 'install 'hardlink-libstdc++
+                            ;; XXX: Most arm toolchains offer both *.a and *_nano.a as
+                            ;; newlib and newlib-nano respectively.  The headers are
+                            ;; usually arm-none-eabi/include/newlib.h for newlib and
+                            ;; arm-none-eabi/include/newlib-nano/newlib.h for newlib-nano.
+                            ;; We have two different toolchain packages for each which
+                            ;; works but is a little strange.
+                            (lambda* (#:key outputs #:allow-other-keys)
+                              (let ((out (assoc-ref outputs "out")))
+                                ;; The nano.specs file says that newlib-nano files should
+                                ;; end in "_nano.a" instead of just ".a".  Note that this
+                                ;; applies to all the multilib folders too.
+                                (for-each
+                                 (lambda (file)
+                                   (link file
+                                         (string-append
+                                          ;; Strip ".a" off the end
+                                          (substring file 0 (- (string-length file) 2))
+                                          ;; Add "_nano.a" onto the end
+                                          "_nano.a")))
+                                 (find-files
+                                  out "^(libstdc\\+\\+.a|libsupc\\+\\+.a)$")))))))))))))
+
 (define make-arm-none-eabi-toolchain
   (mlambda (xgcc newlib)
     "Produce a cross-compiler toolchain package with the compiler XGCC and the
 C library variant NEWLIB."
-    (let ((newlib-with-xgcc
-           (package
-             (inherit newlib)
-             (native-inputs
-              (alist-replace "xgcc" (list xgcc)
-                             (package-native-inputs newlib))))))
+    (let* ((nano? (string=? (package-name newlib)
+                            "newlib-nano"))
+           (newlib-with-xgcc
+            (package
+              (inherit newlib)
+              (native-inputs
+               (alist-replace "xgcc" (list xgcc)
+                              (package-native-inputs newlib)))))
+           (libstdc++
+            (if nano?
+                (make-libstdc++-nano-arm-none-eabi xgcc newlib-with-xgcc)
+                (make-libstdc++-arm-none-eabi xgcc newlib-with-xgcc))))
       (package
         (name (string-append "arm-none-eabi"
-                             (if (string=? (package-name newlib-with-xgcc)
-                                           "newlib-nano")
-                                 "-nano" "")
+                             (if nano? "-nano" "")
                              "-toolchain"))
         (version (package-version xgcc))
         (source #f)
@@ -537,7 +589,7 @@ (define make-arm-none-eabi-toolchain
                              directories))))))
         (propagated-inputs
          `(("binutils" ,(cross-binutils "arm-none-eabi"))
-           ("libstdc++" ,(make-libstdc++-arm-none-eabi xgcc newlib-with-xgcc))
+           ("libstdc++" ,libstdc++)
            ("gcc" ,xgcc)
            ("newlib" ,newlib-with-xgcc)))
         (synopsis "Complete GCC tool chain for ARM bare metal development")
-- 
2.46.0






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH v2 4/5] gnu: newlib arm-none-eabi-7-2018-q2-update: Add proper newlib-nano variant.
  2024-09-13 11:41 ` [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
                     ` (2 preceding siblings ...)
  2024-09-13 11:42   ` [bug#73118] [PATCH v2 3/5] gnu: make-libstdc++-arm-none-eabi: add nano variant Rutherther via Guix-patches via
@ 2024-09-13 11:42   ` Rutherther via Guix-patches via
  2024-09-13 11:42   ` [bug#73118] [PATCH v2 5/5] gnu: arm-none-eabi toolchain 12.3.rel1 Rutherther via Guix-patches via
  4 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-13 11:42 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

The nano variant for was not nano. It was just a copy of the original
one with different name. This meant there were no _nano.a files present
at all, and the flags were the same, not producing a smaller library.

* gnu/packages/embedded.scm (make-base-newlib-arm-none-eabi-7-2018-q2-update):
Rename variable from make-newlib-arm-none-eabi-7-2018-q2-update.
* gnu/packages/embedded.scm (make-newlib-nano-arm-none-eabi-7-2018-q2-update):
Add variable.
* gnu/packages/embedded.scm (make-newlib-arm-none-eabi-7-2018-q2-update):
Inherit from make-base-newlib-arm-none-eabi-7-2018-q2-update.

Change-Id: I01517ed860dfb2b6a9c7e912fd724832f5a0500a
---
 gnu/packages/embedded.scm | 26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index 847eb8059c..4b9da1f529 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -247,10 +247,7 @@ (define make-newlib-arm-none-eabi
          (modify-phases %standard-phases
            (add-after 'unpack 'fix-references-to-/bin/sh
              (lambda _
-               (substitute* '("libgloss/arm/cpu-init/Makefile.in"
-                              "libgloss/arm/Makefile.in"
-                              "libgloss/libnosys/Makefile.in"
-                              "libgloss/Makefile.in")
+               (substitute* (find-files "libgloss" "^Makefile\\.in$")
                  (("/bin/sh") (which "sh")))
                #t)))))
       (native-inputs
@@ -430,12 +427,11 @@ (define make-gcc-arm-none-eabi-7-2018-q2-update
                        (variable "CROSS_LIBRARY_PATH")
                        (files '("arm-none-eabi/lib")))))))))
 
-(define make-newlib-arm-none-eabi-7-2018-q2-update
+(define make-base-newlib-arm-none-eabi-7-2018-q2-update
   ;; This is the same commit as used for the 7-2018-q2-update release
   ;; according to the release.txt.
-  (mlambda ()
-    (let ((base (make-newlib-arm-none-eabi))
-          (commit "3ccfb407af410ba7e54ea0da11ae1e40b554a6f4")
+  (mlambda (base)
+    (let ((commit "3ccfb407af410ba7e54ea0da11ae1e40b554a6f4")
           (revision "0"))
       (package
         (inherit base)
@@ -464,15 +460,13 @@ (define make-newlib-arm-none-eabi-7-2018-q2-update
            ("xgcc" ,(make-gcc-arm-none-eabi-7-2018-q2-update))
            ("texinfo" ,texinfo)))))))
 
-(define-public make-newlib-nano-arm-none-eabi-7-2018-q2-update
+(define make-newlib-arm-none-eabi-7-2018-q2-update
   (mlambda ()
-    (let ((base (make-newlib-arm-none-eabi-7-2018-q2-update)))
-      (package
-        (inherit base)
-        (name "newlib-nano")
-        (arguments
-         (package-arguments base))
-        (synopsis "Newlib variant for small systems with limited memory")))))
+    (make-base-newlib-arm-none-eabi-7-2018-q2-update (make-newlib-arm-none-eabi))))
+
+(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))))
 
 \f
 (define make-libstdc++-arm-none-eabi
-- 
2.46.0






^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [bug#73118] [PATCH v2 5/5] gnu: arm-none-eabi toolchain 12.3.rel1
  2024-09-13 11:41 ` [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
                     ` (3 preceding siblings ...)
  2024-09-13 11:42   ` [bug#73118] [PATCH v2 4/5] gnu: newlib arm-none-eabi-7-2018-q2-update: Add proper newlib-nano variant Rutherther via Guix-patches via
@ 2024-09-13 11:42   ` Rutherther via Guix-patches via
  4 siblings, 0 replies; 12+ messages in thread
From: Rutherther via Guix-patches via @ 2024-09-13 11:42 UTC (permalink / raw)
  To: 73118; +Cc: Rutherther

Introduces arm-none-eabi 12.3.rel1 toolchain

The arguments for this toolchain are taken mostly out of here
https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads/12-3-rel1

* gnu/packages/patches/newlib-getentropy.patch: Add a patch.
* gnu/local.mk: Register it.
* gnu/packages/embedded.scm (make-gcc-arm-none-eabi-12.3.rel1): Add variable.
* gnu/packages/embedded.scm (make-newlib-arm-none-eabi-12.3.rel1): Add variable.
* gnu/packages/embedded.scm (make-newlib-nano-arm-none-eabi-12.3.rel1): Add variable.
* gnu/packages/embedded.scm (make-arm-none-eabi-toolchain-12.3.rel1): Add variable.
* gnu/packages/embedded.scm (make-arm-none-eabi-toolchain-nano-12.3.rel1): Add variable.

Change-Id: If4220c6bc7b1def240cbb9d5d245758f7c51a8a0
---
 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 --git a/gnu/local.mk b/gnu/local.mk
index ed630041ff..ce40b7e28b 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 4b9da1f529..cc999d35f8 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))))
 
+\f
+;;; 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))))
+
 \f
 (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")
         (arguments
          (substitute-keyword-arguments (package-arguments libstdc++)
@@ -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
+ 
-- 
2.46.0






^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2024-09-13 11:43 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-08  7:42 [bug#73118] [PATCH 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
2024-09-08  7:48 ` [bug#73118] [PATCH 1/5] Fix native-search-paths of arm-none-eabi toolchains Rutherther via Guix-patches via
2024-09-08  7:49 ` [bug#73118] [PATCH 2/5] Fix lib directory of arm-none-eabi libstdc++ Rutherther via Guix-patches via
2024-09-08  7:49 ` [bug#73118] [PATCH 3/5] Add libstdc++-nano for arm-none-eabi Rutherther via Guix-patches via
2024-09-08  7:49 ` [bug#73118] [PATCH 4/5] Fix arm-none-eabi 7 newlib nano variant Rutherther via Guix-patches via
2024-09-08  7:49 ` [bug#73118] [PATCH 5/5] Introduce arm-none-eabi 12.3.rel1 toolchain Rutherther via Guix-patches via
2024-09-13 11:41 ` [bug#73118] [PATCH v2 0/5] Fix arm-none-eabi toolchains and introduce a newer version 12.3.rel1 Rutherther via Guix-patches via
2024-09-13 11:41   ` [bug#73118] [PATCH v2 1/5] gnu: make-gcc-arm-none-eabi: reorder C++ native search paths Rutherther via Guix-patches via
2024-09-13 11:42   ` [bug#73118] [PATCH v2 2/5] gnu: make-libstdc++-arm-none-eabi: output libstdc++ to arm-none-eabi Rutherther via Guix-patches via
2024-09-13 11:42   ` [bug#73118] [PATCH v2 3/5] gnu: make-libstdc++-arm-none-eabi: add nano variant Rutherther via Guix-patches via
2024-09-13 11:42   ` [bug#73118] [PATCH v2 4/5] gnu: newlib arm-none-eabi-7-2018-q2-update: Add proper newlib-nano variant Rutherther via Guix-patches via
2024-09-13 11:42   ` [bug#73118] [PATCH v2 5/5] gnu: arm-none-eabi toolchain 12.3.rel1 Rutherther via Guix-patches via

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.