gexp: Move the package and origin compilers to (guix packages).

From now own, (guix packages) depends on (guix gexps); it was the other
way around now.  This means that (guix packages) code can use gexps.

* guix/gexp.scm (origin-compiler, package-compiler): Remove.
  (default-guile-derivation): New procedure.
  (gexp->derivation): Use it instead of 'default-guile' +
  'package->derivation'.
* guix/packages.scm (default-guile-derivation): New procedure.
  (package-compiler, origin-compiler): New variables.
* doc/guix.texi (G-Expressions): Mention extensibility.
master
Ludovic Courtès 2015-03-17 22:09:32 +01:00
parent 9d8100f4c7
commit ff40e9b7e5
3 changed files with 39 additions and 14 deletions

View File

@ -2464,6 +2464,11 @@ processes.
When a package or derivation is unquoted inside a gexp, the result is as When a package or derivation is unquoted inside a gexp, the result is as
if its output file name had been introduced. if its output file name had been introduced.
Actually this mechanism is not limited to package and derivation
objects; @dfn{compilers} able to ``lower'' other high-level objects to
derivations can be defined, such that these objects can also be inserted
into gexps.
@item @item
Gexps carry information about the packages or derivations they refer to, Gexps carry information about the packages or derivations they refer to,
and these dependencies are automatically added as inputs to the build and these dependencies are automatically added as inputs to the build

View File

@ -20,7 +20,6 @@
#:use-module (guix store) #:use-module (guix store)
#:use-module (guix monads) #:use-module (guix monads)
#:use-module (guix derivations) #:use-module (guix derivations)
#:use-module (guix packages)
#:use-module (guix utils) #:use-module (guix utils)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-9) #:use-module (srfi srfi-9)
@ -39,7 +38,10 @@
text-file* text-file*
imported-files imported-files
imported-modules imported-modules
compiled-modules)) compiled-modules
define-gexp-compiler
gexp-compiler?))
;;; Commentary: ;;; Commentary:
;;; ;;;
@ -125,16 +127,6 @@ cross-compiling.)"
body ...))) body ...)))
(register-compiler! name))) (register-compiler! name)))
(define-gexp-compiler (origin-compiler (origin origin?) system target)
;; Compiler for origins.
(origin->derivation origin system))
(define-gexp-compiler (package-compiler (package package?) system target)
;; Compiler for packages.
(if target
(package->cross-derivation package target system)
(package->derivation package system)))
;;; ;;;
;;; Inputs & outputs. ;;; Inputs & outputs.
@ -212,6 +204,15 @@ names and file names suitable for the #:allowed-references argument to
(sequence %store-monad (map lower lst)))) (sequence %store-monad (map lower lst))))
(define default-guile-derivation
;; Here we break the abstraction by talking to the higher-level layer.
;; Thus, do the resolution lazily to hide the circular dependency.
(let ((proc (delay
(let ((iface (resolve-interface '(guix packages))))
(module-ref iface 'default-guile-derivation)))))
(lambda (system)
((force proc) system))))
(define* (gexp->derivation name exp (define* (gexp->derivation name exp
#:key #:key
system (target 'current) system (target 'current)
@ -314,8 +315,7 @@ The other arguments are as for 'derivation'."
(return #f))) (return #f)))
(guile (if guile-for-build (guile (if guile-for-build
(return guile-for-build) (return guile-for-build)
(package->derivation (default-guile) (default-guile-derivation system))))
system))))
(mbegin %store-monad (mbegin %store-monad
(set-grafting graft?) ;restore the initial setting (set-grafting graft?) ;restore the initial setting
(raw-derivation name (raw-derivation name

View File

@ -22,6 +22,7 @@
#:use-module (guix records) #:use-module (guix records)
#:use-module (guix store) #:use-module (guix store)
#:use-module (guix monads) #:use-module (guix monads)
#:use-module (guix gexp)
#:use-module (guix base32) #:use-module (guix base32)
#:use-module (guix derivations) #:use-module (guix derivations)
#:use-module (guix build-system) #:use-module (guix build-system)
@ -111,6 +112,7 @@
bag-transitive-target-inputs bag-transitive-target-inputs
default-guile default-guile
default-guile-derivation
set-guile-for-build set-guile-for-build
package-file package-file
package->derivation package->derivation
@ -341,6 +343,12 @@ derivations."
(let ((distro (resolve-interface '(gnu packages commencement)))) (let ((distro (resolve-interface '(gnu packages commencement))))
(module-ref distro 'guile-final))) (module-ref distro 'guile-final)))
(define* (default-guile-derivation #:optional (system (%current-system)))
"Return the derivation for SYSTEM of the default Guile package used to run
the build code of derivation."
(package->derivation (default-guile) system
#:graft? #f))
;; TODO: Rewrite using %STORE-MONAD and gexps. ;; TODO: Rewrite using %STORE-MONAD and gexps.
(define* (patch-and-repack store source patches (define* (patch-and-repack store source patches
#:key #:key
@ -939,6 +947,13 @@ cross-compilation target triplet."
(define package->cross-derivation (define package->cross-derivation
(store-lift package-cross-derivation)) (store-lift package-cross-derivation))
(define-gexp-compiler (package-compiler (package package?) system target)
;; Compile PACKAGE to a derivation for SYSTEM, optionally cross-compiled for
;; TARGET. This is used when referring to a package from within a gexp.
(if target
(package->cross-derivation package target system)
(package->derivation package system)))
(define patch-and-repack* (define patch-and-repack*
(store-lift patch-and-repack)) (store-lift patch-and-repack))
@ -976,5 +991,10 @@ outside of the store) or SOURCE itself (if SOURCE is already a store item.)"
(interned-file file (basename file) (interned-file file (basename file)
#:recursive? #t)))) #:recursive? #t))))
(define-gexp-compiler (origin-compiler (origin origin?) system target)
;; Compile ORIGIN to a derivation for SYSTEM. This is used when referring
;; to an origin from within a gexp.
(origin->derivation origin system))
(define package-source-derivation (define package-source-derivation
(store-lower origin->derivation)) (store-lower origin->derivation))