Subject: [bug#63576] [PATCH v1 2/4] gnu: Add aarch64-none-elf-gcc.

From: Denis 'GNUtoo' Carikli <[email-masked]>
Date: Thu, 18 May 2023 20:28:12 +0200

* gnu/packages/aarch64-none-elf-toolchain.scm (aarch64-none-elf-gcc): New
  variable.
---
 gnu/packages/aarch64-none-elf-toolchain.scm | 59 ++++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/aarch64-none-elf-toolchain.scm b/gnu/packages/aarch64-none-elf-toolchain.scm
index 14569036ce..88a2abb1f9 100644
--- a/gnu/packages/aarch64-none-elf-toolchain.scm
+++ b/gnu/packages/aarch64-none-elf-toolchain.scm
@@ -17,10 +17,67 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages aarch64-none-elf-toolchain)
+  #:use-module (guix gexp)
+  #:use-module (guix utils)
   #:use-module (guix packages)
-  #:use-module (gnu packages cross-base))
+  #:use-module (gnu packages cross-base)
+  #:use-module (gnu packages gcc))
 
 (define-public aarch64-none-elf-binutils
   (package
     (inherit (cross-binutils "aarch64-none-elf"))
     (name "aarch64-none-elf-binutils")))
+
+(define aarch64-none-elf-gcc
+  (let ((xgcc (cross-gcc "aarch64-none-elf" #:xgcc gcc #:xbinutils aarch64-none-elf-binutils)))
+    (package
+      (inherit xgcc)
+      (name "aarch64-none-elf-gcc")
+      (arguments
+       (substitute-keyword-arguments (package-arguments xgcc)
+         ((#:phases phases)
+          #~(modify-phases #$phases
+              (add-after 'set-paths 'augment-CPLUS_INCLUDE_PATH
+                (lambda* (#:key inputs #:allow-other-keys)
+                  (let ((gcc (assoc-ref inputs  "gcc")))
+                    ;; Remove the default compiler from CPLUS_INCLUDE_PATH to
+                    ;; prevent header conflict with the GCC from native-inputs.
+                    (setenv "CPLUS_INCLUDE_PATH"
+                            (string-join
+                             (delete (string-append gcc "/include/c++")
+                                     (string-split (getenv "CPLUS_INCLUDE_PATH")
+                                                   #\:))
+                             ":"))
+                    (format #t
+                            "environment variable `CPLUS_INCLUDE_PATH' changed to ~a~%"
+                            (getenv "CPLUS_INCLUDE_PATH")))))
+              ;; Without a working multilib build, the resulting GCC lacks
+              ;; support for nearly every AARCH64-NONE-ELF chip.
+              (add-after 'unpack 'fix-genmultilib
+                (lambda _
+                  ;; patch-shebang doesn't work here because there are actually
+                  ;; several scripts inside this script, each with a #!/bin/sh
+                  ;; that needs patching.
+                  (substitute* "gcc/genmultilib"
+                    (("#!/bin/sh") (string-append "#!" (which "sh"))))))))
+         ((#:configure-flags flags)
+          #~(delete "--disable-multilib" #$flags))))
+      (native-search-paths
+       (list (search-path-specification
+              (variable "CROSS_C_INCLUDE_PATH")
+              (files '("aarch64-none-elf/include")))
+             (search-path-specification
+              (variable "CROSS_CPLUS_INCLUDE_PATH")
+              (files '("aarch64-none-elf/include")))
+             (search-path-specification
+              (variable "CROSS_OBJC_INCLUDE_PATH")
+              (files '("aarch64-none-elf/include")))
+             (search-path-specification
+              (variable "CROSS_OBJCPLUS_INCLUDE_PATH")
+              (files '("aarch64-none-elf/include")))
+             (search-path-specification
+              (variable "CROSS_LIBRARY_PATH")
+              (files '("aarch64-none-elf/lib")))))
+      (native-inputs
+       `(("gcc" ,gcc)
+         ,@(package-native-inputs xgcc))))))
-- 
2.40.1