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.
This commit is contained in:
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
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
Gexps carry information about the packages or derivations they refer to,
and these dependencies are automatically added as inputs to the build

View file

@ -20,7 +20,6 @@ (define-module (guix gexp)
#:use-module (guix store)
#:use-module (guix monads)
#:use-module (guix derivations)
#:use-module (guix packages)
#:use-module (guix utils)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-9)
@ -39,7 +38,10 @@ (define-module (guix gexp)
text-file*
imported-files
imported-modules
compiled-modules))
compiled-modules
define-gexp-compiler
gexp-compiler?))
;;; Commentary:
;;;
@ -125,16 +127,6 @@ (define name
body ...)))
(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.
@ -212,6 +204,15 @@ (define lower
(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
#:key
system (target 'current)
@ -314,8 +315,7 @@ (define (graphs-file-names graphs)
(return #f)))
(guile (if guile-for-build
(return guile-for-build)
(package->derivation (default-guile)
system))))
(default-guile-derivation system))))
(mbegin %store-monad
(set-grafting graft?) ;restore the initial setting
(raw-derivation name

View file

@ -22,6 +22,7 @@ (define-module (guix packages)
#:use-module (guix records)
#:use-module (guix store)
#:use-module (guix monads)
#:use-module (guix gexp)
#:use-module (guix base32)
#:use-module (guix derivations)
#:use-module (guix build-system)
@ -111,6 +112,7 @@ (define-module (guix packages)
bag-transitive-target-inputs
default-guile
default-guile-derivation
set-guile-for-build
package-file
package->derivation
@ -341,6 +343,12 @@ (define (default-guile)
(let ((distro (resolve-interface '(gnu packages commencement))))
(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.
(define* (patch-and-repack store source patches
#:key
@ -939,6 +947,13 @@ (define package->derivation
(define 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*
(store-lift patch-and-repack))
@ -976,5 +991,10 @@ (define* (origin->derivation source
(interned-file file (basename file)
#: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
(store-lower origin->derivation))