build.js (72 lines of code) (raw):

/* * Copyright (c) 2024, Mozilla Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ "use strict"; const { ArgumentParser } = require("argparse"); const fs = require("fs"); const { spawn, exec } = require("child_process"); const { resolve } = require("path"); function execAndPrint(fun, args) { const child = spawn(fun, args.split(" "), { stdio: "inherit" }); return new Promise((res) => { child.on("close", res); }); } function create() { return execAndPrint("docker", `build -t openjpeg-decoder .`); } function build(type, path) { const workingDir = resolve("."); return execAndPrint( "docker", `run -t -v ${path}:/js -v ${workingDir}:/code --env BUILD_TYPE=${type} --rm openjpeg-decoder` ); } function compile(type, path) { path = resolve(path); fs.access(path, fs.constants.F_OK, (err) => { if (err) { console.log(`Invalid path: ${path}`); return; } exec("docker images openjpeg-decoder", (err, stdout) => { const output = stdout .split("\n") .map((line) => line.trim()) .filter((line) => Boolean(line)); if (output.length === 1) { create().then(() => { build(type, path); }); } else { build(type, path); } }); }); } const parser = new ArgumentParser({ description: "Build Openjpeg decoder", }); parser.add_argument("-C", "--create", { help: "Create the docker image", action: "store_true", }); parser.add_argument("-c", "--compile", { help: "Compile the decoder and output a js file", action: "store_true", }); parser.add_argument("-o", "--output", { help: "Output directory", default: ".", }); parser.add_argument("-t", "--type", { help: "Type (wasm or js)", default: "wasm", }); const args = parser.parse_args(); if (args.create) { create().then(() => { if (args.compile) { compile(args.type, args.output); } }); } else if (args.compile) { compile(args.type, args.output); }