me
/
guix
Archived
1
0
Fork 0

gnu: avr: Delay all cross compilation packages.

Partially addresses <https://issues.guix.gnu.org/65716>.

* gnu/packages/avr.scm: Add commentary comment.
(avr-binutils): Turn into this...
(make-avr-binutils): ... procedure.
(avr-gcc): Likewise, into...
(make-avr-gcc): ... this.  Adjust native-inputs accordingly.
(avr-toolchain): Likewise, into...
(make-avr-toolchain): ... this.
* gnu/packages/avr-xyz.scm (simavr) [propagated-inputs]: replace avr-toolchain
with a call to the 'make-avr-toolchain' procedure.

Series-changes: 2
- Use mlambda for procedures
- Fix ((make-avr-toolchain)) typo
Maxim Cournoyer 2023-09-10 11:21:34 -04:00
parent 1d872a6705
commit d35bc00cc1
No known key found for this signature in database
GPG Key ID: 1260E46482E63562
2 changed files with 123 additions and 100 deletions

View File

@ -71,7 +71,7 @@
(string-append "PREFIX=" #$output) (string-append "PREFIX=" #$output)
(string-append "DESTDIR=" #$output)))) (string-append "DESTDIR=" #$output))))
(propagated-inputs (propagated-inputs
(list avr-toolchain)) (list (make-avr-toolchain)))
(native-inputs (native-inputs
(list autoconf (list autoconf
which which

View File

@ -25,6 +25,7 @@
(define-module (gnu packages avr) (define-module (gnu packages avr)
#:use-module ((guix licenses) #:prefix license:) #:use-module ((guix licenses) #:prefix license:)
#:use-module (guix gexp) #:use-module (guix gexp)
#:use-module (guix memoization)
#:use-module (guix utils) #:use-module (guix utils)
#:use-module (guix download) #:use-module (guix download)
#:use-module (guix git-download) #:use-module (guix git-download)
@ -37,113 +38,135 @@
#:use-module (gnu packages flashing-tools) #:use-module (gnu packages flashing-tools)
#:use-module (gnu packages gcc) #:use-module (gnu packages gcc)
#:use-module (gnu packages llvm) #:use-module (gnu packages llvm)
#:use-module (gnu packages vim)) #:use-module (gnu packages vim)
#:export (make-avr-toolchain))
(define-public avr-binutils ;;; Commentary:
(package ;;;
(inherit (cross-binutils "avr")) ;;; This module defines a procedure that can be used to create a complete
(name "avr-binutils"))) ;;; avr-toolchain package. The procedure must not be used at the top level,
;;; to avoid cyclic module dependencies caused by the (gnu packages
;;; cross-base) module referring to top level bindings from (gnu packages
;;; gcc).
;;;
;;; It also contains packages for working with or targeting the AVR system.
;;;
(define avr-gcc (define make-avr-binutils
(let ((xgcc (cross-gcc "avr" #:xbinutils avr-binutils))) (mlambda ()
(package (package
(inherit xgcc) (inherit (cross-binutils "avr"))
(name "avr-gcc") (name "avr-binutils"))))
(define make-avr-gcc
(mlambda ()
(let ((xgcc (cross-gcc "avr" #:xbinutils (make-avr-binutils))))
(package
(inherit xgcc)
(name "avr-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 AVR 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 '("avr/include")))
(search-path-specification
(variable "CROSS_CPLUS_INCLUDE_PATH")
(files '("avr/include")))
(search-path-specification
(variable "CROSS_OBJC_INCLUDE_PATH")
(files '("avr/include")))
(search-path-specification
(variable "CROSS_OBJCPLUS_INCLUDE_PATH")
(files '("avr/include")))
(search-path-specification
(variable "CROSS_LIBRARY_PATH")
(files '("avr/lib")))))
(native-inputs
`(("gcc" ,gcc)
,@(package-native-inputs xgcc)))))))
(define make-avr-libc
(mlambda ()
(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 (arguments
(substitute-keyword-arguments (package-arguments xgcc) '(#:out-of-source? #t
((#:phases phases) #:configure-flags '("--host=avr")))
#~(modify-phases #$phases (native-inputs `(("avr-binutils" ,(make-avr-binutils))
(add-after 'set-paths 'augment-CPLUS_INCLUDE_PATH ("avr-gcc" ,(make-avr-gcc))))
(lambda* (#:key inputs #:allow-other-keys) (home-page "https://www.nongnu.org/avr-libc/")
(let ((gcc (assoc-ref inputs "gcc"))) (synopsis "The AVR C Library")
;; Remove the default compiler from CPLUS_INCLUDE_PATH to (description
;; prevent header conflict with the GCC from native-inputs. "AVR Libc is a project whose goal is to provide a high quality C
(setenv "CPLUS_INCLUDE_PATH" library for use with GCC on Atmel AVR microcontrollers.")
(string-join (license
(delete (string-append gcc "/include/c++") (license:non-copyleft "http://www.nongnu.org/avr-libc/LICENSE.txt")))))
(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 AVR 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 '("avr/include")))
(search-path-specification
(variable "CROSS_CPLUS_INCLUDE_PATH")
(files '("avr/include")))
(search-path-specification
(variable "CROSS_OBJC_INCLUDE_PATH")
(files '("avr/include")))
(search-path-specification
(variable "CROSS_OBJCPLUS_INCLUDE_PATH")
(files '("avr/include")))
(search-path-specification
(variable "CROSS_LIBRARY_PATH")
(files '("avr/lib")))))
(native-inputs
`(("gcc" ,gcc)
,@(package-native-inputs xgcc))))))
(define avr-libc (define make-avr-toolchain
(package (mlambda ()
(name "avr-libc") (let ((avr-binutils (make-avr-binutils))
(version "2.0.0") (avr-libc (make-avr-libc))
(source (origin (avr-gcc (make-avr-gcc)))
(method url-fetch) ;; avr-libc checks the compiler version and passes "--enable-device-lib"
(uri (string-append "mirror://savannah//avr-libc/avr-libc-" ;; for avr-gcc > 5.1.0. It wouldn't install the library for atmega32u4
version ".tar.bz2")) ;; etc if we didn't use the corret avr-gcc.
(sha256 (package
(base32 (name "avr-toolchain")
"15svr2fx8j6prql2il2fc0ppwlv50rpmyckaxx38d3gxxv97zpdj")))) (version (package-version avr-gcc))
(build-system gnu-build-system) (source #f)
(arguments (build-system trivial-build-system)
'(#:out-of-source? #t (arguments '(#:builder (begin (mkdir %output) #t)))
#:configure-flags '("--host=avr"))) (propagated-inputs
(native-inputs `(("avr-binutils" ,avr-binutils) `(("avrdude" ,avrdude)
("avr-gcc" ,avr-gcc))) ("binutils" ,avr-binutils)
(home-page "https://www.nongnu.org/avr-libc/") ("gcc" ,avr-gcc)
(synopsis "The AVR C Library") ("libc" ,avr-libc)))
(description (synopsis "Complete GCC tool chain for AVR microcontroller development")
"AVR Libc is a project whose goal is to provide a high quality C library (description "This package provides a complete GCC tool chain for AVR
for use with GCC on Atmel AVR microcontrollers.")
(license
(license:non-copyleft "http://www.nongnu.org/avr-libc/LICENSE.txt"))))
(define-public avr-toolchain
;; 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 etc if we didn't use the corret avr-gcc.
(package
(name "avr-toolchain")
(version (package-version avr-gcc))
(source #f)
(build-system trivial-build-system)
(arguments '(#:builder (begin (mkdir %output) #t)))
(propagated-inputs
`(("avrdude" ,avrdude)
("binutils" ,avr-binutils)
("gcc" ,avr-gcc)
("libc" ,avr-libc)))
(synopsis "Complete GCC tool chain for AVR microcontroller development")
(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-public microscheme (define-public microscheme
(package (package