setup-cpp/src/kcov/kcov.ts

97 lines
3.5 KiB
TypeScript
Raw Normal View History

2021-12-07 19:30:33 +08:00
import execa from "execa"
2022-04-16 15:42:53 +08:00
import { join } from "path"
import untildify from "untildify"
import which from "which"
import { setupCmake } from "../cmake/cmake"
import { getVersion } from "../default_versions"
2021-12-07 19:30:33 +08:00
import { addBinExtension } from "../utils/extension/extension"
import { extractTarByExe } from "../utils/setup/extract"
import { setupAptPack } from "../utils/setup/setupAptPack"
import { setupPacmanPack } from "../utils/setup/setupPacmanPack"
import { InstallationInfo, PackageInfo, setupBin } from "../utils/setup/setupBin"
2022-06-30 10:06:33 +08:00
import { isArch } from "../utils/env/isArch"
import { hasDnf } from "../utils/env/hasDnf"
import { setupDnfPack } from "../utils/setup/setupDnfPack"
import { isUbuntu } from "../utils/env/isUbuntu"
2022-07-23 04:57:11 +08:00
import { addVPrefix, removeVPrefix } from "../utils/setup/version"
import { info } from "../utils/io/io"
2021-12-07 19:30:33 +08:00
2022-07-28 04:35:11 +08:00
function getDownloadKcovPackageInfo(version: string): PackageInfo {
return {
2022-07-28 04:35:11 +08:00
url: `https://github.com/SimonKagstrom/kcov/releases/download/${version}/kcov-amd64.tar.gz`,
extractedFolderName: "",
binRelativeDir: "usr/local/bin",
binFileName: addBinExtension("kcov"),
extractFunction: extractTarByExe,
2021-12-07 19:30:33 +08:00
}
}
function getBuildKcovPackageInfo(version: string): PackageInfo {
const version_number = removeVPrefix(version)
return {
url: `https://github.com/SimonKagstrom/kcov/archive/refs/tags/${version}.tar.gz`,
extractedFolderName: `kcov-${version_number}`,
binRelativeDir: "build/",
binFileName: addBinExtension("kcov"),
extractFunction: buildKcov,
2021-12-07 19:30:33 +08:00
}
}
2022-04-16 15:42:53 +08:00
async function buildKcov(file: string, dest: string) {
const out = await extractTarByExe(file, dest, ["--strip-components=1"])
// build after extraction using CMake
if (which.sync("cmake", { nothrow: true }) === null) {
await setupCmake(getVersion("cmake", undefined), join(untildify(""), "cmake"), "")
}
if (process.platform === "linux") {
2022-06-30 10:06:33 +08:00
if (isArch()) {
setupPacmanPack("libdwarf")
setupPacmanPack("libcurl-openssl")
} else if (hasDnf()) {
setupDnfPack("libdwarf-devel")
setupDnfPack("libcurl-devel")
} else if (isUbuntu()) {
setupAptPack("libdw-dev")
setupAptPack("libcurl4-openssl-dev")
}
2022-04-16 15:42:53 +08:00
}
await execa("cmake", ["-S", "./", "-B", "./build"], { cwd: out, stdio: "inherit" })
await execa("cmake", ["--build", "./build", "--config", "Release"], { cwd: out, stdio: "inherit" })
2022-07-28 04:51:05 +08:00
// execSudo("cmake", ["--install", "./build"], out)
// return "user/local/bin" // the cmake install prefix
2022-07-28 08:42:04 +08:00
return join(out, "build")
2022-04-16 15:42:53 +08:00
}
export async function setupKcov(versionGiven: string, setupDir: string, arch: string) {
2022-07-28 03:30:56 +08:00
if (process.platform !== "linux") {
info("Kcov is not supported on non-linux")
2022-07-23 04:57:11 +08:00
return
}
2022-07-23 04:57:11 +08:00
// parse version
const versionSplit = versionGiven.split("-")
let version = addVPrefix(versionSplit[0])
const installMethod = versionSplit[1] as "binary" | undefined
const version_number = removeVPrefix(version)
// fix inconsistency in tagging
if (version_number === 38) {
version = "v38"
}
let installationInfo: InstallationInfo
if (installMethod === "binary" && version_number >= 39) {
installationInfo = await setupBin("kcov", version, getDownloadKcovPackageInfo, setupDir, arch)
if (isArch()) {
setupPacmanPack("binutils")
} else if (hasDnf()) {
setupDnfPack("binutils")
} else if (isUbuntu()) {
setupAptPack("libbinutils")
2021-12-07 19:30:33 +08:00
}
2022-07-23 04:57:11 +08:00
return installationInfo
} else {
installationInfo = await setupBin("kcov", version, getBuildKcovPackageInfo, setupDir, arch)
2021-12-07 19:30:33 +08:00
}
2022-07-23 04:57:11 +08:00
return installationInfo
2021-12-07 19:30:33 +08:00
}