native/winui-angle/build.cake (114 lines of code) (raw):
DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));
DirectoryPath ANGLE_PATH = ROOT_PATH.Combine("externals/angle");
DirectoryPath WINAPPSDK_PATH = ROOT_PATH.Combine("externals/winappsdk");
DirectoryPath OUTPUT_PATH = MakeAbsolute(ROOT_PATH.Combine("output/native/winui"));
string ANGLE_VERSION = GetVersion("ANGLE", "release");
#load "../../scripts/cake/native-shared.cake"
#load "../../scripts/cake/msbuild.cake"
Task("sync-ANGLE")
.WithCriteria(IsRunningOnWindows())
.Does(() =>
{
// sync ANGLE
if (!DirectoryExists(ANGLE_PATH)) {
RunProcess("git", $"clone https://github.com/google/angle.git --branch {ANGLE_VERSION} --depth 1 --single-branch --shallow-submodules {ANGLE_PATH}");
}
// sync submodules
var submodules = new[] {
"build",
"testing",
"third_party/zlib",
"third_party/jsoncpp",
"third_party/vulkan-deps",
"third_party/astc-encoder/src",
"tools/clang",
};
foreach (var submodule in submodules) {
var sub = ANGLE_PATH.Combine(submodule);
if (FileExists(sub.CombineWithFilePath("BUILD.gn")) || FileExists(sub.CombineWithFilePath(".gitignore")))
continue;
RunProcess("git", new ProcessSettings {
Arguments = $"submodule update --init --recursive --depth 1 --single-branch {submodule}",
WorkingDirectory = ANGLE_PATH.FullPath,
});
}
// patch the output filenames
{
var toolchain = ANGLE_PATH.CombineWithFilePath("build/toolchain/win/toolchain.gni");
var contents = System.IO.File.ReadAllText(toolchain.FullPath);
var newContents = contents
.Replace("\"${dllname}.lib\"", "\"{{output_dir}}/{{target_output_name}}.lib\"")
.Replace("\"${dllname}.pdb\"", "\"{{output_dir}}/{{target_output_name}}.pdb\"");
if (contents != newContents)
System.IO.File.WriteAllText(toolchain.FullPath, newContents);
}
// set build args
if (!FileExists(ANGLE_PATH.CombineWithFilePath("build/config/gclient_args.gni"))) {
var lines = new[] {
"checkout_angle_internal = false",
"checkout_angle_mesa = false",
"checkout_angle_restricted_traces = false",
"generate_location_tags = false"
};
System.IO.File.WriteAllLines(ANGLE_PATH.CombineWithFilePath("build/config/gclient_args.gni").FullPath, lines);
}
// set version numbers
if (!FileExists(ANGLE_PATH.CombineWithFilePath("build/util/LASTCHANGE"))) {
var lastchange = ANGLE_PATH.CombineWithFilePath("build/util/LASTCHANGE");
RunPython(ANGLE_PATH, ANGLE_PATH.CombineWithFilePath("build/util/lastchange.py"), $"-o {lastchange}");
}
// download rc.exe
var rc_exe = "build/toolchain/win/rc/win/rc.exe";
var rcPath = ANGLE_PATH.CombineWithFilePath(rc_exe);
if (!FileExists(rcPath)) {
var shaPath = ANGLE_PATH.CombineWithFilePath($"{rc_exe}.sha1");
var sha = System.IO.File.ReadAllText(shaPath.FullPath);
var url = $"https://storage.googleapis.com/download/storage/v1/b/chromium-browser-clang/o/rc%2F{sha}?alt=media";
DownloadFile(url, rcPath);
}
// download llvm
if (!FileExists(ANGLE_PATH.CombineWithFilePath("third_party/llvm-build/Release+Asserts/cr_build_revision"))) {
RunPython(ANGLE_PATH, ANGLE_PATH.CombineWithFilePath("tools/clang/scripts/update.py"));
}
// generate Windows App SDK files
if (!FileExists(WINAPPSDK_PATH.CombineWithFilePath("Microsoft.WindowsAppSDK.nuspec"))) {
var setup = ANGLE_PATH.CombineWithFilePath("scripts/winappsdk_setup.py");
RunProcess(
ROOT_PATH.CombineWithFilePath("scripts/vcvarsall.bat"),
$"\"{VS_INSTALL}\" \"x64\" \"{PYTHON_EXE}\" \"{setup}\" --output \"{WINAPPSDK_PATH}\"");
}
});
Task("ANGLE")
.IsDependentOn("sync-ANGLE")
.IsDependentOn("git-sync-deps")
.WithCriteria(IsRunningOnWindows())
.Does(() =>
{
Build("x86");
Build("x64");
Build("arm64");
void Build(string arch)
{
if (Skip(arch)) return;
try {
System.Environment.SetEnvironmentVariable("DEPOT_TOOLS_WIN_TOOLCHAIN", "0");
RunGn(ANGLE_PATH, $"out/winui/{arch}",
$"target_cpu='{arch}' " +
$"is_component_build=false " +
$"is_debug=false " +
$"is_clang=false " +
$"angle_is_winappsdk=true " +
$"winappsdk_dir='{WINAPPSDK_PATH}' " +
$"enable_precompiled_headers=false " +
$"angle_enable_null=false " +
$"angle_enable_wgpu=false " +
$"angle_enable_gl_desktop_backend=false " +
$"angle_enable_vulkan=false");
RunNinja(ANGLE_PATH, $"out/winui/{arch}", "libEGL libGLESv2");
} finally {
System.Environment.SetEnvironmentVariable("DEPOT_TOOLS_WIN_TOOLCHAIN", "");
}
var outDir = OUTPUT_PATH.Combine(arch);
EnsureDirectoryExists(outDir);
CopyFileToDirectory(ANGLE_PATH.CombineWithFilePath($"out/winui/{arch}/libEGL.dll"), outDir);
CopyFileToDirectory(ANGLE_PATH.CombineWithFilePath($"out/winui/{arch}/libEGL.pdb"), outDir);
CopyFileToDirectory(ANGLE_PATH.CombineWithFilePath($"out/winui/{arch}/libGLESv2.dll"), outDir);
CopyFileToDirectory(ANGLE_PATH.CombineWithFilePath($"out/winui/{arch}/libGLESv2.pdb"), outDir);
}
});
Task("Default")
.IsDependentOn("sync-ANGLE")
.IsDependentOn("ANGLE");
RunTarget(TARGET);