aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/primops.cc24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index cd9a05bb2..ef2d7e768 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -82,16 +82,15 @@ StringMap EvalState::realiseContext(const NixStringContext & context)
/* Build/substitute the context. */
std::vector<DerivedPath> buildReqs;
for (auto & d : drvs) buildReqs.emplace_back(DerivedPath { d });
- store->buildPaths(buildReqs);
+ buildStore->buildPaths(buildReqs, bmNormal, store);
+
+ StorePathSet outputsToCopyAndAllow;
for (auto & drv : drvs) {
- auto outputs = resolveDerivedPath(*store, drv);
+ auto outputs = resolveDerivedPath(*buildStore, drv, &*store);
for (auto & [outputName, outputPath] : outputs) {
- /* Add the output of this derivations to the allowed
- paths. */
- if (allowedPaths) {
- allowPath(outputPath);
- }
+ outputsToCopyAndAllow.insert(outputPath);
+
/* Get all the output paths corresponding to the placeholders we had */
if (experimentalFeatureSettings.isEnabled(Xp::CaDerivations)) {
res.insert_or_assign(
@@ -100,12 +99,21 @@ StringMap EvalState::realiseContext(const NixStringContext & context)
.drvPath = drv.drvPath,
.output = outputName,
}).render(),
- store->printStorePath(outputPath)
+ buildStore->printStorePath(outputPath)
);
}
}
}
+ if (store != buildStore) copyClosure(*buildStore, *store, outputsToCopyAndAllow);
+ if (allowedPaths) {
+ for (auto & outputPath : outputsToCopyAndAllow) {
+ /* Add the output of this derivations to the allowed
+ paths. */
+ allowPath(store->toRealPath(outputPath));
+ }
+ }
+
return res;
}