about summary refs log tree commit diff
path: root/third_party/nix/src/libexpr/get-drvs.hh
blob: deb0a6d647a9165b9fa7cb5acf9d45b65fb40e87 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#pragma once

#include <map>
#include <string>

#include "eval.hh"

namespace nix {

struct DrvInfo {
 public:
  typedef std::map<string, Path> Outputs;

 private:
  EvalState* state;

  mutable string name;
  mutable string system;
  mutable string drvPath;
  mutable string outPath;
  mutable string outputName;
  Outputs outputs;

  bool failed = false;  // set if we get an AssertionError

  Bindings *attrs = nullptr, *meta = nullptr;

  Bindings* getMeta();

  bool checkMeta(Value& v);

 public:
  string attrPath; /* path towards the derivation */

  DrvInfo(EvalState& state) : state(&state){};
  DrvInfo(EvalState& state, const string& attrPath, Bindings* attrs);
  DrvInfo(EvalState& state, ref<Store> store,
          const std::string& drvPathWithOutputs);

  string queryName() const;
  string querySystem() const;
  string queryDrvPath() const;
  string queryOutPath() const;
  string queryOutputName() const;
  /** Return the list of outputs. The "outputs to install" are determined by
   * `meta.outputsToInstall`. */
  Outputs queryOutputs(bool onlyOutputsToInstall = false);

  StringSet queryMetaNames();
  Value* queryMeta(const string& name);
  string queryMetaString(const string& name);
  NixInt queryMetaInt(const string& name, NixInt def);
  NixFloat queryMetaFloat(const string& name, NixFloat def);
  bool queryMetaBool(const string& name, bool def);
  void setMeta(const string& name, Value* v);

  /*
  MetaInfo queryMetaInfo(EvalState & state) const;
  MetaValue queryMetaInfo(EvalState & state, const string & name) const;
  */

  void setName(const string& s) { name = s; }
  void setDrvPath(const string& s) { drvPath = s; }
  void setOutPath(const string& s) { outPath = s; }

  void setFailed() { failed = true; };
  bool hasFailed() { return failed; };
};

#if HAVE_BOEHMGC
typedef list<DrvInfo, traceable_allocator<DrvInfo> > DrvInfos;
#else
typedef list<DrvInfo> DrvInfos;
#endif

/* If value `v' denotes a derivation, return a DrvInfo object
   describing it. Otherwise return nothing. */
std::optional<DrvInfo> getDerivation(EvalState& state, Value& v,
                                     bool ignoreAssertionFailures);

void getDerivations(EvalState& state, Value& v, const string& pathPrefix,
                    Bindings& autoArgs, DrvInfos& drvs,
                    bool ignoreAssertionFailures);

}  // namespace nix