Exemple #1
0
        public static void CrossCompileAOTDirectory(BuildTarget buildTarget, CrossCompileOptions crossCompileOptions, string sourceAssembliesFolder, string targetCrossCompiledASMFolder, string pathExtension, string additionalOptions)
        {
            string text = BuildPipeline.GetBuildToolsDirectory(buildTarget);

            if (Application.platform == RuntimePlatform.OSXEditor)
            {
                text = Path.Combine(Path.Combine(text, pathExtension), "mono-xcompiler");
            }
            else
            {
                text = Path.Combine(Path.Combine(text, pathExtension), "mono-xcompiler.exe");
            }
            sourceAssembliesFolder       = Path.Combine(Directory.GetCurrentDirectory(), sourceAssembliesFolder);
            targetCrossCompiledASMFolder = Path.Combine(Directory.GetCurrentDirectory(), targetCrossCompiledASMFolder);
            string[] files = Directory.GetFiles(sourceAssembliesFolder);
            for (int i = 0; i < files.Length; i++)
            {
                string path = files[i];
                if (!(Path.GetExtension(path) != ".dll"))
                {
                    string fileName = Path.GetFileName(path);
                    string output   = Path.Combine(targetCrossCompiledASMFolder, fileName + ".s");
                    if (EditorUtility.DisplayCancelableProgressBar("Building Player", "AOT cross compile " + fileName, 0.95f))
                    {
                        throw new OperationCanceledException();
                    }
                    MonoCrossCompile.CrossCompileAOT(buildTarget, text, sourceAssembliesFolder, crossCompileOptions, fileName, output, additionalOptions);
                }
            }
        }
Exemple #2
0
 public void ThreadPoolCallback(object threadContext)
 {
     try
     {
         MonoCrossCompile.CrossCompileAOT(this.m_target, this.m_crossCompilerAbsolutePath, this.m_assembliesAbsoluteDirectory, this.m_crossCompileOptions, this.m_input, this.m_output, this.m_additionalOptions);
     }
     catch (Exception exception)
     {
         this.m_Exception = exception;
     }
     this.m_doneEvent.Set();
 }
Exemple #3
0
        public static bool CrossCompileAOTDirectoryParallel(BuildTarget buildTarget, CrossCompileOptions crossCompileOptions, string sourceAssembliesFolder, string targetCrossCompiledASMFolder, string pathExtension, string additionalOptions)
        {
            string text = BuildPipeline.GetBuildToolsDirectory(buildTarget);

            if (Application.platform == RuntimePlatform.OSXEditor)
            {
                text = Path.Combine(Path.Combine(text, pathExtension), "mono-xcompiler");
            }
            else
            {
                text = Path.Combine(Path.Combine(text, pathExtension), "mono-xcompiler.exe");
            }
            return(MonoCrossCompile.CrossCompileAOTDirectoryParallel(text, buildTarget, crossCompileOptions, sourceAssembliesFolder, targetCrossCompiledASMFolder, additionalOptions));
        }
Exemple #4
0
 public void ThreadPoolCallback(System.Object threadContext)
 {
     try
     {
         MonoCrossCompile.CrossCompileAOT(m_target, m_crossCompilerAbsolutePath,
                                          m_assembliesAbsoluteDirectory, m_crossCompileOptions,
                                          m_input, m_output, m_additionalOptions);
     }
     catch (Exception ex)
     {
         m_Exception = ex;
     }
     m_doneEvent.Set();
 }
        public static void CrossCompileAOTDirectory(BuildTarget buildTarget, CrossCompileOptions crossCompileOptions, string sourceAssembliesFolder, string targetCrossCompiledASMFolder, string pathExtension, string additionalOptions)
        {
            string buildToolsDirectory       = BuildPipeline.GetBuildToolsDirectory(buildTarget);
            string crossCompilerAbsolutePath = Application.platform != RuntimePlatform.OSXEditor ? Path.Combine(Path.Combine(buildToolsDirectory, pathExtension), "mono-xcompiler.exe") : Path.Combine(Path.Combine(buildToolsDirectory, pathExtension), "mono-xcompiler");

            sourceAssembliesFolder       = Path.Combine(Directory.GetCurrentDirectory(), sourceAssembliesFolder);
            targetCrossCompiledASMFolder = Path.Combine(Directory.GetCurrentDirectory(), targetCrossCompiledASMFolder);
            foreach (string file in Directory.GetFiles(sourceAssembliesFolder))
            {
                if (!(Path.GetExtension(file) != ".dll"))
                {
                    string fileName = Path.GetFileName(file);
                    string output   = Path.Combine(targetCrossCompiledASMFolder, fileName + ".s");
                    if (EditorUtility.DisplayCancelableProgressBar("Building Player", "AOT cross compile " + fileName, 0.95f))
                    {
                        throw new OperationCanceledException();
                    }
                    MonoCrossCompile.CrossCompileAOT(buildTarget, crossCompilerAbsolutePath, sourceAssembliesFolder, crossCompileOptions, fileName, output, additionalOptions);
                }
            }
        }
