mirror of https://github.com/aminya/setup-cpp
feat: install pip and wheel in all cases
This commit is contained in:
parent
0f6b349a1e
commit
6637fda894
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
|
@ -15,34 +15,62 @@ import { setupDnfPack } from "../utils/setup/setupDnfPack"
|
||||||
import { isUbuntu } from "../utils/env/isUbuntu"
|
import { isUbuntu } from "../utils/env/isUbuntu"
|
||||||
import { getExecOutput } from "@actions/exec"
|
import { getExecOutput } from "@actions/exec"
|
||||||
import { isBinUptoDate } from "../utils/setup/version"
|
import { isBinUptoDate } from "../utils/setup/version"
|
||||||
import { getVersion } from "../versions/versions"
|
|
||||||
import assert from "assert"
|
|
||||||
import { execaSync } from "execa"
|
import { execaSync } from "execa"
|
||||||
import { unique } from "../utils/std"
|
import { unique } from "../utils/std"
|
||||||
import { DefaultVersions } from "../versions/default_versions"
|
import { DefaultVersions } from "../versions/default_versions"
|
||||||
|
|
||||||
export async function setupPython(version: string, setupDir: string, arch: string) {
|
export async function setupPython(version: string, setupDir: string, arch: string): Promise<InstallationInfo> {
|
||||||
if (!GITHUB_ACTIONS) {
|
let installInfo: InstallationInfo | undefined
|
||||||
// TODO parse version
|
let foundPython = await findPython()
|
||||||
return setupPythonViaSystem(version, setupDir, arch)
|
|
||||||
|
if (foundPython !== undefined) {
|
||||||
|
const binDir = dirname(foundPython)
|
||||||
|
installInfo = { bin: foundPython, installDir: binDir, binDir }
|
||||||
|
} else {
|
||||||
|
// if python is not found, try to install it
|
||||||
|
if (GITHUB_ACTIONS) {
|
||||||
|
// install python in GitHub Actions
|
||||||
|
try {
|
||||||
|
info("Installing python in GitHub Actions")
|
||||||
|
const { setupActionsPython } = await import("./actions_python")
|
||||||
|
await setupActionsPython(version, setupDir, arch)
|
||||||
|
|
||||||
|
foundPython = (await findPython())!
|
||||||
|
const binDir = dirname(foundPython)
|
||||||
|
installInfo = { bin: foundPython, installDir: binDir, binDir }
|
||||||
|
} catch (err) {
|
||||||
|
warning((err as Error).toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (installInfo === undefined) {
|
||||||
|
// install python via system package manager
|
||||||
|
installInfo = await setupPythonSystem(setupDir, version)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (foundPython === undefined) {
|
||||||
|
foundPython = (await findPython())!
|
||||||
|
installInfo.bin = foundPython
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup pip
|
||||||
|
const foundPip = await findOrSetupPip(foundPython)
|
||||||
|
if (foundPip === undefined) {
|
||||||
|
throw new Error("pip was not installed correctly")
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup wheel
|
||||||
try {
|
try {
|
||||||
info("Installing python in GitHub Actions")
|
setupWheel(foundPython)
|
||||||
const { setupActionsPython } = await import("./actions_python")
|
|
||||||
return setupActionsPython(version, setupDir, arch)
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
warning((err as Error).toString())
|
warning(`Failed to install wheels: ${(err as Error).toString()}. Ignoring...`)
|
||||||
return setupPythonViaSystem(version, setupDir, arch)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return installInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function setupPythonViaSystem(
|
async function setupPythonSystem(setupDir: string, version: string) {
|
||||||
version: string,
|
let installInfo: InstallationInfo | undefined
|
||||||
setupDir: string,
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
_arch: string
|
|
||||||
): Promise<InstallationInfo> {
|
|
||||||
let installInfo: InstallationInfo
|
|
||||||
switch (process.platform) {
|
switch (process.platform) {
|
||||||
case "win32": {
|
case "win32": {
|
||||||
if (setupDir) {
|
if (setupDir) {
|
||||||
|
@ -81,23 +109,9 @@ export async function setupPythonViaSystem(
|
||||||
throw new Error("Unsupported platform")
|
throw new Error("Unsupported platform")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await findOrSetupPip((await findPython())!)
|
|
||||||
return installInfo
|
return installInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
/// setup python and pip if needed
|
|
||||||
export async function findOrSetupPythonAndPip(): Promise<string> {
|
|
||||||
const foundPython = await findOrSetupPython()
|
|
||||||
const foundPip = await findOrSetupPip(foundPython)
|
|
||||||
if (foundPip === undefined) {
|
|
||||||
throw new Error("pip was not installed correctly")
|
|
||||||
}
|
|
||||||
setupWheel(foundPython)
|
|
||||||
return foundPython
|
|
||||||
}
|
|
||||||
|
|
||||||
let setupPythonTried = false
|
|
||||||
|
|
||||||
async function findPython() {
|
async function findPython() {
|
||||||
if (which.sync("python3", { nothrow: true }) !== null) {
|
if (which.sync("python3", { nothrow: true }) !== null) {
|
||||||
return "python3"
|
return "python3"
|
||||||
|
@ -107,23 +121,6 @@ async function findPython() {
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
async function findOrSetupPython() {
|
|
||||||
const maybeFoundPython = await findPython()
|
|
||||||
if (maybeFoundPython !== undefined) {
|
|
||||||
return maybeFoundPython
|
|
||||||
}
|
|
||||||
|
|
||||||
if (setupPythonTried) {
|
|
||||||
throw new Error("Failed to install python")
|
|
||||||
}
|
|
||||||
setupPythonTried = true
|
|
||||||
|
|
||||||
// install python
|
|
||||||
info("python3 was not found. Installing python")
|
|
||||||
await setupPython(getVersion("python", undefined), "", process.arch)
|
|
||||||
return findOrSetupPython() // recurse
|
|
||||||
}
|
|
||||||
|
|
||||||
async function findOrSetupPip(foundPython: string) {
|
async function findOrSetupPip(foundPython: string) {
|
||||||
const maybePip = await findPip()
|
const maybePip = await findPip()
|
||||||
|
|
||||||
|
@ -161,12 +158,14 @@ function ensurePipUpgrade(foundPython: string) {
|
||||||
try {
|
try {
|
||||||
execaSync(foundPython, ["-m", "ensurepip", "-U", "--upgrade"], { stdio: "inherit" })
|
execaSync(foundPython, ["-m", "ensurepip", "-U", "--upgrade"], { stdio: "inherit" })
|
||||||
return true
|
return true
|
||||||
} catch {
|
} catch (err1) {
|
||||||
|
info((err1 as Error)?.toString?.())
|
||||||
try {
|
try {
|
||||||
// ensure pip is disabled on Ubuntu
|
// ensure pip is disabled on Ubuntu
|
||||||
execaSync(foundPython, ["-m", "pip", "install", "--upgrade", "pip"], { stdio: "inherit" })
|
execaSync(foundPython, ["-m", "pip", "install", "--upgrade", "pip"], { stdio: "inherit" })
|
||||||
return true
|
return true
|
||||||
} catch {
|
} catch (err2) {
|
||||||
|
info((err2 as Error)?.toString?.())
|
||||||
// pip module not found
|
// pip module not found
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ export type InstallationInfo = {
|
||||||
/** The top install dir */
|
/** The top install dir */
|
||||||
installDir?: string
|
installDir?: string
|
||||||
binDir: string
|
binDir: string
|
||||||
|
bin?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
let didInit: boolean = false
|
let didInit: boolean = false
|
||||||
|
|
|
@ -3,9 +3,10 @@ import { execaSync } from "execa"
|
||||||
import { pathExists } from "path-exists"
|
import { pathExists } from "path-exists"
|
||||||
import { addExeExt, dirname, join } from "patha"
|
import { addExeExt, dirname, join } from "patha"
|
||||||
import which from "which"
|
import which from "which"
|
||||||
import { addPythonBaseExecPrefix, findOrSetupPythonAndPip } from "../../python/python"
|
import { addPythonBaseExecPrefix, setupPython } from "../../python/python"
|
||||||
import { addPath } from "../env/addEnv"
|
import { addPath } from "../env/addEnv"
|
||||||
import { InstallationInfo } from "./setupBin"
|
import { InstallationInfo } from "./setupBin"
|
||||||
|
import { getVersion } from "../../versions/versions"
|
||||||
|
|
||||||
/* eslint-disable require-atomic-updates */
|
/* eslint-disable require-atomic-updates */
|
||||||
let python: string | undefined
|
let python: string | undefined
|
||||||
|
@ -16,7 +17,7 @@ export async function setupPipPack(name: string, version?: string): Promise<Inst
|
||||||
info(`Installing ${name} ${version ?? ""} via pip`)
|
info(`Installing ${name} ${version ?? ""} via pip`)
|
||||||
|
|
||||||
if (python === undefined) {
|
if (python === undefined) {
|
||||||
python = await findOrSetupPythonAndPip()
|
python = (await setupPython(getVersion("python", undefined), "", process.arch)).bin!
|
||||||
}
|
}
|
||||||
|
|
||||||
execaSync(python, ["-m", "pip", "install", version !== undefined && version !== "" ? `${name}==${version}` : name], {
|
execaSync(python, ["-m", "pip", "install", version !== undefined && version !== "" ? `${name}==${version}` : name], {
|
||||||
|
|
|
@ -28,7 +28,7 @@ export const DefaultVersions: Record<string, string | undefined> = {
|
||||||
task: "3.25.0", // https://github.com/go-task/task/releases
|
task: "3.25.0", // https://github.com/go-task/task/releases
|
||||||
doxygen: isArch() ? "1.9.6-1" : "1.9.7", // https://www.doxygen.nl/download.html // https://packages.ubuntu.com/search?suite=all&arch=any&searchon=names&keywords=doxygen // https://formulae.brew.sh/formula/doxygen // https://archlinux.org/packages/extra/x86_64/doxygen/
|
doxygen: isArch() ? "1.9.6-1" : "1.9.7", // https://www.doxygen.nl/download.html // https://packages.ubuntu.com/search?suite=all&arch=any&searchon=names&keywords=doxygen // https://formulae.brew.sh/formula/doxygen // https://archlinux.org/packages/extra/x86_64/doxygen/
|
||||||
gcc: isArch() ? "13.1.1-1" : "13", // https://github.com/brechtsanders/winlibs_mingw/releases and // https://packages.ubuntu.com/search?suite=all&arch=any&searchon=names&keywords=gcc
|
gcc: isArch() ? "13.1.1-1" : "13", // https://github.com/brechtsanders/winlibs_mingw/releases and // https://packages.ubuntu.com/search?suite=all&arch=any&searchon=names&keywords=gcc
|
||||||
pip: "23.1.2",
|
pip: "22.3.1",
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If an ubuntu versions is not in this map:
|
/// If an ubuntu versions is not in this map:
|
||||||
|
|
Loading…
Reference in New Issue