lix/src/nix/installables.hh

133 lines
3.1 KiB
C++
Raw Normal View History

2019-10-14 12:40:16 +00:00
#pragma once
#include "util.hh"
#include "path.hh"
#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;
struct SourceExprCommand;
2019-10-14 12:40:16 +00:00
namespace eval_cache { class EvalCache; class AttrCursor; }
2020-04-20 11:13:52 +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
};
typedef std::variant<
BuildableOpaque,
BuildableFromDrv
> Buildable;
2019-10-14 12:40:16 +00:00
typedef std::vector<Buildable> Buildables;
struct App
{
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;
virtual Buildables toBuildables() = 0;
2019-10-14 12:40:16 +00:00
Buildable toBuildable();
App toApp(EvalState & state);
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. */
virtual std::optional<StorePath> getStorePath()
2019-10-14 12:40:16 +00:00
{
return {};
}
virtual std::vector<std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>>
2020-08-07 12:13:24 +00:00
getCursors(EvalState & state);
std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>
2020-08-07 12:13:24 +00:00
getCursor(EvalState & state);
virtual FlakeRef nixpkgsFlakeRef() const
{
return FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}});
}
2019-10-14 12:40:16 +00:00
};
struct InstallableValue : Installable
{
ref<EvalState> state;
2019-10-14 12:40:16 +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;
};
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;
const flake::LockFlags & lockFlags;
mutable std::shared_ptr<flake::LockedFlake> _lockedFlake;
2019-10-14 12:40:16 +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();
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
std::pair<Value *, Pos> toValue(EvalState & state) override;
std::vector<std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>>
2020-08-07 12:13:24 +00:00
getCursors(EvalState & state) override;
std::shared_ptr<flake::LockedFlake> getLockedFlake() const;
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
}