mirror of
https://github.com/NixOS/nix
synced 2025-06-25 10:41:16 +02:00
Allow dynamic registration of builtin builders
This commit is contained in:
parent
2676ae7ca6
commit
40bbad3be5
5 changed files with 32 additions and 15 deletions
|
@ -1,4 +1,5 @@
|
|||
#include "nix/store/builtins/buildenv.hh"
|
||||
#include "nix/store/builtins.hh"
|
||||
#include "nix/store/derivations.hh"
|
||||
#include "nix/util/signals.hh"
|
||||
|
||||
|
@ -166,7 +167,7 @@ void buildProfile(const Path & out, Packages && pkgs)
|
|||
debug("created %d symlinks in user environment", state.symlinks);
|
||||
}
|
||||
|
||||
void builtinBuildenv(
|
||||
static void builtinBuildenv(
|
||||
const BasicDerivation & drv,
|
||||
const std::map<std::string, Path> & outputs)
|
||||
{
|
||||
|
@ -203,4 +204,6 @@ void builtinBuildenv(
|
|||
createSymlink(getAttr("manifest"), out + "/manifest.nix");
|
||||
}
|
||||
|
||||
static RegisterBuiltinBuilder registerBuildenv("buildenv", builtinBuildenv);
|
||||
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
namespace nix {
|
||||
|
||||
void builtinUnpackChannel(
|
||||
static void builtinUnpackChannel(
|
||||
const BasicDerivation & drv,
|
||||
const std::map<std::string, Path> & outputs)
|
||||
{
|
||||
|
@ -42,4 +42,6 @@ void builtinUnpackChannel(
|
|||
}
|
||||
}
|
||||
|
||||
static RegisterBuiltinBuilder registerUnpackChannel("unpack-channel", builtinUnpackChannel);
|
||||
|
||||
}
|
||||
|
|
|
@ -12,8 +12,19 @@ void builtinFetchurl(
|
|||
const std::string & netrcData,
|
||||
const std::string & caFileData);
|
||||
|
||||
void builtinUnpackChannel(
|
||||
const BasicDerivation & drv,
|
||||
const std::map<std::string, Path> & outputs);
|
||||
using BuiltinBuilder =
|
||||
std::function<void(const BasicDerivation & drv, const std::map<std::string, Path> & outputs)>;
|
||||
|
||||
struct RegisterBuiltinBuilder
|
||||
{
|
||||
typedef std::map<std::string, BuiltinBuilder> BuiltinBuilders;
|
||||
static BuiltinBuilders * builtinBuilders;
|
||||
|
||||
RegisterBuiltinBuilder(const std::string & name, BuiltinBuilder && fun)
|
||||
{
|
||||
if (!builtinBuilders) builtinBuilders = new BuiltinBuilders;
|
||||
builtinBuilders->insert_or_assign(name, std::move(fun));
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -45,8 +45,4 @@ typedef std::vector<Package> Packages;
|
|||
|
||||
void buildProfile(const Path & out, Packages && pkgs);
|
||||
|
||||
void builtinBuildenv(
|
||||
const BasicDerivation & drv,
|
||||
const std::map<std::string, Path> & outputs);
|
||||
|
||||
}
|
||||
|
|
|
@ -1835,6 +1835,9 @@ void setupSeccomp()
|
|||
}
|
||||
|
||||
|
||||
RegisterBuiltinBuilder::BuiltinBuilders * RegisterBuiltinBuilder::builtinBuilders = nullptr;
|
||||
|
||||
|
||||
void DerivationBuilderImpl::runChild()
|
||||
{
|
||||
/* Warning: in the child we should absolutely not make any SQLite
|
||||
|
@ -2293,12 +2296,14 @@ void DerivationBuilderImpl::runChild()
|
|||
|
||||
if (drv.builder == "builtin:fetchurl")
|
||||
builtinFetchurl(drv, outputs, netrcData, caFileData);
|
||||
else if (drv.builder == "builtin:buildenv")
|
||||
builtinBuildenv(drv, outputs);
|
||||
else if (drv.builder == "builtin:unpack-channel")
|
||||
builtinUnpackChannel(drv, outputs);
|
||||
else
|
||||
throw Error("unsupported builtin builder '%1%'", drv.builder.substr(8));
|
||||
else {
|
||||
std::string builtinName = drv.builder.substr(8);
|
||||
assert(RegisterBuiltinBuilder::builtinBuilders);
|
||||
if (auto builtin = get(*RegisterBuiltinBuilder::builtinBuilders, builtinName))
|
||||
(*builtin)(drv, outputs);
|
||||
else
|
||||
throw Error("unsupported builtin builder '%1%'", builtinName);
|
||||
}
|
||||
_exit(0);
|
||||
} catch (std::exception & e) {
|
||||
writeFull(STDERR_FILENO, e.what() + std::string("\n"));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue