mirror of
https://github.com/actions/python-versions.git
synced 2025-12-15 15:32:11 +00:00
Compare commits
49 Commits
3.8.18-996
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8f97023320 | ||
|
|
209af9b943 | ||
|
|
43318d4f4f | ||
|
|
95601e8cfd | ||
|
|
81bbab5835 | ||
|
|
e3b147457c | ||
|
|
26223fb20b | ||
|
|
7406e1d9f7 | ||
|
|
94c566800e | ||
|
|
7c0308cd7d | ||
|
|
bcf6ecc82e | ||
|
|
2eea8c8fed | ||
|
|
56544d4840 | ||
|
|
96e291c21e | ||
|
|
d5e8ad6406 | ||
|
|
5c01d17435 | ||
|
|
bc5b4d5490 | ||
|
|
a12e3a2eaa | ||
|
|
5ebefacc0b | ||
|
|
1c10cada84 | ||
|
|
3854fb534e | ||
|
|
d456108e6b | ||
|
|
e550a75036 | ||
|
|
4f85d6a62f | ||
|
|
e5b79ff409 | ||
|
|
4cee44596d | ||
|
|
d7df8df9ba | ||
|
|
54c77b6778 | ||
|
|
87721c9ae3 | ||
|
|
5bbc2cab12 | ||
|
|
771cbab387 | ||
|
|
7069021fff | ||
|
|
d8ae6ee095 | ||
|
|
dd24c2e5e7 | ||
|
|
48bcef9764 | ||
|
|
5d096de548 | ||
|
|
b0ba1dbe1e | ||
|
|
8eb4ff3a92 | ||
|
|
98e79473eb | ||
|
|
16955773ac | ||
|
|
c41d908608 | ||
|
|
8dd72e5592 | ||
|
|
b8cfd51f65 | ||
|
|
bb9054d05d | ||
|
|
c8a840c660 | ||
|
|
b423327e4a | ||
|
|
2f8ab97baf | ||
|
|
9d3be767fc | ||
|
|
80d68b2b90 |
14
.github/dependabot.yml
vendored
Normal file
14
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
# Enable version updates for GitHub Actions
|
||||||
|
- package-ecosystem: 'github-actions'
|
||||||
|
# Workflow files stored in the default location of `.github/workflows`
|
||||||
|
# You don't need to specify `/.github/workflows` for `directory`. You can use `directory: "/"`.
|
||||||
|
directory: '/'
|
||||||
|
schedule:
|
||||||
|
interval: 'weekly'
|
||||||
115
.github/workflows/build-python-packages.yml
vendored
115
.github/workflows/build-python-packages.yml
vendored
@@ -12,10 +12,15 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
|
THREADING_BUILD_MODES:
|
||||||
|
description: 'CPython threading build modes'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
default: 'default,freethreaded'
|
||||||
PLATFORMS:
|
PLATFORMS:
|
||||||
description: 'Platforms for execution in "os" or "os_arch" format (arch is "x64" by default)'
|
description: 'Platforms for execution in "os" or "os_arch" format (arch is "x64" by default)'
|
||||||
required: true
|
required: true
|
||||||
default: 'ubuntu-20.04,ubuntu-22.04,ubuntu-22.04_arm64,ubuntu-24.04,ubuntu-24.04_arm64,macos-12_x64,macos-14_arm64,windows-2019_x64,windows-2019_x86,windows-2019_arm64'
|
default: 'ubuntu-22.04,ubuntu-22.04_arm64,ubuntu-24.04,ubuntu-24.04_arm64,macos-13_x64,macos-14_arm64,windows-2022_x64,windows-2022_x86,windows-11_arm64'
|
||||||
pull_request:
|
pull_request:
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- 'versions-manifest.json'
|
- 'versions-manifest.json'
|
||||||
@@ -39,37 +44,37 @@ jobs:
|
|||||||
- name: Generate execution matrix
|
- name: Generate execution matrix
|
||||||
id: generate-matrix
|
id: generate-matrix
|
||||||
run: |
|
run: |
|
||||||
[String[]]$configurations = "${{ inputs.platforms || 'ubuntu-20.04,ubuntu-22.04,ubuntu-22.04_arm64,ubuntu-24.04,ubuntu-24.04_arm64,macos-12,macos-14_arm64,windows-2019_x64,windows-2019_x86,windows-2019_arm64' }}".Split(",").Trim()
|
[String[]]$configurations = "${{ inputs.platforms || 'ubuntu-22.04,ubuntu-22.04_arm64,ubuntu-24.04,ubuntu-24.04_arm64,macos-13,macos-14_arm64,windows-2022_x64,windows-2022_x86,windows-11_arm64' }}".Split(",").Trim()
|
||||||
|
[String[]]$buildModes = "${{ inputs.threading_build_modes || 'default' }}".Split(",").Trim()
|
||||||
$matrix = @()
|
$matrix = @()
|
||||||
|
|
||||||
foreach ($configuration in $configurations) {
|
foreach ($configuration in $configurations) {
|
||||||
$parts = $configuration.Split("_")
|
foreach ($buildMode in $buildModes) {
|
||||||
$os = $parts[0]
|
$parts = $configuration.Split("_")
|
||||||
$arch = if ($parts[1]) {$parts[1]} else {"x64"}
|
$os = $parts[0]
|
||||||
switch -wildcard ($os) {
|
$arch = if ($parts[1]) {$parts[1]} else {"x64"}
|
||||||
"*ubuntu*" { $platform = $os.Replace("ubuntu","linux")}
|
switch -wildcard ($os) {
|
||||||
"*macos*" { $platform = 'darwin' }
|
"*ubuntu*" { $platform = $os.Replace("ubuntu","linux"); if ($arch -eq "arm64" ) { $os = "${os}-arm" } }
|
||||||
"*windows*" { $platform = 'win32' }
|
"*macos*" { $platform = 'darwin' }
|
||||||
}
|
"*windows*" { $platform = 'win32'; if ($arch -eq "arm64" ) { $os = "${os}-arm" } }
|
||||||
|
}
|
||||||
if ($configuration -eq "ubuntu-22.04_arm64") {
|
|
||||||
$os = "setup-actions-ubuntu-arm64-2-core"
|
if ($buildMode -eq "freethreaded") {
|
||||||
}
|
if ([semver]"${{ inputs.VERSION }}" -lt [semver]"3.13.0") {
|
||||||
elseif ($configuration -eq "ubuntu-24.04_arm64") {
|
continue;
|
||||||
$os = "setup-actions-ubuntu24-arm64-2-core"
|
}
|
||||||
}
|
$arch += "-freethreaded"
|
||||||
elseif ($configuration -eq "windows-2019_arm64") {
|
}
|
||||||
$os = "setup-actions-windows-arm64-4-core"
|
|
||||||
}
|
$matrix += @{
|
||||||
|
'platform' = $platform
|
||||||
$matrix += @{
|
'os' = $os
|
||||||
'platform' = $platform
|
'arch' = $arch
|
||||||
'os' = $os
|
}
|
||||||
'arch' = $arch
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
echo "matrix=$($matrix | ConvertTo-Json -Compress -AsArray)" >> $env:GITHUB_OUTPUT
|
echo "matrix=$($matrix | ConvertTo-Json -Compress -AsArray)" >> $env:GITHUB_OUTPUT
|
||||||
|
|
||||||
build_python:
|
build_python:
|
||||||
needs: generate_matrix
|
needs: generate_matrix
|
||||||
strategy:
|
strategy:
|
||||||
@@ -80,40 +85,20 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
||||||
steps:
|
steps:
|
||||||
- name: Setup Environment on Windows ARM64 Runner
|
|
||||||
if: matrix.os == 'setup-actions-windows-arm64-4-core'
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
# Install Chocolatey
|
|
||||||
Set-ExecutionPolicy Bypass -Scope Process -Force
|
|
||||||
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
|
||||||
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
|
|
||||||
echo "C:\ProgramData\Chocolatey\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
|
||||||
|
|
||||||
# Install PowerShell
|
|
||||||
choco install powershell-core -y
|
|
||||||
echo "C:\Program Files\PowerShell\7" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
|
||||||
|
|
||||||
# Install Git
|
|
||||||
choco install git -y
|
|
||||||
echo "C:\Program Files\Git\cmd" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
|
||||||
|
|
||||||
|
|
||||||
# Install 7-Zip
|
|
||||||
choco install 7zip -y
|
|
||||||
echo "C:\ProgramData\chocolatey\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
|
||||||
|
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
|
- name: Adding Symlink
|
||||||
|
if: matrix.os == 'macos-13'
|
||||||
|
run: ln -sf /usr/local/opt/tcl-tk@8 /usr/local/opt/tcl-tk
|
||||||
|
|
||||||
- name: Build Python ${{ env.VERSION }}
|
- name: Build Python ${{ env.VERSION }}
|
||||||
run: |
|
run: |
|
||||||
./builders/build-python.ps1 -Version $env:VERSION `
|
./builders/build-python.ps1 -Version $env:VERSION `
|
||||||
-Platform ${{ matrix.platform }} -Architecture ${{ matrix.arch }}
|
-Platform ${{ matrix.platform }} -Architecture ${{ matrix.arch }}
|
||||||
|
|
||||||
- name: Publish artifact
|
- name: Publish artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -131,29 +116,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
||||||
steps:
|
steps:
|
||||||
- name: Setup Environment on Windows ARM64 Runner
|
|
||||||
if: matrix.os == 'setup-actions-windows-arm64-4-core'
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
# Install Chocolatey
|
|
||||||
Set-ExecutionPolicy Bypass -Scope Process -Force
|
|
||||||
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
|
||||||
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
|
|
||||||
echo "C:\ProgramData\Chocolatey\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
|
||||||
|
|
||||||
# Install PowerShell
|
|
||||||
choco install powershell-core -y
|
|
||||||
echo "C:\Program Files\PowerShell\7" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
|
||||||
|
|
||||||
# Install Git
|
|
||||||
choco install git -y
|
|
||||||
echo "C:\Program Files\Git\cmd" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
|
||||||
|
|
||||||
|
|
||||||
# Install 7-Zip
|
|
||||||
choco install 7zip -y
|
|
||||||
echo "C:\ProgramData\chocolatey\bin" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8
|
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@@ -201,6 +163,9 @@ jobs:
|
|||||||
python-version: ${{ env.VERSION }}
|
python-version: ${{ env.VERSION }}
|
||||||
architecture: ${{ matrix.arch }}
|
architecture: ${{ matrix.arch }}
|
||||||
|
|
||||||
|
- name: Python version
|
||||||
|
run: python -VVV
|
||||||
|
|
||||||
- name: Verbose sysconfig dump
|
- name: Verbose sysconfig dump
|
||||||
if: runner.os == 'Linux' || runner.os == 'macOS'
|
if: runner.os == 'Linux' || runner.os == 'macOS'
|
||||||
run: python ./sources/python-config-output.py
|
run: python ./sources/python-config-output.py
|
||||||
|
|||||||
3
.github/workflows/codeql-analysis.yml
vendored
3
.github/workflows/codeql-analysis.yml
vendored
@@ -13,4 +13,5 @@ jobs:
|
|||||||
name: CodeQL analysis
|
name: CodeQL analysis
|
||||||
uses: actions/reusable-workflows/.github/workflows/codeql-analysis.yml@main
|
uses: actions/reusable-workflows/.github/workflows/codeql-analysis.yml@main
|
||||||
with:
|
with:
|
||||||
languages: "['python']"
|
languages: '["python"]'
|
||||||
|
|
||||||
|
|||||||
4
.github/workflows/get-python-versions.yml
vendored
4
.github/workflows/get-python-versions.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
name: Get Python versions
|
name: Get Python versions
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 3,15 * * *'
|
- cron: '0 0,12 * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -10,4 +10,4 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
tool-name: "Python"
|
tool-name: "Python"
|
||||||
image-url: "https://avatars.githubusercontent.com/u/1525981?s=200&v=4"
|
image-url: "https://avatars.githubusercontent.com/u/1525981?s=200&v=4"
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|||||||
4
.github/workflows/releases-validation.yml
vendored
4
.github/workflows/releases-validation.yml
vendored
@@ -14,8 +14,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04]
|
os: [macos-latest, windows-latest, ubuntu-22.04, ubuntu-latest, macos-13]
|
||||||
python: [3.9.13, 3.10.11, 3.11.8]
|
python: [3.9.13, 3.10.11, 3.11.8, 3.12.7, 3.13.0]
|
||||||
steps:
|
steps:
|
||||||
- name: setup-python ${{ matrix.python }}
|
- name: setup-python ${{ matrix.python }}
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
|
|||||||
2
.github/workflows/test-python-version.yml
vendored
2
.github/workflows/test-python-version.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [macos-latest, windows-latest, ubuntu-20.04, ubuntu-22.04]
|
os: [macos-latest, windows-latest, ubuntu-22.04, ubuntu-latest, macos-13]
|
||||||
steps:
|
steps:
|
||||||
- name: Setup Python ${{ github.event.inputs.version }}
|
- name: Setup Python ${{ github.event.inputs.version }}
|
||||||
uses: actions/setup-python@main
|
uses: actions/setup-python@main
|
||||||
|
|||||||
@@ -31,14 +31,6 @@ class macOSPythonBuilder : NixPythonBuilder {
|
|||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Prepare system environment by installing dependencies and required packages.
|
Prepare system environment by installing dependencies and required packages.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
if ($this.Version -eq "3.7.17") {
|
|
||||||
# We have preinstalled ncurses and readLine on the hoster runners. But we need to install bzip2 for
|
|
||||||
# setting up an environemnt
|
|
||||||
# If we get any issues realted to ncurses or readline we can try to run this command
|
|
||||||
# brew install ncurses readline
|
|
||||||
Execute-Command -Command "brew install bzip2"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] Configure() {
|
[void] Configure() {
|
||||||
@@ -58,46 +50,20 @@ class macOSPythonBuilder : NixPythonBuilder {
|
|||||||
### will never be used itself by a Github Actions runner but using a universal2 Python is the only way to build
|
### will never be used itself by a Github Actions runner but using a universal2 Python is the only way to build
|
||||||
### universal2 C extensions and wheels. This is supported by Python >= 3.10 and was backported to Python >=
|
### universal2 C extensions and wheels. This is supported by Python >= 3.10 and was backported to Python >=
|
||||||
### 3.9.1 and >= 3.8.10.
|
### 3.9.1 and >= 3.8.10.
|
||||||
### Disabled, discussion: https://github.com/actions/python-versions/pull/114
|
|
||||||
# if ($this.Version -ge "3.8.10" -and $this.Version -ne "3.8.13" -and $this.Version -ne "3.9.0" ) {
|
|
||||||
# $configureString += " --enable-universalsdk --with-universal-archs=universal2"
|
|
||||||
# }
|
|
||||||
|
|
||||||
### OS X 10.11, Apple no longer provides header files for the deprecated system version of OpenSSL.
|
### OS X 10.11, Apple no longer provides header files for the deprecated system version of OpenSSL.
|
||||||
### Solution is to install these libraries from a third-party package manager,
|
### Solution is to install these libraries from a third-party package manager,
|
||||||
### and then add the appropriate paths for the header and library files to configure command.
|
### and then add the appropriate paths for the header and library files to configure command.
|
||||||
### Link to documentation (https://cpython-devguide.readthedocs.io/setup/#build-dependencies)
|
### Link to documentation (https://cpython-devguide.readthedocs.io/setup/#build-dependencies)
|
||||||
if ($this.Version -lt "3.7.0") {
|
$configureString += " --with-openssl=/usr/local/opt/openssl@3"
|
||||||
$env:LDFLAGS = "-L/usr/local/opt/openssl@1.1/lib -L/usr/local/opt/zlib/lib"
|
$configureString += " --with-tcltk-includes='-I /usr/local/opt/tcl-tk/include/tcl-tk' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'"
|
||||||
$env:CFLAGS = "-I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/zlib/include"
|
|
||||||
} else {
|
|
||||||
$configureString += " --with-openssl=/usr/local/opt/openssl@1.1"
|
|
||||||
|
|
||||||
# For Python 3.7.2 and 3.7.3 we need to provide PATH for zlib to pack it properly. Otherwise the build will fail
|
### Compile with support of loadable sqlite extensions.
|
||||||
# with the error: zipimport.ZipImportError: can't decompress data; zlib not available
|
|
||||||
if ($this.Version -eq "3.7.2" -or $this.Version -eq "3.7.3" -or $this.Version -eq "3.7.17") {
|
|
||||||
$env:LDFLAGS = "-L/usr/local/opt/zlib/lib"
|
|
||||||
$env:CFLAGS = "-I/usr/local/opt/zlib/include"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this.Version -gt "3.7.12") {
|
|
||||||
$configureString += " --with-tcltk-includes='-I /usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this.Version -eq "3.7.17") {
|
|
||||||
$env:LDFLAGS += " -L$(brew --prefix bzip2)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix ncurses)/lib"
|
|
||||||
$env:CFLAGS += " -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(brew --prefix ncurses)/include"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
### Compile with support of loadable sqlite extensions. Unavailable for Python 2.*
|
|
||||||
### Link to documentation (https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.enable_load_extension)
|
### Link to documentation (https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.enable_load_extension)
|
||||||
if ($this.Version -ge "3.2.0") {
|
$configureString += " --enable-loadable-sqlite-extensions"
|
||||||
$configureString += " --enable-loadable-sqlite-extensions"
|
$env:LDFLAGS += " -L$(brew --prefix sqlite3)/lib"
|
||||||
$env:LDFLAGS += " -L$(brew --prefix sqlite3)/lib"
|
$env:CFLAGS += " -I$(brew --prefix sqlite3)/include"
|
||||||
$env:CFLAGS += " -I$(brew --prefix sqlite3)/include"
|
$env:CPPFLAGS += "-I$(brew --prefix sqlite3)/include"
|
||||||
$env:CPPFLAGS += "-I$(brew --prefix sqlite3)/include"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "The passed configure options are: "
|
Write-Host "The passed configure options are: "
|
||||||
Write-Host $configureString
|
Write-Host $configureString
|
||||||
@@ -151,6 +117,37 @@ class macOSPythonBuilder : NixPythonBuilder {
|
|||||||
return $pkgLocation
|
return $pkgLocation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[string] GetFrameworkName() {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Get the Python installation Package name.
|
||||||
|
#>
|
||||||
|
|
||||||
|
if ($this.IsFreeThreaded()) {
|
||||||
|
return "PythonT.framework"
|
||||||
|
} else {
|
||||||
|
return "Python.framework"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] GetPkgChoices() {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Reads the configuration XML file for the Python installer
|
||||||
|
#>
|
||||||
|
|
||||||
|
$config = if ($this.IsFreeThreaded()) { "freethreaded" } else { "default" }
|
||||||
|
$choicesFile = Join-Path $PSScriptRoot "../config/macos-pkg-choices-$($config).xml"
|
||||||
|
$choicesTemplate = Get-Content -Path $choicesFile -Raw
|
||||||
|
|
||||||
|
$variablesToReplace = @{
|
||||||
|
"{{__VERSION_MAJOR_MINOR__}}" = "$($this.Version.Major).$($this.Version.Minor)";
|
||||||
|
}
|
||||||
|
|
||||||
|
$variablesToReplace.keys | ForEach-Object { $choicesTemplate = $choicesTemplate.Replace($_, $variablesToReplace[$_]) }
|
||||||
|
return $choicesTemplate
|
||||||
|
}
|
||||||
|
|
||||||
[void] CreateInstallationScriptPkg() {
|
[void] CreateInstallationScriptPkg() {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
@@ -165,6 +162,8 @@ class macOSPythonBuilder : NixPythonBuilder {
|
|||||||
"{{__VERSION_FULL__}}" = $this.Version;
|
"{{__VERSION_FULL__}}" = $this.Version;
|
||||||
"{{__PKG_NAME__}}" = $this.GetPkgName();
|
"{{__PKG_NAME__}}" = $this.GetPkgName();
|
||||||
"{{__ARCH__}}" = $this.Architecture;
|
"{{__ARCH__}}" = $this.Architecture;
|
||||||
|
"{{__FRAMEWORK_NAME__}}" = $this.GetFrameworkName();
|
||||||
|
"{{__PKG_CHOICES__}}" = $this.GetPkgChoices();
|
||||||
}
|
}
|
||||||
|
|
||||||
$variablesToReplace.keys | ForEach-Object { $installationTemplateContent = $installationTemplateContent.Replace($_, $variablesToReplace[$_]) }
|
$variablesToReplace.keys | ForEach-Object { $installationTemplateContent = $installationTemplateContent.Replace($_, $variablesToReplace[$_]) }
|
||||||
|
|||||||
@@ -61,8 +61,7 @@ class NixPythonBuilder : PythonBuilder {
|
|||||||
Return name of Python binary.
|
Return name of Python binary.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
if ($this.Version.Major -eq 2) { $pythonBinary = "python" } else { $pythonBinary = "python3" }
|
return "python3"
|
||||||
return $pythonBinary
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] Download() {
|
[string] Download() {
|
||||||
@@ -115,7 +114,7 @@ class NixPythonBuilder : PythonBuilder {
|
|||||||
Write-Debug "make Python $($this.Version)-$($this.Architecture) $($this.Platform)"
|
Write-Debug "make Python $($this.Version)-$($this.Architecture) $($this.Platform)"
|
||||||
$buildOutputLocation = New-Item -Path $this.WorkFolderLocation -Name "build_output.txt" -ItemType File
|
$buildOutputLocation = New-Item -Path $this.WorkFolderLocation -Name "build_output.txt" -ItemType File
|
||||||
|
|
||||||
Execute-Command -Command "make 2>&1 | tee $buildOutputLocation" -ErrorAction Continue
|
Execute-Command -Command "make 2>&1 | tee $buildOutputLocation" -ErrorAction Continue
|
||||||
Execute-Command -Command "make install" -ErrorAction Continue
|
Execute-Command -Command "make install" -ErrorAction Continue
|
||||||
|
|
||||||
Write-Debug "Done; Make log location: $buildOutputLocation"
|
Write-Debug "Done; Make log location: $buildOutputLocation"
|
||||||
|
|||||||
@@ -94,6 +94,24 @@ class PythonBuilder {
|
|||||||
return "$($this.Version.Major).$($this.Version.Minor).$($this.Version.Patch)"
|
return "$($this.Version.Major).$($this.Version.Minor).$($this.Version.Patch)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[string] GetHardwareArchitecture() {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
The hardware architecture (x64, arm64) without any Python free threading suffix.
|
||||||
|
#>
|
||||||
|
|
||||||
|
return $this.Architecture.Replace("-freethreaded", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
[bool] IsFreeThreaded() {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Check if Python version is free threaded.
|
||||||
|
#>
|
||||||
|
|
||||||
|
return $this.Architecture.EndsWith("-freethreaded")
|
||||||
|
}
|
||||||
|
|
||||||
[void] PreparePythonToolcacheLocation() {
|
[void] PreparePythonToolcacheLocation() {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
|
|||||||
@@ -37,6 +37,14 @@ class UbuntuPythonBuilder : NixPythonBuilder {
|
|||||||
$configureString += " --enable-shared"
|
$configureString += " --enable-shared"
|
||||||
$configureString += " --enable-optimizations"
|
$configureString += " --enable-optimizations"
|
||||||
|
|
||||||
|
if ($this.IsFreeThreaded()) {
|
||||||
|
if ($this.Version -lt "3.13.0") {
|
||||||
|
Write-Host "Python versions lower than 3.13.0 do not support free threading"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
$configureString += " --disable-gil"
|
||||||
|
}
|
||||||
|
|
||||||
### Compile with support of loadable sqlite extensions.
|
### Compile with support of loadable sqlite extensions.
|
||||||
### Link to documentation (https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.enable_load_extension)
|
### Link to documentation (https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.enable_load_extension)
|
||||||
$configureString += " --enable-loadable-sqlite-extensions"
|
$configureString += " --enable-loadable-sqlite-extensions"
|
||||||
@@ -53,8 +61,8 @@ class UbuntuPythonBuilder : NixPythonBuilder {
|
|||||||
Prepare system environment by installing dependencies and required packages.
|
Prepare system environment by installing dependencies and required packages.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
if ($this.Version -lt "3.5.3") {
|
if ($this.Version -lt "3.9.0") {
|
||||||
Write-Host "Python versions lower than 3.5.3 are not supported"
|
Write-Host "Python versions lower than 3.9.0 are not supported"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,9 +42,7 @@ class WinPythonBuilder : PythonBuilder {
|
|||||||
Return extension for required version of Python executable.
|
Return extension for required version of Python executable.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
$extension = if ($this.Version -lt "3.5" -and $this.Version -ge "2.5") { ".msi" } else { ".exe" }
|
return ".exe"
|
||||||
|
|
||||||
return $extension
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] GetArchitectureExtension() {
|
[string] GetArchitectureExtension() {
|
||||||
@@ -54,13 +52,9 @@ class WinPythonBuilder : PythonBuilder {
|
|||||||
#>
|
#>
|
||||||
|
|
||||||
$ArchitectureExtension = ""
|
$ArchitectureExtension = ""
|
||||||
if ($this.Architecture -eq "x64") {
|
if ($this.GetHardwareArchitecture() -eq "x64") {
|
||||||
if ($this.Version -ge "3.5") {
|
$ArchitectureExtension = "-amd64"
|
||||||
$ArchitectureExtension = "-amd64"
|
} elseif ($this.GetHardwareArchitecture() -eq "arm64") {
|
||||||
} else {
|
|
||||||
$ArchitectureExtension = ".amd64"
|
|
||||||
}
|
|
||||||
}elseif ($this.Architecture -eq "arm64") {
|
|
||||||
$ArchitectureExtension = "-arm64"
|
$ArchitectureExtension = "-arm64"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,6 +107,7 @@ class WinPythonBuilder : PythonBuilder {
|
|||||||
|
|
||||||
$variablesToReplace = @{
|
$variablesToReplace = @{
|
||||||
"{{__ARCHITECTURE__}}" = $this.Architecture;
|
"{{__ARCHITECTURE__}}" = $this.Architecture;
|
||||||
|
"{{__HARDWARE_ARCHITECTURE__}}" = $this.GetHardwareArchitecture();
|
||||||
"{{__VERSION__}}" = $this.Version;
|
"{{__VERSION__}}" = $this.Version;
|
||||||
"{{__PYTHON_EXEC_NAME__}}" = $pythonExecName
|
"{{__PYTHON_EXEC_NAME__}}" = $pythonExecName
|
||||||
}
|
}
|
||||||
|
|||||||
8
config/macos-pkg-choices-default.xml
Normal file
8
config/macos-pkg-choices-default.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</plist>
|
||||||
14
config/macos-pkg-choices-freethreaded.xml
Normal file
14
config/macos-pkg-choices-freethreaded.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>attributeSetting</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>choiceAttribute</key>
|
||||||
|
<string>selected</string>
|
||||||
|
<key>choiceIdentifier</key>
|
||||||
|
<string>org.python.Python.PythonTFramework-{{__VERSION_MAJOR_MINOR__}}</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</plist>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"regex": "python-\\d+\\.\\d+\\.\\d+-(\\w+\\.\\d+)?-?(\\w+)-(\\d+\\.\\d+)?-?((x|arm)\\d+)",
|
"regex": "python-\\d+\\.\\d+\\.\\d+-(\\w+\\.\\d+)?-?(\\w+)-(\\d+\\.\\d+)?-?((x|arm)\\d+(-freethreaded)?)",
|
||||||
"groups": {
|
"groups": {
|
||||||
"arch": 4,
|
"arch": 4,
|
||||||
"platform": 2,
|
"platform": 2,
|
||||||
|
|||||||
@@ -2,6 +2,11 @@ set -e
|
|||||||
|
|
||||||
PYTHON_FULL_VERSION="{{__VERSION_FULL__}}"
|
PYTHON_FULL_VERSION="{{__VERSION_FULL__}}"
|
||||||
PYTHON_PKG_NAME="{{__PKG_NAME__}}"
|
PYTHON_PKG_NAME="{{__PKG_NAME__}}"
|
||||||
|
PYTHON_FRAMEWORK_NAME="{{__FRAMEWORK_NAME__}}"
|
||||||
|
PYTHON_PKG_CHOICES=$(cat << 'EOF'
|
||||||
|
{{__PKG_CHOICES__}}
|
||||||
|
EOF
|
||||||
|
)
|
||||||
ARCH="{{__ARCH__}}"
|
ARCH="{{__ARCH__}}"
|
||||||
MAJOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 1)
|
MAJOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 1)
|
||||||
MINOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 2)
|
MINOR_VERSION=$(echo $PYTHON_FULL_VERSION | cut -d '.' -f 2)
|
||||||
@@ -20,7 +25,7 @@ fi
|
|||||||
PYTHON_TOOLCACHE_PATH=$TOOLCACHE_ROOT/Python
|
PYTHON_TOOLCACHE_PATH=$TOOLCACHE_ROOT/Python
|
||||||
PYTHON_TOOLCACHE_VERSION_PATH=$PYTHON_TOOLCACHE_PATH/$PYTHON_FULL_VERSION
|
PYTHON_TOOLCACHE_VERSION_PATH=$PYTHON_TOOLCACHE_PATH/$PYTHON_FULL_VERSION
|
||||||
PYTHON_TOOLCACHE_VERSION_ARCH_PATH=$PYTHON_TOOLCACHE_VERSION_PATH/$ARCH
|
PYTHON_TOOLCACHE_VERSION_ARCH_PATH=$PYTHON_TOOLCACHE_VERSION_PATH/$ARCH
|
||||||
PYTHON_FRAMEWORK_PATH="/Library/Frameworks/Python.framework/Versions/${MAJOR_VERSION}.${MINOR_VERSION}"
|
PYTHON_FRAMEWORK_PATH="/Library/Frameworks/${PYTHON_FRAMEWORK_NAME}/Versions/${MAJOR_VERSION}.${MINOR_VERSION}"
|
||||||
PYTHON_APPLICATION_PATH="/Applications/Python ${MAJOR_VERSION}.${MINOR_VERSION}"
|
PYTHON_APPLICATION_PATH="/Applications/Python ${MAJOR_VERSION}.${MINOR_VERSION}"
|
||||||
|
|
||||||
echo "Check if Python hostedtoolcache folder exist..."
|
echo "Check if Python hostedtoolcache folder exist..."
|
||||||
@@ -38,8 +43,11 @@ else
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
PYTHON_PKG_CHOICES_FILES=$(mktemp)
|
||||||
|
echo "$PYTHON_PKG_CHOICES" > $PYTHON_PKG_CHOICES_FILES
|
||||||
|
|
||||||
echo "Install Python binaries from prebuilt package"
|
echo "Install Python binaries from prebuilt package"
|
||||||
sudo installer -pkg $PYTHON_PKG_NAME -target /
|
sudo installer -pkg $PYTHON_PKG_NAME -applyChoiceChangesXML $PYTHON_PKG_CHOICES_FILES -target /
|
||||||
|
|
||||||
echo "Create hostedtoolcach symlinks (Required for the backward compatibility)"
|
echo "Create hostedtoolcach symlinks (Required for the backward compatibility)"
|
||||||
echo "Create Python $PYTHON_FULL_VERSION folder"
|
echo "Create Python $PYTHON_FULL_VERSION folder"
|
||||||
@@ -53,7 +61,9 @@ ln -s "${PYTHON_FRAMEWORK_PATH}/lib" lib
|
|||||||
|
|
||||||
echo "Create additional symlinks (Required for the UsePythonVersion Azure Pipelines task and the setup-python GitHub Action)"
|
echo "Create additional symlinks (Required for the UsePythonVersion Azure Pipelines task and the setup-python GitHub Action)"
|
||||||
ln -s ./bin/$PYTHON_MAJOR_DOT_MINOR python
|
ln -s ./bin/$PYTHON_MAJOR_DOT_MINOR python
|
||||||
|
chmod +x python
|
||||||
|
|
||||||
|
# Note that bin is a symlink so referencing .. from bin will not work as expected
|
||||||
cd bin/
|
cd bin/
|
||||||
|
|
||||||
# This symlink already exists if Python version with the same major.minor version is installed,
|
# This symlink already exists if Python version with the same major.minor version is installed,
|
||||||
@@ -62,11 +72,15 @@ if [ ! -f $PYTHON_MAJOR_MINOR ]; then
|
|||||||
ln -s $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJOR_MINOR
|
ln -s $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJOR_MINOR
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -f $PYTHON_MAJOR ]; then
|
||||||
|
ln -s $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJOR
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -f python ]; then
|
if [ ! -f python ]; then
|
||||||
ln -s $PYTHON_MAJOR_DOT_MINOR python
|
ln -s $PYTHON_MAJOR_DOT_MINOR python
|
||||||
fi
|
fi
|
||||||
|
|
||||||
chmod +x ../python $PYTHON_MAJOR $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJOR_MINOR python
|
chmod +x $PYTHON_MAJOR $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJOR_MINOR python
|
||||||
|
|
||||||
echo "Upgrading pip..."
|
echo "Upgrading pip..."
|
||||||
export PIP_ROOT_USER_ACTION=ignore
|
export PIP_ROOT_USER_ACTION=ignore
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ echo "Check if Python hostedtoolcache folder exist..."
|
|||||||
if [ ! -d $PYTHON_TOOLCACHE_PATH ]; then
|
if [ ! -d $PYTHON_TOOLCACHE_PATH ]; then
|
||||||
echo "Creating Python hostedtoolcache folder..."
|
echo "Creating Python hostedtoolcache folder..."
|
||||||
mkdir -p $PYTHON_TOOLCACHE_PATH
|
mkdir -p $PYTHON_TOOLCACHE_PATH
|
||||||
elif [ -d $PYTHON_TOOLCACHE_VERSION_PATH ]; then
|
elif [ -d $PYTHON_TOOLCACHE_VERSION_ARCH_PATH ]; then
|
||||||
echo "Deleting Python $PYTHON_FULL_VERSION"
|
echo "Deleting Python $PYTHON_FULL_VERSION ($ARCH)"
|
||||||
rm -rf $PYTHON_TOOLCACHE_VERSION_PATH
|
rm -rf $PYTHON_TOOLCACHE_VERSION_ARCH_PATH
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Create Python $PYTHON_FULL_VERSION folder"
|
echo "Create Python $PYTHON_FULL_VERSION folder"
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
[String] $Architecture = "{{__ARCHITECTURE__}}"
|
[String] $Architecture = "{{__ARCHITECTURE__}}"
|
||||||
|
[String] $HardwareArchitecture = "{{__HARDWARE_ARCHITECTURE__}}"
|
||||||
[String] $Version = "{{__VERSION__}}"
|
[String] $Version = "{{__VERSION__}}"
|
||||||
[String] $PythonExecName = "{{__PYTHON_EXEC_NAME__}}"
|
[String] $PythonExecName = "{{__PYTHON_EXEC_NAME__}}"
|
||||||
|
|
||||||
@@ -10,12 +11,7 @@ function Get-RegistryVersionFilter {
|
|||||||
)
|
)
|
||||||
|
|
||||||
$archFilter = if ($Architecture -eq 'x86') { "32-bit" } else { "64-bit" }
|
$archFilter = if ($Architecture -eq 'x86') { "32-bit" } else { "64-bit" }
|
||||||
### Python 2.7 x86 have no architecture postfix
|
"Python $MajorVersion.$MinorVersion.*($archFilter)"
|
||||||
if (($Architecture -eq "x86") -and ($MajorVersion -eq 2)) {
|
|
||||||
"Python $MajorVersion.$MinorVersion.\d+$"
|
|
||||||
} else {
|
|
||||||
"Python $MajorVersion.$MinorVersion.*($archFilter)"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Remove-RegistryEntries {
|
function Remove-RegistryEntries {
|
||||||
@@ -25,7 +21,7 @@ function Remove-RegistryEntries {
|
|||||||
[Parameter(Mandatory)][Int32] $MinorVersion
|
[Parameter(Mandatory)][Int32] $MinorVersion
|
||||||
)
|
)
|
||||||
|
|
||||||
$versionFilter = Get-RegistryVersionFilter -Architecture $Architecture -MajorVersion $MajorVersion -MinorVersion $MinorVersion
|
$versionFilter = Get-RegistryVersionFilter -Architecture $HardwareArchitecture -MajorVersion $MajorVersion -MinorVersion $MinorVersion
|
||||||
|
|
||||||
$regPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"
|
$regPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"
|
||||||
if (Test-Path -Path Registry::$regPath) {
|
if (Test-Path -Path Registry::$regPath) {
|
||||||
@@ -61,13 +57,15 @@ function Remove-RegistryEntries {
|
|||||||
function Get-ExecParams {
|
function Get-ExecParams {
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)][Boolean] $IsMSI,
|
[Parameter(Mandatory)][Boolean] $IsMSI,
|
||||||
|
[Parameter(Mandatory)][Boolean] $IsFreeThreaded,
|
||||||
[Parameter(Mandatory)][String] $PythonArchPath
|
[Parameter(Mandatory)][String] $PythonArchPath
|
||||||
)
|
)
|
||||||
|
|
||||||
if ($IsMSI) {
|
if ($IsMSI) {
|
||||||
"TARGETDIR=$PythonArchPath ALLUSERS=1"
|
"TARGETDIR=$PythonArchPath ALLUSERS=1"
|
||||||
} else {
|
} else {
|
||||||
"DefaultAllUsersTargetDir=$PythonArchPath InstallAllUsers=1"
|
$Include_freethreaded = if ($IsFreeThreaded) { "Include_freethreaded=1" } else { "" }
|
||||||
|
"DefaultAllUsersTargetDir=$PythonArchPath InstallAllUsers=1 $Include_freethreaded"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,6 +79,7 @@ $PythonVersionPath = Join-Path -Path $PythonToolcachePath -ChildPath $Version
|
|||||||
$PythonArchPath = Join-Path -Path $PythonVersionPath -ChildPath $Architecture
|
$PythonArchPath = Join-Path -Path $PythonVersionPath -ChildPath $Architecture
|
||||||
|
|
||||||
$IsMSI = $PythonExecName -match "msi"
|
$IsMSI = $PythonExecName -match "msi"
|
||||||
|
$IsFreeThreaded = $Architecture -match "-freethreaded"
|
||||||
|
|
||||||
$MajorVersion = $Version.Split('.')[0]
|
$MajorVersion = $Version.Split('.')[0]
|
||||||
$MinorVersion = $Version.Split('.')[1]
|
$MinorVersion = $Version.Split('.')[1]
|
||||||
@@ -120,18 +119,22 @@ Write-Host "Copy Python binaries to $PythonArchPath"
|
|||||||
Copy-Item -Path ./$PythonExecName -Destination $PythonArchPath | Out-Null
|
Copy-Item -Path ./$PythonExecName -Destination $PythonArchPath | Out-Null
|
||||||
|
|
||||||
Write-Host "Install Python $Version in $PythonToolcachePath..."
|
Write-Host "Install Python $Version in $PythonToolcachePath..."
|
||||||
$ExecParams = Get-ExecParams -IsMSI $IsMSI -PythonArchPath $PythonArchPath
|
$ExecParams = Get-ExecParams -IsMSI $IsMSI -IsFreeThreaded $IsFreeThreaded -PythonArchPath $PythonArchPath
|
||||||
|
|
||||||
cmd.exe /c "cd $PythonArchPath && call $PythonExecName $ExecParams /quiet"
|
cmd.exe /c "cd $PythonArchPath && call $PythonExecName $ExecParams /quiet"
|
||||||
if ($LASTEXITCODE -ne 0) {
|
if ($LASTEXITCODE -ne 0) {
|
||||||
Throw "Error happened during Python installation"
|
Throw "Error happened during Python installation"
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Create `python3` symlink"
|
if ($IsFreeThreaded) {
|
||||||
if ($MajorVersion -ne "2") {
|
# Delete python.exe and create a symlink to free-threaded exe
|
||||||
New-Item -Path "$PythonArchPath\python3.exe" -ItemType SymbolicLink -Value "$PythonArchPath\python.exe"
|
Remove-Item -Path "$PythonArchPath\python.exe" -Force
|
||||||
|
New-Item -Path "$PythonArchPath\python.exe" -ItemType SymbolicLink -Value "$PythonArchPath\python${MajorVersion}.${MinorVersion}t.exe"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Write-Host "Create `python3` symlink"
|
||||||
|
New-Item -Path "$PythonArchPath\python3.exe" -ItemType SymbolicLink -Value "$PythonArchPath\python.exe"
|
||||||
|
|
||||||
Write-Host "Install and upgrade Pip"
|
Write-Host "Install and upgrade Pip"
|
||||||
$Env:PIP_ROOT_USER_ACTION = "ignore"
|
$Env:PIP_ROOT_USER_ACTION = "ignore"
|
||||||
$PythonExePath = Join-Path -Path $PythonArchPath -ChildPath "python.exe"
|
$PythonExePath = Join-Path -Path $PythonArchPath -ChildPath "python.exe"
|
||||||
|
|||||||
@@ -4,19 +4,33 @@ $ConfigurationFile = Join-Path $PSScriptRoot "../config/python-manifest-config.j
|
|||||||
$Configuration = Read-ConfigurationFile -Filepath $ConfigurationFile
|
$Configuration = Read-ConfigurationFile -Filepath $ConfigurationFile
|
||||||
|
|
||||||
$stableTestCases = @(
|
$stableTestCases = @(
|
||||||
@{ ReleaseName = "python-3.8.3-darwin-x64.tar.gz"; ExpectedResult = @{ platform = "darwin"; platform_version = $null; arch = "x64"} },
|
|
||||||
@{ ReleaseName = "python-3.8.3-linux-20.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "20.04"; arch = "x64"} },
|
@{ ReleaseName = "python-3.13.0-darwin-x64.tar.gz"; ExpectedResult = @{ platform = "darwin"; platform_version = $null; arch = "x64"} },
|
||||||
@{ ReleaseName = "python-3.8.3-linux-22.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "22.04"; arch = "x64"} },
|
@{ ReleaseName = "python-3.13.0-linux-20.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "20.04"; arch = "x64"} },
|
||||||
@{ ReleaseName = "python-3.8.3-win32-x64.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x64"} },
|
@{ ReleaseName = "python-3.13.0-linux-22.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "22.04"; arch = "x64"} },
|
||||||
@{ ReleaseName = "python-3.8.3-win32-x86.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x86"} }
|
@{ ReleaseName = "python-3.13.0-win32-x64.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x64"} },
|
||||||
|
@{ ReleaseName = "python-3.13.0-win32-x86.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x86"} },
|
||||||
|
@{ ReleaseName = "python-3.13.0-darwin-x64-freethreaded.tar.gz"; ExpectedResult = @{ platform = "darwin"; platform_version = $null; arch = "x64-freethreaded"} },
|
||||||
|
@{ ReleaseName = "python-3.13.0-linux-20.04-x64-freethreaded.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "20.04"; arch = "x64-freethreaded"} },
|
||||||
|
@{ ReleaseName = "python-3.13.0-linux-22.04-x64-freethreaded.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "22.04"; arch = "x64-freethreaded"} },
|
||||||
|
@{ ReleaseName = "python-3.13.0-win32-x64-freethreaded.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x64-freethreaded"} },
|
||||||
|
@{ ReleaseName = "python-3.13.0-win32-x86-freethreaded.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x86-freethreaded"} }
|
||||||
|
|
||||||
) | ForEach-Object { $_.Configuration = $Configuration; $_ }
|
) | ForEach-Object { $_.Configuration = $Configuration; $_ }
|
||||||
|
|
||||||
$unstableTestCases = @(
|
$unstableTestCases = @(
|
||||||
@{ ReleaseName = "python-3.9.0-alpha.2-darwin-x64.tar.gz"; ExpectedResult = @{ platform = "darwin"; platform_version = $null; arch = "x64"} },
|
|
||||||
@{ ReleaseName = "python-3.9.0-beta.2-linux-20.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "20.04"; arch = "x64"} },
|
@{ ReleaseName = "python-3.14.0-alpha.5-darwin-x64.tar.gz"; ExpectedResult = @{ platform = "darwin"; platform_version = $null; arch = "x64"} },
|
||||||
@{ ReleaseName = "python-3.9.0-rc.4-linux-22.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "22.04"; arch = "x64"} },
|
@{ ReleaseName = "python-3.14.0-alpha.5-linux-20.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "20.04"; arch = "x64"} },
|
||||||
@{ ReleaseName = "python-3.9.0-beta.2-win32-x64.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x64"} },
|
@{ ReleaseName = "python-3.14.0-alpha.5-linux-22.04-x64.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "22.04"; arch = "x64"} },
|
||||||
@{ ReleaseName = "python-3.9.0-beta.2-win32-x86.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x86"} }
|
@{ ReleaseName = "python-3.14.0-alpha.5-win32-x64.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x64"} },
|
||||||
|
@{ ReleaseName = "python-3.14.0-alpha.5-win32-x86.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x86"} },
|
||||||
|
@{ ReleaseName = "python-3.14.0-alpha.5-darwin-x64-freethreaded.tar.gz"; ExpectedResult = @{ platform = "darwin"; platform_version = $null; arch = "x64-freethreaded"} },
|
||||||
|
@{ ReleaseName = "python-3.14.0-alpha.5-linux-20.04-x64-freethreaded.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "20.04"; arch = "x64-freethreaded"} },
|
||||||
|
@{ ReleaseName = "python-3.14.0-alpha.5-linux-22.04-x64-freethreaded.tar.gz"; ExpectedResult = @{ platform = "linux"; platform_version = "22.04"; arch = "x64-freethreaded"} },
|
||||||
|
@{ ReleaseName = "python-3.14.0-alpha.5-win32-x64-freethreaded.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x64-freethreaded"} },
|
||||||
|
@{ ReleaseName = "python-3.14.0-alpha.5-win32-x86-freethreaded.zip"; ExpectedResult = @{ platform = "win32"; platform_version = $null; arch = "x86-freethreaded"} }
|
||||||
|
|
||||||
) | ForEach-Object { $_.Configuration = $Configuration; $_ }
|
) | ForEach-Object { $_.Configuration = $Configuration; $_ }
|
||||||
|
|
||||||
Describe "Python manifest config" {
|
Describe "Python manifest config" {
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ param (
|
|||||||
$Architecture
|
$Architecture
|
||||||
)
|
)
|
||||||
|
|
||||||
|
$HardwareArchitecture = $Architecture -replace "-freethreaded", ""
|
||||||
|
|
||||||
Import-Module (Join-Path $PSScriptRoot "../helpers/pester-extensions.psm1")
|
Import-Module (Join-Path $PSScriptRoot "../helpers/pester-extensions.psm1")
|
||||||
Import-Module (Join-Path $PSScriptRoot "../helpers/common-helpers.psm1")
|
Import-Module (Join-Path $PSScriptRoot "../helpers/common-helpers.psm1")
|
||||||
Import-Module (Join-Path $PSScriptRoot "../builders/python-version.psm1")
|
Import-Module (Join-Path $PSScriptRoot "../builders/python-version.psm1")
|
||||||
@@ -58,7 +60,7 @@ Describe "Tests" {
|
|||||||
# }
|
# }
|
||||||
# }
|
# }
|
||||||
|
|
||||||
if (($Version -ge "3.2.0") -and ($Version -lt "3.11.0") -and (($Platform -ne "darwin") -or ($Architecture -ne "arm64"))) {
|
if (($Version -lt "3.11.0") -and (($Platform -ne "darwin") -or ($HardwareArchitecture -ne "arm64"))) {
|
||||||
It "Check if sqlite3 module is installed" {
|
It "Check if sqlite3 module is installed" {
|
||||||
"python ./sources/python-sqlite3.py" | Should -ReturnZeroExitCode
|
"python ./sources/python-sqlite3.py" | Should -ReturnZeroExitCode
|
||||||
}
|
}
|
||||||
@@ -90,16 +92,6 @@ Describe "Tests" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Pyinstaller 3.5 does not support Python 3.8.0. Check issue https://github.com/pyinstaller/pyinstaller/issues/4311
|
|
||||||
if ($Version -lt "3.8.0" -and $Version.Major -ne "2") {
|
|
||||||
It "Validate Pyinstaller" {
|
|
||||||
"pip install pyinstaller" | Should -ReturnZeroExitCode
|
|
||||||
"pyinstaller --onefile ./sources/simple-test.py" | Should -ReturnZeroExitCode
|
|
||||||
$distPath = [IO.Path]::Combine($pwd, "dist", "simple-test")
|
|
||||||
"$distPath" | Should -ReturnZeroExitCode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
It "Check urlopen with HTTPS works" {
|
It "Check urlopen with HTTPS works" {
|
||||||
"python ./sources/python-urlopen-https.py" | Should -ReturnZeroExitCode
|
"python ./sources/python-urlopen-https.py" | Should -ReturnZeroExitCode
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,25 +8,31 @@ os_type = platform.system()
|
|||||||
version = sys.argv[1]
|
version = sys.argv[1]
|
||||||
nativeVersion = sys.argv[2]
|
nativeVersion = sys.argv[2]
|
||||||
architecture = sys.argv[3]
|
architecture = sys.argv[3]
|
||||||
|
hw_architecture = architecture.replace('-freethreaded', '')
|
||||||
|
|
||||||
versions=version.split(".")
|
versions=version.split(".")
|
||||||
version_major=int(versions[0])
|
version_major=int(versions[0])
|
||||||
version_minor=int(versions[1])
|
version_minor=int(versions[1])
|
||||||
|
|
||||||
pkg_installer = os_type == 'Darwin' and ((version_major == 3 and version_minor >= 11) or (architecture == "arm64"))
|
pkg_installer = os_type == 'Darwin' and ((version_major == 3 and version_minor >= 11) or (hw_architecture == "arm64"))
|
||||||
|
|
||||||
lib_dir_path = sysconfig.get_config_var('LIBDIR')
|
lib_dir_path = sysconfig.get_config_var('LIBDIR')
|
||||||
ld_library_name = sysconfig.get_config_var('LDLIBRARY')
|
ld_library_name = sysconfig.get_config_var('LDLIBRARY')
|
||||||
|
|
||||||
is_shared = sysconfig.get_config_var('Py_ENABLE_SHARED')
|
is_shared = sysconfig.get_config_var('Py_ENABLE_SHARED')
|
||||||
have_libreadline = sysconfig.get_config_var("HAVE_LIBREADLINE")
|
have_libreadline = sysconfig.get_config_var("HAVE_LIBREADLINE")
|
||||||
|
is_free_threaded = sysconfig.get_config_var('Py_GIL_DISABLED')
|
||||||
|
|
||||||
### Define expected variables
|
### Define expected variables
|
||||||
if os_type == 'Linux': expected_ld_library_extension = 'so'
|
if os_type == 'Linux': expected_ld_library_extension = 'so'
|
||||||
if os_type == 'Darwin': expected_ld_library_extension = 'dylib'
|
if os_type == 'Darwin': expected_ld_library_extension = 'dylib'
|
||||||
|
if is_free_threaded:
|
||||||
|
framework_name = 'PythonT.framework'
|
||||||
|
else:
|
||||||
|
framework_name = 'Python.framework'
|
||||||
|
|
||||||
if pkg_installer:
|
if pkg_installer:
|
||||||
expected_lib_dir_path = f'/Library/Frameworks/Python.framework/Versions/{version_major}.{version_minor}/lib'
|
expected_lib_dir_path = f'/Library/Frameworks/{framework_name}/Versions/{version_major}.{version_minor}/lib'
|
||||||
else:
|
else:
|
||||||
expected_lib_dir_path = f'{os.getenv("AGENT_TOOLSDIRECTORY")}/Python/{version}/{architecture}/lib'
|
expected_lib_dir_path = f'{os.getenv("AGENT_TOOLSDIRECTORY")}/Python/{version}/{architecture}/lib'
|
||||||
|
|
||||||
@@ -54,15 +60,15 @@ else:
|
|||||||
if os_type == 'Darwin':
|
if os_type == 'Darwin':
|
||||||
### Validate openssl links
|
### Validate openssl links
|
||||||
if version_major == 3 and version_minor < 7:
|
if version_major == 3 and version_minor < 7:
|
||||||
expected_ldflags = '-L/usr/local/opt/openssl@1.1/lib'
|
expected_ldflags = '-L/usr/local/opt/openssl@3/lib'
|
||||||
ldflags = sysconfig.get_config_var('LDFLAGS')
|
ldflags = sysconfig.get_config_var('LDFLAGS')
|
||||||
|
|
||||||
if not expected_ldflags in ldflags:
|
if not expected_ldflags in ldflags:
|
||||||
print('Invalid ldflags: %s; Expected: %s' % (ldflags, expected_ldflags))
|
print('Invalid ldflags: %s; Expected: %s' % (ldflags, expected_ldflags))
|
||||||
exit(1)
|
exit(1)
|
||||||
else:
|
else:
|
||||||
expected_openssl_includes = '-I/usr/local/opt/openssl@1.1/include'
|
expected_openssl_includes = '-I/usr/local/opt/openssl@3/include'
|
||||||
expected_openssl_ldflags ='-L/usr/local/opt/openssl@1.1/lib'
|
expected_openssl_ldflags ='-L/usr/local/opt/openssl@3/lib'
|
||||||
|
|
||||||
openssl_includes = sysconfig.get_config_var('OPENSSL_INCLUDES')
|
openssl_includes = sysconfig.get_config_var('OPENSSL_INCLUDES')
|
||||||
openssl_ldflags = sysconfig.get_config_var('OPENSSL_LDFLAGS')
|
openssl_ldflags = sysconfig.get_config_var('OPENSSL_LDFLAGS')
|
||||||
|
|||||||
@@ -3,12 +3,10 @@ Make sure all the optional modules are installed.
|
|||||||
This is needed for Linux since we build from source.
|
This is needed for Linux since we build from source.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
|
|
||||||
import importlib
|
import importlib
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# The Python standard library as of Python 3.0
|
# The Python standard library as of Python 3.9
|
||||||
standard_library = [
|
standard_library = [
|
||||||
'abc',
|
'abc',
|
||||||
'aifc',
|
'aifc',
|
||||||
@@ -17,6 +15,7 @@ standard_library = [
|
|||||||
'ast',
|
'ast',
|
||||||
'asynchat',
|
'asynchat',
|
||||||
'asyncore',
|
'asyncore',
|
||||||
|
'asyncio',
|
||||||
'base64',
|
'base64',
|
||||||
'bdb',
|
'bdb',
|
||||||
'binhex',
|
'binhex',
|
||||||
@@ -34,14 +33,17 @@ standard_library = [
|
|||||||
'collections',
|
'collections',
|
||||||
'colorsys',
|
'colorsys',
|
||||||
'compileall',
|
'compileall',
|
||||||
|
'concurrent',
|
||||||
'configparser',
|
'configparser',
|
||||||
'contextlib',
|
'contextlib',
|
||||||
|
'contextvars',
|
||||||
'copy',
|
'copy',
|
||||||
'copyreg',
|
'copyreg',
|
||||||
'crypt',
|
'crypt',
|
||||||
'csv',
|
'csv',
|
||||||
'ctypes',
|
'ctypes',
|
||||||
'curses',
|
'curses',
|
||||||
|
'dataclasses',
|
||||||
'datetime',
|
'datetime',
|
||||||
'dbm',
|
'dbm',
|
||||||
'decimal',
|
'decimal',
|
||||||
@@ -49,9 +51,11 @@ standard_library = [
|
|||||||
'dis',
|
'dis',
|
||||||
'distutils',
|
'distutils',
|
||||||
'doctest',
|
'doctest',
|
||||||
'dummy_threading',
|
|
||||||
'email',
|
'email',
|
||||||
'encodings',
|
'encodings',
|
||||||
|
'ensurepip',
|
||||||
|
'enum',
|
||||||
|
'faulthandler',
|
||||||
'filecmp',
|
'filecmp',
|
||||||
'fileinput',
|
'fileinput',
|
||||||
'fnmatch',
|
'fnmatch',
|
||||||
@@ -77,13 +81,14 @@ standard_library = [
|
|||||||
'importlib',
|
'importlib',
|
||||||
'inspect',
|
'inspect',
|
||||||
'io',
|
'io',
|
||||||
|
'ipaddress',
|
||||||
'json',
|
'json',
|
||||||
'keyword',
|
'keyword',
|
||||||
'lib2to3',
|
'lib2to3',
|
||||||
'linecache',
|
'linecache',
|
||||||
'locale',
|
'locale',
|
||||||
'logging',
|
'logging',
|
||||||
'macpath',
|
'lzma',
|
||||||
'mailbox',
|
'mailbox',
|
||||||
'mailcap',
|
'mailcap',
|
||||||
'mimetypes',
|
'mimetypes',
|
||||||
@@ -98,6 +103,7 @@ standard_library = [
|
|||||||
'operator',
|
'operator',
|
||||||
'optparse',
|
'optparse',
|
||||||
'os',
|
'os',
|
||||||
|
'pathlib',
|
||||||
'pdb',
|
'pdb',
|
||||||
'pickle',
|
'pickle',
|
||||||
'pickletools',
|
'pickletools',
|
||||||
@@ -124,6 +130,8 @@ standard_library = [
|
|||||||
'rlcompleter',
|
'rlcompleter',
|
||||||
'runpy',
|
'runpy',
|
||||||
'sched',
|
'sched',
|
||||||
|
'secrets',
|
||||||
|
'selectors',
|
||||||
'shelve',
|
'shelve',
|
||||||
'shlex',
|
'shlex',
|
||||||
'shutil',
|
'shutil',
|
||||||
@@ -141,6 +149,7 @@ standard_library = [
|
|||||||
'ssl',
|
'ssl',
|
||||||
'_ssl',
|
'_ssl',
|
||||||
'stat',
|
'stat',
|
||||||
|
'statistics',
|
||||||
'string',
|
'string',
|
||||||
'stringprep',
|
'stringprep',
|
||||||
'struct',
|
'struct',
|
||||||
@@ -163,14 +172,17 @@ standard_library = [
|
|||||||
'tokenize',
|
'tokenize',
|
||||||
'trace',
|
'trace',
|
||||||
'traceback',
|
'traceback',
|
||||||
|
'tracemalloc',
|
||||||
'tty',
|
'tty',
|
||||||
'turtle',
|
'turtle',
|
||||||
'turtledemo',
|
'turtledemo',
|
||||||
'types',
|
'types',
|
||||||
|
'typing',
|
||||||
'unittest',
|
'unittest',
|
||||||
'urllib',
|
'urllib',
|
||||||
'uu',
|
'uu',
|
||||||
'uuid',
|
'uuid',
|
||||||
|
'venv',
|
||||||
'warnings',
|
'warnings',
|
||||||
'wave',
|
'wave',
|
||||||
'weakref',
|
'weakref',
|
||||||
@@ -179,83 +191,12 @@ standard_library = [
|
|||||||
'xdrlib',
|
'xdrlib',
|
||||||
'xml',
|
'xml',
|
||||||
'xmlrpc',
|
'xmlrpc',
|
||||||
|
'zipapp',
|
||||||
'zipfile'
|
'zipfile'
|
||||||
]
|
]
|
||||||
|
|
||||||
# Modules that had different names in Python 2
|
|
||||||
if sys.version_info.major == 2:
|
|
||||||
def replace(lst, old, new):
|
|
||||||
lst[lst.index(old)] = new
|
|
||||||
|
|
||||||
# Keys are the Python 2 names
|
|
||||||
# Values are the Python 3 names
|
|
||||||
renames = {
|
|
||||||
'ConfigParser': 'configparser',
|
|
||||||
'copy_reg': 'copyreg',
|
|
||||||
'HTMLParser': 'html',
|
|
||||||
'httplib': 'http',
|
|
||||||
'Queue': 'queue',
|
|
||||||
'repr': 'reprlib',
|
|
||||||
'SocketServer': 'socketserver',
|
|
||||||
'xmlrpclib': 'xmlrpc',
|
|
||||||
'Tkinter': 'tkinter'
|
|
||||||
}
|
|
||||||
|
|
||||||
# All of the Python 3 names should be in the list
|
|
||||||
for python2name, python3name in renames.items():
|
|
||||||
replace(standard_library, python3name, python2name)
|
|
||||||
|
|
||||||
# Add new modules
|
# Add new modules
|
||||||
# See https://docs.python.org/3/whatsnew/index.html
|
# See https://docs.python.org/3/whatsnew/index.html
|
||||||
if sys.version_info >= (3, 2):
|
|
||||||
standard_library.extend([
|
|
||||||
'concurrent',
|
|
||||||
])
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 3):
|
|
||||||
standard_library.extend([
|
|
||||||
'ipaddress',
|
|
||||||
'faulthandler',
|
|
||||||
'lzma',
|
|
||||||
'venv',
|
|
||||||
])
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 4):
|
|
||||||
standard_library.extend([
|
|
||||||
'asyncio',
|
|
||||||
'ensurepip',
|
|
||||||
'enum',
|
|
||||||
'pathlib',
|
|
||||||
'selectors',
|
|
||||||
'statistics',
|
|
||||||
'tracemalloc',
|
|
||||||
])
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 5):
|
|
||||||
standard_library.extend([
|
|
||||||
'typing',
|
|
||||||
'zipapp',
|
|
||||||
])
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 6):
|
|
||||||
standard_library.extend([
|
|
||||||
'secrets',
|
|
||||||
])
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 7):
|
|
||||||
standard_library.extend([
|
|
||||||
'contextvars',
|
|
||||||
'dataclasses',
|
|
||||||
])
|
|
||||||
|
|
||||||
# 'macpath' module has been removed from Python 3.8
|
|
||||||
if sys.version_info > (3, 7):
|
|
||||||
standard_library.remove('macpath')
|
|
||||||
|
|
||||||
# 'dummy_threading' module has been removed from Python 3.9
|
|
||||||
if sys.version_info > (3, 8):
|
|
||||||
standard_library.remove('dummy_threading')
|
|
||||||
|
|
||||||
# 'symbol' and 'formatter' modules have been removed from Python 3.10
|
# 'symbol' and 'formatter' modules have been removed from Python 3.10
|
||||||
if sys.version_info >= (3, 10):
|
if sys.version_info >= (3, 10):
|
||||||
standard_library.remove('symbol')
|
standard_library.remove('symbol')
|
||||||
@@ -295,6 +236,11 @@ if sys.version_info >= (3, 13):
|
|||||||
standard_library.remove('uu')
|
standard_library.remove('uu')
|
||||||
standard_library.remove('xdrlib')
|
standard_library.remove('xdrlib')
|
||||||
|
|
||||||
|
if sys.version_info >= (3, 14):
|
||||||
|
standard_library.extend([
|
||||||
|
'annotationlib',
|
||||||
|
])
|
||||||
|
|
||||||
# Remove tkinter and Easter eggs
|
# Remove tkinter and Easter eggs
|
||||||
excluded_modules = [
|
excluded_modules = [
|
||||||
'antigravity',
|
'antigravity',
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
import sys
|
import sys
|
||||||
|
from urllib.request import urlopen
|
||||||
if sys.version_info[0] == 2:
|
|
||||||
from urllib2 import urlopen
|
|
||||||
else:
|
|
||||||
from urllib.request import urlopen
|
|
||||||
|
|
||||||
response = urlopen("https://raw.githubusercontent.com/actions/python-versions/c641695f6a07526c18f10e374e503e649fef9427/.gitignore")
|
response = urlopen("https://raw.githubusercontent.com/actions/python-versions/c641695f6a07526c18f10e374e503e649fef9427/.gitignore")
|
||||||
data = response.read()
|
data = response.read()
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user