~ruther/guix-local

e5a00639aa6490f3f2047174be719d2defda9c4a — Jean-Pierre De Jesus DIAZ 2 years ago ae7da5c
gnu: make-crust-package: Memoize.

* gnu/packages/firmware.scm (make-crust-package): Use mlambda.

Change-Id: I2d916b96bc650f3731a69505e086cf8f8f470809
1 files changed, 78 insertions(+), 77 deletions(-)

M gnu/packages/firmware.scm
M gnu/packages/firmware.scm => gnu/packages/firmware.scm +78 -77
@@ 1197,81 1197,82 @@ such as:
          ;; Adding debug symbols causes the size to exceed limits.
          #~(delete "DEBUG=1" #$flags)))))))

(define (make-crust-package platform)
  (package
    (name (string-append "crust-"
                         (string-replace-substring platform "_" "-")))
    (version "0.5")
    (source
     (origin
       (method git-fetch)
       (uri (git-reference
             ;; There are only GitHub generated release snapshots.
             (url "https://github.com/crust-firmware/crust")
             (commit (string-append "v" version))))
       (file-name (git-file-name "crust" version))
       (sha256
        (base32
         "0xgbbhifg3miwd3yp6jq9kp7nqgz5gzy00w95vba45j8jk5vjvvz"))))
    (build-system gnu-build-system)
    (arguments
     (list
      #:tests? #f                       ;no test suite
      #:make-flags
      (let ((triplet-without-vendor
             (and (%current-target-system)
                  ;; TODO: Is there a use case for allowing this?
                  (not (target-avr?))
                  (match (string-split (nix-system->gnu-triplet
                                        (%current-target-system)) #\-)
                    ((arch vendor os ..1)
                     (string-join `(,arch ,@os) "-"))))))
        #~(list "CROSS_COMPILE=or1k-elf-"
                "V=1"
                #$@(if triplet-without-vendor
                       ;; We are cross-compiling the tools, intended to be
                       ;; executable for the target system.
                       (list (string-append "HOSTAR=" triplet-without-vendor
                                            "-ar")
                             (string-append "HOSTCC=" triplet-without-vendor
                                            "-gcc"))
                       ;; Not cross-compiling.
                       (list "HOSTAR=ar"
                             "HOSTCC=gcc"))
                "LEX=flex"))
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'do-not-build-tests
            (lambda _
              ;; Attempting to build the tools test binary on a non-aarch64
              ;; architecture fails with: "No cache cleaning implementation
              ;; available for this architecture".  Avoid building it (see:
              ;; https://github.com/crust-firmware/crust/issues/182).
              (substitute* "tools/Makefile"
                (("tools-y \\+= test") ""))))
          (delete 'configure)
          (add-before 'build 'defconfig
            (lambda* (#:key make-flags #:allow-other-keys)
              (let ((config-name (string-append #$platform "_defconfig")))
                (apply invoke "make" (cons config-name make-flags)))))
          (replace 'install
            (lambda _
              (for-each (lambda (file)
                          (install-file file (string-append #$output
                                                            "/libexec")))
                        (find-files "." "(scp\\.bin|\\.config)$"))
              (install-file "build/tools/load"
                            (string-append #$output "/bin")))))))
    ;; The firmware is cross-compiled using a "bare bones" compiler (no libc).
    ;; Use our own tool chain for that.
    (native-inputs
     (list bison
           (cross-gcc "or1k-elf")
           (cross-binutils "or1k-elf")
           flex))
    (home-page "https://github.com/crust-firmware/crust")
    (synopsis "Firmware for Allwinner sunxi SoCs")
    (description "Crust improves battery life and thermal performance by
(define make-crust-package
  (mlambda (platform)
    (package
      (name (string-append "crust-"
                           (string-replace-substring platform "_" "-")))
      (version "0.5")
      (source
       (origin
         (method git-fetch)
         (uri (git-reference
               ;; There are only GitHub generated release snapshots.
               (url "https://github.com/crust-firmware/crust")
               (commit (string-append "v" version))))
         (file-name (git-file-name "crust" version))
         (sha256
          (base32
           "0xgbbhifg3miwd3yp6jq9kp7nqgz5gzy00w95vba45j8jk5vjvvz"))))
      (build-system gnu-build-system)
      (arguments
       (list
        #:tests? #f                       ;no test suite
        #:make-flags
        (let ((triplet-without-vendor
               (and (%current-target-system)
                    ;; TODO: Is there a use case for allowing this?
                    (not (target-avr?))
                    (match (string-split (nix-system->gnu-triplet
                                          (%current-target-system)) #\-)
                      ((arch vendor os ..1)
                       (string-join `(,arch ,@os) "-"))))))
          #~(list "CROSS_COMPILE=or1k-elf-"
                  "V=1"
                  #$@(if triplet-without-vendor
                         ;; We are cross-compiling the tools, intended to be
                         ;; executable for the target system.
                         (list (string-append "HOSTAR=" triplet-without-vendor
                                              "-ar")
                               (string-append "HOSTCC=" triplet-without-vendor
                                              "-gcc"))
                         ;; Not cross-compiling.
                         (list "HOSTAR=ar"
                               "HOSTCC=gcc"))
                  "LEX=flex"))
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'do-not-build-tests
              (lambda _
                ;; Attempting to build the tools test binary on a non-aarch64
                ;; architecture fails with: "No cache cleaning implementation
                ;; available for this architecture".  Avoid building it (see:
                ;; https://github.com/crust-firmware/crust/issues/182).
                (substitute* "tools/Makefile"
                  (("tools-y \\+= test") ""))))
            (delete 'configure)
            (add-before 'build 'defconfig
              (lambda* (#:key make-flags #:allow-other-keys)
                (let ((config-name (string-append #$platform "_defconfig")))
                  (apply invoke "make" (cons config-name make-flags)))))
            (replace 'install
              (lambda _
                (for-each (lambda (file)
                            (install-file file (string-append #$output
                                                              "/libexec")))
                          (find-files "." "(scp\\.bin|\\.config)$"))
                (install-file "build/tools/load"
                              (string-append #$output "/bin")))))))
      ;; The firmware is cross-compiled using a "bare bones" compiler (no libc).
      ;; Use our own tool chain for that.
      (native-inputs
       (list bison
             (cross-gcc "or1k-elf")
             (cross-binutils "or1k-elf")
             flex))
      (home-page "https://github.com/crust-firmware/crust")
      (synopsis "Firmware for Allwinner sunxi SoCs")
      (description "Crust improves battery life and thermal performance by
implementing a deep sleep state.  During deep sleep, the CPU cores, the DRAM
controller, and most onboard peripherals are powered down, reducing power
consumption by 80% or more compared to an idle device.  On boards without a


@@ 1280,8 1281,8 @@ device.  For this to work, Crust runs outside the main CPU and DRAM, on a
dedicated always-on microprocessor called a System Control Processor (SCP).
Crust is designed to run on a specific SCP implementation, Allwinner's
AR100.")
    ;; Most files are dual-licensed "BSD-3 OR GPL2", a few are GPL2 only.
    (license (list license:bsd-3 license:gpl2))))
      ;; Most files are dual-licensed "BSD-3 OR GPL2", a few are GPL2 only.
      (license (list license:bsd-3 license:gpl2)))))

(define-public crust-pinebook
  (make-crust-package "pinebook"))