Index: kdesettings-example.bat =================================================================== --- kdesettings-example.bat (Revision 1115374) +++ kdesettings-example.bat (Arbeitskopie) @@ -178,6 +178,10 @@ rem for all other packages this option doesn't have any effect rem set EMERGE_DEFAULTCATEGORY=kde-4.3 +rem This option can be used to set a directory where build logs are saved +rem instead of being printed to the console. +rem set EMERGE_LOG_DIR=%KDEROOT%\buildlogs + rem No editing should be necessary below this line (in an ideal world) rem ################################################################## Index: bin/utils.py =================================================================== --- bin/utils.py (Revision 1115374) +++ bin/utils.py (Arbeitskopie) @@ -420,15 +420,26 @@ print >> sys.stderr, "emerge fatal error: %s" % message exit( 1 ) -def system( cmdstring, outstream=sys.stdout, errstream=sys.stderr ): +def system( cmdstring, outstream=None, errstream=None ): + + if outstream is None: outstream = sys.stdout + if errstream is None: errstream = sys.stderr + debug( "executing command: %s" % cmdstring, 1 ) - if verbose() == 0 and outstream == sys.stdout and errstream == sys.stderr: - sys.stderr = file('test.outlog', 'wb') - sys.stdout = sys.stderr - p = subprocess.Popen( cmdstring, shell=True, stdout=outstream, stderr=errstream ) - ret = p.wait() - sys.stderr = sys.__stderr__ - sys.stdout = sys.__stdout__ + redirected = False + try: + if verbose() == 0 and outstream == sys.stdout and errstream == sys.stderr: + redirected = True + sys.stderr = file('test.outlog', 'wb') + sys.stdout = sys.stderr + + p = subprocess.Popen( cmdstring, shell=True, stdout=outstream, stderr=errstream ) + ret = p.wait() + finally: + if redirected: + sys.stderr = sys.__stderr__ + sys.stdout = sys.__stdout__ + return ( ret == 0 ) def systemWithoutShell(cmdstring, outstream=sys.stdout, errstream=sys.stderr): @@ -895,3 +906,31 @@ cmd = "patch -d %s -p%s < %s" % ( sourceDir, patchLevel, file ) debug("applying patch %s" % ( cmd ), 2) return system( cmd ) + +def log(fn): + def inner(*args, **argv): + + logdir = os.environ.get('EMERGE_LOG_DIR') + + if not logdir: + return fn(*args, **argv) + + if not os.path.exists(logdir): + os.mkdir(logdir) + + logfile = "%s-%s-%s.log" % (args[0], args[1], args[2]) + + logfile = os.path.join(logdir, logfile) + f = open(logfile, "a+") + try: + old_out = sys.stdout + old_err = sys.stderr + sys.stdout = f + sys.stderr = f + return fn(*args, **argv) + finally: + sys.stdout = old_out + sys.stderr = old_err + f.close() + + return inner Index: bin/emerge.py =================================================================== --- bin/emerge.py (Revision 1115374) +++ bin/emerge.py (Arbeitskopie) @@ -92,6 +92,8 @@ star in the printout of --print-targets --patchlevel=[PATCHLEVEL] This will add a patch level when used together with --package +--log-dir=[LOG_DIR] This will log the build output to a logfile in + LOG_DIR for each package. -i ignore install: using this option will install a package over an existing install. This can be useful if you want to check some @@ -140,6 +142,7 @@ """ +@utils.log def doExec( category, package, version, action, opts ): utils.debug( "emerge doExec called. action: %s opts: %s" % (action, opts), 2 ) fileName = portage.getFilename( category, package, version ) @@ -226,6 +229,7 @@ environ["EMERGE_BUILDTYPE"] = os.getenv( "EMERGE_BUILDTYPE" ) environ["EMERGE_TARGET"] = os.getenv( "EMERGE_TARGET" ) environ["EMERGE_TARGET"] = os.getenv( "EMERGE_PKGPATCHLVL" ) +environ["EMERGE_LOG_DIR"] = os.getenv( "EMERGE_LOG_DIR" ) if ( environ['EMERGE_NOCOPY'] == "False" ): nocopy = False @@ -269,6 +273,8 @@ os.environ["EMERGE_TARGET"] = i.replace( "--target=", "" ) elif ( i.startswith( "--patchlevel=" ) ): os.environ["EMERGE_PKGPATCHLVL"] = i.replace( "--patchlevel=", "" ) + elif ( i.startswith( "--log-dir=" ) ): + os.environ["EMERGE_LOG_DIR"] = i.replace( "--log-dir=", "" ) elif ( i == "-v" ): verbose = verbose + 1 os.environ["EMERGE_VERBOSE"] = str( verbose )