コード例 #1
0
    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);
            }
        };
    }
コード例 #2
0
    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);
    }