1
0
Fork 0
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:
Eelco Dolstra 2025-05-01 10:53:47 +02:00
parent 2676ae7ca6
commit 40bbad3be5
5 changed files with 32 additions and 15 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -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 {
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%'", drv.builder.substr(8));
throw Error("unsupported builtin builder '%1%'", builtinName);
}
_exit(0);
} catch (std::exception & e) {
writeFull(STDERR_FILENO, e.what() + std::string("\n"));