private static int RunBuild(string[] args, DateTime start, Action <string> stdout, Action <string> stderr) { Logging.Emit("client mode = {0}", Settings.ServiceMode); try { if (!Settings.Disabled) { string compiler = Compiler.Find(); if (compiler == null) { throw new System.IO.FileNotFoundException("cant find real cl compiler"); } var cachedir = Settings.CacheDirectory; Logging.Emit("compiler: {0}", compiler); ICompiler comp; using (ICompilerCache cc = CompilerCacheFactory.Get(Settings.DirectMode, cachedir, compiler, Environment.CurrentDirectory, Compiler.GetEnvironmentDictionary(), out comp)) { if (comp != null) { spawnServer = true; } cc.SetCaptureCallback(comp, stdout, stderr); long last_hits = 0; if (!Settings.ServiceMode) { last_hits = cc.Stats.CacheHits; } int res = cc.CompileOrCache(comp, args, null); if (!Settings.ServiceMode) { if (last_hits < cc.Stats.CacheHits) { WasHit = true; } } return(res); } } else { Logging.Emit("disabled by environment"); } } catch (CClashWarningException e) { Logging.Warning(e.Message); } catch (Exception e) { Logging.Emit("{0} after {1} ms", e.GetType().Name, DateTime.Now.Subtract(start).TotalMilliseconds); Logging.Emit("{0} {1}", e.GetType().Name + " message: " + e.Message); #if DEBUG Logging.Error("Exception from cacher {0}!!!", e); #endif } int rv = -1; try { var c = new Compiler() { CompilerExe = Compiler.Find(), }; c.SetEnvironment(Compiler.GetEnvironmentDictionary()); c.SetWorkingDirectory(Environment.CurrentDirectory); rv = c.InvokeCompiler(args, stderr, stdout, false, null); Logging.Emit("exit {0} after {1} ms", rv, DateTime.Now.Subtract(start).TotalMilliseconds); } catch (CClashErrorException e) { Logging.Error(e.Message); throw; } catch (CClashWarningException e) { Logging.Warning(e.Message); } return(rv); }