Skip to content

Merge 3.15 changes to main - #908

Merged
isuruf merged 68 commits into
conda-forge:mainfrom
h-vetinari:315
Aug 31, 2026
Merged

Merge 3.15 changes to main#908
isuruf merged 68 commits into
conda-forge:mainfrom
h-vetinari:315

Conversation

@h-vetinari

@h-vetinarih-vetinari commented Aug 31, 2026

Copy link
Copy Markdown
Member

This needs to undo most of #894 and #907, but not #885 or #896

For ease of review, below is the diff against the dev branch (generated by git diff up/dev -b -- recipe; with -b to ignore whitespace-only changes, because build_base.bat on the dev branch has switched to CRLF line endings, presumably spuriously)

diff --git a/recipe/build_base.sh b/recipe/build_base.sh
index a4552fb..259c359 100644
--- a/recipe/build_base.sh+++ b/recipe/build_base.sh@@ -172,7 +172,7 @@ if [[ "${CONDA_BUILD_CROSS_COMPILATION}" == "1" ]]; then
echo "ac_cv_file__dev_ptc=no" >> config.site
echo "ac_cv_pthread=yes" >> config.site
echo "ac_cv_little_endian_double=yes" >> config.site
- if [[ "${target_platform}" == "osx-arm64" || "${target_platform}" == "linux-ppc64le" || "${target_platform}" == "linux-aarch64" ]]; then+ if [[ "${target_platform}" == "osx-arm64" || "${target_platform}" == "linux-ppc64le" || "${target_platform}" == "linux-aarch64" || "${target_platform}" == "linux-riscv64" ]]; then
echo "ac_cv_aligned_required=no" >> config.site
echo "ac_cv_pthread_is_default=yes" >> config.site
echo "ac_cv_working_tzset=yes" >> config.site
@@ -336,29 +336,16 @@ pushd ${_buildd_static}
${_DISABLE_SHARED} "${_PROFILE_TASK[@]}"
popd
-if [[ "${CI}" == "travis" ]]; then- # Travis has issues with long logs- make -j${CPU_COUNT} -C ${_buildd_static} \- EXTRA_CFLAGS="${EXTRA_CFLAGS}" \- ${_MAKE_TARGET} "${_PROFILE_TASK[@]}" 2>&1 >make-static.log-else- make -j${CPU_COUNT} -C ${_buildd_static} \+make -j${CPU_COUNT} -C ${_buildd_static} \
EXTRA_CFLAGS="${EXTRA_CFLAGS}" \
${_MAKE_TARGET} "${_PROFILE_TASK[@]}" 2>&1 | tee make-static.log
-fi
if rg "Failed to build these modules" make-static.log; then
echo "(static) :: Failed to build some modules, check the log"
exit 1
fi
-if [[ "${CI}" == "travis" ]]; then- # Travis has issues with long logs- make -j${CPU_COUNT} -C ${_buildd_shared} \- EXTRA_CFLAGS="${EXTRA_CFLAGS}" 2>&1 >make-shared.log-else- make -j${CPU_COUNT} -C ${_buildd_shared} \+make -j${CPU_COUNT} -C ${_buildd_shared} \
EXTRA_CFLAGS="${EXTRA_CFLAGS}" 2>&1 | tee make-shared.log
-fi
if rg "Failed to build these modules" make-shared.log; then
echo "(shared) :: Failed to build some modules, check the log"
exit 1
diff --git a/recipe/build_shared.bat b/recipe/build_shared.bat
deleted file mode 100644
index e69de29..0000000
diff --git a/recipe/build_static.bat b/recipe/build_static.bat
deleted file mode 100644
index e69de29..0000000
diff --git a/recipe/conda_build_config.yaml b/recipe/conda_build_config.yaml
index 2ae238a..78d45e4 100644
--- a/recipe/conda_build_config.yaml+++ b/recipe/conda_build_config.yaml@@ -1,5 +1,3 @@-MACOSX_SDK_VERSION: # [osx and x86_64]- - 11.0 # [osx and x86_64]
# See https://docs.python.org/3.14/whatsnew/3.14.html#a-new-type-of-interpreter
c_compiler_version: # [osx]
- 21 # [osx]
@@ -10,7 +8,7 @@ cxx_compiler_version: # [osx]
python:
- 3.15
numpy:
- - 1.16+ - 2
python_impl:
- cpython
is_python_min:
diff --git a/recipe/build_shared.sh b/recipe/install_shared.sh
similarity index 56%
rename from recipe/build_shared.sh
rename to recipe/install_shared.sh
index 35812a5..5dafbd1 100644
--- a/recipe/build_shared.sh+++ b/recipe/install_shared.sh@@ -31,3 +31,23 @@ fi
if [[ ${PY_INTERP_DEBUG} == yes ]]; then
ln -s ${PREFIX}/lib/libpython${VERABI}${SHLIB_EXT} ${PREFIX}/lib/libpython${VERABI_NO_DBG}${SHLIB_EXT}
fi
++# create libpython3.dylib; linux builds only add this in release mode, do the same on osx+if [[ "$target_platform" == osx-* && ${PY_INTERP_DEBUG} == no ]]; then+ # need to filter out windows-specific symbols & PyOS_CheckStack from+ # https://github.com/python/cpython/blob/main/Doc/data/stable_abi.dat+ awk -F',' '+ ($1 == "func" || $1 == "data") &&+ $4 != "on Windows" &&+ $2 != "PyOS_CheckStack" {+ print "_" $2+ }+ ' Doc/data/stable_abi.dat > stable_abi_exports.txt++ $CC -dynamiclib \+ -install_name @rpath/libpython3.dylib \+ -compatibility_version 3.0 -current_version ${PY_VER}.0 \+ -Wl,-reexport_library,${PREFIX}/lib/libpython${VERABI}.dylib \+ -Wl,-exported_symbols_list,stable_abi_exports.txt \+ -o ${PREFIX}/lib/libpython3.dylib+fidiff --git a/recipe/build_static.sh b/recipe/install_static.sh
similarity index 100%
rename from recipe/build_static.sh
rename to recipe/install_static.sh
diff --git a/recipe/meta.yaml b/recipe/meta.yaml
index 31289cb..7aa746f 100644
--- a/recipe/meta.yaml+++ b/recipe/meta.yaml@@ -4,7 +4,7 @@
{% set ver2 = '.'.join(version.split('.')[0:2]) %}
{% set ver2nd = ''.join(version.split('.')[0:2]) %}
{% set ver3nd = ''.join(version.split('.')[0:3]) %}
-{% set build_number = 0 %}+{% set build_number = 1 %}
# this makes the linter happy
{% set channel_targets = channel_targets or 'conda-forge main' %}
@@ -39,6 +39,24 @@
{% set site_packages_path = "lib/python" + ver2 + "/site-packages" %}
{% endif %}
+# CMake needs to be told that the debug/freethreading ABI is fine; the option takes a 4-tuple,+# Python_FIND_ABI=<pydebug>;<pymalloc>;<unicode>;<gil_disabled>; for details see+# https://cmake.org/cmake/help/latest/module/FindPython.html#hints+{% set cmake_test_args=" -DPython_FIND_ABI=\"" ~ ("ON" if build_type == "debug" else "OFF") ~ ";ANY;ANY;" ~ ("ON" if freethreading == "yes" else "OFF") ~ "\"" %}+{% if unix %}+ # for CMake invocations during testing, we need to avoid accidentally picking up python versions from+ # the image, but we don't want to use `${CMAKE_ARGS}` from the compiler activation, because that contains+ # `CMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER`; while that's useful for building (i.e. don't look in `host:`,+ # because we want to use binaries from `build:`), we want the exact opposite when running tests.+ {% set cmake_test_args=cmake_test_args ~ " -DCMAKE_POLICY_DEFAULT_CMP0094=NEW -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=ONLY -DCMAKE_FIND_ROOT_PATH=${PREFIX}" %}+{% endif %}++# extremely noisy; only use if needing to debug how CMake finds our libraries+{% set cmake_debug = "" %}+{% if False %}+ {% set cmake_debug = "--debug-find --trace --debug-output --debug-trycompile" %}+{% endif %}+
package:
name: python-split
version: {{ version }}{{ dev }}
@@ -227,6 +245,8 @@ outputs:
commands:
- echo on # [win]
- set # [win]
+ # ensure we don't pick up python from the image by accident+ - rmdir /s /q C:\hostedtoolcache\windows\Python # [win]
- python -V
- python3 -V # [not win]
- pydoc -h
@@ -270,7 +290,7 @@ outputs:
- if not exist %PREFIX%\\include\\python\\pyconfig.h exit 1 # [win]
- pushd tests
- pushd cmake
- - cmake -GNinja -DPY_VER={{ version }} -DEXTRA_COMPONENTS="Development.Module" --debug-find --trace --debug-output --debug-trycompile .+ - cmake -GNinja {{ cmake_test_args }} -DPY_VER={{ version }} -DEXTRA_COMPONENTS="Development.Module" {{ cmake_debug }} .
- popd
- popd
- python run_test.py
@@ -282,8 +302,7 @@ outputs:
- TERM=xterm >/dev/null python -c "import curses; scr = curses.initscr(); curses.unget_wch('x'); assert 'x' == scr.get_wch()" # [unix]
- name: libpython
- script: build_shared.sh # [unix]- script: build_shared.bat # [win]+ script: install_shared.sh # [unix]
build:
number: {{ build_number }}
activate_in_script: true
@@ -324,21 +343,19 @@ outputs:
{% if py_interp_debug == "yes" %}
- VERABI=${VERABI}d # [not win]
{% endif %}
- - test -f ${PREFIX}/lib/libpython${VERABI}.so # [linux]- - test -f ${PREFIX}/lib/libpython3.so # [linux and build_type == "release"]- - test -f ${PREFIX}/lib/libpython${VERABI}.dylib # [osx]+ - test -f ${PREFIX}/lib/libpython${VERABI}${SHLIB_EXT} # [unix]+ - test -f ${PREFIX}/lib/libpython3${SHLIB_EXT} # [unix and build_type == "release"]
- pushd tests
- pushd prefix-replacement # [unix]
- bash build-and-test.sh # [unix]
- popd # [unix]
- pushd cmake
- - cmake -GNinja -DPY_VER={{ version }} -DEXTRA_COMPONENTS="Development.Embed" --debug-find --trace --debug-output --debug-trycompile .+ - cmake -GNinja {{ cmake_test_args }} -DPY_VER={{ version }} -DEXTRA_COMPONENTS="Development.Embed" {{ cmake_debug }} .
- popd
- popd
- name: libpython-static
- script: build_static.sh # [unix]- script: build_static.bat # [win]+ script: install_static.sh # [unix]
build:
number: {{ build_number }}
activate_in_script: true
@@ -350,8 +367,8 @@ outputs:
string: h{{ PKG_HASH }}_{{ PKG_BUILDNUM }}{{ debug }}_{{ abi_tag }}
requirements:
build:
- - {{ compiler('c') }}
- {{ stdlib('c') }}
+ - {{ compiler('c') }}
- {{ compiler('cxx') }}
host:
- {{ pin_subpackage('python', exact=True) }}
@@ -387,7 +404,7 @@ outputs:
- bash build-and-test.sh # [unix]
- popd # [unix]
- pushd cmake
- - cmake -GNinja -DPY_VER={{ version }} -DEXTRA_COMPONENTS="Development.Embed" --debug-find --trace --debug-output --debug-trycompile .+ - cmake -GNinja {{ cmake_test_args }} -DPY_VER={{ version }} -DEXTRA_COMPONENTS="Development.Embed" {{ cmake_debug }} .
- popd
- popd

