2019-10-14 12:40:16 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "util.hh"
|
2019-12-11 13:53:30 +00:00
|
|
|
#include "path.hh"
|
2023-01-10 16:27:19 +00:00
|
|
|
#include "outputs-spec.hh"
|
2021-04-05 14:33:28 +00:00
|
|
|
#include "derived-path.hh"
|
2020-02-07 13:22:01 +00:00
|
|
|
#include "eval.hh"
|
2022-03-02 12:54:08 +00:00
|
|
|
#include "store-api.hh"
|
2020-04-20 11:13:52 +00:00
|
|
|
#include "flake/flake.hh"
|
2022-11-21 09:49:01 +00:00
|
|
|
#include "build-result.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
|
|
|
|
2019-10-14 12:40:16 +00:00
|
|
|
struct App
|
|
|
|
{
|
2023-01-10 16:27:19 +00:00
|
|
|
std::vector<DerivedPath> context;
|
2019-10-14 12:40:16 +00:00
|
|
|
Path program;
|
|
|
|
// FIXME: add args, sandbox settings, metadata, ...
|
|
|
|
};
|
|
|
|
|
2021-05-17 15:49:20 +00:00
|
|
|
struct UnresolvedApp
|
|
|
|
{
|
|
|
|
App unresolved;
|
2021-07-16 14:04:47 +00:00
|
|
|
App resolve(ref<Store> evalStore, ref<Store> store);
|
2021-05-17 15:49:20 +00:00
|
|
|
};
|
|
|
|
|
2022-03-02 12:54:08 +00: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 13:52:49 +00:00
|
|
|
struct ExtraPathInfo
|
2022-12-15 21:09:32 +00:00
|
|
|
{
|
|
|
|
std::optional<NixInt> priority;
|
|
|
|
std::optional<FlakeRef> originalRef;
|
|
|
|
std::optional<FlakeRef> resolvedRef;
|
|
|
|
std::optional<std::string> attrPath;
|
|
|
|
// FIXME: merge with DerivedPath's 'outputs' field?
|
2023-01-11 07:00:44 +00:00
|
|
|
std::optional<ExtendedOutputsSpec> extendedOutputsSpec;
|
2022-12-15 21:09:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* A derived path with any additional info that commands might
|
|
|
|
need from the derivation. */
|
|
|
|
struct DerivedPathWithInfo
|
|
|
|
{
|
|
|
|
DerivedPath path;
|
2023-01-10 13:52:49 +00:00
|
|
|
ExtraPathInfo info;
|
2022-12-15 21:09:32 +00:00
|
|
|
};
|
|
|
|
|
2022-11-21 09:49:01 +00:00
|
|
|
struct BuiltPathWithResult
|
|
|
|
{
|
|
|
|
BuiltPath path;
|
2023-01-10 13:52:49 +00:00
|
|
|
ExtraPathInfo info;
|
2022-11-21 09:49:01 +00:00
|
|
|
std::optional<BuildResult> result;
|
|
|
|
};
|
|
|
|
|
2022-12-15 21:09:32 +00:00
|
|
|
typedef std::vector<DerivedPathWithInfo> DerivedPathsWithInfo;
|
|
|
|
|
2019-10-14 12:40:16 +00:00
|
|
|
struct Installable
|
|
|
|
{
|
|
|
|
virtual ~Installable() { }
|
|
|
|
|
2022-01-18 16:28:18 +00:00
|
|
|
virtual std::string what() const = 0;
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2022-12-15 21:09:32 +00:00
|
|
|
virtual DerivedPathsWithInfo toDerivedPaths() = 0;
|
2022-01-18 16:28:18 +00:00
|
|
|
|
2022-12-15 21:09:32 +00:00
|
|
|
DerivedPathWithInfo toDerivedPath();
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2021-05-17 15:49:20 +00:00
|
|
|
UnresolvedApp toApp(EvalState & state);
|
2019-10-14 12:40:16 +00:00
|
|
|
|
2022-03-04 18:31:59 +00:00
|
|
|
virtual std::pair<Value *, PosIdx> 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
|
|
|
|
2023-01-30 15:56:27 +00:00
|
|
|
/* Get a cursor to each value this Installable could refer to. However
|
|
|
|
if none exists, throw exception instead of returning empty vector. */
|
2022-04-14 12:04:19 +00:00
|
|
|
virtual std::vector<ref<eval_cache::AttrCursor>>
|
2020-08-07 12:13:24 +00:00
|
|
|
getCursors(EvalState & state);
|
2020-06-04 18:02:50 +00:00
|
|
|
|
2023-01-30 15:56:27 +00:00
|
|
|
/* Get the first and most preferred cursor this Installable could refer
|
|
|
|
to, or throw an exception if none exists. */
|
2022-04-14 12:04:19 +00:00
|
|
|
virtual ref<eval_cache::AttrCursor>
|
2020-08-07 12:13:24 +00:00
|
|
|
getCursor(EvalState & state);
|
2020-05-05 16:49:39 +00:00
|
|
|
|
|
|
|
virtual FlakeRef nixpkgsFlakeRef() const
|
|
|
|
{
|
2020-09-08 12:50:23 +00:00
|
|
|
return FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}});
|
2020-05-05 16:49:39 +00:00
|
|
|
}
|
2022-03-02 12:54:08 +00:00
|
|
|
|
2022-11-21 09:49:01 +00:00
|
|
|
static std::vector<BuiltPathWithResult> build(
|
2022-03-02 12:54:08 +00:00
|
|
|
ref<Store> evalStore,
|
|
|
|
ref<Store> store,
|
|
|
|
Realise mode,
|
|
|
|
const std::vector<std::shared_ptr<Installable>> & installables,
|
|
|
|
BuildMode bMode = bmNormal);
|
|
|
|
|
2022-11-21 09:49:01 +00:00
|
|
|
static std::vector<std::pair<std::shared_ptr<Installable>, BuiltPathWithResult>> build2(
|
2022-03-28 12:21:35 +00:00
|
|
|
ref<Store> evalStore,
|
|
|
|
ref<Store> store,
|
|
|
|
Realise mode,
|
|
|
|
const std::vector<std::shared_ptr<Installable>> & installables,
|
|
|
|
BuildMode bMode = bmNormal);
|
|
|
|
|
2022-03-02 12:54:08 +00: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 12:40:16 +00:00
|
|
|
};
|
2022-05-20 05:48:24 +00:00
|
|
|
|
2022-03-11 18:26:08 +00:00
|
|
|
typedef std::vector<std::shared_ptr<Installable>> Installables;
|
2019-10-14 12:40:16 +00:00
|
|
|
|
|
|
|
}
|