Skip to content

Commit 76e1f69

Browse files
authored
Implement free-threaded build for the Windows release (#81)
1 parent e09c9a7 commit 76e1f69

11 files changed

Lines changed: 177 additions & 9 deletions

windows-release/azure-pipelines.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ parameters:
3939
displayName: "Signature description"
4040
type: string
4141
default: 'Built: $(Build.BuildNumber)'
42+
- name: DoFreethreaded
43+
displayName: "Include free-threaded builds (3.13 and later)"
44+
type: boolean
45+
default: true
4246
- name: DoARM64
4347
displayName: "Publish ARM64 build (3.11 and later)"
4448
type: boolean
@@ -106,6 +110,7 @@ variables:
106110
${{ else }}:
107111
IsRealSigned: false
108112
DoCHM: ${{ parameters.DoCHM }}
113+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
109114
DoLayout: ${{ parameters.DoLayout }}
110115
DoMSIX: ${{ parameters.DoMSIX }}
111116
DoNuget: ${{ parameters.DoNuget }}
@@ -128,6 +133,7 @@ stages:
128133
- template: stage-build.yml
129134
parameters:
130135
ARM64TclTk: ${{ parameters.ARM64TclTk }}
136+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
131137
DoPGO: ${{ parameters.DoPGO }}
132138
DoPGOARM64: ${{ parameters.DoPGOARM64 }}
133139

@@ -147,8 +153,11 @@ stages:
147153
- template: stage-layout-full.yml
148154
parameters:
149155
ARM64TclTk: ${{ parameters.ARM64TclTk }}
156+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
150157
- template: stage-layout-embed.yml
151158
- template: stage-layout-nuget.yml
159+
parameters:
160+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
152161

153162
- stage: Pack
154163
dependsOn: Layout
@@ -157,12 +166,15 @@ stages:
157166
parameters:
158167
${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }}:
159168
SigningCertificate: ${{ parameters.SigningCertificate }}
169+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
160170

161171
- stage: Test
162172
dependsOn: Pack
163173
jobs:
164174
- template: stage-test-embed.yml
165175
- template: stage-test-nuget.yml
176+
parameters:
177+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
166178

167179
- ${{ if eq(parameters.DoMSIX, 'true') }}:
168180
- stage: Layout_MSIX
@@ -192,12 +204,15 @@ stages:
192204
ARM64TclTk: ${{ parameters.ARM64TclTk }}
193205
${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }}:
194206
SigningCertificate: ${{ parameters.SigningCertificate }}
207+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
195208

196209
- stage: Test_MSI
197210
displayName: Test MSI installer
198211
dependsOn: Build_MSI
199212
jobs:
200213
- template: stage-test-msi.yml
214+
parameters:
215+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
201216

202217
- ${{ if eq(parameters.DoPublish, 'true') }}:
203218
- ${{ if eq(parameters.DoMSI, 'true') }}:

windows-release/build-steps-pgo.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ parameters:
22
PGInstrument: false
33
PGRun: false
44
PGUpdate: false
5+
DoFreethreaded: false
56

67
steps:
78
- template: ./checkout.yml
@@ -28,6 +29,15 @@ steps:
2829
IncludeUwp: true
2930
Py_OutDir: '$(Build.BinariesDirectory)\bin'
3031
32+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
33+
- powershell: |
34+
$env:SigningCertificate = $null
35+
.\PCbuild\build.bat -v -p $(Platform) -c PGInstrument --disable-gil
36+
displayName: 'Run free-threaded build'
37+
env:
38+
IncludeUwp: true
39+
Py_OutDir: '$(Build.BinariesDirectory)\bin'
40+
3141
- ${{ if ne(parameters.PGRun, 'true') }}:
3242
# Not running in this job, so we publish our entire build and object files
3343

