nix-super/src/libcmd/installables.hh

215 lines
5.8 KiB
C++
Raw Normal View History

2019-10-14 15:40:16 +03:00
#pragma once
#include "util.hh"
#include "path.hh"
#include "outputs-spec.hh"
#include "derived-path.hh"
#include "eval.hh"
2022-03-02 14:54:08 +02:00
#include "store-api.hh"
2020-04-20 14:13:52 +03:00
#include "flake/flake.hh"
#include "build-result.hh"
2019-10-14 15:40:16 +03:00
#include <optional>
namespace nix {
2019-10-22 01:21:58 +03:00
struct DrvInfo;
struct SourceExprCommand;
2019-10-14 15:40:16 +03:00
namespace eval_cache { class EvalCache; class AttrCursor; }
2020-04-20 14:13:52 +03:00
2019-10-14 15:40:16 +03:00
struct App
{
std::vector<DerivedPath> context;
2019-10-14 15:40:16 +03:00
Path program;
// FIXME: add args, sandbox settings, metadata, ...
};
struct UnresolvedApp
{
App unresolved;
App resolve(ref<Store> evalStore, ref<Store> store);
};
2022-03-02 14:54:08 +02:00
enum class Realise {
/* Build the derivation. Postcondition: the
derivation outputs exist. */
Outputs,
/* Don't build the derivation. Postcondition: the store derivation
exists. */
Derivation,
/* Evaluate in dry-run mode. Postcondition: nothing. */
// FIXME: currently unused, but could be revived if we can
// evaluate derivations in-memory.
Nothing
};
/* How to handle derivations in commands that operate on store paths. */
enum class OperateOn {
/* Operate on the output path. */
Output,
/* Operate on the .drv path. */
Derivation
};
2023-01-10 15:52:49 +02:00
struct ExtraPathInfo
{
std::optional<NixInt> priority;
std::optional<FlakeRef> originalRef;
std::optional<FlakeRef> resolvedRef;
std::optional<std::string> attrPath;
// FIXME: merge with DerivedPath's 'outputs' field?
std::optional<ExtendedOutputsSpec> extendedOutputsSpec;
};
/* A derived path with any additional info that commands might
need from the derivation. */
struct DerivedPathWithInfo
{
DerivedPath path;
2023-01-10 15:52:49 +02:00
ExtraPathInfo info;
};
struct BuiltPathWithResult
{
BuiltPath path;
2023-01-10 15:52:49 +02:00
ExtraPathInfo info;
std::optional<BuildResult> result;
};
typedef std::vector<DerivedPathWithInfo> DerivedPathsWithInfo;
2019-10-14 15:40:16 +03:00
struct Installable
{
virtual ~Installable() { }
virtual std::string what() const = 0;
2019-10-14 15:40:16 +03:00
virtual DerivedPathsWithInfo toDerivedPaths() = 0;
DerivedPathWithInfo toDerivedPath();
2019-10-14 15:40:16 +03:00
UnresolvedApp toApp(EvalState & state);
2019-10-14 15:40:16 +03:00
virtual std::pair<Value *, PosIdx> toValue(EvalState & state)
2019-10-14 15:40:16 +03: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 15:40:16 +03:00
{
return {};
}
/* Get a cursor to each value this Installable could refer to. However
if none exists, throw exception instead of returning empty vector. */
virtual std::vector<ref<eval_cache::AttrCursor>>
2020-08-07 15:13:24 +03:00
getCursors(EvalState & state);
/* Get the first and most preferred cursor this Installable could refer
to, or throw an exception if none exists. */
virtual ref<eval_cache::AttrCursor>
2020-08-07 15:13:24 +03:00
getCursor(EvalState & state);
virtual FlakeRef nixpkgsFlakeRef() const
{
return FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}});
}
2022-03-02 14:54:08 +02:00
static std::vector<BuiltPathWithResult> build(
2022-03-02 14:54:08 +02:00
ref<Store> evalStore,
ref<Store> store,
Realise mode,
const std::vector<std::shared_ptr<Installable>> & installables,
BuildMode bMode = bmNormal);
static std::vector<std::pair<std::shared_ptr<Installable>, BuiltPathWithResult>> build2(
ref<Store> evalStore,
ref<Store> store,
Realise mode,
const std::vector<std::shared_ptr<Installable>> & installables,
BuildMode bMode = bmNormal);
2022-03-02 14:54:08 +02:00
static std::set<StorePath> toStorePaths(
ref<Store> evalStore,
ref<Store> store,
Realise mode,
OperateOn operateOn,
const std::vector<std::shared_ptr<Installable>> & installables);
static StorePath toStorePath(
ref<Store> evalStore,
ref<Store> store,
Realise mode,
OperateOn operateOn,
std::shared_ptr<Installable> installable);
static std::set<StorePath> toDerivations(
ref<Store> store,
const std::vector<std::shared_ptr<Installable>> & installables,
bool useDeriver = false);
static BuiltPaths toBuiltPaths(
ref<Store> evalStore,
ref<Store> store,
Realise mode,
OperateOn operateOn,
const std::vector<std::shared_ptr<Installable>> & installables);
2019-10-14 15:40:16 +03:00
};
2022-03-11 20:26:08 +02:00
typedef std::vector<std::shared_ptr<Installable>> Installables;
2019-10-14 15:40:16 +03:00
struct InstallableValue : Installable
{
ref<EvalState> state;
2019-10-14 15:40:16 +03:00
InstallableValue(ref<EvalState> state) : state(state) {}
2019-10-14 15:40:16 +03:00
};
struct InstallableFlake : InstallableValue
{
FlakeRef flakeRef;
Strings attrPaths;
Strings prefixes;
ExtendedOutputsSpec extendedOutputsSpec;
const flake::LockFlags & lockFlags;
mutable std::shared_ptr<flake::LockedFlake> _lockedFlake;
2019-10-14 15:40:16 +03:00
InstallableFlake(
SourceExprCommand * cmd,
ref<EvalState> state,
FlakeRef && flakeRef,
std::string_view fragment,
ExtendedOutputsSpec extendedOutputsSpec,
Strings attrPaths,
Strings prefixes,
const flake::LockFlags & lockFlags);
2019-10-14 15:40:16 +03:00
std::string what() const override { return flakeRef.to_string() + "#" + *attrPaths.begin(); }
2019-10-14 15:40:16 +03:00
std::vector<std::string> getActualAttrPaths();
Value * getFlakeOutputs(EvalState & state, const flake::LockedFlake & lockedFlake);
2019-10-14 15:40:16 +03:00
DerivedPathsWithInfo toDerivedPaths() override;
2019-10-14 15:40:16 +03:00
std::pair<Value *, PosIdx> toValue(EvalState & state) override;
/* Get a cursor to every attrpath in getActualAttrPaths()
that exists. However if none exists, throw an exception. */
std::vector<ref<eval_cache::AttrCursor>>
2020-08-07 15:13:24 +03:00
getCursors(EvalState & state) override;
std::shared_ptr<flake::LockedFlake> getLockedFlake() const;
FlakeRef nixpkgsFlakeRef() const override;
2019-10-14 15:40:16 +03:00
};
2020-04-20 14:13:52 +03:00
ref<eval_cache::EvalCache> openEvalCache(
EvalState & state,
2020-08-07 15:13:24 +03:00
std::shared_ptr<flake::LockedFlake> lockedFlake);
2020-04-20 14:13:52 +03:00
2019-10-14 15:40:16 +03:00
}