aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/primops.cc48
1 files changed, 20 insertions, 28 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index f3eb5e925..9f549e52f 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -1222,34 +1222,26 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
DerivationOutput::Deferred { });
}
- // Regular, non-CA derivation should always return a single hash and not
- // hash per output.
- auto hashModulo = hashDerivationModulo(*state.store, drv, true);
- std::visit(overloaded {
- [&](const DrvHash & drvHash) {
- auto & h = drvHash.hash;
- switch (drvHash.kind) {
- case DrvHash::Kind::Deferred:
- /* Outputs already deferred, nothing to do */
- break;
- case DrvHash::Kind::Regular:
- for (auto & [outputName, output] : drv.outputs) {
- auto outPath = state.store->makeOutputPath(outputName, h, drvName);
- drv.env[outputName] = state.store->printStorePath(outPath);
- output = DerivationOutput::InputAddressed {
- .path = std::move(outPath),
- };
- }
- break;
- }
- },
- [&](const CaOutputHashes &) {
- // Shouldn't happen as the toplevel derivation is not CA.
- assert(false);
- },
- },
- hashModulo.raw());
-
+ auto hashModulo = hashDerivationModulo(*state.store, Derivation(drv), true);
+ switch (hashModulo.kind) {
+ case DrvHash::Kind::Regular:
+ for (auto & i : outputs) {
+ auto h = hashModulo.hashes.at(i);
+ auto outPath = state.store->makeOutputPath(i, h, drvName);
+ drv.env[i] = state.store->printStorePath(outPath);
+ drv.outputs.insert_or_assign(
+ i,
+ DerivationOutputInputAddressed {
+ .path = std::move(outPath),
+ });
+ }
+ break;
+ ;
+ case DrvHash::Kind::Deferred:
+ for (auto & i : outputs) {
+ drv.outputs.insert_or_assign(i, DerivationOutputDeferred {});
+ }
+ }
}
/* Write the resulting term into the Nix store directory. */