* Pass to the build hook all sorts of information useful for
distributing a build action to another machine. In particular, the paths in the input closures, the output paths, and successor mapping for sub-derivations.
This commit is contained in:
		
							parent
							
								
									8c0b42f857
								
							
						
					
					
						commit
						aa5a5084e4
					
				
					 1 changed files with 41 additions and 6 deletions
				
			
		| 
						 | 
					@ -322,18 +322,17 @@ bool Normaliser::startBuild(Path nePath)
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Right platform? */
 | 
					 | 
				
			||||||
    if (goal.expr.derivation.platform != thisSystem)
 | 
					 | 
				
			||||||
        throw Error(format("a `%1%' is required, but I am a `%2%'")
 | 
					 | 
				
			||||||
		    % goal.expr.derivation.platform % thisSystem);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Realise inputs (and remember all input paths). */
 | 
					    /* Realise inputs (and remember all input paths). */
 | 
				
			||||||
 | 
					    PathSet fnord;
 | 
				
			||||||
 | 
					    map<Path, Path> xyzzy;
 | 
				
			||||||
    for (PathSet::iterator i = goal.expr.derivation.inputs.begin();
 | 
					    for (PathSet::iterator i = goal.expr.derivation.inputs.begin();
 | 
				
			||||||
         i != goal.expr.derivation.inputs.end(); ++i)
 | 
					         i != goal.expr.derivation.inputs.end(); ++i)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        checkInterrupt();
 | 
					        checkInterrupt();
 | 
				
			||||||
        Path nfPath = useSuccessor(*i);
 | 
					        Path nfPath = useSuccessor(*i);
 | 
				
			||||||
        realiseClosure(nfPath);
 | 
					        realiseClosure(nfPath);
 | 
				
			||||||
 | 
					        fnord.insert(nfPath);
 | 
				
			||||||
 | 
					        if (nfPath != *i) xyzzy[*i] = nfPath;
 | 
				
			||||||
        /* !!! nfPath should be a root of the garbage collector while
 | 
					        /* !!! nfPath should be a root of the garbage collector while
 | 
				
			||||||
           we are building */
 | 
					           we are building */
 | 
				
			||||||
        StoreExpr ne = storeExprFromPath(nfPath);
 | 
					        StoreExpr ne = storeExprFromPath(nfPath);
 | 
				
			||||||
| 
						 | 
					@ -369,7 +368,38 @@ bool Normaliser::startBuild(Path nePath)
 | 
				
			||||||
    Path buildHook = getEnv("NIX_BUILD_HOOK");
 | 
					    Path buildHook = getEnv("NIX_BUILD_HOOK");
 | 
				
			||||||
    if (buildHook != "") {
 | 
					    if (buildHook != "") {
 | 
				
			||||||
        printMsg(lvlChatty, format("using build hook `%1%'") % buildHook);
 | 
					        printMsg(lvlChatty, format("using build hook `%1%'") % buildHook);
 | 
				
			||||||
        int status = system((buildHook + " " + goal.nePath + " 1>&2").c_str());
 | 
					
 | 
				
			||||||
 | 
					        Path hookTmpDir = createTempDir();
 | 
				
			||||||
 | 
					        Path inputListFN = hookTmpDir + "/inputs";
 | 
				
			||||||
 | 
					        Path outputListFN = hookTmpDir + "/outputs";
 | 
				
			||||||
 | 
					        Path successorsListFN = hookTmpDir + "/successors";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        string s;
 | 
				
			||||||
 | 
					        for (ClosureElems::iterator i = goal.inClosures.begin();
 | 
				
			||||||
 | 
					             i != goal.inClosures.end(); ++i)
 | 
				
			||||||
 | 
					            s += i->first + "\n";
 | 
				
			||||||
 | 
					        for (PathSet::iterator i = fnord.begin();
 | 
				
			||||||
 | 
					             i != fnord.end(); ++i)
 | 
				
			||||||
 | 
					            s += *i + "\n";
 | 
				
			||||||
 | 
					        writeStringToFile(inputListFN, s);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        s = "";
 | 
				
			||||||
 | 
					        for (PathSet::iterator i = goal.expr.derivation.outputs.begin();
 | 
				
			||||||
 | 
					             i != goal.expr.derivation.outputs.end(); ++i)
 | 
				
			||||||
 | 
					            s += *i + "\n";
 | 
				
			||||||
 | 
					        writeStringToFile(outputListFN, s);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        s = "";
 | 
				
			||||||
 | 
					        for (map<Path, Path>::iterator i = xyzzy.begin();
 | 
				
			||||||
 | 
					             i != xyzzy.end(); ++i)
 | 
				
			||||||
 | 
					            s += i->first + " " + i->second + "\n";
 | 
				
			||||||
 | 
					        writeStringToFile(successorsListFN, s);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        int status = system((format("%1% %2% %3% %4% %5% %6% 1>&2")
 | 
				
			||||||
 | 
					            % buildHook % goal.nePath % inputListFN % outputListFN
 | 
				
			||||||
 | 
					            % successorsListFN
 | 
				
			||||||
 | 
					            % goal.expr.derivation.platform).str().c_str());
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        if (WIFEXITED(status)) {
 | 
					        if (WIFEXITED(status)) {
 | 
				
			||||||
            int code = WEXITSTATUS(status);
 | 
					            int code = WEXITSTATUS(status);
 | 
				
			||||||
            if (code == 100) { /* == accepted */
 | 
					            if (code == 100) { /* == accepted */
 | 
				
			||||||
| 
						 | 
					@ -384,6 +414,11 @@ bool Normaliser::startBuild(Path nePath)
 | 
				
			||||||
            format("build hook died with status %1%") % status);
 | 
					            format("build hook died with status %1%") % status);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Right platform? */
 | 
				
			||||||
 | 
					    if (goal.expr.derivation.platform != thisSystem)
 | 
				
			||||||
 | 
					        throw Error(format("a `%1%' is required, but I am a `%2%'")
 | 
				
			||||||
 | 
							    % goal.expr.derivation.platform % thisSystem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Otherwise, start the build in a child process. */
 | 
					    /* Otherwise, start the build in a child process. */
 | 
				
			||||||
    startBuildChild(goal);
 | 
					    startBuildChild(goal);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue