Files
2026-07-13 12:25:07 +08:00

95 lines
4.1 KiB
JavaScript

// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
import os from "node:os";
import path from "node:path";
import * as url from "node:url";
import * as fs from "node:fs";
import "zx/globals";
const __dirname = url.fileURLToPath(new URL(".", import.meta.url)).slice(0, -1);
const env = process.env.PSP_DEBUG ? "debug" : "release";
const cwd = path.join(process.cwd(), "build", env);
const cmake_dir = path.join(__dirname, "cpp", "perspective");
const { compress } = await import("pro_self_extracting_wasm");
delete process.env.NODE;
async function run_emsdk(cmd) {
const emsdkdir = `${__dirname}/../../.emsdk`;
const { emscripten } = JSON.parse(
fs.readFileSync(`${__dirname}/../../package.json`),
);
if (!emscripten) {
throw new Error("Emscripten version not specified in package.json");
}
await $({ env: { FORCE_COLOR: "1", ...process.env } })`cd ${emsdkdir} \
&& source ./emsdk_env.sh >/dev/null 2>&1 \
&& emsdk activate ${emscripten} >/dev/null \
&& cd ${cwd} \
&& ${cmd}`.verbose();
}
let cmake_flags = [];
let make_flags = [];
if (!!process.env.PSP_BUILD_VERBOSE) {
cmake_flags.push("-Wdev");
cmake_flags.push("--debug-output");
make_flags.push("VERBOSE=1");
} else {
cmake_flags.push("-Wno-dev"); // suppress developer warnings
}
try {
fs.mkdirSync(cwd, { recursive: true });
process.env.CLICOLOR_FORCE = 1;
const out = await $`cargo metadata`;
const p = JSON.parse(out.stdout).packages.find(
(x) => x.name === "perspective-client",
).manifest_path;
const pp = path.parse(p);
await run_emsdk([
`emcmake`,
`cmake`,
cmake_dir,
...cmake_flags,
`-DCMAKE_BUILD_TYPE=${env}`,
`-DRAPIDJSON_BUILD_EXAMPLES=OFF`,
`-DPSP_PROTO_PATH=${pp.dir}`,
`-DCMAKE_COLOR_DIAGNOSTICS=ON`,
]);
await run_emsdk([
`emmake`,
`make`,
`-j${process.env.PSP_NUM_CPUS || os.cpus().length}`,
...make_flags,
]);
fs.cpSync(`build/${env}/web`, "dist/wasm", { recursive: true });
if (!process.env.PSP_HEAP_INSTRUMENTS) {
compress(
`./dist/wasm/perspective-server.wasm`,
`./dist/wasm/perspective-server.wasm`,
);
}
} catch (e) {
console.error(e);
process.exit(1);
}