M guix/derivations.scm => guix/derivations.scm +17 -1
@@ 90,7 90,11 @@
build-derivations
built-derivations
+ file-search-error?
+ file-search-error-file-name
+ file-search-error-search-path
+ search-path*
module->source-file-name
build-expression->derivation)
@@ 1036,10 1040,22 @@ system, imported, and appears under FINAL-PATH in the resulting store path."
#:guile-for-build guile
#:local-build? #t)))
+;; The "file not found" error condition.
+(define-condition-type &file-search-error &error
+ file-search-error?
+ (file file-search-error-file-name)
+ (path file-search-error-search-path))
+
(define search-path*
;; A memoizing version of 'search-path' so 'imported-modules' does not end
;; up looking for the same files over and over again.
- (memoize search-path))
+ (memoize (lambda (path file)
+ "Search for FILE in PATH and memoize the result. Raise a
+'&file-search-error' condition if it could not be found."
+ (or (search-path path file)
+ (raise (condition
+ (&file-search-error (file file)
+ (path path))))))))
(define (module->source-file-name module)
"Return the file name corresponding to MODULE, a Guile module name (a list
M guix/gexp.scm => guix/gexp.scm +0 -5
@@ 902,11 902,6 @@ system, imported, and appears under FINAL-PATH in the resulting store path."
#:guile-for-build guile
#:local-build? #t)))
-(define search-path*
- ;; A memoizing version of 'search-path' so 'imported-modules' does not end
- ;; up looking for the same files over and over again.
- (memoize search-path))
-
(define* (imported-modules modules
#:key (name "module-import")
(system (%current-system))
M guix/ui.scm => guix/ui.scm +5 -0
@@ 461,6 461,11 @@ interpreted."
(leave (_ "reference to invalid output '~a' of derivation '~a'~%")
(derivation-missing-output c)
(derivation-file-name (derivation-error-derivation c))))
+ ((file-search-error? c)
+ (leave (_ "file '~a' could not be found in these \
+directories:~{ ~a~}~%")
+ (file-search-error-file-name c)
+ (file-search-error-search-path c)))
((message-condition? c)
;; Normally '&message' error conditions have an i18n'd message.
(leave (_ "~a~%")
M tests/derivations.scm => tests/derivations.scm +9 -0
@@ 570,6 570,15 @@
(test-skip (if (%guile-for-build) 0 8))
+(test-equal "build-expression->derivation and invalid module name"
+ '(file-search-error "guix/module/that/does/not/exist.scm")
+ (guard (c ((file-search-error? c)
+ (list 'file-search-error
+ (file-search-error-file-name c))))
+ (build-expression->derivation %store "foo" #t
+ #:modules '((guix module that
+ does not exist)))))
+
(test-assert "build-expression->derivation and derivation-prerequisites"
(let ((drv (build-expression->derivation %store "fail" #f)))
(any (match-lambda