diff --git a/lix/libstore/build/derivation-goal.cc b/lix/libstore/build/derivation-goal.cc index be7bb8f6f..87f9a1b2c 100644 --- a/lix/libstore/build/derivation-goal.cc +++ b/lix/libstore/build/derivation-goal.cc @@ -82,7 +82,7 @@ DerivationGoal::DerivationGoal(const StorePath & drvPath, } -DerivationGoal::DerivationGoal(const StorePath & drvPath, const BasicDerivation & drv, +DerivationGoal::DerivationGoal(DrvHasRoot, const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, Worker & worker, bool isDependency, BuildMode buildMode) : Goal(worker, isDependency) , useDerivation(false) @@ -98,10 +98,6 @@ DerivationGoal::DerivationGoal(const StorePath & drvPath, const BasicDerivation trace("created"); mcExpectedBuilds = worker.expectedBuilds.addTemporarily(1); - - /* Prevent the .chroot directory from being - garbage-collected. (See isActiveTempFile() in gc.cc.) */ - worker.store.addTempRoot(this->drvPath); } diff --git a/lix/libstore/build/derivation-goal.hh b/lix/libstore/build/derivation-goal.hh index 2a547ecb3..3ce619402 100644 --- a/lix/libstore/build/derivation-goal.hh +++ b/lix/libstore/build/derivation-goal.hh @@ -245,10 +245,13 @@ struct DerivationGoal : public Goal */ std::string machineName; + /** Witness type to say that the drvPath has already been added as a temp root */ + struct DrvHasRoot { explicit DrvHasRoot() = default; }; + DerivationGoal(const StorePath & drvPath, const OutputsSpec & wantedOutputs, Worker & worker, bool isDependency, BuildMode buildMode = bmNormal); - DerivationGoal(const StorePath & drvPath, const BasicDerivation & drv, + DerivationGoal(DrvHasRoot, const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, Worker & worker, bool isDependency, BuildMode buildMode = bmNormal); virtual ~DerivationGoal() noexcept(false); diff --git a/lix/libstore/build/local-derivation-goal.hh b/lix/libstore/build/local-derivation-goal.hh index d9a7bb91b..61325f36c 100644 --- a/lix/libstore/build/local-derivation-goal.hh +++ b/lix/libstore/build/local-derivation-goal.hh @@ -195,6 +195,7 @@ struct LocalDerivationGoal : public DerivationGoal * possibly a platform-specific subclass */ static std::unique_ptr makeLocalDerivationGoal( + DrvHasRoot drvRoot, const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, diff --git a/lix/libstore/build/worker.cc b/lix/libstore/build/worker.cc index 2c1ac9c0c..e3e9b7849 100644 --- a/lix/libstore/build/worker.cc +++ b/lix/libstore/build/worker.cc @@ -142,16 +142,20 @@ std::pair, kj::Promise> BuildMode buildMode ) { + /* Prevent the .chroot directory from being + garbage-collected. (See isActiveTempFile() in gc.cc.) */ + store.addTempRoot(drvPath); + return makeGoalCommon( derivationGoals, drvPath, [&]() -> std::unique_ptr { return !dynamic_cast(&store) ? std::make_unique( - drvPath, drv, wantedOutputs, *this, running, buildMode + DerivationGoal::DrvHasRoot{}, drvPath, drv, wantedOutputs, *this, running, buildMode ) : LocalDerivationGoal::makeLocalDerivationGoal( - drvPath, drv, wantedOutputs, *this, running, buildMode + DerivationGoal::DrvHasRoot{}, drvPath, drv, wantedOutputs, *this, running, buildMode ); }, [&](DerivationGoal & g) { return g.addWantedOutputs(wantedOutputs); } diff --git a/lix/libstore/platform.cc b/lix/libstore/platform.cc index 7a1d9c502..f3ce17a60 100644 --- a/lix/libstore/platform.cc +++ b/lix/libstore/platform.cc @@ -45,6 +45,7 @@ std::unique_ptr LocalDerivationGoal::makeLocalDerivationGoa } std::unique_ptr LocalDerivationGoal::makeLocalDerivationGoal( + DrvHasRoot drvRoot, const StorePath & drvPath, const BasicDerivation & drv, const OutputsSpec & wantedOutputs, @@ -55,19 +56,19 @@ std::unique_ptr LocalDerivationGoal::makeLocalDerivationGoa { #if __linux__ return std::make_unique( - drvPath, drv, wantedOutputs, worker, isDependency, buildMode + drvRoot, drvPath, drv, wantedOutputs, worker, isDependency, buildMode ); #elif __APPLE__ return std::make_unique( - drvPath, drv, wantedOutputs, worker, isDependency, buildMode + drvRoot, drvPath, drv, wantedOutputs, worker, isDependency, buildMode ); #elif __FreeBSD__ return std::make_unique( - drvPath, drv, wantedOutputs, worker, isDependency, buildMode + drvRoot, drvPath, drv, wantedOutputs, worker, isDependency, buildMode ); #else return std::make_unique( - drvPath, drv, wantedOutputs, worker, isDependency, buildMode + drvRoot, drvPath, drv, wantedOutputs, worker, isDependency, buildMode ); #endif }