guix build: Support '--with-source' along with '-e'.

* guix/scripts/build.scm (derivation-from-expression): Remove.
  (options->derivations): Handle pairs of the form
  "('argument . (? derivation?))".
  (options/resolve-packages): Add 'store' parameter; update caller.  Add
  'system' variable.  Add case for 'expression pairs.
* guix/scripts/archive.scm (derivation-from-expression): New procedure.
This commit is contained in:
Ludovic Courtès 2014-03-13 19:21:49 +01:00
parent 9037ea2c12
commit 257b93412a
2 changed files with 34 additions and 26 deletions

@ -23,6 +23,7 @@
#:use-module (guix store) #:use-module (guix store)
#:use-module (guix packages) #:use-module (guix packages)
#:use-module (guix derivations) #:use-module (guix derivations)
#:use-module (guix monads)
#:use-module (guix ui) #:use-module (guix ui)
#:use-module (guix pki) #:use-module (guix pki)
#:use-module (guix pk-crypto) #:use-module (guix pk-crypto)
@ -143,6 +144,24 @@ Export/import one or more packages from/to the store.\n"))
%standard-build-options)) %standard-build-options))
(define (derivation-from-expression store str package-derivation
system source?)
"Read/eval STR and return the corresponding derivation path for SYSTEM.
When SOURCE? is true and STR evaluates to a package, return the derivation of
the package source; otherwise, use PACKAGE-DERIVATION to compute the
derivation of a package."
(match (read/eval str)
((? package? p)
(if source?
(let ((source (package-source p)))
(if source
(package-source-derivation store source)
(leave (_ "package `~a' has no source~%")
(package-name p))))
(package-derivation store p system)))
((? procedure? proc)
(run-with-store store (proc) #:system system))))
(define (options->derivations+files store opts) (define (options->derivations+files store opts)
"Given OPTS, the result of 'args-fold', return a list of derivations to "Given OPTS, the result of 'args-fold', return a list of derivations to
build and a list of store files to transfer." build and a list of store files to transfer."

@ -34,32 +34,12 @@
#:use-module (srfi srfi-37) #:use-module (srfi srfi-37)
#:autoload (gnu packages) (find-best-packages-by-name) #:autoload (gnu packages) (find-best-packages-by-name)
#:autoload (guix download) (download-to-store) #:autoload (guix download) (download-to-store)
#:export (derivation-from-expression #:export (%standard-build-options
%standard-build-options
set-build-options-from-command-line set-build-options-from-command-line
show-build-options-help show-build-options-help
guix-build)) guix-build))
(define (derivation-from-expression store str package-derivation
system source?)
"Read/eval STR and return the corresponding derivation path for SYSTEM.
When SOURCE? is true and STR evaluates to a package, return the derivation of
the package source; otherwise, use PACKAGE-DERIVATION to compute the
derivation of a package."
(match (read/eval str)
((? package? p)
(if source?
(let ((source (package-source p)))
(if source
(package-source-derivation store source)
(leave (_ "package `~a' has no source~%")
(package-name p))))
(package-derivation store p system)))
((? procedure? proc)
(run-with-store store (proc) #:system system))))
(define (specification->package spec) (define (specification->package spec)
"Return a package matching SPEC. SPEC may be a package name, or a package "Return a package matching SPEC. SPEC may be a package name, or a package
name followed by a hyphen and a version number. If the version number is not name followed by a hyphen and a version number. If the version number is not
@ -322,16 +302,15 @@ build."
(define sys (assoc-ref opts 'system)) (define sys (assoc-ref opts 'system))
(let ((opts (options/with-source store (let ((opts (options/with-source store
(options/resolve-packages opts)))) (options/resolve-packages store opts))))
(filter-map (match-lambda (filter-map (match-lambda
(('expression . str)
(derivation-from-expression store str package->derivation
sys src?))
(('argument . (? package? p)) (('argument . (? package? p))
(if src? (if src?
(let ((s (package-source p))) (let ((s (package-source p)))
(package-source-derivation store s)) (package-source-derivation store s))
(package->derivation store p sys))) (package->derivation store p sys)))
(('argument . (? derivation? drv))
drv)
(('argument . (? derivation-path? drv)) (('argument . (? derivation-path? drv))
(call-with-input-file drv read-derivation)) (call-with-input-file drv read-derivation))
(('argument . (? store-path?)) (('argument . (? store-path?))
@ -340,14 +319,24 @@ build."
(_ #f)) (_ #f))
opts))) opts)))
(define (options/resolve-packages opts) (define (options/resolve-packages store opts)
"Return OPTS with package specification strings replaced by actual "Return OPTS with package specification strings replaced by actual
packages." packages."
(define system
(or (assoc-ref opts 'system) (%current-system)))
(map (match-lambda (map (match-lambda
(('argument . (? string? spec)) (('argument . (? string? spec))
(if (store-path? spec) (if (store-path? spec)
`(argument . ,spec) `(argument . ,spec)
`(argument . ,(specification->package spec)))) `(argument . ,(specification->package spec))))
(('expression . str)
(match (read/eval str)
((? package? p)
`(argument . ,p))
((? procedure? proc)
(let ((drv (run-with-store store (proc) #:system system)))
`(argument . ,drv)))))
(opt opt)) (opt opt))
opts)) opts))