* Simplify the context handling logic.

This commit is contained in:
Eelco Dolstra 2011-12-21 15:33:30 +00:00
parent 4be5a2c096
commit b19a0f63db

View file

@ -347,8 +347,6 @@ static void prim_derivationStrict(EvalState & state, Value * * args, Value & v)
derivation. */ derivation. */
foreach (PathSet::iterator, i, context) { foreach (PathSet::iterator, i, context) {
Path path = *i; Path path = *i;
bool explicitlyPassed = false;
string output = "out";
/* Paths marked with `=' denote that the path of a derivation /* Paths marked with `=' denote that the path of a derivation
is explicitly passed to the builder. Since that allows the is explicitly passed to the builder. Since that allows the
@ -358,39 +356,30 @@ static void prim_derivationStrict(EvalState & state, Value * * args, Value & v)
inputs to ensure that they are available when the builder inputs to ensure that they are available when the builder
runs. */ runs. */
if (path.at(0) == '=') { if (path.at(0) == '=') {
path = string(path, 1); PathSet refs; computeFSClosure(*store, string(path, 1), refs);
PathSet refs; computeFSClosure(*store, path, refs);
foreach (PathSet::iterator, j, refs) { foreach (PathSet::iterator, j, refs) {
drv.inputSrcs.insert(*j); drv.inputSrcs.insert(*j);
if (isDerivation(*j)) if (isDerivation(*j))
drv.inputDrvs[*j] = store->queryDerivationOutputNames(*j); drv.inputDrvs[*j] = store->queryDerivationOutputNames(*j);
} }
explicitlyPassed = true;
} else if (path.at(0) == '!') {
size_t index;
path = string(path, 1);
index = path.find("!");
output = path.substr(0, index);
path = string(path, index + 1);
} }
/* See prim_unsafeDiscardOutputDependency. */ /* See prim_unsafeDiscardOutputDependency. */
bool useDrvAsSrc = false; else if (path.at(0) == '~')
if (path.at(0) == '~') { drv.inputSrcs.insert(string(path, 1));
path = string(path, 1);
useDrvAsSrc = true; /* Handle derivation outputs of the form !<name>!<path>. */
else if (path.at(0) == '!') {
size_t index = path.find("!", 1);
drv.inputDrvs[string(path, index + 1)].insert(string(path, 1, index - 1));
} }
assert(isStorePath(path)); /* Handle derivation contexts returned by
builtins.storePath. */
else if (isDerivation(path))
drv.inputDrvs[path] = store->queryDerivationOutputNames(path);
debug(format("derivation uses `%1%'") % path); /* Otherwise it's a source file. */
if (!useDrvAsSrc && isDerivation(path))
if (explicitlyPassed)
drv.inputDrvs[path] = store->queryDerivationOutputNames(path);
else if (drv.inputDrvs.find(path) == drv.inputDrvs.end())
drv.inputDrvs[path] = singleton<StringSet>(output);
else
drv.inputDrvs[path].insert(output);
else else
drv.inputSrcs.insert(path); drv.inputSrcs.insert(path);
} }