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

67 lines
3.3 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 path from "path";
import os from "os";
import fs from "fs";
import * as dotenv from "dotenv";
import { getWorkspaceRoot, getWorkspacePackageJson } from "./workspace.mjs";
import "zx/globals";
const pkg = getWorkspacePackageJson();
const emscripten = pkg.emscripten;
dotenv.config({ path: "./.perspectiverc", quiet: true });
function base() {
return path.resolve(getWorkspaceRoot(), ".emsdk").replace(/\\/g, "/");
}
function emsdk_checkout() {
$.sync`git clone https://github.com/emscripten-core/emsdk.git ${base()}`;
}
function emsdk(...args) {
const basedir = base();
const suffix = os.type() == "Windows_NT" ? ".bat" : "";
const emsdkBin = path.join(basedir, "emsdk" + suffix).replace(/\\/g, "/");
$.sync`${emsdkBin} ${args}`;
}
function toolchain_install() {
console.log(`-- Installing Emscripten ${emscripten}`);
$.sync({ cwd: ".emsdk" })`git pull`;
emsdk("install", emscripten);
emsdk("activate", emscripten);
console.log(`-- Emscripten ${emscripten} installed`);
}
function repo_check() {
return fs.existsSync(path.join(base(), "emsdk_env.sh"));
}
if (!process.env.PSP_SKIP_EMSDK_INSTALL) {
// if a stale toolchain is still activated in the shell, these vars break
// emsdk install in a confusing way. ensure they are unset
for (let ev of ["EMSDK", "EMSDK_NODE", "EMSDK_PYTHON", "SSL_CERT_FILE"]) {
delete process.env[ev];
}
if (!repo_check()) {
emsdk_checkout();
}
toolchain_install();
}