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'.