Nix 2.26.3
Nix, the purely functional package manager; unstable internal interfaces
 
Loading...
Searching...
No Matches
derivations.hh
Go to the documentation of this file.
1#pragma once
3
4#include "path.hh"
5#include "types.hh"
6#include "hash.hh"
7#include "content-address.hh"
8#include "repair-flag.hh"
9#include "derived-path-map.hh"
10#include "sync.hh"
11#include "variant-wrapper.hh"
12
13#include <map>
14#include <variant>
15
16namespace nix {
17
18struct StoreDirConfig;
19
20/* Abstract syntax of derivations. */
21
26{
31 {
32 StorePath path;
33
34 bool operator == (const InputAddressed &) const = default;
35 auto operator <=> (const InputAddressed &) const = default;
36 };
37
42 struct CAFixed
43 {
50
57 StorePath path(const StoreDirConfig & store, std::string_view drvName, OutputNameView outputName) const;
58
59 bool operator == (const CAFixed &) const = default;
60 auto operator <=> (const CAFixed &) const = default;
61 };
62
69 {
74
78 HashAlgorithm hashAlgo;
79
80 bool operator == (const CAFloating &) const = default;
81 auto operator <=> (const CAFloating &) const = default;
82 };
83
88 struct Deferred {
89 bool operator == (const Deferred &) const = default;
90 auto operator <=> (const Deferred &) const = default;
91 };
92
97 struct Impure
98 {
103
107 HashAlgorithm hashAlgo;
108
109 bool operator == (const Impure &) const = default;
110 auto operator <=> (const Impure &) const = default;
111 };
112
113 typedef std::variant<
115 CAFixed,
117 Deferred,
118 Impure
119 > Raw;
120
121 Raw raw;
122
123 bool operator == (const DerivationOutput &) const = default;
124 auto operator <=> (const DerivationOutput &) const = default;
125
126 MAKE_WRAPPER_CONSTRUCTOR(DerivationOutput);
127
132
139 std::optional<StorePath> path(const StoreDirConfig & store, std::string_view drvName, OutputNameView outputName) const;
140
141 nlohmann::json toJSON(
142 const StoreDirConfig & store,
143 std::string_view drvName,
144 OutputNameView outputName) const;
149 const StoreDirConfig & store,
150 std::string_view drvName,
151 OutputNameView outputName,
152 const nlohmann::json & json,
153 const ExperimentalFeatureSettings & xpSettings = experimentalFeatureSettings);
154};
155
156typedef std::map<std::string, DerivationOutput> DerivationOutputs;
157
164typedef std::map<std::string, std::pair<DerivationOutput, std::optional<StorePath>>>
166
171typedef std::map<StorePath, StringSet> DerivationInputs;
172
184
185 bool operator == (const InputAddressed &) const = default;
186 auto operator <=> (const InputAddressed &) const = default;
187 };
188
208 bool fixed;
209
210 bool operator == (const ContentAddressed &) const = default;
211 auto operator <=> (const ContentAddressed &) const = default;
212 };
213
220 struct Impure {
221 bool operator == (const Impure &) const = default;
222 auto operator <=> (const Impure &) const = default;
223 };
224
225 typedef std::variant<
228 Impure
229 > Raw;
230
231 Raw raw;
232
233 bool operator == (const DerivationType &) const = default;
234 auto operator <=> (const DerivationType &) const = default;
235
236 MAKE_WRAPPER_CONSTRUCTOR(DerivationType);
237
241 DerivationType() = delete;
242
247 bool isCA() const;
248
253 bool isFixed() const;
254
261 bool isSandboxed() const;
262
274 bool isImpure() const;
275
281 bool hasKnownOutputPaths() const;
282};
283
284struct BasicDerivation
285{
289 DerivationOutputs outputs;
293 StorePathSet inputSrcs;
294 std::string platform;
295 Path builder;
296 Strings args;
297 StringPairs env;
298 std::string name;
299
300 BasicDerivation() = default;
301 BasicDerivation(BasicDerivation &&) = default;
302 BasicDerivation(const BasicDerivation &) = default;
303 BasicDerivation& operator=(BasicDerivation &&) = default;
304 BasicDerivation& operator=(const BasicDerivation &) = default;
305 virtual ~BasicDerivation() { };
306
307 bool isBuiltin() const;
308
312 DerivationType type() const;
313
317 StringSet outputNames() const;
318
325
326 static std::string_view nameFromPath(const StorePath & storePath);
327
332 void applyRewrites(const StringMap & rewrites);
333
334 bool operator == (const BasicDerivation &) const = default;
335 // TODO libc++ 16 (used by darwin) missing `std::map::operator <=>`, can't do yet.
336 //auto operator <=> (const BasicDerivation &) const = default;
337};
338
339class Store;
340
341struct Derivation : BasicDerivation
342{
347
351 std::string unparse(const StoreDirConfig & store, bool maskOutputs,
352 DerivedPathMap<StringSet>::ChildNode::Map * actualInputs = nullptr) const;
353
363 std::optional<BasicDerivation> tryResolve(Store & store, Store * evalStore = nullptr) const;
364
370 std::optional<BasicDerivation> tryResolve(
371 Store & store,
372 const std::map<std::pair<StorePath, std::string>, StorePath> & inputDrvOutputs) const;
373
382 void checkInvariants(Store & store, const StorePath & drvPath) const;
383
384 Derivation() = default;
385 Derivation(const BasicDerivation & bd) : BasicDerivation(bd) { }
386 Derivation(BasicDerivation && bd) : BasicDerivation(std::move(bd)) { }
387
388 nlohmann::json toJSON(const StoreDirConfig & store) const;
389 static Derivation fromJSON(
390 const StoreDirConfig & store,
391 const nlohmann::json & json,
392 const ExperimentalFeatureSettings & xpSettings = experimentalFeatureSettings);
393
394 bool operator == (const Derivation &) const = default;
395 // TODO libc++ 16 (used by darwin) missing `std::map::operator <=>`, can't do yet.
396 //auto operator <=> (const Derivation &) const = default;
397};
398
399
400class Store;
401
405StorePath writeDerivation(Store & store,
406 const Derivation & drv,
407 RepairFlag repair = NoRepair,
408 bool readOnly = false);
409
413Derivation parseDerivation(
414 const StoreDirConfig & store,
415 std::string && s,
416 std::string_view name,
417 const ExperimentalFeatureSettings & xpSettings = experimentalFeatureSettings);
418
424bool isDerivation(std::string_view fileName);
425
433std::string outputPathName(std::string_view drvName, OutputNameView outputName);
434
435
443struct DrvHash {
447 std::map<std::string, Hash> hashes;
448
449 enum struct Kind : bool {
455
460 };
461
467};
468
469void operator |= (DrvHash::Kind & self, const DrvHash::Kind & other) noexcept;
470
495DrvHash hashDerivationModulo(Store & store, const Derivation & drv, bool maskOutputs);
496
503std::map<std::string, Hash> staticOutputHashes(Store & store, const Derivation & drv);
504
508typedef std::map<StorePath, DrvHash> DrvHashes;
509
510// FIXME: global, though at least thread-safe.
511extern Sync<DrvHashes> drvHashes;
512
513struct Source;
514struct Sink;
515
516Source & readDerivation(Source & in, const StoreDirConfig & store, BasicDerivation & drv, std::string_view name);
517void writeDerivation(Sink & out, const StoreDirConfig & store, const BasicDerivation & drv);
518
527std::string hashPlaceholder(const OutputNameView outputName);
528
529extern const Hash impureOutputHash;
530
531}
Definition path.hh:27
Definition store-api.hh:169
std::map< StorePath, StringSet > DerivationInputs
Definition derivations.hh:171
std::map< std::string, std::pair< DerivationOutput, std::optional< StorePath > > > DerivationOutputsAndOptPaths
Definition derivations.hh:165
std::map< StorePath, DrvHash > DrvHashes
Definition derivations.hh:508
ChunkedVector< std::string, 8192 > store
Definition lexer.l:1011
return s
Definition lexer.l:459
virtual nlohmann::json toJSON()=0
const std::string_view & name
Definition lexer.l:1709
RepairFlag repair
Definition lexer.l:7173
bool isDerivation(Value &v)
std::string_view OutputNameView
Definition outputs-spec.hh:24
Definition derivations.hh:285
DerivationOutputs outputs
Definition derivations.hh:289
StringSet outputNames() const
Definition derivations.cc:914
void applyRewrites(const StringMap &rewrites)
Definition derivations.cc:1020
DerivationType type() const
Definition derivations.cc:683
StorePathSet inputSrcs
Definition derivations.hh:293
DerivationOutputsAndOptPaths outputsAndOptPaths(const StoreDirConfig &store) const
Definition derivations.cc:922
Definition content-address.hh:31
Definition content-address.hh:153
Definition derivations.hh:43
ContentAddress ca
Definition derivations.hh:49
StorePath path(const StoreDirConfig &store, std::string_view drvName, OutputNameView outputName) const
Definition derivations.cc:42
Definition derivations.hh:69
ContentAddressMethod method
Definition derivations.hh:73
HashAlgorithm hashAlgo
Definition derivations.hh:78
Definition derivations.hh:88
Definition derivations.hh:98
ContentAddressMethod method
Definition derivations.hh:102
HashAlgorithm hashAlgo
Definition derivations.hh:107
Definition derivations.hh:31
std::optional< StorePath > path(const StoreDirConfig &store, std::string_view drvName, OutputNameView outputName) const
Definition derivations.cc:18
static DerivationOutput fromJSON(const StoreDirConfig &store, std::string_view drvName, OutputNameView outputName, const nlohmann::json &json, const ExperimentalFeatureSettings &xpSettings=experimentalFeatureSettings)
Definition derivations.cc:1243
Definition derivations.hh:192
bool sandboxed
Definition derivations.hh:196
bool fixed
Definition derivations.hh:208
Definition derivations.hh:220
Definition derivations.hh:177
bool deferred
Definition derivations.hh:183
Definition derivations.hh:173
bool isSandboxed() const
Definition derivations.cc:100
bool isImpure() const
Definition derivations.cc:116
bool hasKnownOutputPaths() const
Definition derivations.cc:84
bool isFixed() const
Definition derivations.cc:69
bool isCA() const
Definition derivations.cc:50
Definition derivations.hh:342
void checkInvariants(Store &store, const StorePath &drvPath) const
Definition derivations.cc:1151
DerivedPathMap< std::set< OutputName > > inputDrvs
Definition derivations.hh:346
std::string unparse(const StoreDirConfig &store, bool maskOutputs, DerivedPathMap< StringSet >::ChildNode::Map *actualInputs=nullptr) const
Definition derivations.cc:571
std::optional< BasicDerivation > tryResolve(Store &store, Store *evalStore=nullptr) const
Definition derivations.cc:1063
std::map< OutputName, ChildNode > Map
Definition derived-path-map.hh:43
Definition derived-path-map.hh:28
Definition derivations.hh:443
Kind kind
Definition derivations.hh:466
Kind
Definition derivations.hh:449
@ Deferred
Definition derivations.hh:459
@ Regular
Definition derivations.hh:454
std::map< std::string, Hash > hashes
Definition derivations.hh:447
Definition config.hh:382
Definition hash.hh:45
Definition serialise.hh:20
Definition serialise.hh:68
Definition store-dir-config.hh:22
std::string Path
Definition types.hh:22