From c8c533f8796fe3dbbbc88227deb3155d90ef482f Mon Sep 17 00:00:00 2001
From: regro-cf-autotick-bot
<36490558+regro-cf-autotick-bot@users.noreply.github.com>
Date: Tue, 27 Jan 2026 00:57:43 +0000
Subject: [PATCH 1/5] migration: supportwindowsarm64platform
---
conda-forge.yml | 1 +
recipe/meta.yaml | 2 ++
2 files changed, 3 insertions(+)
diff --git a/conda-forge.yml b/conda-forge.yml
index a16962d8..ab94597a 100644
--- a/conda-forge.yml
+++ b/conda-forge.yml
@@ -9,6 +9,7 @@ build_platform:
linux_aarch64: linux_64
linux_ppc64le: linux_64
osx_arm64: osx_64
+ win_arm64: win_64
conda_build:
pkg_format: '2'
conda_forge_output_validation: true
diff --git a/recipe/meta.yaml b/recipe/meta.yaml
index 17b8d6e7..fb28f323 100644
--- a/recipe/meta.yaml
+++ b/recipe/meta.yaml
@@ -86,6 +86,8 @@ build:
requirements:
build:
+ - python # [build_platform != target_platform]
+ - cross-python_{{ target_platform }} # [build_platform != target_platform]
- patch # [not win]
- m2-patch # [win]
- m2-gcc-libs # [win]
From 1e4fd3840735077c4ca5daf7f632ccc7d72fa312 Mon Sep 17 00:00:00 2001
From: regro-cf-autotick-bot
<36490558+regro-cf-autotick-bot@users.noreply.github.com>
Date: Tue, 27 Jan 2026 00:59:37 +0000
Subject: [PATCH 2/5] MNT: Re-rendered with conda-smithy 3.54.1 and
conda-forge-pinning 2026.01.26.23.17.1
---
.azure-pipelines/azure-pipelines-win.yml | 6 +++
.ci_support/win_arm64_freethreadingno.yaml | 43 +++++++++++++++++++++
.ci_support/win_arm64_freethreadingyes.yaml | 43 +++++++++++++++++++++
.scripts/run_osx_build.sh | 19 +++++++++
README.md | 14 +++++++
5 files changed, 125 insertions(+)
create mode 100644 .ci_support/win_arm64_freethreadingno.yaml
create mode 100644 .ci_support/win_arm64_freethreadingyes.yaml
diff --git a/.azure-pipelines/azure-pipelines-win.yml b/.azure-pipelines/azure-pipelines-win.yml
index d5d5b998..90c44503 100755
--- a/.azure-pipelines/azure-pipelines-win.yml
+++ b/.azure-pipelines/azure-pipelines-win.yml
@@ -14,6 +14,12 @@ jobs:
win_64_freethreadingyes:
CONFIG: win_64_freethreadingyes
UPLOAD_PACKAGES: 'True'
+ win_arm64_freethreadingno:
+ CONFIG: win_arm64_freethreadingno
+ UPLOAD_PACKAGES: 'True'
+ win_arm64_freethreadingyes:
+ CONFIG: win_arm64_freethreadingyes
+ UPLOAD_PACKAGES: 'True'
timeoutInMinutes: 360
variables:
CONDA_BLD_PATH: D:\\bld\\
diff --git a/.ci_support/win_arm64_freethreadingno.yaml b/.ci_support/win_arm64_freethreadingno.yaml
new file mode 100644
index 00000000..0ce25317
--- /dev/null
+++ b/.ci_support/win_arm64_freethreadingno.yaml
@@ -0,0 +1,43 @@
+build_type:
+- release
+bzip2:
+- '1'
+c_compiler:
+- vs2022
+c_stdlib:
+- vs
+channel_sources:
+- conda-forge/label/python_rc,conda-forge
+channel_targets:
+- conda-forge main
+cxx_compiler:
+- vs2022
+expat:
+- '2'
+freethreading:
+- 'no'
+libffi:
+- '3.5'
+liblzma_devel:
+- '5'
+libsqlite:
+- '3'
+openssl:
+- '3.5'
+pin_run_as_build:
+ python:
+ min_pin: x.x
+ max_pin: x.x
+python:
+- '3.14'
+target_platform:
+- win-arm64
+tk:
+- '8.6'
+zip_keys:
+- - build_type
+ - channel_targets
+zlib:
+- '1'
+zstd:
+- '1.5'
diff --git a/.ci_support/win_arm64_freethreadingyes.yaml b/.ci_support/win_arm64_freethreadingyes.yaml
new file mode 100644
index 00000000..e82aad0a
--- /dev/null
+++ b/.ci_support/win_arm64_freethreadingyes.yaml
@@ -0,0 +1,43 @@
+build_type:
+- release
+bzip2:
+- '1'
+c_compiler:
+- vs2022
+c_stdlib:
+- vs
+channel_sources:
+- conda-forge/label/python_rc,conda-forge
+channel_targets:
+- conda-forge main
+cxx_compiler:
+- vs2022
+expat:
+- '2'
+freethreading:
+- 'yes'
+libffi:
+- '3.5'
+liblzma_devel:
+- '5'
+libsqlite:
+- '3'
+openssl:
+- '3.5'
+pin_run_as_build:
+ python:
+ min_pin: x.x
+ max_pin: x.x
+python:
+- '3.14'
+target_platform:
+- win-arm64
+tk:
+- '8.6'
+zip_keys:
+- - build_type
+ - channel_targets
+zlib:
+- '1'
+zstd:
+- '1.5'
diff --git a/.scripts/run_osx_build.sh b/.scripts/run_osx_build.sh
index 361edeb2..bac7141a 100755
--- a/.scripts/run_osx_build.sh
+++ b/.scripts/run_osx_build.sh
@@ -63,6 +63,25 @@ if [[ "${sha:-}" == "" ]]; then
sha=$(git rev-parse HEAD)
fi
+if [[ "${OSX_SDK_DIR:-}" == "" ]]; then
+ if [[ "${CI:-}" == "" ]]; then
+ echo "Please set OSX_SDK_DIR to a directory where SDKs can be downloaded to. Aborting"
+ exit 1
+ else
+ export OSX_SDK_DIR=/opt/conda-sdks
+ /usr/bin/sudo mkdir -p "${OSX_SDK_DIR}"
+ /usr/bin/sudo chown "${USER}" "${OSX_SDK_DIR}"
+ fi
+else
+ if tmpf=$(mktemp -p "$OSX_SDK_DIR" tmp.XXXXXXXX 2>/dev/null); then
+ rm -f "$tmpf"
+ echo "OSX_SDK_DIR is writeable without sudo, continuing"
+ else
+ echo "User-provided OSX_SDK_DIR is not writeable for current user! Aborting"
+ exit 1
+ fi
+fi
+
echo -e "\n\nRunning the build setup script."
source run_conda_forge_build_setup
diff --git a/README.md b/README.md
index 78eed68b..84b4babd 100644
--- a/README.md
+++ b/README.md
@@ -212,6 +212,20 @@ Current build status
+
+ | win_arm64_freethreadingno |
+
+
+
+
+ |
+
+ | win_arm64_freethreadingyes |
+
+
+
+
+ |
From b76fe9bf4dc676fd7334822b212c1487548222f5 Mon Sep 17 00:00:00 2001
From: Isuru Fernando
Date: Mon, 26 Jan 2026 17:09:02 -0800
Subject: [PATCH 3/5] Remove Python requirements for cross-platform builds
Removed unnecessary Python requirements for cross-platform builds.
---
recipe/meta.yaml | 2 --
1 file changed, 2 deletions(-)
diff --git a/recipe/meta.yaml b/recipe/meta.yaml
index fb28f323..17b8d6e7 100644
--- a/recipe/meta.yaml
+++ b/recipe/meta.yaml
@@ -86,8 +86,6 @@ build:
requirements:
build:
- - python # [build_platform != target_platform]
- - cross-python_{{ target_platform }} # [build_platform != target_platform]
- patch # [not win]
- m2-patch # [win]
- m2-gcc-libs # [win]
From b42732c3a15e2244b8840b735e617fa1bedb1e6d Mon Sep 17 00:00:00 2001
From: Isuru Fernando
Date: Mon, 26 Jan 2026 17:32:16 -0800
Subject: [PATCH 4/5] Fix platform and build_path
---
recipe/build_base.bat | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/recipe/build_base.bat b/recipe/build_base.bat
index 59471bca..2a31a84a 100644
--- a/recipe/build_base.bat
+++ b/recipe/build_base.bat
@@ -2,15 +2,18 @@ setlocal EnableDelayedExpansion
echo on
:: Compile python, extensions and external libraries
-if "%ARCH%"=="64" (
+if "%target_platform%"=="win-64" (
set PLATFORM=x64
- set VC_PATH=x64
set BUILD_PATH=amd64
-) else (
+)
+if "%target_platform%"=="win-32" (
set PLATFORM=Win32
- set VC_PATH=x86
set BUILD_PATH=win32
)
+if "%target_platform%"=="win-arm64" (
+ set PLATFORM=ARM64
+ set BUILD_PATH=arm64
+)
for /F "tokens=1,2 delims=." %%i in ("%PKG_VERSION%") do (
set "VERNODOTS=%%i%%j"
From 2d294436fe1d8311a4624bebd819cf775ace988a Mon Sep 17 00:00:00 2001
From: Isuru Fernando
Date: Tue, 27 Jan 2026 19:44:39 -0800
Subject: [PATCH 5/5] refactor variables
---
recipe/build_base.bat | 67 ++++++++++++++++++++++++++-----------------
1 file changed, 40 insertions(+), 27 deletions(-)
diff --git a/recipe/build_base.bat b/recipe/build_base.bat
index 2a31a84a..b0f1bc80 100644
--- a/recipe/build_base.bat
+++ b/recipe/build_base.bat
@@ -3,16 +3,29 @@ echo on
:: Compile python, extensions and external libraries
if "%target_platform%"=="win-64" (
- set PLATFORM=x64
- set BUILD_PATH=amd64
+ set HOST_PLATFORM=x64
+ set HOST_DIR=amd64
)
if "%target_platform%"=="win-32" (
- set PLATFORM=Win32
- set BUILD_PATH=win32
+ set HOST_PLATFORM=Win32
+ set HOST_DIR=win32
)
if "%target_platform%"=="win-arm64" (
- set PLATFORM=ARM64
- set BUILD_PATH=arm64
+ set HOST_PLATFORM=ARM64
+ set HOST_DIR=arm64
+)
+
+if "%build_platform%"=="win-64" (
+ set BUILD_PLATFORM=x64
+ set BUILD_DIR=amd64
+)
+if "%build_platform%"=="win-32" (
+ set BUILD_PLATFORM=Win32
+ set BUILD_DIR=win32
+)
+if "%build_platform%"=="win-arm64" (
+ set BUILD_PLATFORM=ARM64
+ set BUILD_DIR=arm64
)
for /F "tokens=1,2 delims=." %%i in ("%PKG_VERSION%") do (
@@ -64,25 +77,25 @@ cd PCbuild
:: Twice because:
:: error : importlib_zipimport.h updated. You will need to rebuild pythoncore to see the changes.
-call build.bat %PGO% %CONFIG% %FREETHREADING% -m -e -v -p %PLATFORM%
-call build.bat %PGO% %CONFIG% %FREETHREADING% -m -e -v -p %PLATFORM%
+call build.bat %PGO% %CONFIG% %FREETHREADING% -m -e -v -p %HOST_PLATFORM%
+call build.bat %PGO% %CONFIG% %FREETHREADING% -m -e -v -p %HOST_PLATFORM%
if errorlevel 1 exit 1
cd ..
:: Populate the root package directory
for %%x in (python%VERNODOTS%%THREAD%%_D%.dll python3%THREAD%%_D%.dll python%EXE_T%%_D%.exe pythonw%EXE_T%%_D%.exe) do (
- if exist %SRC_DIR%\PCbuild\%BUILD_PATH%\%%x (
- copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\%%x %PREFIX%
+ if exist %SRC_DIR%\PCbuild\%HOST_DIR%\%%x (
+ copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\%%x %PREFIX%
) else (
- echo "WARNING :: %SRC_DIR%\PCbuild\%BUILD_PATH%\%%x does not exist"
+ echo "WARNING :: %SRC_DIR%\PCbuild\%HOST_DIR%\%%x does not exist"
)
)
for %%x in (python%THREAD%%_D%.pdb python%VERNODOTS%%THREAD%%_D%.pdb pythonw%THREAD%%_D%.pdb) do (
- if exist %SRC_DIR%\PCbuild\%BUILD_PATH%\%%x (
- copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\%%x %PREFIX%
+ if exist %SRC_DIR%\PCbuild\%HOST_DIR%\%%x (
+ copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\%%x %PREFIX%
) else (
- echo "WARNING :: %SRC_DIR%\PCbuild\%BUILD_PATH%\%%x does not exist"
+ echo "WARNING :: %SRC_DIR%\PCbuild\%HOST_DIR%\%%x does not exist"
)
)
@@ -93,7 +106,7 @@ if errorlevel 1 exit 1
:: Populate the DLLs directory
mkdir %PREFIX%\DLLs
-xcopy /s /y %SRC_DIR%\PCBuild\%BUILD_PATH%\*.pyd %PREFIX%\DLLs\
+xcopy /s /y %SRC_DIR%\PCBuild\%HOST_DIR%\*.pyd %PREFIX%\DLLs\
if errorlevel 1 exit 1
copy /Y %SRC_DIR%\PC\icons\py.ico %PREFIX%\DLLs\
@@ -135,12 +148,12 @@ for %%x in (idle pydoc) do (
:: Populate the libs directory
if not exist %PREFIX%\libs mkdir %PREFIX%\libs
-dir %SRC_DIR%\PCbuild\%BUILD_PATH%\
-if exist %SRC_DIR%\PCbuild\%BUILD_PATH%\python%VERNODOTS%%THREAD%%_D%.lib copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\python%VERNODOTS%%THREAD%%_D%.lib %PREFIX%\libs\
+dir %SRC_DIR%\PCbuild\%HOST_DIR%\
+if exist %SRC_DIR%\PCbuild\%HOST_DIR%\python%VERNODOTS%%THREAD%%_D%.lib copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\python%VERNODOTS%%THREAD%%_D%.lib %PREFIX%\libs\
if errorlevel 1 exit 1
-if exist %SRC_DIR%\PCbuild\%BUILD_PATH%\python3%THREAD%%_D%.lib copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\python3%THREAD%%_D%.lib %PREFIX%\libs\
+if exist %SRC_DIR%\PCbuild\%HOST_DIR%\python3%THREAD%%_D%.lib copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\python3%THREAD%%_D%.lib %PREFIX%\libs\
if errorlevel 1 exit 1
-if exist %SRC_DIR%\PCbuild\%BUILD_PATH%\_tkinter%THREAD%%_D%.lib copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\_tkinter%THREAD%%_D%.lib %PREFIX%\libs\
+if exist %SRC_DIR%\PCbuild\%HOST_DIR%\_tkinter%THREAD%%_D%.lib copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\_tkinter%THREAD%%_D%.lib %PREFIX%\libs\
if errorlevel 1 exit 1
@@ -151,20 +164,20 @@ if errorlevel 1 exit 1
:: Copy venv[w]launcher scripts to venv\srcipts\nt
:: See https://github.com/python/cpython/blob/b4a316087c32d83e375087fd35fc511bc430ee8b/Lib/venv/__init__.py#L334-L376
-if exist %SRC_DIR%\PCbuild\%BUILD_PATH%\venvlauncher%THREAD%%_D%.exe (
+if exist %SRC_DIR%\PCbuild\%HOST_DIR%\venvlauncher%THREAD%%_D%.exe (
@rem We did copy pythonw.exe until 3.12 but starting with 3.13 we seem to need the latter. Should we omit the first?
- copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\venvlauncher%THREAD%%_D%.exe %PREFIX%\Lib\venv\scripts\nt\python.exe
- copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\venvlauncher%THREAD%%_D%.exe %PREFIX%\Lib\venv\scripts\nt\venvlauncher%THREAD%%_D%.exe
+ copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\venvlauncher%THREAD%%_D%.exe %PREFIX%\Lib\venv\scripts\nt\python.exe
+ copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\venvlauncher%THREAD%%_D%.exe %PREFIX%\Lib\venv\scripts\nt\venvlauncher%THREAD%%_D%.exe
) else (
- echo "WARNING :: %SRC_DIR%\PCbuild\%BUILD_PATH%\venvlauncher%THREAD%%_D%.exe does not exist"
+ echo "WARNING :: %SRC_DIR%\PCbuild\%HOST_DIR%\venvlauncher%THREAD%%_D%.exe does not exist"
)
-if exist %SRC_DIR%\PCbuild\%BUILD_PATH%\venvwlauncher%THREAD%%_D%.exe (
+if exist %SRC_DIR%\PCbuild\%HOST_DIR%\venvwlauncher%THREAD%%_D%.exe (
@rem We did copy pythonw.exe until 3.12 but starting with 3.13 we seem to need the latter. Should we omit the first?
- copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\venvwlauncher%THREAD%%_D%.exe %PREFIX%\Lib\venv\scripts\nt\pythonw.exe
- copy /Y %SRC_DIR%\PCbuild\%BUILD_PATH%\venvwlauncher%THREAD%%_D%.exe %PREFIX%\Lib\venv\scripts\nt\venvwlauncher%THREAD%%_D%.exe
+ copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\venvwlauncher%THREAD%%_D%.exe %PREFIX%\Lib\venv\scripts\nt\pythonw.exe
+ copy /Y %SRC_DIR%\PCbuild\%HOST_DIR%\venvwlauncher%THREAD%%_D%.exe %PREFIX%\Lib\venv\scripts\nt\venvwlauncher%THREAD%%_D%.exe
) else (
- echo "WARNING :: %SRC_DIR%\PCbuild\%BUILD_PATH%\venvwlauncher%THREAD%%_D%.exe does not exist"
+ echo "WARNING :: %SRC_DIR%\PCbuild\%HOST_DIR%\venvwlauncher%THREAD%%_D%.exe does not exist"
)
:: Remove test data to save space.