From db393b333f77ffbb573faf47b6df74dc65a0e85b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Sat, 16 Jun 2012 16:46:29 +0200 Subject: [PATCH] build-expression->derivation: Have the build fail when EXP returns #f. * guix/derivations.scm (build-expression->derivation)[builder]: Pass the result of EXP to `exit'. * tests/derivations.scm ("build-expression->derivation with expression returning #f"): New test. --- guix/derivations.scm | 7 +++++-- tests/derivations.scm | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/guix/derivations.scm b/guix/derivations.scm index ffdf570fc2..24ee06c399 100644 --- a/guix/derivations.scm +++ b/guix/derivations.scm @@ -446,7 +446,9 @@ (define* (build-expression->derivation store name system exp inputs when SUB-DRV is omitted, \"out\" is assumed. EXP is evaluated in an environment where %OUTPUT is bound to the main output path, %OUTPUTS is bound to a list of output/path pairs, and where %BUILD-INPUTS is bound to an alist -of string/output-path pairs made from INPUTS." +of string/output-path pairs made from INPUTS. The builder terminates by +passing the result of EXP to `exit'; thus, when EXP returns #f, the build is +considered to have failed." (define guile (string-append (derivation-path->output-path (%guile-for-build)) "/bin/guile")) @@ -472,7 +474,8 @@ (define %build-inputs (builder (add-text-to-store store (string-append name "-guile-builder") (string-append (object->string prologue) - (object->string exp)) + (object->string + `(exit ,exp))) (map second inputs))) (mod-drv (if (null? modules) #f diff --git a/tests/derivations.scm b/tests/derivations.scm index 4a81a70f65..1e9a136d04 100644 --- a/tests/derivations.scm +++ b/tests/derivations.scm @@ -29,6 +29,7 @@ (define-module (test-derivations) #:use-module (rnrs io ports) #:use-module (rnrs bytevectors) #:use-module (ice-9 rdelim) + #:use-module (ice-9 regex) #:use-module (ice-9 ftw) #:use-module (ice-9 match)) @@ -181,6 +182,20 @@ (define %coreutils (equal? '(hello guix) (call-with-input-file (string-append p "/test") read)))))) +(test-assert "build-expression->derivation with expression returning #f" + (let* ((builder '(begin + (mkdir %output) + #f)) ; fail! + (drv-path (build-expression->derivation %store "fail" (%current-system) + builder '()))) + (guard (c ((nix-protocol-error? c) + ;; Note that the output path may exist at this point, but it + ;; is invalid. + (not (not (string-match "build .* failed" + (nix-protocol-error-message c)))))) + (build-derivations %store (list drv-path)) + #f))) + (test-assert "build-expression->derivation with two outputs" (let* ((builder '(begin (call-with-output-file (assoc-ref %outputs "out") @@ -265,4 +280,5 @@ (define %coreutils ;;; Local Variables: ;;; eval: (put 'test-assert 'scheme-indent-function 1) +;;; eval: (put 'guard 'scheme-indent-function 1) ;;; End: