about summary refs log tree commit diff
path: root/third_party/nix/src/libstore/derivations.hh
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/nix/src/libstore/derivations.hh')
-rw-r--r--third_party/nix/src/libstore/derivations.hh130
1 files changed, 130 insertions, 0 deletions
diff --git a/third_party/nix/src/libstore/derivations.hh b/third_party/nix/src/libstore/derivations.hh
new file mode 100644
index 0000000000..4966b858d3
--- /dev/null
+++ b/third_party/nix/src/libstore/derivations.hh
@@ -0,0 +1,130 @@
+#pragma once
+
+#include <map>
+
+#include <absl/container/btree_map.h>
+
+#include "libproto/worker.pb.h"
+#include "libstore/store-api.hh"
+#include "libutil/hash.hh"
+#include "libutil/types.hh"
+
+namespace nix {
+
+/* Extension of derivations in the Nix store. */
+const std::string drvExtension = ".drv";
+
+/* Abstract syntax of derivations. */
+
+struct DerivationOutput {
+  Path path;
+  // TODO(grfn): make these two fields a Hash
+  std::string hashAlgo; /* hash used for expected hash computation */
+  std::string hash;     /* expected hash, may be null */
+  DerivationOutput() {}
+  DerivationOutput(Path path, std::string hashAlgo, std::string hash) {
+    this->path = path;
+    this->hashAlgo = hashAlgo;
+    this->hash = hash;
+  }
+
+  explicit DerivationOutput(
+      const nix::proto::Derivation_DerivationOutput& proto_derivation_output)
+      : path(proto_derivation_output.path().path()),
+        hashAlgo(proto_derivation_output.hash_algo()),
+        hash(proto_derivation_output.hash()) {}
+
+  void parseHashInfo(bool& recursive, Hash& hash) const;
+
+  [[nodiscard]] nix::proto::Derivation_DerivationOutput to_proto() const;
+};
+
+// TODO(tazjin): Determine whether this actually needs to be ordered.
+using DerivationOutputs = absl::btree_map<std::string, DerivationOutput>;
+
+/* For inputs that are sub-derivations, we specify exactly which
+   output IDs we are interested in. */
+using DerivationInputs = absl::btree_map<Path, StringSet>;
+
+using StringPairs = absl::btree_map<std::string, std::string>;
+
+struct BasicDerivation {
+  DerivationOutputs outputs; /* keyed on symbolic IDs */
+  PathSet inputSrcs;         /* inputs that are sources */
+  std::string platform;
+  Path builder;
+  Strings args;
+  StringPairs env;
+
+  BasicDerivation() = default;
+
+  // Convert the given proto derivation to a BasicDerivation
+  static BasicDerivation from_proto(
+      const nix::proto::Derivation* proto_derivation);
+
+  [[nodiscard]] nix::proto::Derivation to_proto() const;
+
+  virtual ~BasicDerivation(){};
+
+  /* Return the path corresponding to the output identifier `id' in
+     the given derivation. */
+  Path findOutput(const std::string& id) const;
+
+  bool isBuiltin() const;
+
+  /* Return true iff this is a fixed-output derivation. */
+  bool isFixedOutput() const;
+
+  /* Return the output paths of a derivation. */
+  PathSet outputPaths() const;
+};
+
+struct Derivation : BasicDerivation {
+  DerivationInputs inputDrvs; /* inputs that are sub-derivations */
+
+  /* Print a derivation. */
+  std::string unparse() const;
+};
+
+class Store;
+
+/* Write a derivation to the Nix store, and return its path. */
+Path writeDerivation(const ref<Store>& store, const Derivation& drv,
+                     const std::string& name, RepairFlag repair = NoRepair);
+
+/* Read a derivation from a file. */
+Derivation readDerivation(const Path& drvPath);
+
+Derivation parseDerivation(const std::string& s);
+
+/* Check whether a file name ends with the extension for
+   derivations. */
+bool isDerivation(const std::string& fileName);
+
+Hash hashDerivationModulo(Store& store, Derivation drv);
+
+/* Memoisation of hashDerivationModulo(). */
+typedef std::map<Path, Hash> DrvHashes;
+
+extern DrvHashes drvHashes;  // FIXME: global, not thread-safe
+
+/* Split a string specifying a derivation and a set of outputs
+   (/nix/store/hash-foo!out1,out2,...) into the derivation path and
+   the outputs. */
+using DrvPathWithOutputs = std::pair<std::string, std::set<std::string> >;
+DrvPathWithOutputs parseDrvPathWithOutputs(absl::string_view path);
+
+Path makeDrvPathWithOutputs(const Path& drvPath,
+                            const std::set<std::string>& outputs);
+
+bool wantOutput(const std::string& output, const std::set<std::string>& wanted);
+
+struct Source;
+struct Sink;
+
+Source& readDerivation(Source& in, Store& store, BasicDerivation& drv);
+Sink& operator<<(Sink& out, const BasicDerivation& drv);
+
+std::string hashPlaceholder(const std::string& outputName);
+
+}  // namespace nix