* When using the build hook, distinguish between the stderr of the
hook script proper, and the stdout/stderr of the builder. Only the latter should be saved in /nix/var/log/nix/drvs. * Allow the verbosity to be set through an option. * Added a flag --quiet to lower the verbosity level.
This commit is contained in:
		
							parent
							
								
									20acd43c25
								
							
						
					
					
						commit
						80e722278c
					
				
					 8 changed files with 47 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -626,6 +626,9 @@ struct HookInstance
 | 
			
		|||
    /* Pipe for the hook's standard output/error. */
 | 
			
		||||
    Pipe fromHook;
 | 
			
		||||
 | 
			
		||||
    /* Pipe for the builder's standard output/error. */
 | 
			
		||||
    Pipe builderOut;
 | 
			
		||||
    
 | 
			
		||||
    /* The process ID of the hook. */
 | 
			
		||||
    Pid pid;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -647,6 +650,9 @@ HookInstance::HookInstance()
 | 
			
		|||
    /* Create the communication pipes. */
 | 
			
		||||
    toHook.create();
 | 
			
		||||
 | 
			
		||||
    /* Create a pipe to get the output of the builder. */
 | 
			
		||||
    builderOut.create();
 | 
			
		||||
 | 
			
		||||
    /* Fork the hook. */
 | 
			
		||||
    pid = fork();
 | 
			
		||||
    switch (pid) {
 | 
			
		||||
| 
						 | 
				
			
			@ -666,6 +672,11 @@ HookInstance::HookInstance()
 | 
			
		|||
            if (dup2(toHook.readSide, STDIN_FILENO) == -1)
 | 
			
		||||
                throw SysError("dupping to-hook read side");
 | 
			
		||||
 | 
			
		||||
            /* Use fd 4 for the builder's stdout/stderr. */
 | 
			
		||||
            builderOut.readSide.close();
 | 
			
		||||
            if (dup2(builderOut.writeSide, 4) == -1)
 | 
			
		||||
                throw SysError("dupping builder's stdout/stderr");
 | 
			
		||||
            
 | 
			
		||||
            execl(buildHook.c_str(), buildHook.c_str(), thisSystem.c_str(),
 | 
			
		||||
                (format("%1%") % maxSilentTime).str().c_str(), NULL);
 | 
			
		||||
            
 | 
			
		||||
| 
						 | 
				
			
			@ -740,7 +751,7 @@ private:
 | 
			
		|||
    AutoCloseFD fdLogFile;
 | 
			
		||||
 | 
			
		||||
    /* Pipe for the builder's standard output/error. */
 | 
			
		||||
    Pipe logPipe;
 | 
			
		||||
    Pipe builderOut;
 | 
			
		||||
 | 
			
		||||
    /* The build hook. */
 | 
			
		||||
    boost::shared_ptr<HookInstance> hook;
 | 
			
		||||
| 
						 | 
				
			
			@ -1208,7 +1219,11 @@ void DerivationGoal::buildDone()
 | 
			
		|||
    worker.childTerminated(savedPid);
 | 
			
		||||
    
 | 
			
		||||
    /* Close the read side of the logger pipe. */
 | 
			
		||||
    logPipe.readSide.close();
 | 
			
		||||
    if (hook) {
 | 
			
		||||
        hook->builderOut.readSide.close();
 | 
			
		||||
        hook->fromHook.readSide.close();
 | 
			
		||||
    }
 | 
			
		||||
    else builderOut.readSide.close();
 | 
			
		||||
 | 
			
		||||
    /* Close the log file. */
 | 
			
		||||
    fdLogFile.close();
 | 
			
		||||
| 
						 | 
				
			
			@ -1387,9 +1402,11 @@ HookReply DerivationGoal::tryBuildHook()
 | 
			
		|||
 | 
			
		||||
    /* Create the log file and pipe. */
 | 
			
		||||
    Path logFile = openLogFile();
 | 
			
		||||
    
 | 
			
		||||
    worker.childStarted(shared_from_this(),
 | 
			
		||||
        hook->pid, singleton<set<int> >(hook->fromHook.readSide), false, false);
 | 
			
		||||
 | 
			
		||||
    set<int> fds;
 | 
			
		||||
    fds.insert(hook->fromHook.readSide);
 | 
			
		||||
    fds.insert(hook->builderOut.readSide);
 | 
			
		||||
    worker.childStarted(shared_from_this(), hook->pid, fds, false, false);
 | 
			
		||||
    
 | 
			
		||||
    if (printBuildTrace)
 | 
			
		||||
        printMsg(lvlError, format("@ build-started %1% %2% %3% %4%")
 | 
			
		||||
| 
						 | 
				
			
			@ -1679,8 +1696,8 @@ void DerivationGoal::startBuilder()
 | 
			
		|||
    /* Create the log file. */
 | 
			
		||||
    Path logFile = openLogFile();
 | 
			
		||||
    
 | 
			
		||||
    /* Create a pipe to get the output of the child. */
 | 
			
		||||
    logPipe.create();
 | 
			
		||||
    /* Create a pipe to get the output of the builder. */
 | 
			
		||||
    builderOut.create();
 | 
			
		||||
 | 
			
		||||
    /* Fork a child to build the package.  Note that while we
 | 
			
		||||
       currently use forks to run and wait for the children, it
 | 
			
		||||
| 
						 | 
				
			
			@ -1732,7 +1749,7 @@ void DerivationGoal::startBuilder()
 | 
			
		|||
            }
 | 
			
		||||
#endif
 | 
			
		||||
            
 | 
			
		||||
            commonChildInit(logPipe);
 | 
			
		||||
            commonChildInit(builderOut);
 | 
			
		||||
    
 | 
			
		||||
            if (chdir(tmpDir.c_str()) == -1)
 | 
			
		||||
                throw SysError(format("changing into `%1%'") % tmpDir);
 | 
			
		||||
| 
						 | 
				
			
			@ -1816,9 +1833,9 @@ void DerivationGoal::startBuilder()
 | 
			
		|||
    
 | 
			
		||||
    /* parent */
 | 
			
		||||
    pid.setSeparatePG(true);
 | 
			
		||||
    logPipe.writeSide.close();
 | 
			
		||||
    builderOut.writeSide.close();
 | 
			
		||||
    worker.childStarted(shared_from_this(), pid,
 | 
			
		||||
        singleton<set<int> >(logPipe.readSide), true, true);
 | 
			
		||||
        singleton<set<int> >(builderOut.readSide), true, true);
 | 
			
		||||
 | 
			
		||||
    if (printBuildTrace) {
 | 
			
		||||
        printMsg(lvlError, format("@ build-started %1% %2% %3% %4%")
 | 
			
		||||
| 
						 | 
				
			
			@ -2008,7 +2025,8 @@ void DerivationGoal::handleChildOutput(int fd, const string & data)
 | 
			
		|||
{
 | 
			
		||||
    if (verbosity >= buildVerbosity)
 | 
			
		||||
        writeToStderr((unsigned char *) data.c_str(), data.size());
 | 
			
		||||
    if (fdLogFile != -1)
 | 
			
		||||
    if ((hook && fd == hook->builderOut.readSide) ||
 | 
			
		||||
        (!hook && fd == builderOut.readSide))
 | 
			
		||||
        writeFull(fdLogFile, (unsigned char *) data.c_str(), data.size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -136,7 +136,7 @@ Path addPermRoot(const Path & _storePath, const Path & _gcRoot,
 | 
			
		|||
                    "therefore, `%2%' might be removed by the garbage collector")
 | 
			
		||||
                % gcRoot % storePath);
 | 
			
		||||
    }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    /* Grab the global GC root, causing us to block while a GC is in
 | 
			
		||||
       progress.  This prevents the set of permanent roots from
 | 
			
		||||
       increasing while a GC is in progress. */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ string nixBinDir = "/UNINIT";
 | 
			
		|||
bool keepFailed = false;
 | 
			
		||||
bool keepGoing = false;
 | 
			
		||||
bool tryFallback = false;
 | 
			
		||||
Verbosity buildVerbosity = lvlInfo;
 | 
			
		||||
Verbosity buildVerbosity = lvlError;
 | 
			
		||||
unsigned int maxBuildJobs = 1;
 | 
			
		||||
unsigned int buildCores = 1;
 | 
			
		||||
bool readOnlyMode = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -97,10 +97,6 @@ void RemoteStore::forkSlave()
 | 
			
		|||
    if (worker == "")
 | 
			
		||||
        worker = nixBinDir + "/nix-worker";
 | 
			
		||||
 | 
			
		||||
    string verbosityArg = "-";
 | 
			
		||||
    for (int i = 1; i < verbosity; ++i)
 | 
			
		||||
        verbosityArg += "v";
 | 
			
		||||
 | 
			
		||||
    child = fork();
 | 
			
		||||
    
 | 
			
		||||
    switch (child) {
 | 
			
		||||
| 
						 | 
				
			
			@ -120,10 +116,7 @@ void RemoteStore::forkSlave()
 | 
			
		|||
            close(fdSocket);
 | 
			
		||||
            close(fdChild);
 | 
			
		||||
 | 
			
		||||
            execlp(worker.c_str(), worker.c_str(), "--slave",
 | 
			
		||||
                /* hacky - must be at the end */
 | 
			
		||||
                verbosityArg == "-" ? NULL : verbosityArg.c_str(),
 | 
			
		||||
                NULL);
 | 
			
		||||
            execlp(worker.c_str(), worker.c_str(), "--slave", NULL);
 | 
			
		||||
 | 
			
		||||
            throw SysError(format("executing `%1%'") % worker);
 | 
			
		||||
            
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue