@@ -5,18 +5,20 @@ name: Build WinPython for 2025-05 Cycle
55# 2025-08-25a: will use manual uploaded free-threading, as astral doesn't provide
66# 2025-08-25b: move up all parameters
77# 2025-09-07: one single workflow to reduce code duplication
8+ # 2025-11-30: centralize links in one place, add 3.15, classify as b4
89
910on :
1011 workflow_dispatch :
1112 inputs :
1213 python_version :
13- description : ' Python version to build (3.13 or 3.14 )'
14+ description : ' Python version to build (3.13, 3.14 or 3.15 )'
1415 required : true
1516 default : ' 3.14'
1617 type : choice
1718 options :
1819 - ' 3.13'
1920 - ' 3.14'
21+ - ' 3.15'
2022
2123jobs :
2224 build-winpython :
@@ -29,98 +31,133 @@ jobs:
2931 - name : " dot"
3032 REQUIREMENTS_313 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_13_8_0dotb3.txt"
3133 REQUIREMENTS_314 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_14_0_2dotb3.txt"
34+ REQUIREMENTS_315 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_14_0_2dotb3.txt"
3235 REQUIREMENTS_WHL_313 : " "
3336 REQUIREMENTS_WHL_314 : " "
37+ REQUIREMENTS_WHL_315 : " "
3438 ZIP : " 1"
3539 SEVEN_Z : " 0"
3640 EXE : " 1"
3741 PANDOC : " 0"
3842 ARTIFACT_NAME_313 : " publish_313dot"
3943 ARTIFACT_NAME_314 : " publish_314dot"
44+ ARTIFACT_NAME_315 : " publish_315dot"
4045 WINPYARCH : " 64"
46+ WINPYARCHDET : " 64"
4147 WINPYVERSION_313 : " 313"
4248 WINPYVERSION_314 : " 314"
49+ WINPYVERSION_315 : " 315"
4350 WINPYVER2_313 : " 3.13.8.0"
4451 WINPYVER2_314 : " 3.14.0.2"
45- my_release_level : " b3"
52+ WINPYVER2_315 : " 3.15.0.0"
53+ my_release_level : " b4"
4654 build_location_313 : " WPy64-31380"
4755 build_location_314 : " WPy64-31402"
56+ build_location_315 : " WPy64-31500"
4857 - name : " slim"
4958 REQUIREMENTS_313 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_13_8_0slimb3.txt"
5059 REQUIREMENTS_314 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_14_0_2slimb3.txt"
60+ REQUIREMENTS_315 : " "
5161 REQUIREMENTS_WHL_313 : " "
5262 REQUIREMENTS_WHL_314 : " "
63+ REQUIREMENTS_WHL_315 : " "
5364 ZIP : " 0"
5465 SEVEN_Z : " 1"
5566 EXE : " 1"
5667 PANDOC : " 1"
5768 ARTIFACT_NAME_313 : " publish_313slim"
5869 ARTIFACT_NAME_314 : " publish_314slim"
70+ ARTIFACT_NAME_315 : " "
5971 WINPYARCH : " 64"
72+ WINPYARCHDET : " 64"
6073 WINPYVERSION_313 : " 313"
6174 WINPYVERSION_314 : " 314"
75+ WINPYVERSION_315 : " "
6276 WINPYVER2_313 : " 3.13.8.0"
6377 WINPYVER2_314 : " 3.14.0.2"
64- my_release_level : " b3"
78+ WINPYVER2_315 : " "
79+ my_release_level : " b4"
6580 build_location_313 : " WPy64-31380"
6681 build_location_314 : " WPy64-31402"
82+ build_location_315 : " "
6783 - name : " whl"
6884 REQUIREMENTS_313 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_13_8_0dotb3.txt"
6985 REQUIREMENTS_314 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_14_0_2dotb3.txt"
86+ REQUIREMENTS_315 : " "
7087 REQUIREMENTS_WHL_313 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_13_8_0whlb3_wheels.txt"
7188 REQUIREMENTS_WHL_314 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_14_0_2whlb3_wheels.txt"
89+ REQUIREMENTS_WHL_315 : " "
7290 ZIP : " 0"
7391 SEVEN_Z : " 1"
7492 EXE : " 0"
7593 PANDOC : " 0"
7694 ARTIFACT_NAME_313 : " publish_313whl"
7795 ARTIFACT_NAME_314 : " publish_314whl"
96+ ARTIFACT_NAME_315 : " "
7897 WINPYARCH : " 64"
98+ WINPYARCHDET : " 64"
7999 WINPYVERSION_313 : " 313"
80100 WINPYVERSION_314 : " 314"
101+ WINPYVERSION_315 : " "
81102 WINPYVER2_313 : " 3.13.8.0"
82103 WINPYVER2_314 : " 3.14.0.2"
83- my_release_level : " b3"
104+ WINPYVER2_315 : " "
105+ my_release_level : " b4"
84106 build_location_313 : " WPy64-31380"
85107 build_location_314 : " WPy64-31402"
108+ build_location_315 : " "
86109 - name : " free"
87110 REQUIREMENTS_313 : " "
88111 REQUIREMENTS_314 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_14_0_2freeb3.txt"
112+ REQUIREMENTS_315 : " "
89113 REQUIREMENTS_WHL_313 : " "
90114 REQUIREMENTS_WHL_314 : " "
115+ REQUIREMENTS_WHL_315 : " "
91116 ZIP : " 1"
92117 SEVEN_Z : " 0"
93118 EXE : " 1"
94119 PANDOC : " 0"
95120 ARTIFACT_NAME_313 : " "
96121 ARTIFACT_NAME_314 : " publish_314free"
122+ ARTIFACT_NAME_315 : " "
97123 WINPYARCH : " 64"
124+ WINPYARCHDET : " 64F"
98125 WINPYVERSION_313 : " "
99126 WINPYVERSION_314 : " 314"
127+ WINPYVERSION_315 : " "
100128 WINPYVER2_313 : " "
101129 WINPYVER2_314 : " 3.14.0.2"
102- my_release_level : " b3"
130+ WINPYVER2_315 : " "
131+ my_release_level : " b4"
103132 build_location_313 : " "
104133 build_location_314 : " WPy64-31402"
134+ build_location_315 : " "
105135 - name : " slimf"
106136 REQUIREMENTS_313 : " "
107137 REQUIREMENTS_314 : " winpython\\ portable\\ cycle_2025_05\\ requir.64-3_14_0_2slimfb3.txt"
138+ REQUIREMENTS_315 : " "
108139 REQUIREMENTS_WHL_313 : " "
109140 REQUIREMENTS_WHL_314 : " "
141+ REQUIREMENTS_WHL_315 : " "
110142 ZIP : " 1"
111143 SEVEN_Z : " 0"
112144 EXE : " 1"
113145 PANDOC : " 0"
114146 ARTIFACT_NAME_313 : " "
115147 ARTIFACT_NAME_314 : " publish_314slimf"
148+ ARTIFACT_NAME_315 : " "
116149 WINPYARCH : " 64"
150+ WINPYARCHDET : " 64F"
117151 WINPYVERSION_313 : " "
118152 WINPYVERSION_314 : " 314"
153+ WINPYVERSION_315 : " "
119154 WINPYVER2_313 : " "
120155 WINPYVER2_314 : " 3.14.0.2"
121- my_release_level : " b3"
156+ WINPYVER2_315 : " "
157+ my_release_level : " b4"
122158 build_location_313 : " "
123159 build_location_314 : " WPy64-31402"
160+ build_location_315 : " "
124161
125162 steps :
126163 - name : Checkout repository
@@ -152,8 +189,19 @@ jobs:
152189 echo "build_location=${{ matrix.flavor.build_location_314 }}" >> $GITHUB_ENV
153190 echo "destwheelhouse=${{ matrix.flavor.build_location_314 }}\\wheelhouse\\included.wheels" >> $GITHUB_ENV
154191 echo "WINPYVER=${{ matrix.flavor.WINPYVER2_314 }}${{ matrix.flavor.name }}${{ matrix.flavor.my_release_level }}" >> $GITHUB_ENV
155- fi
192+ elif [ "$PYTHON_VERSION" = "3.15" ]; then echo "WINPYrequirements=${{ matrix.flavor.REQUIREMENTS_315 }}" >> $GITHUB_ENV
193+ echo "WINPYrequirementswhl=${{ matrix.flavor.REQUIREMENTS_WHL_315 }}" >> $GITHUB_ENV
194+ echo "ARTIFACT_NAME=${{ matrix.flavor.ARTIFACT_NAME_315 }}" >> $GITHUB_ENV
195+ echo "WINPYVERSION=${{ matrix.flavor.WINPYVERSION_315 }}" >> $GITHUB_ENV
196+ echo "WINPYVER2=${{ matrix.flavor.WINPYVER2_315 }}" >> $GITHUB_ENV
197+ echo "build_location=${{ matrix.flavor.build_location_315 }}" >> $GITHUB_ENV
198+ echo "destwheelhouse=${{ matrix.flavor.build_location_315 }}\\wheelhouse\\included.wheels" >> $GITHUB_ENV
199+ echo "WINPYVER=${{ matrix.flavor.WINPYVER2_315 }}${{ matrix.flavor.name }}${{ matrix.flavor.my_release_level }}" >> $GITHUB_ENV
200+ fi
201+
202+ # write common flavor env vars
156203 echo "WINPYARCH=$WINPYARCH" >> $GITHUB_ENV
204+ echo "WINPYARCHDET=$WINPYARCHDET" >> $GITHUB_ENV
157205 echo "WINPYFLAVOR=$FLAVOR" >> $GITHUB_ENV
158206 echo "WINPYZIP=${{ matrix.flavor.ZIP }}" >> $GITHUB_ENV
159207 echo "WINPY7Z=${{ matrix.flavor.SEVEN_Z }}" >> $GITHUB_ENV
@@ -168,25 +216,31 @@ jobs:
168216
169217 # Centralized mapping of python binaries and SHAs by version and arch.
170218 # NOTE: fill the 3.15 URLs and SHA values when available.
171- # 3.13 x64 (example )
172- if [ "$PYTHON_VERSION" = "3.13" ] && [ "$WINPYARCH " = "64" ]; then
219+ # 3.13 x64 (GIL )
220+ if [ "$PYTHON_VERSION" = "3.13" ] && [ "$WINPYARCHDET " = "64" ]; then
173221 echo "python_source=https://github.com/astral-sh/python-build-standalone/releases/download/20251031/cpython-3.13.9+20251031-x86_64-pc-windows-msvc-install_only_stripped.tar.gz" >> $GITHUB_ENV
174222 echo "python_sha256=3cdf2ad27fdeea2592b63e5a658aa65733b028a55332fa1aa27be4ce8aef96c0" >> $GITHUB_ENV
175223 fi
176224
177- # 3.14 x64 (existing )
178- if [ "$PYTHON_VERSION" = "3.14" ] && [ "$WINPYARCH " = "64" ]; then
225+ # 3.14 x64 (GIL )
226+ if [ "$PYTHON_VERSION" = "3.14" ] && [ "$WINPYARCHDET " = "64" ]; then
179227 echo "python_source=https://github.com/astral-sh/python-build-standalone/releases/download/20251031/cpython-3.14.0+20251031-x86_64-pc-windows-msvc-install_only_stripped.tar.gz" >> $GITHUB_ENV
180228 echo "python_sha256=a64800cbfbf1c384b9ac7eb5964a9a4c37537791e7ac80eb66b03ccb6f2c2e80" >> $GITHUB_ENV
181229 fi
182230
183- # 3.14 i686 - user provided URL (example for preparing i686 builds).
231+ # 3.14 X64 (free-threading)
184232 # SHA not provided here: fill the correct SHA for security, otherwise the workflow will skip SHA check.
185- if [ "$PYTHON_VERSION" = "3.14" ] && [ "$WINPYARCH" = "32 " ]; then
186- echo "python_source=https://github.com/astral-sh/python-build-standalone/releases/download/20251120 /cpython-3.14.0+20251120-i686 -pc-windows-msvc-install_only_stripped .tar.gz " >> $GITHUB_ENV
187- echo "python_sha256=" >> $GITHUB_ENV
233+ if [ "$PYTHON_VERSION" = "3.14" ] && [ "$WINPYARCH" = "64F " ]; then
234+ echo "python_source=https://github.com/astral-sh/python-build-standalone/releases/download/20251031 /cpython-3.14.0+20251031-x86_64 -pc-windows-msvc-freethreaded+pgo-full .tar.zst " >> $GITHUB_ENV
235+ echo "python_sha256=b81de5fc9e783ea6dfcf1098c28a278c874999c71afbb0309f6a8b4276c769d0"
188236 fi
189237
238+ # 3.15 X64 (GIL)
239+ if [ "$PYTHON_VERSION" = "3.15" ] && [ "$WINPYARCHDET" = "64" ]; then
240+ # Example placeholders -- replace with real URLs and shas when available
241+ echo "python_source=https://github.com/astral-sh/python-build-standalone/releases/download/20251120/cpython-3.15.0a2+20251120-x86_64-pc-windows-msvc-install_only_stripped.tar.gz" >> $GITHUB_ENV
242+ echo "python_sha256=50e8d463a7838c36e01b053a8d01d5c58519e530098d52c7456660a76f3f35f7" >> $GITHUB_ENV
243+ fi
190244
191245 - name : See variables
192246 if : env.ARTIFACT_NAME != ''
@@ -207,6 +261,7 @@ jobs:
207261 Write-Output "build_location is $env:build_location"
208262
209263 Write-Output "WINPYARCH is $env:WINPYARCH"
264+ Write-Output "WINPYARCHDET is $env:WINPYARCHDET"
210265 Write-Output "WINPYZIP is $env:WINPYZIP"
211266 Write-Output "WINPY7Z is $env:WINPY7Z"
212267 Write-Output "WINPYEXE is $env:WINPYEXE"
0 commit comments