Allow substitutes for builds that have preferLocalBuild set

Not substituting builds with "preferLocalBuild = true" was a bad idea,
because it didn't take the cost of dependencies into account. For
instance, if we can't substitute a fetchgit call, then we have to
download/build git and all its dependencies.

Partially reverts 5558652709 and adds a
new derivation attribute "allowSubstitutes" to specify whether a
derivation may be substituted.
This commit is contained in:
Eelco Dolstra 2015-06-04 16:04:41 +02:00 committed by Ludovic Courtès
parent e531520ddc
commit 2459458bc8
3 changed files with 18 additions and 10 deletions

View File

@ -1000,7 +1000,7 @@ void DerivationGoal::haveDerivation()
/* We are first going to try to create the invalid output paths /* We are first going to try to create the invalid output paths
through substitutes. If that doesn't work, we'll build through substitutes. If that doesn't work, we'll build
them. */ them. */
if (settings.useSubstitutes && !willBuildLocally(drv)) if (settings.useSubstitutes && substitutesAllowed(drv))
foreach (PathSet::iterator, i, invalidOutputs) foreach (PathSet::iterator, i, invalidOutputs)
addWaitee(worker.makeSubstitutionGoal(*i, buildMode == bmRepair)); addWaitee(worker.makeSubstitutionGoal(*i, buildMode == bmRepair));
@ -1197,13 +1197,6 @@ PathSet outputPaths(const DerivationOutputs & outputs)
} }
static string get(const StringPairs & map, const string & key)
{
StringPairs::const_iterator i = map.find(key);
return i == map.end() ? (string) "" : i->second;
}
static bool canBuildLocally(const string & platform) static bool canBuildLocally(const string & platform)
{ {
return platform == settings.thisSystem return platform == settings.thisSystem
@ -1214,12 +1207,25 @@ static bool canBuildLocally(const string & platform)
} }
static string get(const StringPairs & map, const string & key, const string & def = "")
{
StringPairs::const_iterator i = map.find(key);
return i == map.end() ? def : i->second;
}
bool willBuildLocally(const Derivation & drv) bool willBuildLocally(const Derivation & drv)
{ {
return get(drv.env, "preferLocalBuild") == "1" && canBuildLocally(drv.platform); return get(drv.env, "preferLocalBuild") == "1" && canBuildLocally(drv.platform);
} }
bool substitutesAllowed(const Derivation & drv)
{
return get(drv.env, "allowSubstitutes", "1") == "1";
}
void DerivationGoal::tryToBuild() void DerivationGoal::tryToBuild()
{ {
trace("trying to build"); trace("trying to build");

View File

@ -120,7 +120,7 @@ void queryMissing(StoreAPI & store, const PathSet & targets,
if (invalid.empty()) continue; if (invalid.empty()) continue;
todoDrv.insert(*i); todoDrv.insert(*i);
if (settings.useSubstitutes && !willBuildLocally(drv)) if (settings.useSubstitutes && substitutesAllowed(drv))
query.insert(invalid.begin(), invalid.end()); query.insert(invalid.begin(), invalid.end());
} }
@ -144,7 +144,7 @@ void queryMissing(StoreAPI & store, const PathSet & targets,
PathSet outputs; PathSet outputs;
bool mustBuild = false; bool mustBuild = false;
if (settings.useSubstitutes && !willBuildLocally(drv)) { if (settings.useSubstitutes && substitutesAllowed(drv)) {
foreach (DerivationOutputs::iterator, j, drv.outputs) { foreach (DerivationOutputs::iterator, j, drv.outputs) {
if (!wantOutput(j->first, i2.second)) continue; if (!wantOutput(j->first, i2.second)) continue;
if (!store.isValidPath(j->second.path)) { if (!store.isValidPath(j->second.path)) {

View File

@ -34,5 +34,7 @@ void queryMissing(StoreAPI & store, const PathSet & targets,
bool willBuildLocally(const Derivation & drv); bool willBuildLocally(const Derivation & drv);
bool substitutesAllowed(const Derivation & drv);
} }