static CompilerSettings() { var assemblies = new Dictionary <string, int>(); CompilationPipeline.compilationStarted += o => { currentCompilation.Clear(); assemblies.Clear(); compilationStartTime = DateTime.UtcNow; compilationRunning = true; }; CompilationPipeline.compilationFinished += o => { var compilations = Data.instance.compilations; var durationMs = timeSinceCompilationStart(); compilations.Add(new Compilation(currentCompilation.ToArray(), durationMs)); currentCompilation.Clear(); if (compilations.Count > 20) { compilations.RemoveAt(0); } compilationRunning = false; }; CompilationPipeline.assemblyCompilationStarted += target => { assemblies[target] = timeSinceCompilationStart(); var assemblyName = Path.GetFileName(target); currentCompilation.Add(new Element(assemblyName, timeSinceCompilationStart())); }; CompilationPipeline.assemblyCompilationFinished += (target, messages) => { var assemblyName = Path.GetFileName(target); try { var idx = currentCompilation.FindIndex(_ => _.assemblyName == assemblyName); { var lines = File.ReadAllLines(SharedData.CompileTimesFileName(assemblyName)); var dateTime = DateTime.Parse(lines[0], CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind); var durationMs = int.Parse(lines[1]); var exitCode = int.Parse(lines[2]); var start = timeSinceCompilationStart(dateTime); var newElement = new Element(assemblyName, start, durationMs, success: exitCode == 0); if (idx == -1) { currentCompilation.Add(newElement); } else { currentCompilation[idx] = newElement; } } { // var startTime = assemblies[target]; // var durationMs = timeSinceCompilationStart() - startTime; // currentCompilation.Add(new Element( // assemblyName, startTime, durationMs, // success: messages.All(_ => _.type != CompilerMessageType.Error) // )); } } catch (Exception e) { Debug.LogError(e); } }; }
private static int Compile(string[] args, Logger logger) { var startTime = DateTime.UtcNow; var sw = Stopwatch.StartNew(); logger?.AppendHeader(); logger?.Append("mono path"); logger?.Append(Environment.GetEnvironmentVariable("MONO_PATH")); var platform = CurrentPlatform; var responseFile = args[0]; var compilationOptions = File.ReadAllLines(responseFile.TrimStart('@')); var unityEditorDataDir = GetUnityEditorDataDir(); var projectDir = Directory.GetCurrentDirectory(); var targetAssembly = compilationOptions.First(line => line.StartsWith("-out:")) .Replace("'", "") .Replace("\"", "") .Substring(10); logger?.Append($"CSharpCompilerWrapper.exe version: {GetExecutingAssemblyFileVersion()}"); logger?.Append($"Platform: {platform}"); logger?.Append($"Target assembly: {targetAssembly}"); logger?.Append($"Project directory: {projectDir}"); logger?.Append($"Unity 'Data' or 'Frameworks' directory: {unityEditorDataDir}"); var compiler = CreateCompiler(logger, projectDir, platform); logger?.Append($"Compiler: {compiler.Name}"); logger?.Append(""); logger?.Append("- Compilation -----------------------------------------------"); logger?.Append(""); var exitCode = compiler.Compile(platform, unityEditorDataDir, responseFile); sw.Stop(); logger?.Append($"Elapsed time: {sw.ElapsedMilliseconds / 1000f:F2} sec"); // this line will be parsed by code in CompilerSettings.cs logger?.Append($"compilation-info;{targetAssembly};{sw.ElapsedMilliseconds};{DateTime.UtcNow:O}"); logger?.Append(""); { var fileName = SharedData.CompileTimesFileName(targetAssembly); try { File.WriteAllLines(fileName, new [] { startTime.ToString("O"), sw.ElapsedMilliseconds.ToString(), exitCode.ToString() }); } catch (Exception e) { logger?.Append(e.ToString()); } } compiler.PrintCompilerOutputAndErrors(); return(exitCode); }