Files
AIGame/AIClient/AgentScripts/VerifyHybridClrGeneration.cs
T

110 lines
5.2 KiB
C#

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<string> 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);
}
}
}