aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build-aux/build-self.scm29
-rw-r--r--guix/channels.scm67
2 files changed, 70 insertions, 26 deletions
diff --git a/build-aux/build-self.scm b/build-aux/build-self.scm
index 02822a2ee8..d9299b9af2 100644
--- a/build-aux/build-self.scm
+++ b/build-aux/build-self.scm
@@ -241,8 +241,12 @@ interface (FFI) of Guile.")
(define* (build-program source version
#:optional (guile-version (effective-version))
- #:key (pull-version 0) (channel-metadata #f))
- "Return a program that computes the derivation to build Guix from SOURCE."
+ #:key (pull-version 0) (channel-metadata #f)
+ built-in-builders)
+ "Return a program that computes the derivation to build Guix from SOURCE.
+If BUILT-IN-BUILDERS is provided, it should be a list of
+strings and this will be used instead of the builtin builders provided by the
+build daemon, from within the generated build program."
(define select?
;; Select every module but (guix config) and non-Guix modules.
;; Also exclude (guix channels): it is autoloaded by (guix describe), but
@@ -331,11 +335,16 @@ interface (FFI) of Guile.")
;; case, attempt to open a new connection.
(let* ((proto (string->number protocol-version))
(store (if (integer? proto)
- (port->connection (duplicate-port
- (current-input-port)
- "w+0")
- #:version proto)
- (open-connection)))
+ (port->connection
+ (duplicate-port
+ (current-input-port)
+ "w+0")
+ #:version proto
+ #:built-in-builders
+ '#$built-in-builders)
+ (open-connection
+ #:built-in-builders
+ '#$built-in-builders)))
(sock (socket AF_UNIX SOCK_STREAM 0)))
;; Connect to BUILD-OUTPUT and send it the raw
;; build output.
@@ -406,7 +415,7 @@ Display a spinner when nothing happens."
(guile-version (if (> pull-version 0)
"3.0"
(effective-version)))
-
+ built-in-builders
#:allow-other-keys
#:rest rest)
"Return a derivation that unpacks SOURCE into STORE and compiles Scheme
@@ -415,7 +424,9 @@ files."
;; SOURCE.
(mlet %store-monad ((build (build-program source version guile-version
#:channel-metadata channel-metadata
- #:pull-version pull-version))
+ #:pull-version pull-version
+ #:built-in-builders
+ built-in-builders))
(system (if system (return system) (current-system)))
(home -> (getenv "HOME"))
diff --git a/guix/channels.scm b/guix/channels.scm
index 0d7bc541cc..34f63eb833 100644
--- a/guix/channels.scm
+++ b/guix/channels.scm
@@ -704,11 +704,15 @@ that unconditionally resumes the continuation."
store))))
(define* (build-from-source instance
- #:key core verbose? (dependencies '()) system)
+ #:key core verbose? (dependencies '()) system
+ built-in-builders)
"Return a derivation to build Guix from INSTANCE, using the self-build
script contained therein. When CORE is true, build package modules under
SOURCE using CORE, an instance of Guix. By default, build for the current
-system, or SYSTEM if specified."
+system, or SYSTEM if specified. If BUILT-IN-BUILDERS is
+provided, it should be a list of strings and this will be used instead of the
+builtin builders provided by the build daemon for store connections used
+during this process."
(define name
(symbol->string
(channel-name (channel-instance-channel instance))))
@@ -750,20 +754,28 @@ system, or SYSTEM if specified."
#:verbose? verbose? #:version commit
#:system system
#:channel-metadata (channel-instance->sexp instance)
- #:pull-version %pull-version))))
+ #:pull-version %pull-version
+ #:built-in-builders
+ built-in-builders))))
;; Build a set of modules that extend Guix using the standard method.
(standard-module-derivation name source core dependencies)))
(define* (build-channel-instance instance system
- #:optional core (dependencies '()))
+ #:optional core (dependencies '())
+ #:key built-in-builders)
"Return, as a monadic value, the derivation for INSTANCE, a channel
instance, for SYSTEM. DEPENDENCIES is a list of extensions providing Guile
-modules that INSTANCE depends on."
+modules that INSTANCE depends on. If BUILT-IN-BUILDERS is
+provided, it should be a list of strings and this will be used instead of the
+builtin builders provided by the build daemon for store connections used
+during this process."
(build-from-source instance
#:core core
#:dependencies dependencies
- #:system system))
+ #:system system
+ #:built-in-builders
+ built-in-builders))
(define (resolve-dependencies instances)
"Return a procedure that, given one of the elements of INSTANCES, returns
@@ -793,9 +805,13 @@ list of instances it depends on."
(lambda (instance)
(vhash-foldq* cons '() instance edges)))
-(define* (channel-instance-derivations instances #:key system)
+(define* (channel-instance-derivations instances #:key system
+ built-in-builders)
"Return the list of derivations to build INSTANCES, in the same order as
-INSTANCES. Build for the current system by default, or SYSTEM if specified."
+INSTANCES. Build for the current system by default, or SYSTEM if specified.
+If BUILT-IN-BUILDERS is provided, it should be a list of
+strings and this will be used instead of the builtin builders provided by the
+build daemon for store connections used during this process."
(define core-instance
;; The 'guix' channel is treated specially: it's an implicit dependency of
;; all the other channels.
@@ -809,11 +825,15 @@ INSTANCES. Build for the current system by default, or SYSTEM if specified."
(define (instance->derivation instance)
(mlet %store-monad ((system (if system (return system) (current-system))))
(mcached (if (eq? instance core-instance)
- (build-channel-instance instance system)
+ (build-channel-instance instance system
+ #:built-in-builders
+ built-in-builders)
(mlet %store-monad ((core (instance->derivation core-instance))
(deps (mapm %store-monad instance->derivation
(edges instance))))
- (build-channel-instance instance system core deps)))
+ (build-channel-instance instance system core deps
+ #:built-in-builders
+ built-in-builders)))
instance
system)))
@@ -915,10 +935,13 @@ derivation."
intro))))))
'()))))
-(define* (channel-instances->manifest instances #:key system)
+(define* (channel-instances->manifest instances #:key system
+ built-in-builders)
"Return a profile manifest with entries for all of INSTANCES, a list of
channel instances. By default, build for the current system, or SYSTEM if
-specified."
+specified. If BUILT-IN-BUILDERS is provided, it should be a
+list of strings and this will be used instead of the builtin builders provided
+by the build daemon for store connections used during this process."
(define (instance->entry instance drv)
(let ((commit (channel-instance-commit instance))
(channel (channel-instance-channel instance)))
@@ -934,8 +957,11 @@ specified."
(properties
`((source ,(channel-instance->sexp instance)))))))
- (mlet* %store-monad ((derivations (channel-instance-derivations instances
- #:system system))
+ (mlet* %store-monad ((derivations (channel-instance-derivations
+ instances
+ #:system system
+ #:built-in-builders
+ built-in-builders))
(entries -> (map instance->entry instances derivations)))
(return (manifest entries))))
@@ -990,10 +1016,17 @@ be used as a profile hook."
;; The default channel profile hooks.
(cons package-cache-file %default-profile-hooks))
-(define (channel-instances->derivation instances)
+(define* (channel-instances->derivation instances
+ #:key built-in-builders)
"Return the derivation of the profile containing INSTANCES, a list of
-channel instances."
- (mlet %store-monad ((manifest (channel-instances->manifest instances)))
+channel instances. If BUILT-IN-BUILDERS is provided, it
+should be a list of strings and this will be used instead of the builtin
+builders provided by the build daemon for store connections used during this
+process."
+ (mlet %store-monad ((manifest (channel-instances->manifest
+ instances
+ #:built-in-builders
+ built-in-builders)))
;; Emit a profile in format version so that, if INSTANCES denotes an old
;; Guix, it can still read that profile, for instance for the purposes of
;; 'guix describe'.