@@ -66,6 +76,16 @@ steps:
6676
env:
6777
PYTHONHOME: '$(Build.SourcesDirectory)'
6878
79+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
80+
- powershell: |
81+
$exe = (gci "$(Build.BinariesDirectory)\bin\$(Arch)\instrumented\python3*t.exe" | select -First 1)
82+
& $exe -m test --pgo
83+
ignoreLASTEXITCODE: true
84+
displayName: 'Collect free-threaded profile'
85+
env:
86+
PYTHONHOME: '$(Build.SourcesDirectory)'
87+
88+
6989
- ${{ if ne(parameters.PGUpdate, 'true') }}:
7090
# Not finishing in this job, so publish the binaries
7191
- task: PublishPipelineArtifact@0
@@ -107,6 +127,15 @@ steps:
107127
IncludeUwp: true
108128
Py_OutDir: '$(Build.BinariesDirectory)\bin'
109129
130+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
131+
- powershell: |
132+
$env:SigningCertificate = $null
133+
.\PCbuild\build.bat -v -p $(Platform) -c PGUpdate --disable-gil
134+
displayName: 'Run free-threaded build with PGO'
135+
env:
136+
IncludeUwp: true
137+
Py_OutDir: '$(Build.BinariesDirectory)\bin'
138+
110139
- powershell: |
111140
$kitroot = (gp 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\').KitsRoot10
112141
$tool = (gci -r "$kitroot\Bin\*\x64\signtool.exe" | sort FullName -Desc | select -First 1)

windows-release/build-steps.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
parameters:
22
ShouldPGO: false
3+
DoFreethreaded: false
34

45
steps:
56
- template: ./checkout.yml
@@ -15,6 +16,12 @@ steps:
1516
Write-Host "##vso[build.addbuildtag]$($d.PythonVersion)-$(Name)"
1617
displayName: 'Extract version numbers'
1718

19+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
20+
- powershell: |
21+
Write-Host "##vso[build.addbuildtag]freethreaded"
22+
Write-Host "##vso[build.addbuildtag]$(VersionText)-freethreaded"
23+
displayName: 'Add freethreaded tags'
24+
1825
- ${{ if eq(parameters.ShouldPGO, 'false') }}:
1926
- powershell: |
2027
$env:SigningCertificate = $null
@@ -24,6 +31,15 @@ steps:
2431
IncludeUwp: true
2532
Py_OutDir: '$(Build.BinariesDirectory)\bin'
2633
34+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
35+
- powershell: |
36+
$env:SigningCertificate = $null
37+
.\PCbuild\build.bat -v -p $(Platform) -c $(Configuration) --disable-gil
38+
displayName: 'Run free-threaded build'
39+
env:
40+
IncludeUwp: true
41+
Py_OutDir: '$(Build.BinariesDirectory)\bin'
42+
2743
- ${{ if eq(parameters.ShouldPGO, 'true') }}:
2844
- powershell: |
2945
$env:SigningCertificate = $null
@@ -33,6 +49,15 @@ steps:
3349
IncludeUwp: true
3450
Py_OutDir: '$(Build.BinariesDirectory)\bin'
3551
52+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
53+
- powershell: |
54+
$env:SigningCertificate = $null
55+
.\PCbuild\build.bat -v -p $(Platform) --pgo --disable-gil
56+
displayName: 'Run free-threaded build'
57+
env:
58+
IncludeUwp: true
59+
Py_OutDir: '$(Build.BinariesDirectory)\bin'
60+
3661
- powershell: |
3762
$kitroot = (gp 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\').KitsRoot10
3863
$tool = (gci -r "$kitroot\Bin\*\x64\signtool.exe" | sort FullName -Desc | select -First 1)

windows-release/msi-steps.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
parameters:
22
ARM64TclTk: true
3+
DoFreethreaded: false
34
SigningCertificate: ''
45

56
steps:
@@ -90,7 +91,7 @@ steps:
9091
call Tools\msi\get_externals.bat
9192
call PCbuild\find_python.bat
9293
echo ##vso[task.setvariable variable=PYTHON]%PYTHON%
93-
call PCbuild/find_msbuild.bat
94+
call PCbuild\find_msbuild.bat
9495
echo ##vso[task.setvariable variable=MSBUILD]%MSBUILD%
9596
displayName: 'Get external dependencies'
9697
@@ -106,6 +107,12 @@ steps:
106107
gc msbuild.rsp
107108
displayName: 'Generate response file'
108109
110+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
111+
- powershell: |
112+
"/p:IncludeFreethreaded=true" | Out-File "$(ResponseFile)" -Append -Encoding UTF8
113+
gc "$(ResponseFile)"
114+
displayName: 'Add Include_freethreaded to response file'
115+
109116
- ${{ if parameters.SigningCertificate }}:
110117
- task: DotNetCoreCLI@2
111118
inputs:

windows-release/purge.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
"exe.msi",
3838
"exe_d.msi",
3939
"exe_pdb.msi",
40+
"freethreaded.msi",
41+
"freethreaded_d.msi",
42+
"freethreaded_pdb.msi",
4043
"launcher.msi",
4144
"lib.msi",
4245
"lib_d.msi",

windows-release/stage-build.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ parameters:
33
DoPGO: false
44
# DoPGOARM64 only applies if DoPGO is also true
55
DoPGOARM64: true
6+
DoFreethreaded: false
67

78
jobs:
89
- job: Build_Docs
@@ -95,6 +96,8 @@ jobs:
9596

9697
steps:
9798
- template: ./build-steps.yml
99+
parameters:
100+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
98101

99102

100103
- ${{ if eq(parameters.DoPGO, 'true') }}:
@@ -118,6 +121,7 @@ jobs:
118121
steps:
119122
- template: ./build-steps-pgo.yml
120123
parameters:
124+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
121125
PGInstrument: true
122126
PGRun: true
123127
PGUpdate: true
@@ -143,6 +147,7 @@ jobs:
143147
steps:
144148
- template: ./build-steps-pgo.yml
145149
parameters:
150+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
146151
PGInstrument: true
147152

148153
- job: Build_Python_PGO_2
@@ -168,6 +173,7 @@ jobs:
168173
steps:
169174
- template: ./build-steps-pgo.yml
170175
parameters:
176+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
171177
PGRun: true
172178

173179
- job: Build_Python_PGO_3
@@ -191,6 +197,7 @@ jobs:
191197
steps:
192198
- template: ./build-steps-pgo.yml
193199
parameters:
200+
DoFreethreaded: ${{ parameters.DoFreethreaded }}
194201
PGUpdate: true
195202

196203

windows-release/stage-layout-full.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
parameters:
22
ARM64TclTk: true
3+
DoFreethreaded: false
34

45
jobs:
56
- job: Make_Layouts
@@ -73,8 +74,22 @@ jobs:
7374
env:
7475
TCL_LIBRARY: $(TclLibrary)
7576
77+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
78+
- powershell: |
79+
$(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\layout_freethreaded" --preset-default --include-freethreaded
80+
displayName: 'Generate full freethreaded layout'
81+
env:
82+
TCL_LIBRARY: $(TclLibrary)
83+
7684
- task: PublishPipelineArtifact@0
7785
displayName: 'Publish Artifact: layout_full_$(Name)'
7886
inputs:
7987
targetPath: '$(Build.ArtifactStagingDirectory)\layout'
8088
artifactName: layout_full_$(Name)
89+
90+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
91+
- task: PublishPipelineArtifact@0
92+
displayName: 'Publish Artifact: layout_full_freethreaded_$(Name)'
93+
inputs:
94+
targetPath: '$(Build.ArtifactStagingDirectory)\layout_freethreaded'
95+
artifactName: layout_full_freethreaded_$(Name)

windows-release/stage-layout-nuget.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
parameters:
2+
DoFreethreaded: false
3+
14
jobs:
25
- job: Make_Nuget_Layout
36
displayName: Make Nuget layout
@@ -45,8 +48,20 @@ jobs:
4548
$(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\nuget" --preset-nuget
4649
displayName: 'Generate nuget layout'
4750
51+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
52+
- powershell: |
53+
$(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\nuget_freethreaded" --preset-nuget --include-freethreaded
54+
displayName: 'Generate freethreaded nuget layout'
55+
4856
- task: PublishPipelineArtifact@0
4957
displayName: 'Publish Artifact: layout_nuget_$(Name)'
5058
inputs:
5159
targetPath: '$(Build.ArtifactStagingDirectory)\nuget'
5260
artifactName: layout_nuget_$(Name)
61+
62+
- ${{ if eq(parameters.DoFreethreaded, 'true') }}:
63+
- task: PublishPipelineArtifact@0
64+
displayName: 'Publish Artifact: layout_nuget_freethreaded_$(Name)'
65+
inputs:
66+
targetPath: '$(Build.ArtifactStagingDirectory)\nuget_freethreaded'
67+
artifactName: layout_nuget_freethreaded_$(Name)

windows-release/stage-msi.yml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
parameters:
22
ARM64TclTk: true
3+
DoFreethreaded: false
34
SigningCertificate: ''
45

56
jobs:
67
- ${{ if parameters.SigningCertificate }}:
78
- job: Make_Signed_MSI
89
displayName: Make signed MSI
9-
10+
1011
pool:
1112
vmImage: windows-2022
12-
13+
1314
variables:
1415
- group: CPythonSign
1516
- name: ReleaseUri
@@ -18,10 +19,10 @@ jobs:
1819
value: https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi}
1920
- name: Py_OutDir
2021
value: $(Build.BinariesDirectory)
21-
22+
2223
workspace:
2324
clean: all
24-
25+
2526
steps:
2627
- template: msi-steps.yml
2728
parameters:
@@ -32,19 +33,20 @@ jobs:
3233
- ${{ else }}:
3334
- job: Make_MSI
3435
displayName: Make MSI
35-
36+
3637
pool:
3738
vmImage: windows-2022
38-
39+
3940
variables:
4041
ReleaseUri: http://www.python.org/{arch}
4142
DownloadUrl: https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi}
4243
Py_OutDir: $(Build.BinariesDirectory)
43-
44+
4445
workspace:
4546
clean: all
46-
47+
4748
steps:
4849
- template: msi-steps.yml
4950
parameters:
5051
ARM64TclTk: ${{ parameters.ARM64TclTk }}
52+
DoFreethreaded: ${{ parameters.DoFreethreaded }}

0 commit comments

Comments
 (0)