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:
parent
b190f771e7
commit
b64988bb35
3 changed files with 18 additions and 10 deletions
|
@ -999,7 +999,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));
|
||||||
|
|
||||||
|
@ -1196,13 +1196,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
|
||||||
|
@ -1213,12 +1206,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");
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue