mirror of
https://codeberg.org/guix/guix.git
synced 2025-10-02 02:15:12 +00:00
gnu: make-libstdc++-arm-none-eabi: add nano variant
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 Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
parent
3f09b05d8d
commit
9dabdd9e50
1 changed files with 63 additions and 11 deletions
|
@ -483,8 +483,17 @@ embedded-7-branch/")
|
||||||
(name "libstdc++-arm-none-eabi")
|
(name "libstdc++-arm-none-eabi")
|
||||||
(arguments
|
(arguments
|
||||||
(substitute-keyword-arguments (package-arguments libstdc++)
|
(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 _)
|
((#: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"
|
"--host=arm-none-eabi"
|
||||||
"--disable-libstdcxx-pch"
|
"--disable-libstdcxx-pch"
|
||||||
"--enable-multilib"
|
"--enable-multilib"
|
||||||
|
@ -506,21 +515,64 @@ embedded-7-branch/")
|
||||||
("xgcc" ,xgcc)
|
("xgcc" ,xgcc)
|
||||||
,@(package-native-inputs libstdc++)))))))
|
,@(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
|
(define make-arm-none-eabi-toolchain
|
||||||
(mlambda (xgcc newlib)
|
(mlambda (xgcc newlib)
|
||||||
"Produce a cross-compiler toolchain package with the compiler XGCC and the
|
"Produce a cross-compiler toolchain package with the compiler XGCC and the
|
||||||
C library variant NEWLIB."
|
C library variant NEWLIB."
|
||||||
(let ((newlib-with-xgcc
|
(let* ((nano? (string=? (package-name newlib)
|
||||||
(package
|
"newlib-nano"))
|
||||||
(inherit newlib)
|
(newlib-with-xgcc
|
||||||
(native-inputs
|
(package
|
||||||
(alist-replace "xgcc" (list xgcc)
|
(inherit newlib)
|
||||||
(package-native-inputs 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
|
(package
|
||||||
(name (string-append "arm-none-eabi"
|
(name (string-append "arm-none-eabi"
|
||||||
(if (string=? (package-name newlib-with-xgcc)
|
(if nano? "-nano" "")
|
||||||
"newlib-nano")
|
|
||||||
"-nano" "")
|
|
||||||
"-toolchain"))
|
"-toolchain"))
|
||||||
(version (package-version xgcc))
|
(version (package-version xgcc))
|
||||||
(source #f)
|
(source #f)
|
||||||
|
@ -537,7 +589,7 @@ C library variant NEWLIB."
|
||||||
directories))))))
|
directories))))))
|
||||||
(propagated-inputs
|
(propagated-inputs
|
||||||
`(("binutils" ,(cross-binutils "arm-none-eabi"))
|
`(("binutils" ,(cross-binutils "arm-none-eabi"))
|
||||||
("libstdc++" ,(make-libstdc++-arm-none-eabi xgcc newlib-with-xgcc))
|
("libstdc++" ,libstdc++)
|
||||||
("gcc" ,xgcc)
|
("gcc" ,xgcc)
|
||||||
("newlib" ,newlib-with-xgcc)))
|
("newlib" ,newlib-with-xgcc)))
|
||||||
(synopsis "Complete GCC tool chain for ARM bare metal development")
|
(synopsis "Complete GCC tool chain for ARM bare metal development")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue