mirror of
https://github.com/actions/python-versions.git
synced 2025-12-15 15:32:11 +00:00
Compare commits
93 Commits
3.12.0-rc.
...
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 | ||
|
|
2438e271b9 | ||
|
|
3970f04eb4 | ||
|
|
57f2d897a8 | ||
|
|
0c9a1f7cd6 | ||
|
|
0e5f00e5d0 | ||
|
|
1d2e861434 | ||
|
|
d55f04f8e6 | ||
|
|
cb2aecd6d9 | ||
|
|
1c85886f9c | ||
|
|
f14b797a5d | ||
|
|
cc396a6be6 | ||
|
|
1693c7defb | ||
|
|
8108f421b7 | ||
|
|
8bbb5413e0 | ||
|
|
c990e6da95 | ||
|
|
521be20d1e | ||
|
|
064829bd03 | ||
|
|
b77a7dee85 | ||
|
|
37e7166250 | ||
|
|
eb9433f569 | ||
|
|
7c3d29faf2 | ||
|
|
c03f98f186 | ||
|
|
2573fc9af9 | ||
|
|
b643f0d07f | ||
|
|
29394d0042 | ||
|
|
3545308dfe | ||
|
|
fa96e2aca9 | ||
|
|
1dbece3419 | ||
|
|
627cd1691f | ||
|
|
c685daccab | ||
|
|
eaf1258a7f | ||
|
|
9903e2d963 | ||
|
|
310d6e4aea | ||
|
|
af22c2b8e4 | ||
|
|
e605eda13a | ||
|
|
96dae786ca | ||
|
|
e642abaef8 | ||
|
|
381057ce36 | ||
|
|
5da3a44cc2 | ||
|
|
3880dd814a | ||
|
|
ba0b46a6a1 | ||
|
|
b81fc1cff7 | ||
|
|
f4b33352f0 | ||
|
|
8e2e28992d |
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
@@ -1,21 +1,26 @@
|
|||||||
name: Build Python package
|
name: Build Python package
|
||||||
run-name: Generate Python ${{ inputs.VERSION || '3.11.0' }}
|
run-name: Generate Python ${{ inputs.VERSION || '3.12.3' }}
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
VERSION:
|
VERSION:
|
||||||
description: 'Python version to build and upload'
|
description: 'Python version to build and upload'
|
||||||
default: '3.11.0'
|
default: '3.12.3'
|
||||||
required: true
|
required: true
|
||||||
PUBLISH_RELEASES:
|
PUBLISH_RELEASES:
|
||||||
description: 'Whether to publish releases'
|
description: 'Whether to publish releases'
|
||||||
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,macos-11_x64,macos-11_arm64,windows-2019_x64,windows-2019_x86'
|
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'
|
||||||
@@ -25,7 +30,7 @@ on:
|
|||||||
- 'main'
|
- 'main'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
VERSION: ${{ inputs.VERSION || '3.11.0' }}
|
VERSION: ${{ inputs.VERSION || '3.12.3' }}
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
@@ -39,26 +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,macos-11,macos-11_arm64,windows-2019_x64,windows-2019_x86' }}".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" } }
|
||||||
$matrix += @{
|
}
|
||||||
'platform' = $platform
|
|
||||||
'os' = $os
|
if ($buildMode -eq "freethreaded") {
|
||||||
'arch' = $arch
|
if ([semver]"${{ inputs.VERSION }}" -lt [semver]"3.13.0") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$arch += "-freethreaded"
|
||||||
|
}
|
||||||
|
|
||||||
|
$matrix += @{
|
||||||
|
'platform' = $platform
|
||||||
|
'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:
|
||||||
@@ -67,24 +83,28 @@ jobs:
|
|||||||
include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }}
|
include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.11.0' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v3
|
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@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ env.ARTIFACT_NAME }}
|
name: ${{ env.ARTIFACT_NAME }}
|
||||||
path: ${{ runner.temp }}/artifact
|
path: ${{ runner.temp }}/artifact
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
test_python:
|
test_python:
|
||||||
needs: [generate_matrix, build_python]
|
needs: [generate_matrix, build_python]
|
||||||
@@ -94,21 +114,26 @@ jobs:
|
|||||||
include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }}
|
include: ${{ fromJson(needs.generate_matrix.outputs.matrix) }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.11.0' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
ARTIFACT_NAME: python-${{ inputs.VERSION || '3.12.3' }}-${{ matrix.platform }}-${{ matrix.arch }}
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
- name: Fully cleanup the toolcache directory before testing
|
- name: Fully cleanup the toolcache directory before testing
|
||||||
run: ./helpers/clean-toolcache.ps1 -ToolName "Python"
|
run: ./helpers/clean-toolcache.ps1 -ToolName "Python"
|
||||||
|
|
||||||
|
- name: Delete macOS /Library/Frameworks/Python.framework
|
||||||
|
if: matrix.platform == 'darwin'
|
||||||
|
shell: bash
|
||||||
|
run: if [ -d /Library/Frameworks/Python.framework ]; then sudo rm -rf /Library/Frameworks/Python.framework; fi
|
||||||
|
|
||||||
- name: Download artifact
|
- name: Download artifact
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: ${{ runner.temp }}
|
name: ${{ env.ARTIFACT_NAME }}
|
||||||
|
path: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}
|
||||||
|
|
||||||
- name: Extract files
|
- name: Extract files
|
||||||
run: |
|
run: |
|
||||||
@@ -123,6 +148,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Apply build artifact to the local machine
|
- name: Apply build artifact to the local machine
|
||||||
run: |
|
run: |
|
||||||
|
$PSNativeCommandUseErrorActionPreference = $true
|
||||||
if ('${{ matrix.platform }}' -eq 'win32') {
|
if ('${{ matrix.platform }}' -eq 'win32') {
|
||||||
powershell ./setup.ps1
|
powershell ./setup.ps1
|
||||||
} else {
|
} else {
|
||||||
@@ -132,11 +158,14 @@ jobs:
|
|||||||
working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}
|
working-directory: ${{ runner.temp }}/${{ env.ARTIFACT_NAME }}
|
||||||
|
|
||||||
- name: Setup Python ${{ env.VERSION }}
|
- name: Setup Python ${{ env.VERSION }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
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
|
||||||
@@ -150,7 +179,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
Install-Module Pester -Force -Scope CurrentUser
|
Install-Module Pester -Force -Scope CurrentUser -SkipPublisherCheck
|
||||||
Import-Module Pester
|
Import-Module Pester
|
||||||
$pesterContainer = New-PesterContainer -Path './python-tests.ps1' -Data @{
|
$pesterContainer = New-PesterContainer -Path './python-tests.ps1' -Data @{
|
||||||
Version="${{ env.VERSION }}";
|
Version="${{ env.VERSION }}";
|
||||||
@@ -170,7 +199,7 @@ jobs:
|
|||||||
needs: test_python
|
needs: test_python
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v4
|
||||||
|
|
||||||
- name: Publish Release ${{ env.VERSION }}
|
- name: Publish Release ${{ env.VERSION }}
|
||||||
id: create_release
|
id: create_release
|
||||||
@@ -183,21 +212,34 @@ jobs:
|
|||||||
body: |
|
body: |
|
||||||
Python ${{ env.VERSION }}
|
Python ${{ env.VERSION }}
|
||||||
|
|
||||||
|
- name: Generate hash for packages
|
||||||
|
run: |
|
||||||
|
$childItems = Get-Childitem -Path '.'
|
||||||
|
$childItems | Foreach-Object {
|
||||||
|
$packageObj = Get-Childitem -Path $_.FullName | Select-Object -First 1
|
||||||
|
Write-Host "Package: $($packageObj.Name)"
|
||||||
|
$actualHash = (Get-FileHash -Path $packageObj.FullName -Algorithm sha256).Hash
|
||||||
|
$hashString = "$actualHash $($packageObj.Name)"
|
||||||
|
Write-Host "$hashString"
|
||||||
|
Add-Content -Path ./hashes.sha256 -Value "$hashString"
|
||||||
|
}
|
||||||
|
|
||||||
- name: Upload release assets
|
- name: Upload release assets
|
||||||
uses: actions/github-script@v6
|
uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
for (let artifactDir of fs.readdirSync('.')) {
|
for (let artifactDir of fs.readdirSync('.')) {
|
||||||
let artifactName = fs.readdirSync(`${artifactDir}`)[0];
|
let artifactName = fs.lstatSync(artifactDir).isDirectory() ? fs.readdirSync(`${artifactDir}`)[0] : artifactDir;
|
||||||
|
|
||||||
console.log(`Upload ${artifactName} asset`);
|
console.log(`Upload ${artifactName} asset`);
|
||||||
github.rest.repos.uploadReleaseAsset({
|
github.rest.repos.uploadReleaseAsset({
|
||||||
owner: context.repo.owner,
|
owner: context.repo.owner,
|
||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
release_id: ${{ steps.create_release.outputs.id }},
|
release_id: ${{ steps.create_release.outputs.id }},
|
||||||
name: artifactName,
|
name: artifactName,
|
||||||
data: fs.readFileSync(`./${artifactDir}/${artifactName}`)
|
data: fs.lstatSync(artifactDir).isDirectory() ? fs.readFileSync(`./${artifactDir}/${artifactName}`) : fs.readFileSync(`./${artifactName}`).toString()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,7 +249,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Trigger "Create Pull Request" workflow
|
- name: Trigger "Create Pull Request" workflow
|
||||||
uses: actions/github-script@v6
|
uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
@@ -217,4 +259,3 @@ jobs:
|
|||||||
workflow_id: 'create-pr.yml',
|
workflow_id: 'create-pr.yml',
|
||||||
ref: 'main'
|
ref: 'main'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
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
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
|
||||||
|
|||||||
6
.github/workflows/releases-validation.yml
vendored
6
.github/workflows/releases-validation.yml
vendored
@@ -14,11 +14,11 @@ 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.12, 3.10.8, 3.11.10]
|
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@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python }}
|
python-version: ${{ matrix.python }}
|
||||||
|
|
||||||
|
|||||||
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
|
||||||
|
|||||||
@@ -21,5 +21,7 @@ We aim to make new versions of Python available as soon as they are released. Bo
|
|||||||
|
|
||||||
When a new version of an operating system is released and made available for use with [GitHub hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources), we will provide the **latest existing patch versions of Python for all major versions that have not reached [end-of-life](https://devguide.python.org/versions/)**. Any subsequent Python versions will be made available for the new OS as well.
|
When a new version of an operating system is released and made available for use with [GitHub hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources), we will provide the **latest existing patch versions of Python for all major versions that have not reached [end-of-life](https://devguide.python.org/versions/)**. Any subsequent Python versions will be made available for the new OS as well.
|
||||||
|
|
||||||
|
Beginning **approximately six months prior** to the removal of a Python version from the [versions-manifest.json](https://github.com/actions/python-versions/blob/main/versions-manifest.json) file, a pinned issue will be created in the [setup-python](https://github.com/actions/setup-python) repository. This pinned issue will provide important details about the upcoming end of support, including the specific date, as well as any other notes, relevant updates or alternatives. We encourage users to regularly check pinned issues for updates on tool versions they are using for maximum transparency, security, performance and overall compatibility with their projects.
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
Contributions are welcome! See [Contributor's Guide](./CONTRIBUTING.md) for more details about contribution process and code structure
|
Contributions are welcome! See [Contributor's Guide](./CONTRIBUTING.md) for more details about contribution process and code structure
|
||||||
|
|||||||
@@ -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() {
|
||||||
@@ -97,6 +96,7 @@ class NixPythonBuilder : PythonBuilder {
|
|||||||
|
|
||||||
$variablesToReplace = @{
|
$variablesToReplace = @{
|
||||||
"{{__VERSION_FULL__}}" = $this.Version;
|
"{{__VERSION_FULL__}}" = $this.Version;
|
||||||
|
"{{__ARCH__}}" = $this.Architecture;
|
||||||
}
|
}
|
||||||
$variablesToReplace.keys | ForEach-Object { $installationTemplateContent = $installationTemplateContent.Replace($_, $variablesToReplace[$_]) }
|
$variablesToReplace.keys | ForEach-Object { $installationTemplateContent = $installationTemplateContent.Replace($_, $variablesToReplace[$_]) }
|
||||||
|
|
||||||
@@ -114,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,16 +37,17 @@ class UbuntuPythonBuilder : NixPythonBuilder {
|
|||||||
$configureString += " --enable-shared"
|
$configureString += " --enable-shared"
|
||||||
$configureString += " --enable-optimizations"
|
$configureString += " --enable-optimizations"
|
||||||
|
|
||||||
### Compile with ucs4 for Python 2.x. On 3.x, ucs4 is enabled by default
|
if ($this.IsFreeThreaded()) {
|
||||||
if ($this.Version -lt "3.0.0") {
|
if ($this.Version -lt "3.13.0") {
|
||||||
$configureString += " --enable-unicode=ucs4"
|
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. Unavailable for Python 2.*
|
### 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)
|
||||||
if ($this.Version -ge "3.2.0") {
|
$configureString += " --enable-loadable-sqlite-extensions"
|
||||||
$configureString += " --enable-loadable-sqlite-extensions"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "The passed configure options are: "
|
Write-Host "The passed configure options are: "
|
||||||
Write-Host $configureString
|
Write-Host $configureString
|
||||||
@@ -60,17 +61,13 @@ class UbuntuPythonBuilder : NixPythonBuilder {
|
|||||||
Prepare system environment by installing dependencies and required packages.
|
Prepare system environment by installing dependencies and required packages.
|
||||||
#>
|
#>
|
||||||
|
|
||||||
if (($this.Version -gt "3.0.0") -and ($this.Version -lt "3.5.3")) {
|
if ($this.Version -lt "3.9.0") {
|
||||||
Write-Host "Python3 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
|
||||||
}
|
}
|
||||||
|
|
||||||
### Compile with tkinter support
|
### Compile with tkinter support
|
||||||
if ($this.Version -gt "3.0.0") {
|
$tkinterInstallString = "sudo apt-get install -y --allow-downgrades python3-tk tk-dev"
|
||||||
$tkinterInstallString = "sudo apt-get install -y --allow-downgrades python3-tk tk-dev"
|
|
||||||
} else {
|
|
||||||
$tkinterInstallString = "sudo apt install -y python-tk tk-dev"
|
|
||||||
}
|
|
||||||
|
|
||||||
Execute-Command -Command "sudo apt-get update"
|
Execute-Command -Command "sudo apt-get update"
|
||||||
Execute-Command -Command $tkinterInstallString
|
Execute-Command -Command $tkinterInstallString
|
||||||
@@ -85,7 +82,8 @@ class UbuntuPythonBuilder : NixPythonBuilder {
|
|||||||
"libsqlite3-dev",
|
"libsqlite3-dev",
|
||||||
"libncursesw5-dev",
|
"libncursesw5-dev",
|
||||||
"libreadline-dev",
|
"libreadline-dev",
|
||||||
"libgdbm-dev"
|
"libgdbm-dev",
|
||||||
|
"liblzma-dev"
|
||||||
) | ForEach-Object {
|
) | ForEach-Object {
|
||||||
Execute-Command -Command "sudo apt install -y $_"
|
Execute-Command -Command "sudo apt install -y $_"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,12 +52,10 @@ 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 = "-arm64"
|
||||||
$ArchitectureExtension = ".amd64"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $ArchitectureExtension
|
return $ArchitectureExtension
|
||||||
@@ -111,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
helpers
2
helpers
Submodule helpers updated: 896369fc7d...6fbb1f0f20
@@ -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,15 +72,20 @@ 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
|
||||||
./python -m ensurepip
|
./python -m ensurepip
|
||||||
./python -m pip install --ignore-installed pip --disable-pip-version-check --no-warn-script-location --root-user-action=ignore
|
./python -m pip install --upgrade --force-reinstall pip --disable-pip-version-check --no-warn-script-location
|
||||||
|
|
||||||
echo "Install OpenSSL certificates"
|
echo "Install OpenSSL certificates"
|
||||||
sh -e "${PYTHON_APPLICATION_PATH}/Install Certificates.command"
|
sh -e "${PYTHON_APPLICATION_PATH}/Install Certificates.command"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
PYTHON_FULL_VERSION="{{__VERSION_FULL__}}"
|
PYTHON_FULL_VERSION="{{__VERSION_FULL__}}"
|
||||||
|
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)
|
||||||
|
|
||||||
@@ -17,15 +18,15 @@ 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/x64
|
PYTHON_TOOLCACHE_VERSION_ARCH_PATH=$PYTHON_TOOLCACHE_VERSION_PATH/$ARCH
|
||||||
|
|
||||||
echo "Check if Python hostedtoolcache folder exist..."
|
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"
|
||||||
@@ -49,8 +50,9 @@ fi
|
|||||||
chmod +x ../python $PYTHON_MAJOR $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJORMINOR python
|
chmod +x ../python $PYTHON_MAJOR $PYTHON_MAJOR_DOT_MINOR $PYTHON_MAJORMINOR python
|
||||||
|
|
||||||
echo "Upgrading pip..."
|
echo "Upgrading pip..."
|
||||||
|
export PIP_ROOT_USER_ACTION=ignore
|
||||||
./python -m ensurepip
|
./python -m ensurepip
|
||||||
./python -m pip install --ignore-installed pip --disable-pip-version-check --no-warn-script-location --root-user-action=ignore
|
./python -m pip install --upgrade --force-reinstall pip --disable-pip-version-check --no-warn-script-location
|
||||||
|
|
||||||
echo "Create complete file"
|
echo "Create complete file"
|
||||||
touch $PYTHON_TOOLCACHE_VERSION_PATH/x64.complete
|
touch $PYTHON_TOOLCACHE_VERSION_PATH/$ARCH.complete
|
||||||
|
|||||||
@@ -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,21 +119,29 @@ 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"
|
||||||
$PythonExePath = Join-Path -Path $PythonArchPath -ChildPath "python.exe"
|
$PythonExePath = Join-Path -Path $PythonArchPath -ChildPath "python.exe"
|
||||||
cmd.exe /c "$PythonExePath -m ensurepip && $PythonExePath -m pip install --upgrade pip --no-warn-script-location --root-user-action=ignore"
|
cmd.exe /c "$PythonExePath -m ensurepip && $PythonExePath -m pip install --upgrade --force-reinstall pip --no-warn-script-location"
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Throw "Error happened during pip installation / upgrade"
|
||||||
|
}
|
||||||
|
|
||||||
Write-Host "Create complete file"
|
Write-Host "Create complete file"
|
||||||
New-Item -ItemType File -Path $PythonVersionPath -Name "$Architecture.complete" | Out-Null
|
New-Item -ItemType File -Path $PythonVersionPath -Name "$Architecture.complete" | Out-Null
|
||||||
|
|||||||
@@ -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,17 +92,11 @@ 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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
It "Check a single dist-info per distribution is present" {
|
||||||
|
"python ./sources/dist-info.py" | Should -ReturnZeroExitCode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
24
tests/sources/dist-info.py
Normal file
24
tests/sources/dist-info.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import glob
|
||||||
|
import os.path
|
||||||
|
import sysconfig
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
def check_dist_info():
|
||||||
|
paths = set([sysconfig.get_path("purelib"), sysconfig.get_path("platlib")])
|
||||||
|
versions = defaultdict(list)
|
||||||
|
for path in paths:
|
||||||
|
pattern = os.path.join(path, "*.dist-info")
|
||||||
|
for dist_info in glob.glob(pattern):
|
||||||
|
name = os.path.basename(dist_info).split("-", maxsplit=1)[0]
|
||||||
|
versions[name].append(dist_info)
|
||||||
|
exit_code = 0
|
||||||
|
for name in versions:
|
||||||
|
if len(versions[name]) > 1:
|
||||||
|
print("multiple dist-info found for {}: {}".format(name, versions[name]))
|
||||||
|
exit_code = 1
|
||||||
|
exit(exit_code)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
check_dist_info()
|
||||||
@@ -8,27 +8,33 @@ 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}/x64/lib'
|
expected_lib_dir_path = f'{os.getenv("AGENT_TOOLSDIRECTORY")}/Python/{version}/{architecture}/lib'
|
||||||
|
|
||||||
# Check modules
|
# Check modules
|
||||||
### Validate libraries path
|
### Validate libraries path
|
||||||
@@ -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')
|
||||||
@@ -274,6 +215,32 @@ if sys.version_info >= (3, 12):
|
|||||||
standard_library.remove('asyncore')
|
standard_library.remove('asyncore')
|
||||||
standard_library.remove('asynchat')
|
standard_library.remove('asynchat')
|
||||||
|
|
||||||
|
# 'aifc', 'cgi', 'cgitb', 'chunk', 'crypt', 'imghdr', 'lib2to3', 'mailcap', 'nntplib',
|
||||||
|
# 'pipes', 'sndhdr', 'sunau', 'telnetlib', 'uu' and 'xdrlib' modules have been removed
|
||||||
|
# from Python 3.13
|
||||||
|
# https://docs.python.org/dev/whatsnew/3.13.html
|
||||||
|
if sys.version_info >= (3, 13):
|
||||||
|
standard_library.remove('aifc')
|
||||||
|
standard_library.remove('cgi')
|
||||||
|
standard_library.remove('cgitb')
|
||||||
|
standard_library.remove('chunk')
|
||||||
|
standard_library.remove('crypt')
|
||||||
|
standard_library.remove('imghdr')
|
||||||
|
standard_library.remove('lib2to3')
|
||||||
|
standard_library.remove('mailcap')
|
||||||
|
standard_library.remove('nntplib')
|
||||||
|
standard_library.remove('pipes')
|
||||||
|
standard_library.remove('sndhdr')
|
||||||
|
standard_library.remove('sunau')
|
||||||
|
standard_library.remove('telnetlib')
|
||||||
|
standard_library.remove('uu')
|
||||||
|
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