setup-cpp
Version:
Install all the tools required for building and testing C++/C projects.
63 lines • 9.15 kB
JavaScript
import { join } from "path";
import { info, warning } from "ci-log";
import { execaSync } from "execa"; // brew is not thread-safe
import which from "which";
import { getBrewBinDir, getBrewBinPath, setupBrew } from "./install.js";
import { brewPackInstallDir, brewPackNameAndVersion } from "./pack-install-dir.js";
/* eslint-disable require-atomic-updates */
let hasBrew = false;
/** A function that installs a package using brew
*
* @param name The name of the package
* @param version The version of the package (optional)
* @param options The options for installing the package
*
* @returns The installation information
*/
export async function installBrewPack(name, version, options = {}) {
if (!("overwrite" in options)) {
options.overwrite = true; // default to true if not specified
}
if (options.cask === true) {
options.overwrite = false; // mutually exclusive with --overwrite
}
info(`Installing ${name} ${version ?? ""} via brew`);
if (!hasBrew || which.sync("brew", { nothrow: true }) === null) {
await setupBrew();
hasBrew = true;
}
const brewPath = getBrewBinPath();
const args = [
"install",
brewPackNameAndVersion(name, version),
];
// Add options to args
for (const [key, value] of Object.entries(options)) {
if (typeof value === "boolean" && value) {
args.push(`--${key}`);
}
else if (typeof value === "string") {
args.push(`--${key}`, value);
}
}
// dry run to check if the package is already installed
const dryRun = execaSync(brewPath, [...args, "--dry-run"], { stdio: "pipe" });
const isAlreadyInstalled = dryRun.exitCode === 0
&& (new RegExp(`.*${name}.* is already installed and up-to-date.[\\s\\S]*`)).test(dryRun.stderr);
if (isAlreadyInstalled) {
// if the package is already installed and up-to-date, skip the installation
info(`${name} ${version ?? ""} is already installed and up-to-date`);
}
else {
// install the package if not already installed
execaSync(brewPath, args, { stdio: "inherit" });
}
// get the installation directory
const installDir = await brewPackInstallDir(name, version);
if (installDir === undefined) {
warning(`Failed to find installation directory for ${name} ${version}`);
return { binDir: getBrewBinDir(), installDir: undefined };
}
return { installDir, binDir: join(installDir, "bin") };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC1wYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RhbGwtcGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzNCLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUEsQ0FBQywwQkFBMEI7QUFDNUQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBR3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRiwyQ0FBMkM7QUFDM0MsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFBO0FBRW5COzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsSUFBWSxFQUNaLE9BQWdCLEVBQ2hCLFVBQTJCLEVBQUU7SUFFN0IsSUFBSSxDQUFDLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUEsQ0FBQyxtQ0FBbUM7SUFDOUQsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQSxDQUFDLHNDQUFzQztJQUNsRSxDQUFDO0lBRUQsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLE9BQU8sSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRXBELElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMvRCxNQUFNLFNBQVMsRUFBRSxDQUFBO1FBQ2pCLE9BQU8sR0FBRyxJQUFJLENBQUE7SUFDaEIsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLGNBQWMsRUFBRSxDQUFBO0lBRWpDLE1BQU0sSUFBSSxHQUFHO1FBQ1gsU0FBUztRQUNULHNCQUFzQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7S0FDdEMsQ0FBQTtJQUVELHNCQUFzQjtJQUN0QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ25ELElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZCLENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUM3RSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQztXQUMzQyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxrREFBa0QsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUVsRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDdkIsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxPQUFPLElBQUksRUFBRSxzQ0FBc0MsQ0FBQyxDQUFBO0lBQ3RFLENBQUM7U0FBTSxDQUFDO1FBQ04sK0NBQStDO1FBQy9DLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxNQUFNLFVBQVUsR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUMxRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsNkNBQTZDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFBO0lBQzNELENBQUM7SUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUE7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiXG5pbXBvcnQgeyBpbmZvLCB3YXJuaW5nIH0gZnJvbSBcImNpLWxvZ1wiXG5pbXBvcnQgeyBleGVjYVN5bmMgfSBmcm9tIFwiZXhlY2FcIiAvLyBicmV3IGlzIG5vdCB0aHJlYWQtc2FmZVxuaW1wb3J0IHdoaWNoIGZyb20gXCJ3aGljaFwiXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxhdGlvbkluZm8gfSBmcm9tIFwiLi9JbnN0YWxsYXRpb25JbmZvLmpzXCJcbmltcG9ydCB0eXBlIHsgQnJld1BhY2tPcHRpb25zIH0gZnJvbSBcIi4vaW5zdGFsbC1wYWNrLW9wdGlvbnMuanNcIlxuaW1wb3J0IHsgZ2V0QnJld0JpbkRpciwgZ2V0QnJld0JpblBhdGgsIHNldHVwQnJldyB9IGZyb20gXCIuL2luc3RhbGwuanNcIlxuaW1wb3J0IHsgYnJld1BhY2tJbnN0YWxsRGlyLCBicmV3UGFja05hbWVBbmRWZXJzaW9uIH0gZnJvbSBcIi4vcGFjay1pbnN0YWxsLWRpci5qc1wiXG5cbi8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgKi9cbmxldCBoYXNCcmV3ID0gZmFsc2VcblxuLyoqIEEgZnVuY3Rpb24gdGhhdCBpbnN0YWxscyBhIHBhY2thZ2UgdXNpbmcgYnJld1xuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlXG4gKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSAob3B0aW9uYWwpXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgaW5zdGFsbGluZyB0aGUgcGFja2FnZVxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsYXRpb24gaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxCcmV3UGFjayhcbiAgbmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uPzogc3RyaW5nLFxuICBvcHRpb25zOiBCcmV3UGFja09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8SW5zdGFsbGF0aW9uSW5mbz4ge1xuICBpZiAoIShcIm92ZXJ3cml0ZVwiIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5vdmVyd3JpdGUgPSB0cnVlIC8vIGRlZmF1bHQgdG8gdHJ1ZSBpZiBub3Qgc3BlY2lmaWVkXG4gIH1cbiAgaWYgKG9wdGlvbnMuY2FzayA9PT0gdHJ1ZSkge1xuICAgIG9wdGlvbnMub3ZlcndyaXRlID0gZmFsc2UgLy8gbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggLS1vdmVyd3JpdGVcbiAgfVxuXG4gIGluZm8oYEluc3RhbGxpbmcgJHtuYW1lfSAke3ZlcnNpb24gPz8gXCJcIn0gdmlhIGJyZXdgKVxuXG4gIGlmICghaGFzQnJldyB8fCB3aGljaC5zeW5jKFwiYnJld1wiLCB7IG5vdGhyb3c6IHRydWUgfSkgPT09IG51bGwpIHtcbiAgICBhd2FpdCBzZXR1cEJyZXcoKVxuICAgIGhhc0JyZXcgPSB0cnVlXG4gIH1cblxuICBjb25zdCBicmV3UGF0aCA9IGdldEJyZXdCaW5QYXRoKClcblxuICBjb25zdCBhcmdzID0gW1xuICAgIFwiaW5zdGFsbFwiLFxuICAgIGJyZXdQYWNrTmFtZUFuZFZlcnNpb24obmFtZSwgdmVyc2lvbiksXG4gIF1cblxuICAvLyBBZGQgb3B0aW9ucyB0byBhcmdzXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgJiYgdmFsdWUpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke2tleX1gKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtrZXl9YCwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gZHJ5IHJ1biB0byBjaGVjayBpZiB0aGUgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZFxuICBjb25zdCBkcnlSdW4gPSBleGVjYVN5bmMoYnJld1BhdGgsIFsuLi5hcmdzLCBcIi0tZHJ5LXJ1blwiXSwgeyBzdGRpbzogXCJwaXBlXCIgfSlcbiAgY29uc3QgaXNBbHJlYWR5SW5zdGFsbGVkID0gZHJ5UnVuLmV4aXRDb2RlID09PSAwXG4gICAgJiYgKG5ldyBSZWdFeHAoYC4qJHtuYW1lfS4qIGlzIGFscmVhZHkgaW5zdGFsbGVkIGFuZCB1cC10by1kYXRlLltcXFxcc1xcXFxTXSpgKSkudGVzdChkcnlSdW4uc3RkZXJyKVxuXG4gIGlmIChpc0FscmVhZHlJbnN0YWxsZWQpIHtcbiAgICAvLyBpZiB0aGUgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZCBhbmQgdXAtdG8tZGF0ZSwgc2tpcCB0aGUgaW5zdGFsbGF0aW9uXG4gICAgaW5mbyhgJHtuYW1lfSAke3ZlcnNpb24gPz8gXCJcIn0gaXMgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIHVwLXRvLWRhdGVgKVxuICB9IGVsc2Uge1xuICAgIC8vIGluc3RhbGwgdGhlIHBhY2thZ2UgaWYgbm90IGFscmVhZHkgaW5zdGFsbGVkXG4gICAgZXhlY2FTeW5jKGJyZXdQYXRoLCBhcmdzLCB7IHN0ZGlvOiBcImluaGVyaXRcIiB9KVxuICB9XG5cbiAgLy8gZ2V0IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5XG4gIGNvbnN0IGluc3RhbGxEaXIgPSBhd2FpdCBicmV3UGFja0luc3RhbGxEaXIobmFtZSwgdmVyc2lvbilcbiAgaWYgKGluc3RhbGxEaXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHdhcm5pbmcoYEZhaWxlZCB0byBmaW5kIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yICR7bmFtZX0gJHt2ZXJzaW9ufWApXG4gICAgcmV0dXJuIHsgYmluRGlyOiBnZXRCcmV3QmluRGlyKCksIGluc3RhbGxEaXI6IHVuZGVmaW5lZCB9XG4gIH1cblxuICByZXR1cm4geyBpbnN0YWxsRGlyLCBiaW5EaXI6IGpvaW4oaW5zdGFsbERpciwgXCJiaW5cIikgfVxufVxuIl19