~ruther/guix-local

9b222abe0349701280d48e4830f98aa07c947517 — Ludovic Courtès 12 years ago ea84ec7
packages: Raise an error condition a cross builder is needed but unavailable.

* guix/packages.scm (&package-cross-build-system-error): New condition type.
  (package-cross-derivation): Raise &package-cross-build-system-error
  when the build system doesn't support cross builds.
* guix/ui.scm (call-with-error-handling): Add
  package-cross-build-system-error? case.
* tests/packages.scm ("package-cross-derivation, no cross builder"): New test.
3 files changed, 31 insertions(+), 1 deletions(-)

M guix/packages.scm
M guix/ui.scm
M tests/packages.scm
M guix/packages.scm => guix/packages.scm +11 -1
@@ 83,7 83,9 @@
            package-error-package
            &package-input-error
            package-input-error?
            package-error-invalid-input))
            package-error-invalid-input
            &package-cross-build-system-error
            package-cross-build-system-error?))

;;; Commentary:
;;;


@@ 234,6 236,9 @@ corresponds to the arguments expected by `set-path-environment-variable'."
  package-input-error?
  (input package-error-invalid-input))

(define-condition-type &package-cross-build-system-error &package-error
  package-cross-build-system-error?)


(define (package-full-name package)
  "Return the full name of PACKAGE--i.e., `NAME-VERSION'."


@@ 412,6 417,11 @@ system identifying string)."
                  (= build-system-cross-builder builder)
                  args inputs propagated-inputs native-inputs self-native-input?
                  outputs)
               (unless builder
                 (raise (condition
                         (&package-cross-build-system-error
                          (package package)))))

               (let* ((inputs     (package-transitive-target-inputs package))
                      (input-drvs (map (cut expand-input
                                            store package <>

M guix/ui.scm => guix/ui.scm +9 -0
@@ 23,6 23,7 @@
  #:use-module (guix store)
  #:use-module (guix config)
  #:use-module (guix packages)
  #:use-module (guix build-system)
  #:use-module (guix derivations)
  #:use-module ((guix licenses) #:select (license? license-name))
  #:use-module (srfi srfi-1)


@@ 152,6 153,14 @@ General help using GNU software: <http://www.gnu.org/gethelp/>"))
               (leave (_ "~a:~a:~a: package `~a' has an invalid input: ~s~%")
                      file line column
                      (package-full-name package) input)))
            ((package-cross-build-system-error? c)
             (let* ((package (package-error-package c))
                    (loc     (package-location package))
                    (system  (package-build-system package)))
               (leave (_ "~a: ~a: build system `~a' does not support cross builds~%")
                      (location->string loc)
                      (package-full-name package)
                      (build-system-name system))))
            ((nix-connection-error? c)
             (leave (_ "failed to connect to `~a': ~a~%")
                    (nix-connection-error-file c)

M tests/packages.scm => tests/packages.scm +11 -0
@@ 30,6 30,7 @@
  #:use-module (gnu packages bootstrap)
  #:use-module (srfi srfi-11)
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-64)
  #:use-module (rnrs io ports)
  #:use-module (ice-9 match))


@@ 212,6 213,16 @@
      (and (derivation-path? drv-path)
           (derivation? drv)))))

(test-assert "package-cross-derivation, no cross builder"
  (let* ((b (build-system (inherit trivial-build-system)
              (cross-build #f)))
         (p (package (inherit (dummy-package "p"))
              (build-system b))))
    (guard (c ((package-cross-build-system-error? c)
               (eq? (package-error-package c) p)))
      (package-cross-derivation %store p "mips64el-linux-gnu")
      #f)))

(unless (false-if-exception (getaddrinfo "www.gnu.org" "80" AI_NUMERICSERV))
  (test-skip 1))
(test-assert "GNU Make, bootstrap"