nix-instantiate: Fix read-only evaluation

This commit is contained in:
Eelco Dolstra 2012-11-26 17:39:09 +01:00
parent 8d8d47abd2
commit 408a7bfac1
5 changed files with 17 additions and 10 deletions

View File

@ -138,6 +138,7 @@ EvalState::EvalState()
, sName(symbols.create("name"))
, sSystem(symbols.create("system"))
, sOverrides(symbols.create("__overrides"))
, sOutputName(symbols.create("outputName"))
, baseEnv(allocEnv(128))
, baseEnvDispl(0)
, staticBaseEnv(false, 0)

View File

@ -93,7 +93,7 @@ public:
SymbolTable symbols;
const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName,
sSystem, sOverrides;
sSystem, sOverrides, sOutputName;
/* If set, force copying files to the Nix store even if they
already exist there. */

View File

@ -28,6 +28,17 @@ string DrvInfo::queryOutPath(EvalState & state) const
}
string DrvInfo::queryOutputName(EvalState & state) const
{
if (outputName == "" && attrs) {
Bindings::iterator i = attrs->find(state.sOutputName);
PathSet context;
(string &) outputName = i != attrs->end() ? state.coerceToString(*i->value, context) : "";
}
return outputName;
}
MetaInfo DrvInfo::queryMetaInfo(EvalState & state) const
{
if (metaInfoRead) return meta;

View File

@ -28,6 +28,7 @@ struct DrvInfo
private:
string drvPath;
string outPath;
string outputName;
bool metaInfoRead;
MetaInfo meta;
@ -46,6 +47,7 @@ public:
string queryDrvPath(EvalState & state) const;
string queryOutPath(EvalState & state) const;
string queryOutputName(EvalState & state) const;
MetaInfo queryMetaInfo(EvalState & state) const;
MetaValue queryMetaInfo(EvalState & state, const string & name) const;

View File

@ -62,16 +62,9 @@ void processExpr(EvalState & state, const Strings & attrPaths,
Path drvPath = i->queryDrvPath(state);
/* What output do we want? */
Path outPath = i->queryOutPath(state);
Derivation drv = derivationFromPath(*store, drvPath);
string outputName;
foreach (DerivationOutputs::iterator, i, drv.outputs)
if (i->second.path == outPath) {
outputName = i->first;
break;
}
string outputName = i->queryOutputName(state);
if (outputName == "")
throw Error(format("derivation `%1%' does not have an output `%2%'") % drvPath % outPath);
throw Error(format("derivation `%1%' lacks an `outputName' attribute ") % drvPath);
if (gcRoot == "")
printGCWarning();