(define-module (ruther packages embedded)
#:use-module (guix utils)
#:use-module (guix gexp)
#:use-module (guix memoization)
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix git-download)
#:use-module (guix build-system trivial)
#:use-module (gnu packages)
#:use-module (gnu packages embedded)
#:use-module (gnu packages flex)
#:use-module (gnu packages cross-base)
#:use-module (gnu packages texinfo)
#:use-module (guix build utils)
#:use-module (gnu packages gcc)
#:export (make-gcc-arm-none-eabi-12.3.rel1
make-newlib-nano-arm-none-eabi-12.3.rel1
make-newlib-arm-none-eabi-12.3.rel1
arm-none-eabi-nano-toolchain-12.3.rel1
arm-none-eabi-toolchain-12.3.rel1))
(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 (base)
(let ((commit "3ccfb407af410ba7e54ea0da11ae1e40b554a6f4")
(revision "0"))
(package
(inherit base)
(version (git-version "3.0.0" revision commit))
(source
(origin
(method git-fetch)
(uri (git-reference
(url "http://sourceware.org/git/newlib-cygwin.git")
(commit commit)))
(file-name (git-file-name "newlib" commit))
(sha256
(base32
"1dq23fqrk75g1a4v7569fvnnw5q440zawbxi3w0g05n8jlqsmvcy"))))
(arguments
(substitute-keyword-arguments (package-arguments base)
;; The configure flags are identical to the flags used by the "GCC
;; ARM embedded" project.
((#:configure-flags flags)
`(cons* "--enable-newlib-io-c99-formats"
"--enable-newlib-retargetable-locking"
"--with-headers=yes"
,flags))))
(native-inputs
`(("xbinutils" ,(cross-binutils "arm-none-eabi"))
("xgcc" ,(make-gcc-arm-none-eabi-7-2018-q2-update))
("texinfo" ,texinfo)))))))
(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))
(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++)
((#:make-flags flags #f)
#~(cons* "CFLAGS=-g -O2 -fdata-sections -ffunction-sections"
"CXXFLAGS=-g -O2 -fdata-sections -ffunction-sections"
(or #$flags '())))
((#:configure-flags _)
``(; 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"
"--with-multilib-list=armv6-m,armv7-m,armv7e-m"
"--disable-shared"
"--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++")))
((#:strip-directories _ #f)
''("arm-none-eabi/lib"))))
(native-inputs
`(("newlib" ,newlib)
("xgcc" ,xgcc)
,@(package-native-inputs libstdc++)))))))
(define make-arm-none-eabi-toolchain-12.3.rel1
(mlambda ()
((@@ (gnu packages embedded) 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 ()
((@@ (gnu packages embedded) make-arm-none-eabi-toolchain)
(make-gcc-arm-none-eabi-12.3.rel1)
(make-newlib-nano-arm-none-eabi-12.3.rel1))))
(define arm-none-eabi-toolchain-12.3.rel1
(make-arm-none-eabi-toolchain-12.3.rel1))
(define arm-none-eabi-nano-toolchain-12.3.rel1
(make-arm-none-eabi-nano-toolchain-12.3.rel1))