Exemple #6
0
 public static bool CrossCompileAOTDirectoryParallel(BuildTarget buildTarget, CrossCompileOptions crossCompileOptions, string sourceAssembliesFolder, string targetCrossCompiledASMFolder, string additionalOptions)
 {
     return(MonoCrossCompile.CrossCompileAOTDirectoryParallel(buildTarget, crossCompileOptions, sourceAssembliesFolder, targetCrossCompiledASMFolder, string.Empty, additionalOptions));
 }
Exemple #7
0
 public static void CrossCompileAOTDirectory(BuildTarget buildTarget, CrossCompileOptions crossCompileOptions, string sourceAssembliesFolder, string targetCrossCompiledASMFolder, string additionalOptions)
 {
     MonoCrossCompile.CrossCompileAOTDirectory(buildTarget, crossCompileOptions, sourceAssembliesFolder, targetCrossCompiledASMFolder, string.Empty, additionalOptions);
 }
Exemple #8
0
        private static void CrossCompileAOT(BuildTarget target, string crossCompilerAbsolutePath, string assembliesAbsoluteDirectory, CrossCompileOptions crossCompileOptions, string input, string output, string additionalOptions)
        {
            string text = string.Empty;

            if (!MonoCrossCompile.IsDebugableAssembly(input))
            {
                crossCompileOptions &= ~CrossCompileOptions.Debugging;
                crossCompileOptions &= ~CrossCompileOptions.LoadSymbols;
            }
            bool flag  = (crossCompileOptions & CrossCompileOptions.Debugging) != CrossCompileOptions.Dynamic;
            bool flag2 = (crossCompileOptions & CrossCompileOptions.LoadSymbols) != CrossCompileOptions.Dynamic;
            bool flag3 = flag || flag2;

            if (flag3)
            {
                text += "--debug ";
            }
            if (flag)
            {
                text += "--optimize=-linears ";
            }
            text += "--aot=full,asmonly,";
            if (flag3)
            {
                text += "write-symbols,";
            }
            if ((crossCompileOptions & CrossCompileOptions.Debugging) != CrossCompileOptions.Dynamic)
            {
                text += "soft-debug,";
            }
            else
            {
                if (!flag3)
                {
                    text += "nodebug,";
                }
            }
            if (target != BuildTarget.iOS)
            {
                text += "print-skipped,";
            }
            if (additionalOptions != null & additionalOptions.Trim().Length > 0)
            {
                text = text + additionalOptions.Trim() + ",";
            }
            string fileName = Path.GetFileName(output);
            string text2    = Path.Combine(assembliesAbsoluteDirectory, fileName);

            if ((crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic)
            {
                text += "ficall,";
            }
            if ((crossCompileOptions & CrossCompileOptions.Static) != CrossCompileOptions.Dynamic)
            {
                text += "static,";
            }
            string text3 = text;

            text = string.Concat(new string[]
            {
                text3,
                "outfile=\"",
                fileName,
                "\" \"",
                input,
                "\" "
            });
            Process process = new Process();

            process.StartInfo.FileName  = crossCompilerAbsolutePath;
            process.StartInfo.Arguments = text;
            process.StartInfo.EnvironmentVariables["MONO_PATH"]  = assembliesAbsoluteDirectory;
            process.StartInfo.EnvironmentVariables["GAC_PATH"]   = assembliesAbsoluteDirectory;
            process.StartInfo.EnvironmentVariables["GC_DONT_GC"] = "yes please";
            if ((crossCompileOptions & CrossCompileOptions.ExplicitNullChecks) != CrossCompileOptions.Dynamic)
            {
                process.StartInfo.EnvironmentVariables["MONO_DEBUG"] = "explicit-null-checks";
            }
            process.StartInfo.UseShellExecute        = false;
            process.StartInfo.CreateNoWindow         = true;
            process.StartInfo.RedirectStandardOutput = true;
            if (MonoCrossCompile.ArtifactsPath != null)
            {
                if (!Directory.Exists(MonoCrossCompile.ArtifactsPath))
                {
                    Directory.CreateDirectory(MonoCrossCompile.ArtifactsPath);
                }
                File.AppendAllText(MonoCrossCompile.ArtifactsPath + "output.txt", process.StartInfo.FileName + "\n");
                File.AppendAllText(MonoCrossCompile.ArtifactsPath + "output.txt", process.StartInfo.Arguments + "\n");
                File.AppendAllText(MonoCrossCompile.ArtifactsPath + "output.txt", assembliesAbsoluteDirectory + "\n");
                File.AppendAllText(MonoCrossCompile.ArtifactsPath + "output.txt", text2 + "\n");
                File.AppendAllText(MonoCrossCompile.ArtifactsPath + "output.txt", input + "\n");
                File.AppendAllText(MonoCrossCompile.ArtifactsPath + "houtput.txt", fileName + "\n\n");
                File.Copy(assembliesAbsoluteDirectory + "\\" + input, MonoCrossCompile.ArtifactsPath + "\\" + input, true);
            }
            process.StartInfo.WorkingDirectory = assembliesAbsoluteDirectory;
            MonoProcessUtility.RunMonoProcess(process, "AOT cross compiler", text2);
            File.Move(text2, output);
            if ((crossCompileOptions & CrossCompileOptions.Static) == CrossCompileOptions.Dynamic)
            {
                string text4 = Path.Combine(assembliesAbsoluteDirectory, fileName + ".def");
                if (File.Exists(text4))
                {
                    File.Move(text4, output + ".def");
                }
            }
        }
Exemple #9
0
        public static bool CrossCompileAOTDirectoryParallel(string crossCompilerPath, BuildTarget buildTarget, CrossCompileOptions crossCompileOptions, string sourceAssembliesFolder, string targetCrossCompiledASMFolder, string additionalOptions)
        {
            sourceAssembliesFolder       = Path.Combine(Directory.GetCurrentDirectory(), sourceAssembliesFolder);
            targetCrossCompiledASMFolder = Path.Combine(Directory.GetCurrentDirectory(), targetCrossCompiledASMFolder);
            int num  = 1;
            int num2 = 1;

            ThreadPool.GetMaxThreads(out num, out num2);
            List <MonoCrossCompile.JobCompileAOT> list = new List <MonoCrossCompile.JobCompileAOT>();
            List <ManualResetEvent> list2 = new List <ManualResetEvent>();
            bool          flag            = true;
            List <string> list3           = new List <string>(
                from path in Directory.GetFiles(sourceAssembliesFolder)
                where Path.GetExtension(path) == ".dll"
                select path);
            int count = list3.Count;
            int num3  = 0;

            MonoCrossCompile.DisplayAOTProgressBar(count, num3);
            long num4 = (long)Math.Min(1800000, (count + 3) * 1000 * 30);

            foreach (string current in list3)
            {
                string fileName = Path.GetFileName(current);
                string output   = Path.Combine(targetCrossCompiledASMFolder, fileName + ".s");
                MonoCrossCompile.JobCompileAOT jobCompileAOT = new MonoCrossCompile.JobCompileAOT(buildTarget, crossCompilerPath, sourceAssembliesFolder, crossCompileOptions, fileName, output, additionalOptions);
                list.Add(jobCompileAOT);
                list2.Add(jobCompileAOT.m_doneEvent);
                ThreadPool.QueueUserWorkItem(new WaitCallback(jobCompileAOT.ThreadPoolCallback));
                if (list2.Count >= Environment.ProcessorCount)
                {
                    flag = MonoCrossCompile.WaitForBuildOfFile(list2, ref num4);
                    MonoCrossCompile.DisplayAOTProgressBar(count, num3);
                    num3++;
                    if (!flag)
                    {
                        break;
                    }
                }
            }
            while (list2.Count > 0)
            {
                flag = MonoCrossCompile.WaitForBuildOfFile(list2, ref num4);
                MonoCrossCompile.DisplayAOTProgressBar(count, num3);
                num3++;
                if (!flag)
                {
                    break;
                }
            }
            foreach (MonoCrossCompile.JobCompileAOT current2 in list)
            {
                if (current2.m_Exception != null)
                {
                    UnityEngine.Debug.LogErrorFormat("Cross compilation job {0} failed.\n{1}", new object[]
                    {
                        current2.m_input,
                        current2.m_Exception
                    });
                    flag = false;
                }
            }
            return(flag);
        }
        public static bool CrossCompileAOTDirectoryParallel(string crossCompilerPath, BuildTarget buildTarget, CrossCompileOptions crossCompileOptions, string sourceAssembliesFolder, string targetCrossCompiledASMFolder, string additionalOptions)
        {
            sourceAssembliesFolder       = Path.Combine(Directory.GetCurrentDirectory(), sourceAssembliesFolder);
            targetCrossCompiledASMFolder = Path.Combine(Directory.GetCurrentDirectory(), targetCrossCompiledASMFolder);
            int workerThreads         = 1;
            int completionPortThreads = 1;

            ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads);
            List <MonoCrossCompile.JobCompileAOT> jobCompileAotList = new List <MonoCrossCompile.JobCompileAOT>();
            List <ManualResetEvent> events = new List <ManualResetEvent>();
            bool          flag             = true;
            List <string> stringList       = new List <string>(((IEnumerable <string>)Directory.GetFiles(sourceAssembliesFolder)).Where <string>((Func <string, bool>)(path => Path.GetExtension(path) == ".dll")));
            int           count            = stringList.Count;
            int           filesFinished    = 0;

            MonoCrossCompile.DisplayAOTProgressBar(count, filesFinished);
            long timeout = (long)Math.Min(1800000, (count + 3) * 1000 * 30);

            using (List <string> .Enumerator enumerator = stringList.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    string fileName = Path.GetFileName(enumerator.Current);
                    string output   = Path.Combine(targetCrossCompiledASMFolder, fileName + ".s");
                    MonoCrossCompile.JobCompileAOT jobCompileAot = new MonoCrossCompile.JobCompileAOT(buildTarget, crossCompilerPath, sourceAssembliesFolder, crossCompileOptions, fileName, output, additionalOptions);
                    jobCompileAotList.Add(jobCompileAot);
                    events.Add(jobCompileAot.m_doneEvent);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(jobCompileAot.ThreadPoolCallback));
                    if (events.Count >= Environment.ProcessorCount)
                    {
                        flag = MonoCrossCompile.WaitForBuildOfFile(events, ref timeout);
                        MonoCrossCompile.DisplayAOTProgressBar(count, filesFinished);
                        ++filesFinished;
                        if (!flag)
                        {
                            break;
                        }
                    }
                }
            }
            while (events.Count > 0)
            {
                flag = MonoCrossCompile.WaitForBuildOfFile(events, ref timeout);
                MonoCrossCompile.DisplayAOTProgressBar(count, filesFinished);
                ++filesFinished;
                if (!flag)
                {
                    break;
                }
            }
            using (List <MonoCrossCompile.JobCompileAOT> .Enumerator enumerator = jobCompileAotList.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    MonoCrossCompile.JobCompileAOT current = enumerator.Current;
                    if (current.m_Exception != null)
                    {
                        UnityEngine.Debug.LogErrorFormat("Cross compilation job {0} failed.\n{1}", new object[2]
                        {
                            (object)current.m_input,
                            (object)current.m_Exception
                        });
                        flag = false;
                    }
                }
            }
            return(flag);
        }