public bool CompileFramework() { if (!_options.Framework) { return(true); } Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); string coreRoot = _options.CoreRootDirectory.FullName; string[] frameworkFolderFiles = Directory.GetFiles(coreRoot); IEnumerable <CompilerRunner> frameworkRunners = _options.CompilerRunners(isFramework: true); // Pre-populate the output folders with the input files so that we have backdrops // for failing compilations. foreach (CompilerRunner runner in frameworkRunners) { string outputPath = runner.GetOutputPath(coreRoot); outputPath.RecreateDirectory(); } List <ProcessInfo> compilationsToRun = new List <ProcessInfo>(); List <KeyValuePair <string, ProcessInfo[]> > compilationsPerRunner = new List <KeyValuePair <string, ProcessInfo[]> >(); foreach (string frameworkDll in ComputeManagedAssemblies.GetManagedAssembliesInFolder(_options.CoreRootDirectory.FullName)) { ProcessInfo[] processes = new ProcessInfo[(int)CompilerIndex.Count]; compilationsPerRunner.Add(new KeyValuePair <string, ProcessInfo[]>(frameworkDll, processes)); foreach (CompilerRunner runner in frameworkRunners) { ProcessInfo compilationProcess = new ProcessInfo(new CompilationProcessConstructor(runner, _options.CoreRootDirectory.FullName, frameworkDll)); compilationsToRun.Add(compilationProcess); processes[(int)runner.Index] = compilationProcess; } } ParallelRunner.Run(compilationsToRun, _options.DegreeOfParallelism); HashSet <string> skipCopying = new HashSet <string>(StringComparer.OrdinalIgnoreCase); int[] failedCompilationsPerBuilder = new int[(int)CompilerIndex.Count]; int successfulCompileCount = 0; int failedCompileCount = 0; foreach (KeyValuePair <string, ProcessInfo[]> kvp in compilationsPerRunner) { bool anyCompilationsFailed = false; foreach (CompilerRunner runner in frameworkRunners) { ProcessInfo compilationProcess = kvp.Value[(int)runner.Index]; if (compilationProcess.Succeeded) { skipCopying.Add(compilationProcess.Parameters.InputFileName); } else { anyCompilationsFailed = true; failedCompilationsPerBuilder[(int)runner.Index]++; _frameworkCompilationFailureBuckets.AddCompilation(compilationProcess); } } if (anyCompilationsFailed) { failedCompileCount++; } else { successfulCompileCount++; } } foreach (CompilerRunner runner in frameworkRunners) { string outputPath = runner.GetOutputPath(coreRoot); foreach (string file in frameworkFolderFiles) { if (!skipCopying.Contains(file)) { string targetFile = Path.Combine(outputPath, Path.GetFileName(file)); File.Copy(file, targetFile, overwrite: true); } } } _frameworkCompilationMilliseconds = stopwatch.ElapsedMilliseconds; return(failedCompileCount == 0); }
public bool Compile() { CompileFramework(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); ResolveTestExclusions(); List <ProcessInfo> compilationsToRun = new List <ProcessInfo>(); foreach (BuildFolder folder in FoldersToBuild) { foreach (ProcessInfo[] compilation in folder.Compilations) { foreach (CompilerRunner runner in _compilerRunners) { ProcessInfo compilationProcess = compilation[(int)runner.Index]; if (compilationProcess != null) { compilationsToRun.Add(compilationProcess); } } } } ParallelRunner.Run(compilationsToRun, _options.DegreeOfParallelism); bool success = true; List <KeyValuePair <string, string> > failedCompilationsPerBuilder = new List <KeyValuePair <string, string> >(); int successfulCompileCount = 0; List <ProcessInfo> r2rDumpExecutionsToRun = new List <ProcessInfo>(); foreach (BuildFolder folder in FoldersToBuild) { foreach (ProcessInfo[] compilation in folder.Compilations) { string file = null; string failedBuilders = null; foreach (CompilerRunner runner in _compilerRunners) { ProcessInfo runnerProcess = compilation[(int)runner.Index]; if (runnerProcess == null) { // No runner process } else if (runnerProcess.Succeeded) { if (_options.R2RDumpPath != null) { r2rDumpExecutionsToRun.Add(new ProcessInfo(new R2RDumpProcessConstructor(runner, runnerProcess.Parameters.OutputFileName, naked: false))); r2rDumpExecutionsToRun.Add(new ProcessInfo(new R2RDumpProcessConstructor(runner, runnerProcess.Parameters.OutputFileName, naked: true))); } } else // runner process failed { _compilationFailureBuckets.AddCompilation(runnerProcess); try { File.Copy(runnerProcess.Parameters.InputFileName, runnerProcess.Parameters.OutputFileName); } catch (Exception ex) { Console.Error.WriteLine("Error copying {0} to {1}: {2}", runnerProcess.Parameters.InputFileName, runnerProcess.Parameters.OutputFileName, ex.Message); } if (file == null) { file = runnerProcess.Parameters.InputFileName; failedBuilders = runner.CompilerName; } else { failedBuilders += "; " + runner.CompilerName; } } } if (file != null) { failedCompilationsPerBuilder.Add(new KeyValuePair <string, string>(file, failedBuilders)); success = false; } else { successfulCompileCount++; } } } ParallelRunner.Run(r2rDumpExecutionsToRun, _options.DegreeOfParallelism); foreach (ProcessInfo r2rDumpExecution in r2rDumpExecutionsToRun) { if (!r2rDumpExecution.Succeeded) { string causeOfFailure; if (r2rDumpExecution.TimedOut) { causeOfFailure = "timed out"; } else if (r2rDumpExecution.ExitCode != 0) { causeOfFailure = $"invalid exit code {r2rDumpExecution.ExitCode}"; } else { causeOfFailure = "Unknown cause of failure"; } Console.Error.WriteLine("Error running R2R dump on {0}: {1}", r2rDumpExecution.Parameters.InputFileName, causeOfFailure); success = false; } } _compilationMilliseconds = stopwatch.ElapsedMilliseconds; return(success); }
public bool Compile() { CompileFramework(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); ResolveTestExclusions(); List <ProcessInfo> compilationsToRun = new List <ProcessInfo>(); foreach (BuildFolder folder in FoldersToBuild) { foreach (ProcessInfo[] compilation in folder.Compilations) { foreach (CompilerRunner runner in _compilerRunners) { ProcessInfo compilationProcess = compilation[(int)runner.Index]; if (compilationProcess != null) { compilationsToRun.Add(compilationProcess); } } } } ParallelRunner.Run(compilationsToRun, _options.DegreeOfParallelism); bool success = true; List <KeyValuePair <string, string> > failedCompilationsPerBuilder = new List <KeyValuePair <string, string> >(); int successfulCompileCount = 0; foreach (BuildFolder folder in FoldersToBuild) { foreach (ProcessInfo[] compilation in folder.Compilations) { string file = null; string failedBuilders = null; foreach (CompilerRunner runner in _compilerRunners) { ProcessInfo runnerProcess = compilation[(int)runner.Index]; if (runnerProcess != null && !runnerProcess.Succeeded) { _compilationFailureBuckets.AddCompilation(runnerProcess); try { File.Copy(runnerProcess.Parameters.InputFileName, runnerProcess.Parameters.OutputFileName); } catch (Exception ex) { Console.Error.WriteLine("Error copying {0} to {1}: {2}", runnerProcess.Parameters.InputFileName, runnerProcess.Parameters.OutputFileName, ex.Message); } if (file == null) { file = runnerProcess.Parameters.InputFileName; failedBuilders = runner.CompilerName; } else { failedBuilders += "; " + runner.CompilerName; } } } if (file != null) { failedCompilationsPerBuilder.Add(new KeyValuePair <string, string>(file, failedBuilders)); success = false; } else { successfulCompileCount++; } } } _compilationMilliseconds = stopwatch.ElapsedMilliseconds; return(success); }