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…
	
	Add table
		Add a link
		
	
		Reference in a new issue