xhochyand others added 30 commits December 10, 2025 11:20
…5.12.10.08.45.35
Other tools:
- conda-build 25.11.1
- rattler-build 0.54.0
- rattler-build-conda-compat 1.4.10
Use the sysconfigdata from the shared library build rather than the
static one. The main difference is that this ensures that programs link
to the shared Python library rather than the static library. Other
differences are mostly superficial (build directories, test invocation
commands).
Fixesconda-forge#565
Signed-off-by: Michał Górny <mgorny@quansight.com>
Signed-off-by: Michał Górny <mgorny@quansight.com>
Signed-off-by: Michał Górny <mgorny@quansight.com>
Now python3-config defaults to shared linking, so perform that part of
the test first. Then remove the shared libraries to force static
linking.
Signed-off-by: Michał Górny <mgorny@quansight.com>
…6.01.20.09.33.33
Other tools:
- conda-build 25.11.1
- rattler-build 0.55.0
- rattler-build-conda-compat 1.4.10
Fixesconda-forge#843
Signed-off-by: Michał Górny <mgorny@quansight.com>
…6.01.22.10.05.09
Other tools:
- conda-build 25.11.1
- rattler-build 0.55.0
- rattler-build-conda-compat 1.4.10
Use sysconfigdata and `build-details.json` from shared library build
…6.03.16.13.44.37
Other tools:
- conda-build 26.1.0
- rattler-build 0.58.4
- rattler-build-conda-compat 1.4.11
Signed-off-by: Michał Górny <mgorny@quansight.com>
…6.04.17.03.21.26
Other tools:
- conda-build 26.3.0
- rattler-build 0.62.0
- rattler-build-conda-compat 1.4.12
Signed-off-by: Michał Górny <mgorny@quansight.com>
@conda-forge-admin

