M guix/store.scm => guix/store.scm +23 -2
@@ 95,6 95,7 @@
path-info-registration-time
path-info-nar-size
+ built-in-builders
references
references/substitutes
requisites
@@ 187,7 188,8 @@
(query-substitutable-paths 32)
(query-valid-derivers 33)
(optimize-store 34)
- (verify-store 35))
+ (verify-store 35)
+ (built-in-builders 80))
(define-enumerate-type hash-algo
;; hash.hh
@@ 283,7 285,7 @@
(write-string (bytevector->base16-string arg) p))))
(define-syntax read-arg
- (syntax-rules (integer boolean string store-path store-path-list
+ (syntax-rules (integer boolean string store-path store-path-list string-list
substitutable-path-list path-info base16)
((_ integer p)
(read-int p))
@@ 295,6 297,8 @@
(read-store-path p))
((_ store-path-list p)
(read-store-path-list p))
+ ((_ string-list p)
+ (read-string-list p))
((_ substitutable-path-list p)
(read-substitutable-path-list p))
((_ path-info p)
@@ 914,6 918,23 @@ that there is no guarantee that the order of the resulting list matches the
order of PATHS."
substitutable-path-list))
+(define built-in-builders
+ (let ((builders (operation (built-in-builders)
+ "Return the built-in builders."
+ string-list)))
+ (lambda (store)
+ "Return the names of the supported built-in derivation builders
+supported by STORE."
+ ;; Check whether STORE's version supports this RPC and built-in
+ ;; derivation builders in general, which appeared in Guix > 0.11.0.
+ ;; Return the empty list if it doesn't. Note that this RPC does not
+ ;; exist in 'nix-daemon'.
+ (if (or (> (nix-server-major-version store) #x100)
+ (and (= (nix-server-major-version store) #x100)
+ (>= (nix-server-minor-version store) #x60)))
+ (builders store)
+ '()))))
+
(define-operation (optimize-store)
"Optimize the store by hard-linking identical files (\"deduplication\".)
Return #t on success."
M nix/libstore/builtins.cc => nix/libstore/builtins.cc +10 -0
@@ 66,4 66,14 @@ derivationBuilder lookupBuiltinBuilder(const std::string & name)
return NULL;
}
+std::list<std::string> builtinBuilderNames()
+{
+ std::list<std::string> result;
+ for(auto&& iter: builtins)
+ {
+ result.push_back(iter.first);
+ }
+ return result;
+}
+
}
M nix/libstore/builtins.hh => nix/libstore/builtins.hh +3 -0
@@ 38,4 38,7 @@ namespace nix {
/* Return the built-in builder called BUILDER, or NULL if none was
found. */
derivationBuilder lookupBuiltinBuilder(const std::string &builder);
+
+ /* Return the list of supported built-in builder names. */
+ std::list<std::string> builtinBuilderNames();
}
M nix/libstore/worker-protocol.hh => nix/libstore/worker-protocol.hh +3 -2
@@ 6,7 6,7 @@ namespace nix {
#define WORKER_MAGIC_1 0x6e697863
#define WORKER_MAGIC_2 0x6478696f
-#define PROTOCOL_VERSION 0x10f
+#define PROTOCOL_VERSION 0x160
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
@@ 43,7 43,8 @@ typedef enum {
wopQuerySubstitutablePaths = 32,
wopQueryValidDerivers = 33,
wopOptimiseStore = 34,
- wopVerifyStore = 35
+ wopVerifyStore = 35,
+ wopBuiltinBuilders = 80
} WorkerOp;
M nix/nix-daemon/nix-daemon.cc => nix/nix-daemon/nix-daemon.cc +9 -0
@@ 6,6 6,7 @@
#include "archive.hh"
#include "affinity.hh"
#include "globals.hh"
+#include "builtins.hh"
#include <algorithm>
@@ 671,6 672,14 @@ static void performOp(bool trusted, unsigned int clientVersion,
break;
}
+ case wopBuiltinBuilders: {
+ startWork();
+ auto names = builtinBuilderNames();
+ stopWork();
+ writeStrings(names, to);
+ break;
+ }
+
default:
throw Error(format("invalid operation %1%") % op);
}
M tests/derivations.scm => tests/derivations.scm +4 -0
@@ 211,6 211,10 @@
(= (stat:ino (lstat file1))
(stat:ino (lstat file2))))))))
+(test-equal "built-in-builders"
+ '("download")
+ (built-in-builders %store))
+
(test-assert "unknown built-in builder"
(let ((drv (derivation %store "ohoh" "builtin:does-not-exist" '())))
(guard (c ((nix-protocol-error? c)