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 { getExecOutput } from "@actions/exec"
|
||||
import { isBinUptoDate } from "../utils/setup/version"
|
||||
import { getVersion } from "../versions/versions"
|
||||
import assert from "assert"
|
||||
import { execaSync } from "execa"
|
||||
import { unique } from "../utils/std"
|
||||
import { DefaultVersions } from "../versions/default_versions"
|
||||
|
||||
export async function setupPython(version: string, setupDir: string, arch: string) {
|
||||
if (!GITHUB_ACTIONS) {
|
||||
// TODO parse version
|
||||
return setupPythonViaSystem(version, setupDir, arch)
|
||||
}
|
||||
export async function setupPython(version: string, setupDir: string, arch: string): Promise<InstallationInfo> {
|
||||
let installInfo: InstallationInfo | undefined
|
||||
let foundPython = await findPython()
|
||||
|
||||
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")
|
||||
return setupActionsPython(version, setupDir, arch)
|
||||
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())
|
||||
return setupPythonViaSystem(version, setupDir, arch)
|
||||
}
|
||||
}
|
||||
if (installInfo === undefined) {
|
||||
// install python via system package manager
|
||||
installInfo = await setupPythonSystem(setupDir, version)
|
||||
}
|
||||
}
|
||||
|
||||
export async function setupPythonViaSystem(
|
||||
version: string,
|
||||
setupDir: string,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
_arch: string
|
||||
): Promise<InstallationInfo> {
|
||||
let installInfo: InstallationInfo
|
||||
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 {
|
||||
setupWheel(foundPython)
|
||||
} catch (err) {
|
||||
warning(`Failed to install wheels: ${(err as Error).toString()}. Ignoring...`)
|
||||
}
|
||||
|
||||
return installInfo
|
||||
}
|
||||
|
||||
async function setupPythonSystem(setupDir: string, version: string) {
|
||||
let installInfo: InstallationInfo | undefined
|
||||
switch (process.platform) {
|
||||
case "win32": {
|
||||
if (setupDir) {
|
||||
|
@ -81,23 +109,9 @@ export async function setupPythonViaSystem(
|
|||
throw new Error("Unsupported platform")
|
||||
}
|
||||
}
|
||||
await findOrSetupPip((await findPython())!)
|
||||
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() {
|
||||
if (which.sync("python3", { nothrow: true }) !== null) {
|
||||
return "python3"
|
||||
|
@ -107,23 +121,6 @@ async function findPython() {
|
|||
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) {
|
||||
const maybePip = await findPip()
|
||||
|
||||
|
@ -161,12 +158,14 @@ function ensurePipUpgrade(foundPython: string) {
|
|||
try {
|
||||
execaSync(foundPython, ["-m", "ensurepip", "-U", "--upgrade"], { stdio: "inherit" })
|
||||
return true
|
||||
} catch {
|
||||
} catch (err1) {
|
||||
info((err1 as Error)?.toString?.())
|
||||
try {
|
||||
// ensure pip is disabled on Ubuntu
|
||||
execaSync(foundPython, ["-m", "pip", "install", "--upgrade", "pip"], { stdio: "inherit" })
|
||||
return true
|
||||
} catch {
|
||||
} catch (err2) {
|
||||
info((err2 as Error)?.toString?.())
|
||||
// pip module not found
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ export type InstallationInfo = {
|
|||
/** The top install dir */
|
||||
installDir?: string
|
||||
binDir: string
|
||||
bin?: string
|
||||
}
|
||||
|
||||
let didInit: boolean = false
|
||||
|
|
|
@ -3,9 +3,10 @@ import { execaSync } from "execa"
|
|||
import { pathExists } from "path-exists"
|
||||
import { addExeExt, dirname, join } from "patha"
|
||||
import which from "which"
|
||||
import { addPythonBaseExecPrefix, findOrSetupPythonAndPip } from "../../python/python"
|
||||
import { addPythonBaseExecPrefix, setupPython } from "../../python/python"
|
||||
import { addPath } from "../env/addEnv"
|
||||
import { InstallationInfo } from "./setupBin"
|
||||
import { getVersion } from "../../versions/versions"
|
||||
|
||||
/* eslint-disable require-atomic-updates */
|
||||
let python: string | undefined
|
||||
|
@ -16,7 +17,7 @@ export async function setupPipPack(name: string, version?: string): Promise<Inst
|
|||
info(`Installing ${name} ${version ?? ""} via pip`)
|
||||
|
||||
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], {
|
||||
|
|
|
@ -28,7 +28,7 @@ export const DefaultVersions: Record<string, string | undefined> = {
|
|||
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/
|
||||
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:
|
||||
|
|
Loading…
Reference in New Issue