diff --git a/GlitchyEngine/vendor/msdfgen b/GlitchyEngine/vendor/msdfgen index cf87ec3..696623c 160000 --- a/GlitchyEngine/vendor/msdfgen +++ b/GlitchyEngine/vendor/msdfgen @@ -1 +1 @@ -Subproject commit cf87ec3c4fb5e95d1fb3a29b29303a1bd786cea1 +Subproject commit 696623c1cf316f2f084e3d546af20232004b5963 diff --git a/bin/BuildTool/BuildTool.cs b/bin/BuildTool/BuildTool.cs index e1c815b..9c91de2 100644 --- a/bin/BuildTool/BuildTool.cs +++ b/bin/BuildTool/BuildTool.cs @@ -78,7 +78,7 @@ class Program static async Task Main(string[] args) { - List modules = [new BeefWorkspaceModule(), new GlitchyEngineHelperModule(), new ScriptCoreModule(), new SetupNethostModule(), new Box2DModule(), new FreetypeStackModule(), new AllModule()]; + List modules = [new BeefWorkspaceModule(), new GlitchyEngineHelperModule(), new ScriptCoreModule(), new SetupNethostModule(), new Box2DModule(), new FreetypeStackModule(), new MSDFgenModule(), new AllModule()]; // Find dependencies foreach (Module module in modules) diff --git a/bin/BuildTool/Modules/BeefWorkspaceModule.cs b/bin/BuildTool/Modules/BeefWorkspaceModule.cs index 50dcc2a..3a50671 100644 --- a/bin/BuildTool/Modules/BeefWorkspaceModule.cs +++ b/bin/BuildTool/Modules/BeefWorkspaceModule.cs @@ -8,7 +8,7 @@ class BeefWorkspaceModule : Module public override string Name => ModuleName; - public override List DependencyTypes => [typeof(GlitchyEngineHelperModule), typeof(Box2DModule), typeof(FreetypeStackModule)]; + public override List DependencyTypes => [typeof(GlitchyEngineHelperModule), typeof(Box2DModule), typeof(FreetypeStackModule), typeof(MSDFgenModule)]; public override async Task Run(BuildInfo buildInfo) { diff --git a/bin/BuildTool/Modules/MSDFgenModule.cs b/bin/BuildTool/Modules/MSDFgenModule.cs new file mode 100644 index 0000000..cdcd1ed --- /dev/null +++ b/bin/BuildTool/Modules/MSDFgenModule.cs @@ -0,0 +1,84 @@ +using static SimpleExec.Command; + +namespace BuildTool.Modules; + +class MSDFgenModule : Module +{ + public static readonly string ModuleName = "MSDFgen"; + + public override string Name => ModuleName; + + public override List DependencyTypes => [typeof(FreetypeStackModule)]; + + public override async Task Run(BuildInfo buildInfo) + { + string workspaceRoot = buildInfo.WorkingDirectory.WorkspaceRoot; + string msdfgenSrcDir = Path.Combine(workspaceRoot, "GlitchyEngine", "vendor", "msdfgen"); + string buildDir = Path.Combine(workspaceRoot, "build", "msdfgen"); + string distRoot = Path.Combine(msdfgenSrcDir, "msdfgen-beef", "dist"); + + // Freetype headers + libs come from the FreetypeStack module output. + string ftIncludeDir = Path.Combine(workspaceRoot, + "GlitchyEngine", "vendor", "freetype", "harfbuzz", "subprojects", "freetype", "include"); + string ftLibRelease = Path.Combine(workspaceRoot, + "GlitchyEngine", "vendor", "freetype", "dist", "win64", "release", "freetype.lib"); + string ftLibDebug = Path.Combine(workspaceRoot, + "GlitchyEngine", "vendor", "freetype", "dist", "win64", "debug", "freetype.lib"); + + if (buildInfo.ForceRebuild && Directory.Exists(buildDir)) + Directory.Delete(buildDir, recursive: true); + + // Configure once (multi-config VS generator handles both Debug and Release). + if (!Directory.Exists(buildDir)) + { + Console.WriteLine($"[MSDFgen] Configuring CMake -> {buildDir}"); + await RunAsync("cmake", + $"-S \"{msdfgenSrcDir}\" -B \"{buildDir}\" -A x64 " + + $"-DFREETYPE_INCLUDE_DIR=\"{ftIncludeDir}\" " + + $"-DFREETYPE_LIBRARY=\"{ftLibRelease}\" " + + $"-DFREETYPE_LIBRARY_DEBUG=\"{ftLibDebug}\""); + } + + if (buildInfo.BuildDebug) + { + Console.WriteLine("[MSDFgen] Building Debug"); + await RunAsync("cmake", $"--build \"{buildDir}\" --config Debug"); + + string debugDist = Path.Combine(distRoot, "Debug-Win64"); + Directory.CreateDirectory(debugDist); + CopyLibs(buildDir, "Debug", debugDist); + } + + if (buildInfo.BuildRelease) + { + Console.WriteLine("[MSDFgen] Building Release"); + await RunAsync("cmake", $"--build \"{buildDir}\" --config Release"); + + string releaseDist = Path.Combine(distRoot, "Release-Win64"); + Directory.CreateDirectory(releaseDist); + CopyLibs(buildDir, "Release", releaseDist); + } + + return true; + } + + private static void CopyLibs(string buildDir, string config, string distDir) + { + Console.WriteLine($"[MSDFgen] Copying {config} artefacts to {distDir}"); + + // msdfgen-core and msdfgen-ext are built inside the msdfgen/ subdirectory + Copy(Path.Combine(buildDir, "msdfgen", config, "msdfgen-core.lib"), distDir); + Copy(Path.Combine(buildDir, "msdfgen", config, "msdfgen-ext.lib"), distDir); + // msdfgen_c (our C wrapper stub) is at the top-level build dir + Copy(Path.Combine(buildDir, config, "msdfgen_c.lib"), distDir); + } + + private static void Copy(string src, string distDir) + { + if (!File.Exists(src)) + throw new FileNotFoundException($"Expected build artefact not found: {src}"); + + string dst = Path.Combine(distDir, Path.GetFileName(src)); + File.Copy(src, dst, overwrite: true); + } +}