2019-10-14 12:40:16 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "util.hh"
|
2019-12-11 13:53:30 +00:00
|
|
|
#include "path.hh"
|
2020-02-07 13:22:01 +00:00
|
|
|
#include "eval.hh"
|
2020-04-20 11:13:52 +00:00
|
|
|
#include "flake/flake.hh"
|
2019-10-14 12:40:16 +00:00
|
|
|
|
|
|
|
#include <optional>
|
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
2019-10-21 22:21:58 +00:00
|
|
|
struct DrvInfo;
|
2019-12-03 23:36:04 +00:00
|
|
|
struct SourceExprCommand;
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2020-04-20 13:27:09 +00:00
|
|
|
namespace eval_cache { class EvalCache; class AttrCursor; }
|
2020-04-20 11:13:52 +00:00
|
|
|
|
2020-07-23 19:02:57 +00:00
|
|
|
struct BuildableOpaque {
|
|
|
|
StorePath path;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct BuildableFromDrv {
|
|
|
|
StorePath drvPath;
|
2020-08-07 19:09:26 +00:00
|
|
|
std::map<std::string, std::optional<StorePath>> outputs;
|
2019-10-14 12:40:16 +00:00
|
|
|
};
|
|
|
|
|
2020-07-23 19:02:57 +00:00
|
|
|
typedef std::variant<
|
|
|
|
BuildableOpaque,
|
|
|
|
BuildableFromDrv
|
|
|
|
> Buildable;
|
|
|
|
|
2019-10-14 12:40:16 +00:00
|
|
|
typedef std::vector<Buildable> Buildables;
|
|
|
|
|
|
|
|
struct App
|
|
|
|
{
|
2020-06-29 17:08:50 +00:00
|
|
|
std::vector<StorePathWithOutputs> context;
|
2019-10-14 12:40:16 +00:00
|
|
|
Path program;
|
|
|
|
// FIXME: add args, sandbox settings, metadata, ...
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Installable
|
|
|
|
{
|
|
|
|
virtual ~Installable() { }
|
|
|
|
|
|
|
|
virtual std::string what() = 0;
|
|
|
|
|
2020-05-09 15:35:33 +00:00
|
|
|
virtual Buildables toBuildables() = 0;
|
2019-10-14 12:40:16 +00:00
|
|
|
|
|
|
|
Buildable toBuildable();
|
|
|
|
|
|
|
|
App toApp(EvalState & state);
|
|
|
|
|
2020-02-07 13:22:01 +00:00
|
|
|
virtual std::pair<Value *, Pos> toValue(EvalState & state)
|
2019-10-14 12:40:16 +00:00
|
|
|
{
|
|
|
|
throw Error("argument '%s' cannot be evaluated", what());
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return a value only if this installable is a store path or a
|
|
|
|
symlink to it. */
|
2019-12-11 13:53:30 +00:00
|
|
|
virtual std::optional<StorePath> getStorePath()
|
2019-10-14 12:40:16 +00:00
|
|
|
{
|
|
|
|
return {};
|
|
|
|
}
|
2020-04-20 13:27:09 +00:00
|
|
|
|
|
|
|
virtual std::vector<std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>>
|
2020-08-07 12:13:24 +00:00
|
|
|
getCursors(EvalState & state);
|
2020-06-04 18:02:50 +00:00
|
|
|
|
|
|
|
std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>
|
2020-08-07 12:13:24 +00:00
|
|
|
getCursor(EvalState & state);
|
2020-05-05 16:49:39 +00:00
|
|
|
|
|
|
|
virtual FlakeRef nixpkgsFlakeRef() const
|
|
|
|
{
|
|
|
|
return std::move(FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}}));
|
|
|
|
}
|
2019-10-14 12:40:16 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct InstallableValue : Installable
|
|
|
|
{
|
2020-05-09 15:35:33 +00:00
|
|
|
ref<EvalState> state;
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2020-05-09 15:35:33 +00:00
|
|
|
InstallableValue(ref<EvalState> state) : state(state) {}
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2020-04-20 11:13:52 +00:00
|
|
|
struct DerivationInfo
|
|
|
|
{
|
|
|
|
StorePath drvPath;
|
2020-08-07 19:09:26 +00:00
|
|
|
std::optional<StorePath> outPath;
|
2020-04-20 11:13:52 +00:00
|
|
|
std::string outputName;
|
|
|
|
};
|
|
|
|
|
2020-05-09 15:35:33 +00:00
|
|
|
virtual std::vector<DerivationInfo> toDerivations() = 0;
|
2019-10-14 12:40:16 +00:00
|
|
|
|
|
|
|
Buildables toBuildables() override;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct InstallableFlake : InstallableValue
|
|
|
|
{
|
|
|
|
FlakeRef flakeRef;
|
|
|
|
Strings attrPaths;
|
|
|
|
Strings prefixes;
|
2020-05-09 15:35:33 +00:00
|
|
|
const flake::LockFlags & lockFlags;
|
2020-05-13 05:45:45 +00:00
|
|
|
mutable std::shared_ptr<flake::LockedFlake> _lockedFlake;
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2020-05-09 15:35:33 +00:00
|
|
|
InstallableFlake(ref<EvalState> state, FlakeRef && flakeRef,
|
|
|
|
Strings && attrPaths, Strings && prefixes, const flake::LockFlags & lockFlags)
|
|
|
|
: InstallableValue(state), flakeRef(flakeRef), attrPaths(attrPaths),
|
|
|
|
prefixes(prefixes), lockFlags(lockFlags)
|
2019-10-14 12:40:16 +00:00
|
|
|
{ }
|
|
|
|
|
2019-10-20 14:43:00 +00:00
|
|
|
std::string what() override { return flakeRef.to_string() + "#" + *attrPaths.begin(); }
|
2019-10-14 12:40:16 +00:00
|
|
|
|
|
|
|
std::vector<std::string> getActualAttrPaths();
|
|
|
|
|
2020-01-22 19:59:59 +00:00
|
|
|
Value * getFlakeOutputs(EvalState & state, const flake::LockedFlake & lockedFlake);
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2020-04-20 11:13:52 +00:00
|
|
|
std::tuple<std::string, FlakeRef, DerivationInfo> toDerivation();
|
2019-10-21 22:21:58 +00:00
|
|
|
|
2020-04-20 11:13:52 +00:00
|
|
|
std::vector<DerivationInfo> toDerivations() override;
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2020-02-07 13:22:01 +00:00
|
|
|
std::pair<Value *, Pos> toValue(EvalState & state) override;
|
2020-04-20 13:27:09 +00:00
|
|
|
|
|
|
|
std::vector<std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>>
|
2020-08-07 12:13:24 +00:00
|
|
|
getCursors(EvalState & state) override;
|
2020-05-05 16:49:39 +00:00
|
|
|
|
2020-05-13 05:45:45 +00:00
|
|
|
std::shared_ptr<flake::LockedFlake> getLockedFlake() const;
|
|
|
|
|
2020-05-05 16:49:39 +00:00
|
|
|
FlakeRef nixpkgsFlakeRef() const override;
|
2019-10-14 12:40:16 +00:00
|
|
|
};
|
|
|
|
|
2020-04-20 11:13:52 +00:00
|
|
|
ref<eval_cache::EvalCache> openEvalCache(
|
|
|
|
EvalState & state,
|
2020-08-07 12:13:24 +00:00
|
|
|
std::shared_ptr<flake::LockedFlake> lockedFlake);
|
2020-04-20 11:13:52 +00:00
|
|
|
|
2019-10-14 12:40:16 +00:00
|
|
|
}
|