1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-11 21:16:02 +01:00

external-derivation-builder: write the json doc into builder's stdin

This commit is contained in:
Cole Helbling 2025-06-30 13:56:04 -07:00
parent 804729b4ec
commit d1f57c5dae
2 changed files with 13 additions and 6 deletions

View file

@ -1248,7 +1248,7 @@ public:
R"( R"(
Helper programs that execute derivations. Helper programs that execute derivations.
The program is passed a JSON document that describes the build environment as the final argument. The program is passed a JSON document that describes the build environment on standard input.
The JSON document looks like this: The JSON document looks like this:
{ {

View file

@ -4,6 +4,11 @@ struct ExternalDerivationBuilder : DerivationBuilderImpl
{ {
Settings::ExternalBuilder externalBuilder; Settings::ExternalBuilder externalBuilder;
/**
* Pipe for talking to the spawned builder.
*/
Pipe toBuilder;
ExternalDerivationBuilder( ExternalDerivationBuilder(
Store & store, Store & store,
std::unique_ptr<DerivationBuilderCallbacks> miscMethods, std::unique_ptr<DerivationBuilderCallbacks> miscMethods,
@ -83,23 +88,22 @@ struct ExternalDerivationBuilder : DerivationBuilderImpl
json.emplace("realStoreDir", getLocalStore(store).config->realStoreDir.get()); json.emplace("realStoreDir", getLocalStore(store).config->realStoreDir.get());
json.emplace("system", drv.platform); json.emplace("system", drv.platform);
// FIXME: maybe write this JSON into the builder's stdin instead....? toBuilder.create();
auto jsonFile = topTmpDir + "/build.json";
writeFile(jsonFile, json.dump());
pid = startProcess([&]() { pid = startProcess([&]() {
openSlave(); openSlave();
try { try {
commonChildInit(); commonChildInit();
if (dup2(toBuilder.readSide.get(), STDIN_FILENO) == -1)
throw SysError("duping to-builder read side to builder's stdin");
Strings args = {externalBuilder.program}; Strings args = {externalBuilder.program};
if (!externalBuilder.args.empty()) { if (!externalBuilder.args.empty()) {
args.insert(args.end(), externalBuilder.args.begin(), externalBuilder.args.end()); args.insert(args.end(), externalBuilder.args.begin(), externalBuilder.args.end());
} }
args.insert(args.end(), jsonFile);
debug("executing external builder: %s", concatStringsSep(" ", args)); debug("executing external builder: %s", concatStringsSep(" ", args));
execv(externalBuilder.program.c_str(), stringsToCharPtrs(args).data()); execv(externalBuilder.program.c_str(), stringsToCharPtrs(args).data());
@ -109,6 +113,9 @@ struct ExternalDerivationBuilder : DerivationBuilderImpl
_exit(1); _exit(1);
} }
}); });
writeFull(toBuilder.writeSide.get(), json.dump());
toBuilder.close();
} }
}; };