gnu: make-avr-toolchain: Add a #:xgcc argument.

This allows generating an AVR toolchain for any version of GCC.

* gnu/packages/avr.scm (make-avr-gcc): Add a #:xgcc argument; use memoize
instead of mlambda.
(make-avr-libc): Likewise.  Provide it to the 'make-avr-gcc' call.
(make-avr-toolchain): Add a #:xgcc argument; use memoize instead of mlambda.
Provide the xgcc argument to the 'make-avr-libc' and 'make-avr-gcc'
procedures.
This commit is contained in:
Maxim Cournoyer 2023-09-13 16:04:37 -04:00
parent 53fd3989d3
commit 4af820b9ef
No known key found for this signature in database
GPG key ID: 1260E46482E63562

View file

@ -6,6 +6,7 @@
;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com> ;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
;;; Copyright © 2020 Arun Isaac <arunisaac@systemreboot.net> ;;; Copyright © 2020 Arun Isaac <arunisaac@systemreboot.net>
;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -58,115 +59,122 @@ (define make-avr-binutils
(inherit (cross-binutils "avr")) (inherit (cross-binutils "avr"))
(name "avr-binutils")))) (name "avr-binutils"))))
(define make-avr-gcc (define* (make-avr-gcc/implementation #:key (xgcc gcc))
(mlambda () "Return a XGCC-base cross-compiler for the AVR target."
(let ((xgcc (cross-gcc "avr" #:xbinutils (make-avr-binutils)))) (let ((xgcc (cross-gcc "avr" #:xgcc xgcc #:xbinutils (make-avr-binutils))))
(package (package
(inherit xgcc) (inherit xgcc)
(name "avr-gcc") (name "avr-gcc")
(arguments (arguments
(substitute-keyword-arguments (package-arguments xgcc) (substitute-keyword-arguments (package-arguments xgcc)
((#:phases phases) ((#:phases phases)
#~(modify-phases #$phases #~(modify-phases #$phases
(add-after 'set-paths 'augment-CPLUS_INCLUDE_PATH (add-after 'set-paths 'augment-CPLUS_INCLUDE_PATH
(lambda* (#:key inputs #:allow-other-keys) (lambda* (#:key inputs #:allow-other-keys)
(let ((gcc (assoc-ref inputs "gcc"))) (let ((gcc (assoc-ref inputs "gcc")))
;; Remove the default compiler from CPLUS_INCLUDE_PATH ;; Remove the default compiler from CPLUS_INCLUDE_PATH
;; to prevent header conflict with the GCC from ;; to prevent header conflict with the GCC from
;; native-inputs. ;; native-inputs.
(setenv "CPLUS_INCLUDE_PATH" (setenv "CPLUS_INCLUDE_PATH"
(string-join (string-join
(delete (string-append gcc "/include/c++") (delete (string-append gcc "/include/c++")
(string-split (getenv "CPLUS_INCLUDE_PATH") (string-split (getenv "CPLUS_INCLUDE_PATH")
#\:)) #\:))
":")) ":"))
(format #t (format #t
"environment variable `CPLUS_INCLUDE_PATH' \ "environment variable `CPLUS_INCLUDE_PATH' \
changed to ~a~%" changed to ~a~%"
(getenv "CPLUS_INCLUDE_PATH"))))) (getenv "CPLUS_INCLUDE_PATH")))))
;; Without a working multilib build, the resulting GCC lacks ;; Without a working multilib build, the resulting GCC lacks
;; support for nearly every AVR chip. ;; support for nearly every AVR chip.
(add-after 'unpack 'fix-genmultilib (add-after 'unpack 'fix-genmultilib
(lambda _ (lambda _
;; patch-shebang doesn't work here because there are ;; patch-shebang doesn't work here because there are
;; actually several scripts inside this script, each with ;; actually several scripts inside this script, each with
;; a #!/bin/sh that needs patching. ;; a #!/bin/sh that needs patching.
(substitute* "gcc/genmultilib" (substitute* "gcc/genmultilib"
(("#!/bin/sh") (string-append "#!" (which "sh")))))))) (("#!/bin/sh") (string-append "#!" (which "sh"))))))))
((#:configure-flags flags) ((#:configure-flags flags)
#~(delete "--disable-multilib" #$flags)))) #~(delete "--disable-multilib" #$flags))))
(native-search-paths (native-search-paths
(list (search-path-specification (list (search-path-specification
(variable "CROSS_C_INCLUDE_PATH") (variable "CROSS_C_INCLUDE_PATH")
(files '("avr/include"))) (files '("avr/include")))
(search-path-specification (search-path-specification
(variable "CROSS_CPLUS_INCLUDE_PATH") (variable "CROSS_CPLUS_INCLUDE_PATH")
(files '("avr/include"))) (files '("avr/include")))
(search-path-specification (search-path-specification
(variable "CROSS_OBJC_INCLUDE_PATH") (variable "CROSS_OBJC_INCLUDE_PATH")
(files '("avr/include"))) (files '("avr/include")))
(search-path-specification (search-path-specification
(variable "CROSS_OBJCPLUS_INCLUDE_PATH") (variable "CROSS_OBJCPLUS_INCLUDE_PATH")
(files '("avr/include"))) (files '("avr/include")))
(search-path-specification (search-path-specification
(variable "CROSS_LIBRARY_PATH") (variable "CROSS_LIBRARY_PATH")
(files '("avr/lib"))))) (files '("avr/lib")))))
(native-inputs (native-inputs
`(("gcc" ,gcc) `(("gcc" ,gcc)
,@(package-native-inputs xgcc))))))) ,@(package-native-inputs xgcc))))))
(define make-avr-gcc
(memoize make-avr-gcc/implementation))
(define* (make-avr-libc/implementation #:key (xgcc gcc))
(package
(name "avr-libc")
(version "2.0.0")
(source (origin
(method url-fetch)
(uri (string-append "mirror://savannah//avr-libc/avr-libc-"
version ".tar.bz2"))
(sha256
(base32
"15svr2fx8j6prql2il2fc0ppwlv50rpmyckaxx38d3gxxv97zpdj"))))
(build-system gnu-build-system)
(arguments
'(#:out-of-source? #t
#:configure-flags '("--host=avr")))
(native-inputs `(("avr-binutils" ,(make-avr-binutils))
("avr-gcc" ,(make-avr-gcc #:xgcc xgcc))))
(home-page "https://www.nongnu.org/avr-libc/")
(synopsis "The AVR C Library")
(description
"AVR Libc is a project whose goal is to provide a high quality C library
for use with GCC on Atmel AVR microcontrollers.")
(license
(license:non-copyleft "http://www.nongnu.org/avr-libc/LICENSE.txt"))))
(define make-avr-libc (define make-avr-libc
(mlambda () (memoize make-avr-libc/implementation))
(package
(name "avr-libc")
(version "2.0.0")
(source (origin
(method url-fetch)
(uri (string-append "mirror://savannah//avr-libc/avr-libc-"
version ".tar.bz2"))
(sha256
(base32
"15svr2fx8j6prql2il2fc0ppwlv50rpmyckaxx38d3gxxv97zpdj"))))
(build-system gnu-build-system)
(arguments
'(#:out-of-source? #t
#:configure-flags '("--host=avr")))
(native-inputs `(("avr-binutils" ,(make-avr-binutils))
("avr-gcc" ,(make-avr-gcc))))
(home-page "https://www.nongnu.org/avr-libc/")
(synopsis "The AVR C Library")
(description
"AVR Libc is a project whose goal is to provide a high quality C
library for use with GCC on Atmel AVR microcontrollers.")
(license
(license:non-copyleft "http://www.nongnu.org/avr-libc/LICENSE.txt")))))
(define make-avr-toolchain (define* (make-avr-toolchain/implementation #:key (xgcc gcc))
(mlambda () (let ((avr-binutils (make-avr-binutils))
(let ((avr-binutils (make-avr-binutils)) (avr-libc (make-avr-libc #:xgcc xgcc))
(avr-libc (make-avr-libc)) (avr-gcc (make-avr-gcc #:xgcc xgcc)))
(avr-gcc (make-avr-gcc))) ;; avr-libc checks the compiler version and passes "--enable-device-lib"
;; avr-libc checks the compiler version and passes "--enable-device-lib" ;; for avr-gcc > 5.1.0. It wouldn't install the library for atmega32u4
;; for avr-gcc > 5.1.0. It wouldn't install the library for atmega32u4 ;; etc if we didn't use the corret avr-gcc.
;; etc if we didn't use the corret avr-gcc. (package
(package (name "avr-toolchain")
(name "avr-toolchain") (version (package-version avr-gcc))
(version (package-version avr-gcc)) (source #f)
(source #f) (build-system trivial-build-system)
(build-system trivial-build-system) (arguments '(#:builder (begin (mkdir %output) #t)))
(arguments '(#:builder (begin (mkdir %output) #t))) (propagated-inputs
(propagated-inputs `(("avrdude" ,avrdude)
`(("avrdude" ,avrdude) ("binutils" ,avr-binutils)
("binutils" ,avr-binutils) ("gcc" ,avr-gcc)
("gcc" ,avr-gcc) ("libc" ,avr-libc)))
("libc" ,avr-libc))) (synopsis "Complete GCC tool chain for AVR microcontroller development")
(synopsis "Complete GCC tool chain for AVR microcontroller development") (description "This package provides a complete GCC tool chain for AVR
(description "This package provides a complete GCC tool chain for AVR
microcontroller development. This includes the GCC AVR cross compiler and microcontroller development. This includes the GCC AVR cross compiler and
avrdude for firmware flashing. The supported programming languages are C and avrdude for firmware flashing. The supported programming languages are C and
C++.") C++.")
(home-page (package-home-page avr-libc)) (home-page (package-home-page avr-libc))
(license (package-license avr-gcc)))))) (license (package-license avr-gcc)))))
(define make-avr-toolchain
(memoize make-avr-toolchain/implementation))
(define-public microscheme (define-public microscheme
(package (package