[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

From: Ludovic Courtès
Subject: 09/10: gexp: Move the package and origin compilers to (guix packages).
Date: Tue, 17 Mar 2015 21:29:00 +0000

civodul pushed a commit to branch master
in repository guix.

commit ff40e9b7e55846c86f48c861816ac01bd0d7af7a
Author: Ludovic Courtès <address@hidden>
Date:   Tue Mar 17 22:09:32 2015 +0100

    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' +
    * guix/packages.scm (default-guile-derivation): New procedure.
      (package-compiler, origin-compiler): New variables.
    * doc/guix.texi (G-Expressions): Mention extensibility.
 doc/guix.texi     |    5 +++++
 guix/gexp.scm     |   28 ++++++++++++++--------------
 guix/packages.scm |   20 ++++++++++++++++++++
 3 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index fa8d3ab..ae2f786 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -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.
 Gexps carry information about the packages or derivations they refer to,
 and these dependencies are automatically added as inputs to the build
diff --git a/guix/gexp.scm b/guix/gexp.scm
index 119fe42..f8646a0 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -20,7 +20,6 @@
   #: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 @@
-            compiled-modules))
+            compiled-modules
+            define-gexp-compiler
+            gexp-compiler?))
 ;;; Commentary:
@@ -125,16 +127,6 @@ cross-compiling.)"
                        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 @@ names and file names suitable for the #:allowed-references 
argument to
     (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
                            system (target 'current)
@@ -314,8 +315,7 @@ The other arguments are as for 'derivation'."
                                      (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
diff --git a/guix/packages.scm b/guix/packages.scm
index df56286..ec0e79d 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -22,6 +22,7 @@
   #: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 @@
+            default-guile-derivation
@@ -341,6 +343,12 @@ derivations."
   (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
@@ -939,6 +947,13 @@ cross-compilation target triplet."
 (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 @@ outside of the store) or SOURCE itself (if SOURCE is 
already a store item.)"
      (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))

reply via email to

[Prev in Thread] Current Thread [Next in Thread]