105 lines
3.4 KiB
PowerShell
105 lines
3.4 KiB
PowerShell
# Build PyPI-compliant manylinux wheels for CPython 3.10/3.11/3.12 using Docker Desktop.
|
|
#
|
|
# Usage (from repo root, PowerShell):
|
|
# .\build\build_manylinux_docker.ps1
|
|
# .\build\build_manylinux_docker.ps1 -PythonVersions 3.10,3.11,3.12
|
|
# .\build\build_manylinux_docker.ps1 -PythonVersions 3.11
|
|
# .\build\build_manylinux_docker.ps1 -SkipImageBuild
|
|
#
|
|
# From cmd.exe:
|
|
# powershell -ExecutionPolicy Bypass -File .\build\build_manylinux_docker.ps1
|
|
#
|
|
# Prerequisites:
|
|
# - Docker Desktop running in Linux container mode
|
|
# - Enough disk for the manylinux image (~2GB+)
|
|
|
|
param(
|
|
[ValidateSet("pypi-linux", "internal")]
|
|
[string]$Target = "pypi-linux",
|
|
[string]$PythonVersions = "3.10,3.11,3.12",
|
|
[switch]$SkipImageBuild,
|
|
[string]$ImageName = "orisys-manylinux"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
function Convert-ToManylinuxTag {
|
|
param([string]$Version)
|
|
$v = $Version.Trim()
|
|
switch ($v) {
|
|
"3.10" { return "cp310-cp310" }
|
|
"3.11" { return "cp311-cp311" }
|
|
"3.12" { return "cp312-cp312" }
|
|
"cp310-cp310" { return "cp310-cp310" }
|
|
"cp311-cp311" { return "cp311-cp311" }
|
|
"cp312-cp312" { return "cp312-cp312" }
|
|
default {
|
|
throw "Unsupported Python version '$Version'. Use 3.10, 3.11, and/or 3.12."
|
|
}
|
|
}
|
|
}
|
|
|
|
$RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path
|
|
Set-Location $RepoRoot
|
|
|
|
$tags = @()
|
|
foreach ($part in ($PythonVersions -split ",")) {
|
|
if ([string]::IsNullOrWhiteSpace($part)) { continue }
|
|
$tags += (Convert-ToManylinuxTag $part)
|
|
}
|
|
if ($tags.Count -eq 0) {
|
|
throw "No Python versions specified."
|
|
}
|
|
$pythonTags = [string]::Join(",", $tags)
|
|
|
|
Write-Host "=== Orisys manylinux Docker build ==="
|
|
Write-Host "Repo: $RepoRoot"
|
|
Write-Host "Target: $Target"
|
|
Write-Host "Image: $ImageName"
|
|
Write-Host "Python tags: $pythonTags"
|
|
|
|
# Docker Desktop must be in Linux container mode for manylinux.
|
|
$dockerInfo = docker version --format "{{.Server.Os}}" 2>$null
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "Docker is not available. Start Docker Desktop and retry."
|
|
}
|
|
if ($dockerInfo -ne "linux") {
|
|
throw "Docker server OS is '$dockerInfo'. Switch Docker Desktop to Linux containers."
|
|
}
|
|
|
|
$entrypoint = Join-Path $RepoRoot "build\manylinux_entrypoint.sh"
|
|
# Normalize CRLF -> LF so bash in the container can execute the script.
|
|
$raw = [System.IO.File]::ReadAllText($entrypoint)
|
|
$normalized = $raw -replace "`r`n", "`n" -replace "`r", "`n"
|
|
[System.IO.File]::WriteAllText($entrypoint, $normalized)
|
|
|
|
if (-not $SkipImageBuild) {
|
|
Write-Host "`n=== Building Docker image ==="
|
|
docker build -f build/Dockerfile.manylinux -t $ImageName .
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "docker build failed"
|
|
}
|
|
}
|
|
|
|
Write-Host "`n=== Running manylinux container ==="
|
|
# Mount the repo so artifacts land under dist/repaired and SDK/<version>/ on the host.
|
|
docker run --rm `
|
|
-e "ORISYS_BUILD_TARGET=$Target" `
|
|
-e "ORISYS_PYTHON_TAGS=$pythonTags" `
|
|
-v "${RepoRoot}:/src" `
|
|
$ImageName
|
|
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "manylinux container build failed"
|
|
}
|
|
|
|
Write-Host "`n=== Host artifacts ==="
|
|
$repaired = Join-Path $RepoRoot "dist\repaired"
|
|
if (Test-Path $repaired) {
|
|
Get-ChildItem $repaired -Filter *.whl | ForEach-Object { Write-Host $_.FullName }
|
|
} else {
|
|
Write-Warning "No dist/repaired directory found."
|
|
}
|
|
|
|
Write-Host "`nNext steps: see docs/publishing.md (TestPyPI then PyPI)."
|