2019-10-14 15:40:16 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "util.hh"
|
2019-12-11 15:53:30 +02:00
|
|
|
#include "path.hh"
|
2021-03-02 02:47:00 +02:00
|
|
|
#include "path-with-outputs.hh"
|
2021-04-05 17:33:28 +03:00
|
|
|
#include "derived-path.hh"
|
2020-02-07 15:22:01 +02:00
|
|
|
#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"
|
2019-10-14 15:40:16 +03:00
|
|
|
|
|
|
|
#include <optional>
|
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
2019-10-22 01:21:58 +03:00
|
|
|
struct DrvInfo;
|
2019-12-04 01:36:04 +02:00
|
|
|
struct SourceExprCommand;
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2020-04-20 16:27:09 +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
|
|
|
|
{
|
2020-06-29 20:08:50 +03:00
|
|
|
std::vector<StorePathWithOutputs> context;
|
2019-10-14 15:40:16 +03:00
|
|
|
Path program;
|
|
|
|
// FIXME: add args, sandbox settings, metadata, ...
|
|
|
|
};
|
|
|
|
|
2021-05-17 18:49:20 +03:00
|
|
|
struct UnresolvedApp
|
|
|
|
{
|
|
|
|
App unresolved;
|
2021-07-16 17:04:47 +03:00
|
|
|
App resolve(ref<Store> evalStore, ref<Store> store);
|
2021-05-17 18:49:20 +03:00
|
|
|
};
|
|
|
|
|
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
|
|
|
|
};
|
|
|
|
|
2019-10-14 15:40:16 +03:00
|
|
|
struct Installable
|
|
|
|
{
|
|
|
|
virtual ~Installable() { }
|
|
|
|
|
2022-01-18 18:28:18 +02:00
|
|
|
virtual std::string what() const = 0;
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2021-05-17 09:45:08 +03:00
|
|
|
virtual DerivedPaths toDerivedPaths() = 0;
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2022-01-18 18:28:18 +02:00
|
|
|
virtual StorePathSet toDrvPaths(ref<Store> store)
|
|
|
|
{
|
|
|
|
throw Error("'%s' cannot be converted to a derivation path", what());
|
|
|
|
}
|
|
|
|
|
2021-05-17 09:45:08 +03:00
|
|
|
DerivedPath toDerivedPath();
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2021-05-17 18:49:20 +03:00
|
|
|
UnresolvedApp toApp(EvalState & state);
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2020-02-07 15:22:01 +02:00
|
|
|
virtual std::pair<Value *, Pos> 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. */
|
2019-12-11 15:53:30 +02:00
|
|
|
virtual std::optional<StorePath> getStorePath()
|
2019-10-14 15:40:16 +03:00
|
|
|
{
|
|
|
|
return {};
|
|
|
|
}
|
2020-04-20 16:27:09 +03:00
|
|
|
|
|
|
|
virtual std::vector<std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>>
|
2020-08-07 15:13:24 +03:00
|
|
|
getCursors(EvalState & state);
|
2020-06-04 21:02:50 +03:00
|
|
|
|
|
|
|
std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>
|
2020-08-07 15:13:24 +03:00
|
|
|
getCursor(EvalState & state);
|
2020-05-05 19:49:39 +03:00
|
|
|
|
|
|
|
virtual FlakeRef nixpkgsFlakeRef() const
|
|
|
|
{
|
2020-09-08 15:50:23 +03:00
|
|
|
return FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}});
|
2020-05-05 19:49:39 +03:00
|
|
|
}
|
2022-03-02 14:54:08 +02:00
|
|
|
|
|
|
|
static BuiltPaths build(
|
|
|
|
ref<Store> evalStore,
|
|
|
|
ref<Store> store,
|
|
|
|
Realise mode,
|
|
|
|
const std::vector<std::shared_ptr<Installable>> & installables,
|
|
|
|
BuildMode bMode = bmNormal);
|
|
|
|
|
|
|
|
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
|
|
|
};
|
|
|
|
|
|
|
|
struct InstallableValue : Installable
|
|
|
|
{
|
2020-05-09 18:35:33 +03:00
|
|
|
ref<EvalState> state;
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2020-05-09 18:35:33 +03:00
|
|
|
InstallableValue(ref<EvalState> state) : state(state) {}
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2020-04-20 14:13:52 +03:00
|
|
|
struct DerivationInfo
|
|
|
|
{
|
|
|
|
StorePath drvPath;
|
|
|
|
std::string outputName;
|
|
|
|
};
|
|
|
|
|
2020-05-09 18:35:33 +03:00
|
|
|
virtual std::vector<DerivationInfo> toDerivations() = 0;
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2021-05-17 09:45:08 +03:00
|
|
|
DerivedPaths toDerivedPaths() override;
|
2022-01-18 18:28:18 +02:00
|
|
|
|
|
|
|
StorePathSet toDrvPaths(ref<Store> store) override;
|
2019-10-14 15:40:16 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
struct InstallableFlake : InstallableValue
|
|
|
|
{
|
|
|
|
FlakeRef flakeRef;
|
|
|
|
Strings attrPaths;
|
|
|
|
Strings prefixes;
|
2020-05-09 18:35:33 +03:00
|
|
|
const flake::LockFlags & lockFlags;
|
2020-05-13 08:45:45 +03:00
|
|
|
mutable std::shared_ptr<flake::LockedFlake> _lockedFlake;
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2021-02-17 18:32:10 +02:00
|
|
|
InstallableFlake(
|
|
|
|
SourceExprCommand * cmd,
|
|
|
|
ref<EvalState> state,
|
|
|
|
FlakeRef && flakeRef,
|
2022-02-14 21:39:44 +02:00
|
|
|
std::string_view fragment,
|
|
|
|
Strings attrPaths,
|
|
|
|
Strings prefixes,
|
2021-02-17 18:32:10 +02:00
|
|
|
const flake::LockFlags & lockFlags);
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2022-01-18 18:28:18 +02: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();
|
|
|
|
|
2020-01-22 21:59:59 +02:00
|
|
|
Value * getFlakeOutputs(EvalState & state, const flake::LockedFlake & lockedFlake);
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2020-04-20 14:13:52 +03:00
|
|
|
std::tuple<std::string, FlakeRef, DerivationInfo> toDerivation();
|
2019-10-22 01:21:58 +03:00
|
|
|
|
2020-04-20 14:13:52 +03:00
|
|
|
std::vector<DerivationInfo> toDerivations() override;
|
2019-10-14 15:40:16 +03:00
|
|
|
|
2020-02-07 15:22:01 +02:00
|
|
|
std::pair<Value *, Pos> toValue(EvalState & state) override;
|
2020-04-20 16:27:09 +03:00
|
|
|
|
|
|
|
std::vector<std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>>
|
2020-08-07 15:13:24 +03:00
|
|
|
getCursors(EvalState & state) override;
|
2020-05-05 19:49:39 +03:00
|
|
|
|
2020-05-13 08:45:45 +03:00
|
|
|
std::shared_ptr<flake::LockedFlake> getLockedFlake() const;
|
|
|
|
|
2020-05-05 19:49:39 +03:00
|
|
|
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
|
|
|
|
2022-03-02 14:54:08 +02:00
|
|
|
BuiltPaths getBuiltPaths(
|
|
|
|
ref<Store> evalStore,
|
|
|
|
ref<Store> store,
|
|
|
|
const DerivedPaths & hopefullyBuiltPaths);
|
|
|
|
|
2019-10-14 15:40:16 +03:00
|
|
|
}
|