using System; using System.IO; using System.Linq; using System.Threading.Tasks; using HybridCLR.Editor; using HybridCLR.Editor.Commands; using HybridCLR.Editor.Settings; using Newtonsoft.Json; using UnityEditor; using UnityEditor.Build.Reporting; using UnityEngine; public static class VerifyHybridClrGeneration { public static async Task VerifyCallbacks() { BuildReport report = BuildReport.GetLatestReport(); if (report == null || report.summary.platform != BuildTarget.WebGL) throw new Exception("A WebGL build report is required"); string bee = Environment.GetEnvironmentVariable("BEE_BUILD_THREADS"); string binaryen = Environment.GetEnvironmentVariable("BINARYEN_CORES"); var callbacks = new AOT.Editor.HybridCLR.WebGlBuildConcurrency(); try { Environment.SetEnvironmentVariable("BEE_BUILD_THREADS", null); Environment.SetEnvironmentVariable("BINARYEN_CORES", null); callbacks.OnPreprocessBuild(report); RequireEnvironment("4", "4"); callbacks.OnPostprocessBuild(report); RequireEnvironment(null, null); Environment.SetEnvironmentVariable("BEE_BUILD_THREADS", "6"); Environment.SetEnvironmentVariable("BINARYEN_CORES", "2"); callbacks.OnPreprocessBuild(report); callbacks.OnPostprocessBuild(report); RequireEnvironment("6", "2"); Environment.SetEnvironmentVariable("BEE_BUILD_THREADS", null); Environment.SetEnvironmentVariable("BINARYEN_CORES", null); callbacks.OnPreprocessBuild(report); // Simulate an aborted build that never invokes its postprocess callback. await Task.Delay(250); RequireEnvironment(null, null); return "PASS: WebGL worker defaults, successful cleanup, explicit overrides, failed-build idle cleanup"; } finally { callbacks.OnPostprocessBuild(report); Environment.SetEnvironmentVariable("BEE_BUILD_THREADS", bee); Environment.SetEnvironmentVariable("BINARYEN_CORES", binaryen); } } static void RequireEnvironment(string bee, string binaryen) { if (Environment.GetEnvironmentVariable("BEE_BUILD_THREADS") != bee || Environment.GetEnvironmentVariable("BINARYEN_CORES") != binaryen) throw new Exception("Unexpected build worker environment"); } public static string GenerateAll() { string previousBee = Environment.GetEnvironmentVariable("BEE_BUILD_THREADS"); string previousBinaryen = Environment.GetEnvironmentVariable("BINARYEN_CORES"); DateTime started = DateTime.UtcNow; try { Debug.Log("[VerifyHybridClrGeneration] Verify standard Generate All and project build callbacks"); PrebuildCommand.GenerateAll(); string directory = SettingsUtil.GetAssembliesPostIl2CppStripDir(EditorUserBuildSettings.activeBuildTarget); string[] dlls = Directory.GetFiles(directory, "*.dll"); if (dlls.Length == 0) throw new Exception("No stripped AOT DLLs generated"); string[] generated = { Path.Combine(SettingsUtil.GeneratedCppDir, "MethodBridge.cpp"), Path.Combine(SettingsUtil.GeneratedCppDir, "UnityVersion.h"), Path.Combine(Application.dataPath, HybridCLRSettings.Instance.outputLinkFile), Path.Combine(Application.dataPath, HybridCLRSettings.Instance.outputAOTGenericReferenceFile) }; foreach (string file in generated) if (!File.Exists(file) || new FileInfo(file).Length == 0 || File.GetLastWriteTimeUtc(file) < started) throw new Exception("Missing or stale generated file: " + file); if (Environment.GetEnvironmentVariable("BEE_BUILD_THREADS") != previousBee || Environment.GetEnvironmentVariable("BINARYEN_CORES") != previousBinaryen) throw new Exception("Build worker environment was not restored"); string output = Path.GetFullPath(Path.Combine(Application.dataPath, "../../Tools/output/hybridclr_genall")); Directory.CreateDirectory(output); string result = JsonConvert.SerializeObject(new { passed = true, target = EditorUserBuildSettings.activeBuildTarget.ToString(), startedUtc = started, completedUtc = DateTime.UtcNow, beeBuildThreads = 4, binaryenCores = 4, environmentRestored = true, generatedFiles = generated.Select(Path.GetFullPath).ToArray(), aotDirectory = Path.GetFullPath(directory), aotDllCount = dlls.Length, aotDlls = dlls.Select(Path.GetFileName).ToArray() }, Formatting.Indented); File.WriteAllText(Path.Combine(output, "generate_all.json"), result); return result; } finally { Environment.SetEnvironmentVariable("BEE_BUILD_THREADS", previousBee); Environment.SetEnvironmentVariable("BINARYEN_CORES", previousBinaryen); } } }