From 75dedfae0ec717b79a33d62198917b8cbbcad314 Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Wed, 2 Sep 2026 08:10:52 +0000 Subject: [PATCH 01/12] Add track_features on free-threaded python_abi Bump build number to 5 so t variants carry free-threading (same feature name as python 3.14t on main). --- recipe/meta.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 13da910..13a323b 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -1,4 +1,4 @@ -{% set build_num = 4 %} +{% set build_num = 5 %} {% if python_impl_version is not defined %} {% set python_impl_version = "3.8" %} {% endif %} @@ -16,9 +16,11 @@ package: build: number: {{ build_num }} string: {{ build_num }}_{{ python_abi_tag }} - track_features: # [python_implementation != "cpython"] + track_features: - pypy # [python_implementation == "pypy"] - native_graalpy # [python_implementation == "graalpy"] + # Penalize t so unspecified solves prefer GIL; name matches python 3.14t on main. + - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t")] # Required for PBP. force_ignore_keys: - python From c14e3cfcd91850d00a93de9e0953e2466ef4b0b0 Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Wed, 2 Sep 2026 08:15:47 +0000 Subject: [PATCH 02/12] Fix PBP zip_keys clash with aggregate python matrix Drop dummy python/numpy from recipe CBC and ignore the aggregate python zip group (is_freethreading, is_python_min). --- recipe/conda_build_config.yaml | 25 ------------------------- recipe/meta.yaml | 6 +++++- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/recipe/conda_build_config.yaml b/recipe/conda_build_config.yaml index aef34eb..e85f471 100644 --- a/recipe/conda_build_config.yaml +++ b/recipe/conda_build_config.yaml @@ -44,28 +44,3 @@ zip_keys: - python_version - python_impl_version - python_implementation - -# to help PBP generate a proper build graph -python: - - "3.10" - - "3.11" - - "3.12" - - "3.13" - - "3.13" - - "3.14" - - "3.14" - - "3.15" - - "3.15" -numpy: - - "2.1" - - "2.1" - - "2.1" - - "2.1" - - "2.1" - - "2.1" - - "2.1" - # TODO: numpy 2.6.0 is not released yet; - # upstream says py315 support starts with Python 3.15.0rc1 (~Jul 2026) - # keep 2.4 for now. Recheck when 2.6.0 is released. - - "2.5" - - "2.5" diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 13a323b..e95295a 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -21,9 +21,13 @@ build: - native_graalpy # [python_implementation == "graalpy"] # Penalize t so unspecified solves prefer GIL; name matches python 3.14t on main. - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t")] - # Required for PBP. + # Required for PBP. Ignore aggregate python zip_keys (numpy / + # is_freethreading / is_python_min) so this ABI matrix does not collide. force_ignore_keys: - python + - numpy + - is_freethreading + - is_python_min requirements: run_constrained: From f4b8c2ce06b6fc467a4c92e23a8aa7398306e699 Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Mon, 7 Sep 2026 09:32:51 +0000 Subject: [PATCH 03/12] Match python track_features names per version on t abi 3.13/3.14 t stay free-threading (python 3.14t on main). 3.15+ t use py_freethreading (python-feedstock PR 256). Bump build 5 -> 6 so 3.15t rebuilds instead of skip-existing. --- recipe/meta.yaml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index e95295a..158cbe9 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -1,4 +1,4 @@ -{% set build_num = 5 %} +{% set build_num = 6 %} {% if python_impl_version is not defined %} {% set python_impl_version = "3.8" %} {% endif %} @@ -8,6 +8,12 @@ {% endif %} {% set python_minor = python_version.split(".")[1]|int %} +{# Match python-feedstock: 3.14t on main is free-threading; 3.15+ is py_freethreading (PR 256). #} +{% if python_minor >= 15 %} + {% set ft_feature = "py_freethreading" %} +{% else %} + {% set ft_feature = "free-threading" %} +{% endif %} package: name: python_abi @@ -19,8 +25,7 @@ build: track_features: - pypy # [python_implementation == "pypy"] - native_graalpy # [python_implementation == "graalpy"] - # Penalize t so unspecified solves prefer GIL; name matches python 3.14t on main. - - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t")] + - {{ ft_feature }} # [python_implementation == "cpython" and python_abi_tag.endswith("t")] # Required for PBP. Ignore aggregate python zip_keys (numpy / # is_freethreading / is_python_min) so this ABI matrix does not collide. force_ignore_keys: From 5a615417dfd52b93633f5f4098163d591637563e Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Mon, 7 Sep 2026 12:38:16 +0300 Subject: [PATCH 04/12] Use selectors --- recipe/meta.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 158cbe9..99b1f33 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -25,7 +25,9 @@ build: track_features: - pypy # [python_implementation == "pypy"] - native_graalpy # [python_implementation == "graalpy"] - - {{ ft_feature }} # [python_implementation == "cpython" and python_abi_tag.endswith("t")] + # Match python-feedstock: 3.14t on main is free-threading; 3.15+ is py_freethreading (PR 256). + - free-threading # [py<315 or (python_implementation == "cpython" and python_abi_tag.endswith("t"))] + - py_freethreading # [py>=315 or (python_implementation == "cpython" and python_abi_tag.endswith("t"))] # Required for PBP. Ignore aggregate python zip_keys (numpy / # is_freethreading / is_python_min) so this ABI matrix does not collide. force_ignore_keys: From c6092ef551f033b7271eb90bfdf0f2aa53d1bb1c Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Mon, 7 Sep 2026 12:39:10 +0300 Subject: [PATCH 05/12] Remove jinja2 stuff --- recipe/meta.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 99b1f33..95f64ba 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -7,14 +7,6 @@ {% set python_version = "3.8" %} {% endif %} -{% set python_minor = python_version.split(".")[1]|int %} -{# Match python-feedstock: 3.14t on main is free-threading; 3.15+ is py_freethreading (PR 256). #} -{% if python_minor >= 15 %} - {% set ft_feature = "py_freethreading" %} -{% else %} - {% set ft_feature = "free-threading" %} -{% endif %} - package: name: python_abi version: {{ python_version }} From 029eee59b62e25fc87d1292e717ddc8bcb867c36 Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Mon, 7 Sep 2026 12:41:05 +0300 Subject: [PATCH 06/12] Revert python_minor --- recipe/meta.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 95f64ba..455ee4d 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -7,6 +7,8 @@ {% set python_version = "3.8" %} {% endif %} +{% set python_minor = python_version.split(".")[1]|int %} + package: name: python_abi version: {{ python_version }} From d43b494bbe3950378282cabc06f44c9037bf211f Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Mon, 7 Sep 2026 12:41:49 +0300 Subject: [PATCH 07/12] Set build number to 5 --- recipe/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 455ee4d..6fc768b 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -1,4 +1,4 @@ -{% set build_num = 6 %} +{% set build_num = 5 %} {% if python_impl_version is not defined %} {% set python_impl_version = "3.8" %} {% endif %} From f41e6fc4096bfdd0734b32b25be523e165cf1307 Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Mon, 7 Sep 2026 09:47:04 +0000 Subject: [PATCH 08/12] Fix t track_features selectors (and, not or) py<315 or t tagged GIL 3.14 and both names on 3.15t. Require cpython t and split on python_version (no python zip). --- recipe/meta.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 6fc768b..5a381c1 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -20,8 +20,10 @@ build: - pypy # [python_implementation == "pypy"] - native_graalpy # [python_implementation == "graalpy"] # Match python-feedstock: 3.14t on main is free-threading; 3.15+ is py_freethreading (PR 256). - - free-threading # [py<315 or (python_implementation == "cpython" and python_abi_tag.endswith("t"))] - - py_freethreading # [py>=315 or (python_implementation == "cpython" and python_abi_tag.endswith("t"))] + # and, not or: GIL must not get a feature; 3.15t must not get both names. + # Use python_version (this recipe has no python zip / py). + - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version < "3.15"] + - py_freethreading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version >= "3.15"] # Required for PBP. Ignore aggregate python zip_keys (numpy / # is_freethreading / is_python_min) so this ABI matrix does not collide. force_ignore_keys: From a949ba7ba8e2309757ff91eaaccb4311a78e838d Mon Sep 17 00:00:00 2001 From: Serhii Kupriienko Date: Mon, 7 Sep 2026 10:16:33 +0000 Subject: [PATCH 09/12] Limit free-threading track_feature to 3.14t Anaconda CBC has no 3.13t row; free-threading starts at 3.14. 3.13t python_abi must not carry that feature. 3.15t stays py_freethreading. --- recipe/meta.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 5a381c1..2856a65 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -19,10 +19,10 @@ build: track_features: - pypy # [python_implementation == "pypy"] - native_graalpy # [python_implementation == "graalpy"] - # Match python-feedstock: 3.14t on main is free-threading; 3.15+ is py_freethreading (PR 256). - # and, not or: GIL must not get a feature; 3.15t must not get both names. + # Anaconda free-threading starts at 3.14 (aggregate CBC; no 3.13t row). + # 3.14t python on main uses free-threading; 3.15+ uses py_freethreading (PR 256). # Use python_version (this recipe has no python zip / py). - - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version < "3.15"] + - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version == "3.14"] - py_freethreading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version >= "3.15"] # Required for PBP. Ignore aggregate python zip_keys (numpy / # is_freethreading / is_python_min) so this ABI matrix does not collide. From 38b4432b99d0c508465770ca15b5feed7cf3ea78 Mon Sep 17 00:00:00 2001 From: skupr-anaconda <79282962+skupr-anaconda@users.noreply.github.com> Date: Tue, 8 Sep 2026 13:12:16 +0300 Subject: [PATCH 10/12] Update recipe/meta.yaml --- recipe/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 2856a65..a557042 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -25,7 +25,7 @@ build: - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version == "3.14"] - py_freethreading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version >= "3.15"] # Required for PBP. Ignore aggregate python zip_keys (numpy / - # is_freethreading / is_python_min) so this ABI matrix does not collide. + # is_freethreading / is_python_min) so this matrix does not collide. force_ignore_keys: - python - numpy From d954d6d4defc18b36afe6b9abfbc5d242d591e2b Mon Sep 17 00:00:00 2001 From: skupr-anaconda <79282962+skupr-anaconda@users.noreply.github.com> Date: Tue, 8 Sep 2026 13:12:47 +0300 Subject: [PATCH 11/12] Update recipe/meta.yaml Co-authored-by: Ian Fitchet <123584373+ifitchet@users.noreply.github.com> --- recipe/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index a557042..08a0e3b 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -24,7 +24,7 @@ build: # Use python_version (this recipe has no python zip / py). - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version == "3.14"] - py_freethreading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version >= "3.15"] - # Required for PBP. Ignore aggregate python zip_keys (numpy / + # force_ignore_keys required for PBP. Ignore aggregate python zip_keys (numpy / # is_freethreading / is_python_min) so this matrix does not collide. force_ignore_keys: - python From a11180c62d9afacb58dba7dab4827e1e91e1dd51 Mon Sep 17 00:00:00 2001 From: skupr-anaconda <79282962+skupr-anaconda@users.noreply.github.com> Date: Wed, 30 Sep 2026 10:15:48 +0300 Subject: [PATCH 12/12] Apply suggestion from @cbouss Co-authored-by: Charles Bousseau <16641587+cbouss@users.noreply.github.com> --- recipe/meta.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 08a0e3b..5cbaa4a 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -19,11 +19,7 @@ build: track_features: - pypy # [python_implementation == "pypy"] - native_graalpy # [python_implementation == "graalpy"] - # Anaconda free-threading starts at 3.14 (aggregate CBC; no 3.13t row). - # 3.14t python on main uses free-threading; 3.15+ uses py_freethreading (PR 256). - # Use python_version (this recipe has no python zip / py). - - free-threading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version == "3.14"] - - py_freethreading # [python_implementation == "cpython" and python_abi_tag.endswith("t") and python_version >= "3.15"] + - freethreading # [python_implementation == "cpython" and python_abi_tag.endswith("t")] # force_ignore_keys required for PBP. Ignore aggregate python zip_keys (numpy / # is_freethreading / is_python_min) so this matrix does not collide. force_ignore_keys: