Compare commits

...

45 Commits

Author SHA1 Message Date
github-actions[bot]
bcf6ecc82e Update versions-manifest (#341)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-05-28 00:12:01 -05:00
Matthieu Darbois
2eea8c8fed chore: use windows-11-arm runner instead of custom one (#338)
This allows contributors to test on GitHub hosted Windows ARM64 runners easily now that those runners are available for free for public repositories
2025-05-27 13:36:58 -05:00
Max Schmitt
56544d4840 fix(windows): verbose output on Windows (#339) 2025-05-15 22:11:05 -05:00
github-actions[bot]
96e291c21e Update versions-manifest (#340)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-05-07 23:34:45 -05:00
Hugo van Kemenade
d5e8ad6406 Remove EOL Python code, set 3.9 as base, add 3.14 stdlib module (#317)
* Remove redundant Python 2 code

* Use Python 3.2 as base version

* Use Python 3.3 as base version

* Use Python 3.4 as base version

* Use Python 3.5 as base version

* Use Python 3.6 as base version

* Use Python 3.7 as base version

* Use Python 3.8 as base version

* Use Python 3.9 as base version

* Add annotationlib for Python 3.14

* Fix syntax error
2025-04-24 15:29:21 -05:00
aparnajyothi-y
5c01d17435 Remove Ubuntu 20.04 and Update Stable and Unstable Versions for Tests (#336)
* Remove ubuntu-20.04 and updated the stable and unstable test cases

* arch update for freethreaded

* Remove duplicate 'ubuntu-latest' from matrix OS

---------

Co-authored-by: Haritha <73516759+HarithaVattikuti@users.noreply.github.com>
2025-04-16 12:06:27 -05:00
Matthieu Darbois
bc5b4d5490 chore: use ubuntu-*-arm runners instead of custom ones (#330)
This allows contributors to test on GitHub hosted Linux ARM64 runners easily now that those runners are available for free for public repositories: https://github.blog/changelog/2025-01-16-linux-arm64-hosted-runners-now-available-for-free-in-public-repositories-public-preview/
2025-04-15 14:45:36 -05:00
github-actions[bot]
a12e3a2eaa Update versions-manifest (#337)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-04-09 11:22:45 -05:00
github-actions[bot]
5ebefacc0b Update versions-manifest (#335)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-03-17 12:17:01 -05:00
github-actions[bot]
1c10cada84 Update versions-manifest (#334)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-03-10 13:40:46 -05:00
github-actions[bot]
3854fb534e Update versions-manifest (#333)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-02-24 12:29:37 -06:00
Sam Gross
d456108e6b Support building free-threaded CPython (#319)
* Support building free-threaded CPython

Add support for Python's free threading build mode where the global
interpreter lock is disabled. The packages are marked using a suffix on
the architecture, like 'x64-freethreaded' or 'arm64-freethreaded'.

* Match '-freethreaded' in arch

* Use type 'string' instead of 'str'

* On Linux, only delete Python installations with the same architecture.

This matches the macOS behavior and allows users to install both the
free-threading and default builds at the same time.
2025-02-20 08:42:21 -06:00
github-actions[bot]
e550a75036 Update versions-manifest (#332)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-02-12 09:42:34 -06:00
github-actions[bot]
4f85d6a62f Update versions-manifest (#331)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-02-05 09:02:58 -06:00
github-actions[bot]
e5b79ff409 Update versions-manifest (#329)
Co-authored-by: Service account <no-reply@microsoft.com>
2025-01-15 09:24:57 -06:00
priya-kinthali
4cee44596d Enhance workflows: Add Ubuntu-24 Testing (#326)
* include ubuntu24 testing in workflows

* included macos-13 testing
2024-12-19 13:08:49 -06:00
github-actions[bot]
d7df8df9ba Update versions-manifest (#327)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-12-18 11:26:47 -06:00
github-actions[bot]
54c77b6778 Update versions-manifest (#325)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-12-16 10:23:58 -06:00
HarithaVattikuti
87721c9ae3 Fix tkinter issues (#324) 2024-12-12 12:49:43 -06:00
github-actions[bot]
5bbc2cab12 Update versions-manifest (#322)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-12-04 13:29:08 -06:00
github-actions[bot]
771cbab387 Update versions-manifest (#321)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-11-20 08:31:56 -06:00
aparnajyothi-y
7069021fff Update openssl 1.1 to 3 (#316)
* Update openssl to 3

* openssl update 3
2024-11-04 19:18:59 -06:00
priya-kinthali
d8ae6ee095 updated the latest versions and included macos-13 (#315) 2024-10-21 15:25:52 -05:00
github-actions[bot]
dd24c2e5e7 Update versions-manifest (#314)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-10-16 11:26:00 -05:00
github-actions[bot]
48bcef9764 Update versions-manifest (#312)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-10-08 09:52:56 -05:00
github-actions[bot]
5d096de548 Update versions-manifest (#310)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-10-07 22:28:59 -05:00
github-actions[bot]
b0ba1dbe1e Update versions-manifest (#309)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-10-03 11:32:43 -05:00
github-actions[bot]
8eb4ff3a92 Update versions-manifest (#308)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-10-02 23:40:17 -05:00
github-actions[bot]
98e79473eb Update versions-manifest (#307)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-09-30 14:52:11 -05:00
github-actions[bot]
16955773ac Update versions-manifest (#306)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-09-09 14:30:08 -05:00
github-actions[bot]
c41d908608 Update versions-manifest (#305)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-08-29 11:27:37 -05:00
aparnajyothi-y
8dd72e5592 Fix for the build failures on the self-hosted Ubuntu 24.04 arm64 runner for no restart (#304)
* Update build-python-packages.yml

* Update build-python-packages.yml

* fix for ubuntu 24.04 issue for no restart
2024-08-29 09:03:33 -05:00
github-actions[bot]
b8cfd51f65 Update versions-manifest (#303)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-08-13 23:24:55 -05:00
aparnajyothi-y
bb9054d05d Fix for the build failures on the ubuntu 24.04 runner (#302)
* Update build-python-packages.yml

* Update build-python-packages.yml
2024-08-13 14:11:29 -05:00
github-actions[bot]
c8a840c660 Update versions-manifest (#301)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-08-07 10:12:25 -05:00
github-actions[bot]
b423327e4a Update versions-manifest (#300)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-08-06 08:44:31 -05:00
aparnajyothi-y
2f8ab97baf Fix for the Codeql-analysis.yml workflow failure (#299)
* Update codeql-analysis.yml

* Update codeql-analysis.yml

* Update codeql-analysis.yml

* Update codeql-analysis.yml
2024-07-25 08:47:57 -05:00
github-actions[bot]
9d3be767fc Update versions-manifest (#298)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-07-22 08:53:23 -05:00
github-actions[bot]
80d68b2b90 Update versions-manifest (#297)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-07-17 17:08:23 -05:00
github-actions[bot]
2438e271b9 Update versions-manifest (#296)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-07-16 08:56:00 -05:00
HarithaVattikuti
3970f04eb4 Add support for Ubuntu 24 arm64 runner (#294)
* Add support for Ubuntu 24 arm64 runner

* Update macos runner
2024-07-15 16:15:55 -05:00
github-actions[bot]
57f2d897a8 Update versions-manifest (#293)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-07-01 08:35:03 -05:00
github-actions[bot]
0c9a1f7cd6 Update versions-manifest (#292)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-06-26 12:15:49 -05:00
aparnajyothi-y
0e5f00e5d0 Add windows arm64 support (#291)
* Update build-python-packages.yml

* windows arm64 support

* Update build-python-packages.yml

* Update build-python-packages.yml

* Update build-python-packages.yml

* Update build-python-packages.yml

* Update build-python-packages.yml
2024-06-25 13:14:08 -05:00
github-actions[bot]
1d2e861434 Update versions-manifest (#289)
Co-authored-by: Service account <no-reply@microsoft.com>
2024-06-23 23:48:32 -05:00
21 changed files with 4478 additions and 583 deletions

View File

@@ -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,macos-11_x64,macos-14_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-2019_x64,windows-2019_x86,windows-11_arm64'
pull_request: pull_request:
paths-ignore: paths-ignore:
- 'versions-manifest.json' - 'versions-manifest.json'
@@ -39,29 +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,macos-11,macos-14_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-2019_x64,windows-2019_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") {
$matrix += @{ if ([semver]"${{ inputs.VERSION }}" -lt [semver]"3.13.0") {
'platform' = $platform continue;
'os' = $os }
'arch' = $arch $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:
@@ -72,17 +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: 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:
@@ -100,7 +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: Check out repository code - name: Check out repository code
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
@@ -148,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
@@ -241,4 +259,3 @@ jobs:
workflow_id: 'create-pr.yml', workflow_id: 'create-pr.yml',
ref: 'main' ref: 'main'
}); });

View File

@@ -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"]'

View File

@@ -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

View File

@@ -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

View File

@@ -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[$_]) }

View File

@@ -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"

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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
} }

View 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>

View 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>

View File

@@ -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,

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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" {

View File

@@ -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
} }

View File

@@ -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')

View File

@@ -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',

View File

@@ -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