diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2015-06-04 16:04:41 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-07-02 15:18:41 +0200 |
commit | 2459458bc8257734ca78cb7a2db3df20bd730ec0 (patch) | |
tree | 20d157ed4279cd06947fbb18750b7b280576bf33 | |
parent | e531520ddcd54903bbea0f3ce08dfbed830f40aa (diff) | |
download | guix-2459458bc8257734ca78cb7a2db3df20bd730ec0.tar.gz |
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 5558652709f27e8a887580b77b93c705659d7a4b and adds a new derivation attribute "allowSubstitutes" to specify whether a derivation may be substituted.
-rw-r--r-- | nix/libstore/build.cc | 22 | ||||
-rw-r--r-- | nix/libstore/misc.cc | 4 | ||||
-rw-r--r-- | nix/libstore/misc.hh | 2 |
3 files changed, 18 insertions, 10 deletions
diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc index 85a818ba94..11ca6cfe08 100644 --- a/nix/libstore/build.cc +++ b/nix/libstore/build.cc @@ -1000,7 +1000,7 @@ void DerivationGoal::haveDerivation() /* We are first going to try to create the invalid output paths through substitutes. If that doesn't work, we'll build them. */ - if (settings.useSubstitutes && !willBuildLocally(drv)) + if (settings.useSubstitutes && substitutesAllowed(drv)) foreach (PathSet::iterator, i, invalidOutputs) 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) { 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) { return get(drv.env, "preferLocalBuild") == "1" && canBuildLocally(drv.platform); } +bool substitutesAllowed(const Derivation & drv) +{ + return get(drv.env, "allowSubstitutes", "1") == "1"; +} + + void DerivationGoal::tryToBuild() { trace("trying to build"); diff --git a/nix/libstore/misc.cc b/nix/libstore/misc.cc index 6ecf8787cf..22363af126 100644 --- a/nix/libstore/misc.cc +++ b/nix/libstore/misc.cc @@ -120,7 +120,7 @@ void queryMissing(StoreAPI & store, const PathSet & targets, if (invalid.empty()) continue; todoDrv.insert(*i); - if (settings.useSubstitutes && !willBuildLocally(drv)) + if (settings.useSubstitutes && substitutesAllowed(drv)) query.insert(invalid.begin(), invalid.end()); } @@ -144,7 +144,7 @@ void queryMissing(StoreAPI & store, const PathSet & targets, PathSet outputs; bool mustBuild = false; - if (settings.useSubstitutes && !willBuildLocally(drv)) { + if (settings.useSubstitutes && substitutesAllowed(drv)) { foreach (DerivationOutputs::iterator, j, drv.outputs) { if (!wantOutput(j->first, i2.second)) continue; if (!store.isValidPath(j->second.path)) { diff --git a/nix/libstore/misc.hh b/nix/libstore/misc.hh index 144cb7f457..d3e31d51f7 100644 --- a/nix/libstore/misc.hh +++ b/nix/libstore/misc.hh @@ -34,5 +34,7 @@ void queryMissing(StoreAPI & store, const PathSet & targets, bool willBuildLocally(const Derivation & drv); +bool substitutesAllowed(const Derivation & drv); + } |