#pragma once #include "util.hh" #include "path.hh" #include "outputs-spec.hh" #include "derived-path.hh" #include "eval.hh" #include "store-api.hh" #include "flake/flake.hh" #include "build-result.hh" #include namespace nix { struct DrvInfo; struct SourceExprCommand; namespace eval_cache { class EvalCache; class AttrCursor; } 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 }; struct ExtraPathInfo { std::optional priority; std::optional originalRef; std::optional resolvedRef; std::optional attrPath; // FIXME: merge with DerivedPath's 'outputs' field? std::optional extendedOutputsSpec; }; /* A derived path with any additional info that commands might need from the derivation. */ struct DerivedPathWithInfo { DerivedPath path; ExtraPathInfo info; }; struct BuiltPathWithResult { BuiltPath path; ExtraPathInfo info; std::optional result; }; typedef std::vector DerivedPathsWithInfo; struct Installable; typedef std::vector> Installables; struct Installable { virtual ~Installable() { } virtual std::string what() const = 0; virtual DerivedPathsWithInfo toDerivedPaths() = 0; DerivedPathWithInfo toDerivedPath(); /* Return a value only if this installable is a store path or a symlink to it. */ virtual std::optional getStorePath() { return {}; } virtual FlakeRef nixpkgsFlakeRef() const { return FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}}); } static std::vector build( ref evalStore, ref store, Realise mode, const Installables & installables, BuildMode bMode = bmNormal); static std::vector, BuiltPathWithResult>> build2( ref evalStore, ref store, Realise mode, const Installables & installables, BuildMode bMode = bmNormal); static std::set toStorePaths( ref evalStore, ref store, Realise mode, OperateOn operateOn, const Installables & installables); static StorePath toStorePath( ref evalStore, ref store, Realise mode, OperateOn operateOn, ref installable); static std::set toDerivations( ref store, const Installables & installables, bool useDeriver = false); static BuiltPaths toBuiltPaths( ref evalStore, ref store, Realise mode, OperateOn operateOn, const Installables & installables); }; }