conda-forge-admin commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (recipe/meta.yaml) and found it was in an excellent condition.

I do have some suggestions for making it better though...

For recipe/meta.yaml:

  • ℹ️ The recipe is not parsable by parser conda-souschef (grayskull). This parser is not currently used by conda-forge, but may be in the future. We are collecting information to see which recipes are compatible with grayskull.
  • ℹ️ The recipe is not parsable by parser conda-recipe-manager. The recipe can only be automatically migrated to the new v1 format if it is parseable by conda-recipe-manager.

This message was generated by GitHub Actions workflow run https://github.com/conda-forge/conda-forge-webservices/actions/runs/33350956611. Examine the logs at this URL for more detail.

@h-vetinari

Copy link
Copy Markdown
MemberAuthor

Still finding things to fix, update soon

@h-vetinari
h-vetinari marked this pull request as ready for review August 31, 2026 02:36
@h-vetinari

Copy link
Copy Markdown
MemberAuthor

Woohoo, green on the first try! 🥳

@isuruf

Copy link
Copy Markdown
Member

Thanks.

@isuruf
isuruf merged commit 8aa5dbf into conda-forge:mainAug 31, 2026
31 checks passed
@h-vetinari
h-vetinari deleted the 315 branch August 31, 2026 05:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@h-vetinari@conda-forge-admin@isuruf@xhochy@mgorny@hmaarrfk@ocefpaf