aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build/create-derivation-and-realise-goal.hh
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2021-03-08 16:24:49 -0500
committerJohn Ericson <John.Ericson@Obsidian.Systems>2023-08-25 10:01:25 -0400
commit5e3986f59cb58f48186a49dcec7aa317b4787522 (patch)
tree7c746838e7da6aa3677e06cc90766d014c06cfd5 /src/libstore/build/create-derivation-and-realise-goal.hh
parent692074f7142fcf8ede1266b6d8cbbd5feaf3221f (diff)
Adapt scheduler to work with dynamic derivations
To avoid dealing with an optional `drvPath` (because we might not know it yet) everywhere, make an `CreateDerivationAndRealiseGoal`. This goal just builds/substitutes the derivation file, and then kicks of a build for that obtained derivation; in other words it does the chaining of goals when the drv file is missing (as can already be the case) or computed (new case). This also means the `getDerivation` state can be removed from `DerivationGoal`, which makes the `BasicDerivation` / in memory case and `Derivation` / drv file file case closer together. The map type is factored out for clarity, and because we will soon hvae a second use for it (`Derivation` itself). Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
Diffstat (limited to 'src/libstore/build/create-derivation-and-realise-goal.hh')
-rw-r--r--src/libstore/build/create-derivation-and-realise-goal.hh96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/libstore/build/create-derivation-and-realise-goal.hh b/src/libstore/build/create-derivation-and-realise-goal.hh
new file mode 100644
index 000000000..ca936fc95
--- /dev/null
+++ b/src/libstore/build/create-derivation-and-realise-goal.hh
@@ -0,0 +1,96 @@
+#pragma once
+
+#include "parsed-derivations.hh"
+#include "lock.hh"
+#include "store-api.hh"
+#include "pathlocks.hh"
+#include "goal.hh"
+
+namespace nix {
+
+struct DerivationGoal;
+
+/**
+ * This goal type is essentially the serial composition (like function
+ * composition) of a goal for getting a derivation, and then a
+ * `DerivationGoal` using the newly-obtained derivation.
+ *
+ * In the (currently experimental) general inductive case of derivations
+ * that are themselves build outputs, that first goal will be *another*
+ * `CreateDerivationAndRealiseGoal`. In the (much more common) base-case
+ * where the derivation has no provence and is just referred to by
+ * (content-addressed) store path, that first goal is a
+ * `SubstitutionGoal`.
+ *
+ * If we already have the derivation (e.g. if the evalutator has created
+ * the derivation locally and then instructured the store to build it),
+ * we can skip the first goal entirely as a small optimization.
+ */
+struct CreateDerivationAndRealiseGoal : public Goal
+{
+ /**
+ * How to obtain a store path of the derivation to build.
+ */
+ ref<SingleDerivedPath> drvReq;
+
+ /**
+ * The path of the derivation, once obtained.
+ **/
+ std::optional<StorePath> optDrvPath;
+
+ /**
+ * The goal for the corresponding concrete derivation.
+ **/
+ std::shared_ptr<DerivationGoal> concreteDrvGoal;
+
+ /**
+ * The specific outputs that we need to build.
+ */
+ OutputsSpec wantedOutputs;
+
+ typedef void (CreateDerivationAndRealiseGoal::*GoalState)();
+ GoalState state;
+
+ /**
+ * The final output paths of the build.
+ *
+ * - For input-addressed derivations, always the precomputed paths
+ *
+ * - For content-addressed derivations, calcuated from whatever the
+ * hash ends up being. (Note that fixed outputs derivations that
+ * produce the "wrong" output still install that data under its
+ * true content-address.)
+ */
+ OutputPathMap finalOutputs;
+
+ BuildMode buildMode;
+
+ CreateDerivationAndRealiseGoal(ref<SingleDerivedPath> drvReq,
+ const OutputsSpec & wantedOutputs, Worker & worker,
+ BuildMode buildMode = bmNormal);
+ virtual ~CreateDerivationAndRealiseGoal();
+
+ void timedOut(Error && ex) override;
+
+ std::string key() override;
+
+ void work() override;
+
+ /**
+ * Add wanted outputs to an already existing derivation goal.
+ */
+ void addWantedOutputs(const OutputsSpec & outputs);
+
+ /**
+ * The states.
+ */
+ void getDerivation();
+ void loadAndBuildDerivation();
+ void buildDone();
+
+ JobCategory jobCategory() const override {
+ return JobCategory::Administration;
+ };
+};
+
+}