daemon: Add 'built-in-builders' RPC.

* nix/libstore/builtins.cc (builtinBuilderNames): New function.
* nix/libstore/builtins.hh (builtinBuilderNames): New declaration.
* nix/libstore/worker-protocol.hh (PROTOCOL_VERSION): Bump to 0x160.
(WorkerOp)[wopBuiltinBuilders]: New value.
* nix/nix-daemon/nix-daemon.cc (performOp): Handle it.
* guix/store.scm (operation-id)[built-in-builders]: New value.
* guix/store.scm (read-arg): Add 'string-list'.
(built-in-builders): New procedure.
* tests/derivations.scm ("built-in-builders"): New test.
This commit is contained in:
Ludovic Courtès 2016-11-13 22:59:54 +01:00
parent 94d92c7796
commit f9aefa2d5f
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
6 changed files with 52 additions and 4 deletions

View file

@ -95,6 +95,7 @@ (define-module (guix store)
path-info-registration-time
path-info-nar-size
built-in-builders
references
references/substitutes
requisites
@ -187,7 +188,8 @@ (define-enumerate-type operation-id
(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 @@ (define-syntax write-arg
(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 @@ (define-syntax read-arg
(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 @@ (define substitutable-path-info
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."

View file

@ -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;
}
}

View file

@ -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();
}

View file

@ -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;

View file

@ -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);
}

View file

@ -211,6 +211,10 @@ (define prefix-len (string-length dir))
(= (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)