mirror of https://github.com/aminya/setup-cpp
fix: ensure constant initialization order
This commit is contained in:
parent
52047bd03a
commit
4c53a2d376
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,7 @@
|
||||||
import { syncVersions, getVersion } from "../versions/versions"
|
import { syncVersions, getVersion } from "../versions/versions"
|
||||||
import { parseArgs, Inputs } from "../cli-options"
|
import { parseArgs } from "../cli-options"
|
||||||
import { getCompilerInfo } from "../compilers"
|
import { getCompilerInfo } from "../compilers"
|
||||||
|
import { Inputs } from "../tool"
|
||||||
|
|
||||||
jest.setTimeout(300000)
|
jest.setTimeout(300000)
|
||||||
describe("getCompilerInfo", () => {
|
describe("getCompilerInfo", () => {
|
||||||
|
|
|
@ -2,13 +2,7 @@ import { getInput } from "@actions/core"
|
||||||
import { info } from "ci-log"
|
import { info } from "ci-log"
|
||||||
import mri from "mri"
|
import mri from "mri"
|
||||||
import { InstallationInfo } from "./utils/setup/setupBin"
|
import { InstallationInfo } from "./utils/setup/setupBin"
|
||||||
import { setups, tools } from "./tool"
|
import { Inputs, inputs } from "./tool"
|
||||||
|
|
||||||
/** The possible inputs to the program */
|
|
||||||
export type Inputs = keyof typeof setups | "compiler" | "architecture" | "timeout"
|
|
||||||
|
|
||||||
/** an array of possible inputs */
|
|
||||||
export const inputs: Array<Inputs> = ["compiler", "architecture", "timeout", ...tools]
|
|
||||||
|
|
||||||
export function parseArgs(args: string[]): Opts {
|
export function parseArgs(args: string[]): Opts {
|
||||||
return mri<Record<Inputs, string | undefined> & { help: boolean }>(args, {
|
return mri<Record<Inputs, string | undefined> & { help: boolean }>(args, {
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
import { endGroup, startGroup } from "@actions/core"
|
||||||
|
import { error } from "ci-log"
|
||||||
|
import { join } from "patha"
|
||||||
|
import { getSuccessMessage } from "./cli-options"
|
||||||
|
import { InstallationInfo } from "./utils/setup/setupBin"
|
||||||
|
import { setupVCVarsall } from "./vcvarsall/vcvarsall"
|
||||||
|
import { getVersion } from "./versions/versions"
|
||||||
|
import pTimeout from "p-timeout"
|
||||||
|
import { ToolName, setups } from "./tool"
|
||||||
|
|
||||||
|
export const DEFAULT_TIMEOUT = 20 * 60 * 1000 // 20 minutes
|
||||||
|
|
||||||
|
export async function installTool(
|
||||||
|
tool: ToolName,
|
||||||
|
version: string,
|
||||||
|
osVersion: number[] | null,
|
||||||
|
arch: string,
|
||||||
|
setupCppDir: string,
|
||||||
|
successMessages: string[],
|
||||||
|
errorMessages: string[],
|
||||||
|
timeout: number = DEFAULT_TIMEOUT,
|
||||||
|
) {
|
||||||
|
startGroup(`Installing ${tool} ${version}`)
|
||||||
|
let hasLLVM = false
|
||||||
|
try {
|
||||||
|
hasLLVM = await pTimeout(installToolImpl(tool, version, osVersion, arch, hasLLVM, setupCppDir, successMessages), {
|
||||||
|
milliseconds: timeout * 60 * 1000,
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
// push error message to the logger
|
||||||
|
error(e as string | Error)
|
||||||
|
errorMessages.push(`${tool} failed to install`)
|
||||||
|
}
|
||||||
|
endGroup()
|
||||||
|
return hasLLVM
|
||||||
|
}
|
||||||
|
|
||||||
|
async function installToolImpl(
|
||||||
|
tool: ToolName,
|
||||||
|
version: string,
|
||||||
|
osVersion: number[] | null,
|
||||||
|
arch: string,
|
||||||
|
hasLLVM: boolean,
|
||||||
|
setupCppDir: string,
|
||||||
|
successMessages: string[],
|
||||||
|
) {
|
||||||
|
let installationInfo: InstallationInfo | undefined | void
|
||||||
|
if (tool === "vcvarsall") {
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
await setupVCVarsall(getVersion(tool, version, osVersion), undefined, arch, undefined, undefined, false, false)
|
||||||
|
} else {
|
||||||
|
// get the setup function
|
||||||
|
const setupFunction = setups[tool]
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-param-reassign
|
||||||
|
hasLLVM = ["llvm", "clangformat", "clangtidy"].includes(tool)
|
||||||
|
|
||||||
|
// the tool installation directory (for the functions that ue it)
|
||||||
|
const setupDir = join(setupCppDir, hasLLVM ? "llvm" : tool)
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
installationInfo = await setupFunction(getVersion(tool, version, osVersion), setupDir, arch)
|
||||||
|
}
|
||||||
|
// preparing a report string
|
||||||
|
successMessages.push(getSuccessMessage(tool, installationInfo))
|
||||||
|
return hasLLVM
|
||||||
|
}
|
|
@ -35,7 +35,9 @@ async function setupLLVMWithoutActivation_raw(version: string, setupDir: string,
|
||||||
const setupLLVMWithoutActivation = memoize(setupLLVMWithoutActivation_raw, { isPromise: true })
|
const setupLLVMWithoutActivation = memoize(setupLLVMWithoutActivation_raw, { isPromise: true })
|
||||||
|
|
||||||
/** Setup llvm tools (clang tidy, clang format, etc) without activating llvm and using it as the compiler */
|
/** Setup llvm tools (clang tidy, clang format, etc) without activating llvm and using it as the compiler */
|
||||||
export const setupClangTools = setupLLVMWithoutActivation
|
export function setupClangTools(version: string, setupDir: string, arch: string) {
|
||||||
|
return setupLLVMOnly(version, setupDir, arch)
|
||||||
|
}
|
||||||
|
|
||||||
async function setupLLVMOnly(version: string, setupDir: string, arch: string) {
|
async function setupLLVMOnly(version: string, setupDir: string, arch: string) {
|
||||||
const coeredVersion = semverCoerceIfInvalid(version)
|
const coeredVersion = semverCoerceIfInvalid(version)
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { hasNala, isPackageInstalled, setupAptPack } from "../utils/setup/setupA
|
||||||
import { InstallationInfo } from "../utils/setup/setupBin"
|
import { InstallationInfo } from "../utils/setup/setupBin"
|
||||||
import { promises } from "fs"
|
import { promises } from "fs"
|
||||||
import { info } from "console"
|
import { info } from "console"
|
||||||
import { DEFAULT_TIMEOUT } from "../tool"
|
import { DEFAULT_TIMEOUT } from "../installTool"
|
||||||
const { readFile, writeFile, chmod } = promises
|
const { readFile, writeFile, chmod } = promises
|
||||||
|
|
||||||
export async function setupLLVMApt(majorVersion: number): Promise<InstallationInfo> {
|
export async function setupLLVMApt(majorVersion: number): Promise<InstallationInfo> {
|
||||||
|
|
|
@ -11,12 +11,13 @@ import { untildifyUser } from "untildify-user"
|
||||||
import { checkUpdates } from "./check-updates"
|
import { checkUpdates } from "./check-updates"
|
||||||
import { parseArgs, printHelp } from "./cli-options"
|
import { parseArgs, printHelp } from "./cli-options"
|
||||||
import { installCompiler } from "./compilers"
|
import { installCompiler } from "./compilers"
|
||||||
import { installTool, tools } from "./tool"
|
|
||||||
import { finalizeCpprc } from "./utils/env/addEnv"
|
import { finalizeCpprc } from "./utils/env/addEnv"
|
||||||
import { isArch } from "./utils/env/isArch"
|
import { isArch } from "./utils/env/isArch"
|
||||||
import { ubuntuVersion } from "./utils/env/ubuntu_version"
|
import { ubuntuVersion } from "./utils/env/ubuntu_version"
|
||||||
import { setupPacmanPack } from "./utils/setup/setupPacmanPack"
|
import { setupPacmanPack } from "./utils/setup/setupPacmanPack"
|
||||||
import { syncVersions } from "./versions/versions"
|
import { syncVersions } from "./versions/versions"
|
||||||
|
import { installTool } from "./installTool"
|
||||||
|
import { tools } from "./tool"
|
||||||
|
|
||||||
/** The main entry function */
|
/** The main entry function */
|
||||||
async function main(args: string[]): Promise<number> {
|
async function main(args: string[]): Promise<number> {
|
||||||
|
|
67
src/tool.ts
67
src/tool.ts
|
@ -1,11 +1,7 @@
|
||||||
import { endGroup, startGroup } from "@actions/core"
|
|
||||||
import { error } from "ci-log"
|
|
||||||
import { join } from "patha"
|
|
||||||
import { setupBazel } from "./bazel/bazel"
|
import { setupBazel } from "./bazel/bazel"
|
||||||
import { setupBrew } from "./brew/brew"
|
import { setupBrew } from "./brew/brew"
|
||||||
import { setupCcache } from "./ccache/ccache"
|
import { setupCcache } from "./ccache/ccache"
|
||||||
import { setupChocolatey } from "./chocolatey/chocolatey"
|
import { setupChocolatey } from "./chocolatey/chocolatey"
|
||||||
import { getSuccessMessage } from "./cli-options"
|
|
||||||
import { setupCmake } from "./cmake/cmake"
|
import { setupCmake } from "./cmake/cmake"
|
||||||
import { setupConan } from "./conan/conan"
|
import { setupConan } from "./conan/conan"
|
||||||
import { setupCppcheck } from "./cppcheck/cppcheck"
|
import { setupCppcheck } from "./cppcheck/cppcheck"
|
||||||
|
@ -26,11 +22,8 @@ import { setupPython } from "./python/python"
|
||||||
import { setupSccache } from "./sccache/sccache"
|
import { setupSccache } from "./sccache/sccache"
|
||||||
import { setupSevenZip } from "./sevenzip/sevenzip"
|
import { setupSevenZip } from "./sevenzip/sevenzip"
|
||||||
import { setupTask } from "./task/task"
|
import { setupTask } from "./task/task"
|
||||||
import { InstallationInfo } from "./utils/setup/setupBin"
|
|
||||||
import { setupVcpkg } from "./vcpkg/vcpkg"
|
import { setupVcpkg } from "./vcpkg/vcpkg"
|
||||||
import { setupVCVarsall } from "./vcvarsall/vcvarsall"
|
import { setupVCVarsall } from "./vcvarsall/vcvarsall"
|
||||||
import { getVersion } from "./versions/versions"
|
|
||||||
import pTimeout from "p-timeout"
|
|
||||||
|
|
||||||
/** The setup functions */
|
/** The setup functions */
|
||||||
export const setups = {
|
export const setups = {
|
||||||
|
@ -69,60 +62,8 @@ export type ToolName = keyof typeof setups
|
||||||
/** The tools that can be installed */
|
/** The tools that can be installed */
|
||||||
export const tools = Object.keys(setups) as Array<ToolName>
|
export const tools = Object.keys(setups) as Array<ToolName>
|
||||||
|
|
||||||
export const DEFAULT_TIMEOUT = 20 * 60 * 1000 // 20 minutes
|
/** The possible inputs to the program */
|
||||||
|
export type Inputs = keyof typeof setups | "compiler" | "architecture" | "timeout"
|
||||||
|
|
||||||
export async function installTool(
|
/** an array of possible inputs */
|
||||||
tool: ToolName,
|
export const inputs: Array<Inputs> = ["compiler", "architecture", "timeout", ...tools]
|
||||||
version: string,
|
|
||||||
osVersion: number[] | null,
|
|
||||||
arch: string,
|
|
||||||
setupCppDir: string,
|
|
||||||
successMessages: string[],
|
|
||||||
errorMessages: string[],
|
|
||||||
timeout: number = DEFAULT_TIMEOUT,
|
|
||||||
) {
|
|
||||||
startGroup(`Installing ${tool} ${version}`)
|
|
||||||
let hasLLVM = false
|
|
||||||
try {
|
|
||||||
hasLLVM = await pTimeout(installToolImpl(tool, version, osVersion, arch, hasLLVM, setupCppDir, successMessages), {
|
|
||||||
milliseconds: timeout * 60 * 1000,
|
|
||||||
})
|
|
||||||
} catch (e) {
|
|
||||||
// push error message to the logger
|
|
||||||
error(e as string | Error)
|
|
||||||
errorMessages.push(`${tool} failed to install`)
|
|
||||||
}
|
|
||||||
endGroup()
|
|
||||||
return hasLLVM
|
|
||||||
}
|
|
||||||
|
|
||||||
async function installToolImpl(
|
|
||||||
tool: ToolName,
|
|
||||||
version: string,
|
|
||||||
osVersion: number[] | null,
|
|
||||||
arch: string,
|
|
||||||
hasLLVM: boolean,
|
|
||||||
setupCppDir: string,
|
|
||||||
successMessages: string[],
|
|
||||||
) {
|
|
||||||
let installationInfo: InstallationInfo | undefined | void
|
|
||||||
if (tool === "vcvarsall") {
|
|
||||||
// eslint-disable-next-line no-await-in-loop
|
|
||||||
await setupVCVarsall(getVersion(tool, version, osVersion), undefined, arch, undefined, undefined, false, false)
|
|
||||||
} else {
|
|
||||||
// get the setup function
|
|
||||||
const setupFunction = setups[tool]
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-param-reassign
|
|
||||||
hasLLVM = ["llvm", "clangformat", "clangtidy"].includes(tool)
|
|
||||||
|
|
||||||
// the tool installation directory (for the functions that ue it)
|
|
||||||
const setupDir = join(setupCppDir, hasLLVM ? "llvm" : tool)
|
|
||||||
|
|
||||||
// eslint-disable-next-line no-await-in-loop
|
|
||||||
installationInfo = await setupFunction(getVersion(tool, version, osVersion), setupDir, arch)
|
|
||||||
}
|
|
||||||
// preparing a report string
|
|
||||||
successMessages.push(getSuccessMessage(tool, installationInfo))
|
|
||||||
return hasLLVM
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Opts, Inputs } from "../cli-options"
|
import { Opts } from "../cli-options"
|
||||||
|
import { Inputs } from "../tool"
|
||||||
import { DefaultLinuxVersion, DefaultVersions } from "./default_versions"
|
import { DefaultLinuxVersion, DefaultVersions } from "./default_versions"
|
||||||
|
|
||||||
/** Get the default version if passed true or undefined, otherwise return the version itself */
|
/** Get the default version if passed true or undefined, otherwise return the version itself */
|
||||||
|
|
Loading…
Reference in New Issue