From 0e31277eecf555f4b189e469a7387fa98655d333 Mon Sep 17 00:00:00 2001 From: plenarius Date: Mon, 20 Apr 2026 19:51:34 -0400 Subject: [PATCH] feat: add NWNX C++ build pipeline --- packages/backend/src/routes/build.ts | 11 ++++++ .../backend/src/services/build.service.ts | 35 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/packages/backend/src/routes/build.ts b/packages/backend/src/routes/build.ts index 9ff5111..8cf5edc 100644 --- a/packages/backend/src/routes/build.ts +++ b/packages/backend/src/routes/build.ts @@ -4,6 +4,7 @@ import { hotReloadScripts, compileSingle, buildHaks, + buildNWNX, } from "../services/build.service.js"; const router = Router(); @@ -57,4 +58,14 @@ router.post("/haks", async (_req, res) => { } }); +router.post("/nwnx", async (req, res) => { + const { target } = req.body; + try { + const result = await buildNWNX(target); + res.json(result); + } catch (err: any) { + res.status(500).json({ error: err.message }); + } +}); + export default router; diff --git a/packages/backend/src/services/build.service.ts b/packages/backend/src/services/build.service.ts index 93958dc..bb1cef4 100644 --- a/packages/backend/src/services/build.service.ts +++ b/packages/backend/src/services/build.service.ts @@ -120,3 +120,38 @@ export async function buildHaks(): Promise<{ }); return { success, output: result.output }; } + +export async function buildNWNX( + target?: string, +): Promise<{ success: boolean; output: string }> { + const workspacePath = getWorkspacePath(); + + broadcast("build", "start", { type: "nwnx", target }); + + const cmd = target + ? [ + "bash", + "-c", + `cd /build/unified/build-nwnx && cmake --build . --target ${target} --parallel $(nproc)`, + ] + : [ + "bash", + "-c", + "cd /build/unified && mkdir -p build-nwnx && cd build-nwnx && cmake .. && cmake --build . --parallel $(nproc)", + ]; + + const result = await runEphemeralContainer({ + image: "layonara-builder", + cmd, + binds: [`${workspacePath}/repos/unified:/build/unified`], + workingDir: "/build/unified", + }); + + const success = result.statusCode === 0; + broadcast("build", success ? "complete" : "failed", { + type: "nwnx", + target, + exitCode: result.statusCode, + }); + return { success, output: result.output }; +}