From 76f5f5ddba1e9996f7ecd15465fa0b982cc12b13 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Fri, 21 Nov 2025 15:05:57 -0600 Subject: [PATCH 01/45] STYLE: Move repository definition local to where needed --- CMakeLists.txt | 9 ++++----- scripts/macpython-build-common.sh | 2 ++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28f0e96b..3ce61e24 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,11 +80,6 @@ if(ITKPythonPackage_SUPERBUILD) #----------------------------------------------------------------------------- include(ExternalProject) - set(ITK_REPOSITORY "https://github.com/InsightSoftwareConsortium/ITK.git") - - # main branch, 2025-09-22 - set(ITK_GIT_TAG "0f93d6c875ab1a053ccb1a27f9f55b8aa2c4c20b") - #----------------------------------------------------------------------------- # A separate project is used to download ITK, so that it can reused # when building different "flavor" of ITK python packages @@ -145,6 +140,10 @@ if(ITKPythonPackage_SUPERBUILD) set(tbb_depends oneTBB) endif() + set(ITK_REPOSITORY "https://github.com/InsightSoftwareConsortium/ITK.git") + + # main branch, 2025-09-22 + set(ITK_GIT_TAG "0f93d6c875ab1a053ccb1a27f9f55b8aa2c4c20b") if(NOT DEFINED ITK_SOURCE_DIR) diff --git a/scripts/macpython-build-common.sh b/scripts/macpython-build-common.sh index 9325c7cd..c09d9464 100644 --- a/scripts/macpython-build-common.sh +++ b/scripts/macpython-build-common.sh @@ -58,6 +58,8 @@ else done fi +# ----------------------------------------------------------------------- +# Remove previous virtualenv's VENVS=() mkdir -p ${SCRIPT_DIR}/../venvs for PYBIN in "${PYBINARIES[@]}"; do From dd3bcf846ffd54900a8ac8c791abf2146953a031 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Fri, 21 Nov 2025 15:06:56 -0600 Subject: [PATCH 02/45] DOC: Change variable name for readability. --- scripts/macpython-build-common.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/macpython-build-common.sh b/scripts/macpython-build-common.sh index c09d9464..60fbbcce 100644 --- a/scripts/macpython-build-common.sh +++ b/scripts/macpython-build-common.sh @@ -67,8 +67,8 @@ for PYBIN in "${PYBINARIES[@]}"; do continue fi py_mm=$(basename ${PYBIN}) - VENV=${SCRIPT_DIR}/../venvs/${py_mm} - VENVS+=(${VENV}) + _VENV_DIR=${SCRIPT_DIR}/../venvs/${py_mm} + VENVS+=(${_VENV_DIR}) done # ----------------------------------------------------------------------- From b2c70231e8348ae1f0a06deee83d1ad4d617873a Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Fri, 21 Nov 2025 15:08:46 -0600 Subject: [PATCH 03/45] BUG: --no-cache -> --no-cache-dir fix --no-cache is not a valid pip command. --- scripts/macpython-build-module-wheels.sh | 2 +- scripts/macpython-build-wheels.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index ebea1635..45683943 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -65,7 +65,7 @@ source "${script_dir}/macpython-build-common.sh" VENV="${VENVS[0]}" Python3_EXECUTABLE=${VENV}/bin/python3 dot_clean ${VENV} -${Python3_EXECUTABLE} -m pip install --no-cache delocate +${Python3_EXECUTABLE} -m pip install --no-cache-dir delocate DELOCATE_LISTDEPS=${VENV}/bin/delocate-listdeps DELOCATE_WHEEL=${VENV}/bin/delocate-wheel DELOCATE_PATCH=${VENV}/bin/delocate-patch diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index fb04b3e7..73059147 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -55,7 +55,7 @@ done VENV="${VENVS[0]}" Python3_EXECUTABLE=${VENV}/bin/python3 ${Python3_EXECUTABLE} -m pip install --upgrade pip -${Python3_EXECUTABLE} -m pip install --no-cache delocate +${Python3_EXECUTABLE} -m pip install --no-cache-dir delocate DELOCATE_LISTDEPS=${VENV}/bin/delocate-listdeps DELOCATE_WHEEL=${VENV}/bin/delocate-wheel DELOCATE_PATCH=${VENV}/bin/delocate-patch From 692526b63a886b8dd4bd2265d504a66e6453d861 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Fri, 21 Nov 2025 15:09:40 -0600 Subject: [PATCH 04/45] ENH: Remove unused variable for DELOCATE --- scripts/macpython-build-module-wheels.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index 45683943..5694fc66 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -68,8 +68,6 @@ dot_clean ${VENV} ${Python3_EXECUTABLE} -m pip install --no-cache-dir delocate DELOCATE_LISTDEPS=${VENV}/bin/delocate-listdeps DELOCATE_WHEEL=${VENV}/bin/delocate-wheel -DELOCATE_PATCH=${VENV}/bin/delocate-patch -# So delocate can find the libs export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${script_dir}/../oneTBB-prefix/lib # Compile wheels re-using standalone project and archive cache From 31c45d3996cd79ea13e542ae2afa17295f440d06 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Fri, 21 Nov 2025 15:12:39 -0600 Subject: [PATCH 05/45] DOC: give explicit directory name --- scripts/macpython-build-module-wheels.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index 5694fc66..a869756a 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -70,6 +70,8 @@ DELOCATE_LISTDEPS=${VENV}/bin/delocate-listdeps DELOCATE_WHEEL=${VENV}/bin/delocate-wheel export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${script_dir}/../oneTBB-prefix/lib +_module_dir="$(pwd -P)" + # Compile wheels re-using standalone project and archive cache for VENV in "${VENVS[@]}"; do py_mm=$(basename ${VENV}) @@ -126,7 +128,7 @@ for VENV in "${VENVS[@]}"; do || exit 1 done -for wheel in $PWD/dist/*.whl; do +for wheel in ${_module_dir}/dist/*.whl; do ${DELOCATE_LISTDEPS} $wheel # lists library dependencies ${DELOCATE_WHEEL} $wheel # copies library dependencies into wheel done From d9371b9fd6285999d2ff464a34ae0f54922510e2 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Fri, 21 Nov 2025 15:19:38 -0600 Subject: [PATCH 06/45] ENH: Explicilty respect CC and CXX settings --- CMakeLists.txt | 6 +++++- scripts/macpython-build-module-wheels.sh | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ce61e24..d649df54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,11 @@ if(ITKPythonPackage_SUPERBUILD) list(APPEND ep_common_cmake_cache_args -DCMAKE_MAKE_PROGRAM:FILEPATH=${CMAKE_MAKE_PROGRAM}) endif() + list(APPEND ep_common_cmake_cache_args + -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER} + -DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER} + -DCMAKE_BUILD_TYPE:STRING=Release + ) #----------------------------------------------------------------------------- # compile with multiple processors @@ -125,7 +130,6 @@ if(ITKPythonPackage_SUPERBUILD) ${ep_common_cmake_cache_args} ${tbb_cmake_cache_args} ${ep_download_extract_timestamp_arg} - -DCMAKE_BUILD_TYPE:STRING=Release BUILD_BYPRODUCTS "${TBB_DIR}/TBBConfig.cmake" USES_TERMINAL_DOWNLOAD 1 USES_TERMINAL_UPDATE 1 diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index a869756a..cb3496c8 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -83,20 +83,18 @@ for VENV in "${VENVS[@]}"; do echo "Python3_INCLUDE_DIR:${Python3_INCLUDE_DIR}" if [[ $(arch) == "arm64" ]]; then - plat_name="macosx-15.0-arm64" - osx_target="15.0" osx_arch="arm64" - build_path="${SCRIPT_DIR}/../ITK-${py_mm}-macosx_arm64" else - plat_name="macosx-15.0-x86_64" - osx_target="15.0" osx_arch="x86_64" - build_path="${SCRIPT_DIR}/../ITK-${py_mm}-macosx_x86_64" fi - if [[ ! -z "${MACOSX_DEPLOYMENT_TARGET}" ]]; then - osx_target="${MACOSX_DEPLOYMENT_TARGET}" + if [[ -z "${MACOSX_DEPLOYMENT_TARGET}" ]]; then + MACOSX_DEPLOYMENT_TARGET=15.0 + else + MACOSX_DEPLOYMENT_TARGET="${MACOSX_DEPLOYMENT_TARGET}" fi - export MACOSX_DEPLOYMENT_TARGET=${osx_target} + export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} + build_path="${_ipp_dir}/ITK-${py_mm}-macosx_${osx_arch}" + plat_name="macosx-${MACOSX_DEPLOYMENT_TARGET}-${osx_arch}" if [[ -e $PWD/requirements-dev.txt ]]; then ${Python3_EXECUTABLE} -m pip install --upgrade -r $PWD/requirements-dev.txt @@ -110,15 +108,17 @@ for VENV in "${VENVS[@]}"; do ${Python3_EXECUTABLE} -m build \ --verbose \ --wheel \ - --outdir dist \ + --outdir ${_module_dir}/dist \ --no-isolation \ --skip-dependency-check \ --config-setting=cmake.define.CMAKE_MAKE_PROGRAM:FILEPATH=${NINJA_EXECUTABLE} \ --config-setting=cmake.define.ITK_DIR:PATH=${itk_build_path} \ --config-setting=cmake.define.CMAKE_INSTALL_LIBDIR:STRING=lib \ --config-setting=cmake.define.WRAP_ITK_INSTALL_COMPONENT_IDENTIFIER:STRING=PythonWheel \ - --config-setting=cmake.define.CMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ + --config-setting=cmake.define.CMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ --config-setting=cmake.define.CMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ + --config-setting=cmake.define.CMAKE_CXX_COMPILER:STRING=${CXX} \ + --config-setting=cmake.define.CMAKE_C_COMPILER:STRING=${CC} \ --config-setting=cmake.define.PY_SITE_PACKAGES_PATH:PATH="." \ --config-setting=wheel.py-api=$wheel_py_api \ --config-setting=cmake.define.BUILD_TESTING:BOOL=OFF \ From eaeabeb27304b355436071bd1c3d5ea8c362b85f Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Fri, 21 Nov 2025 15:45:51 -0600 Subject: [PATCH 07/45] STYLE: Remove unreachable code SINGLE_WHEEL=0 In all cases SINGLE_WHEEL is always 0. --- scripts/internal/manylinux-build-wheels.sh | 145 ++++++++------------- scripts/macpython-build-wheels.sh | 123 +++++++---------- 2 files changed, 100 insertions(+), 168 deletions(-) diff --git a/scripts/internal/manylinux-build-wheels.sh b/scripts/internal/manylinux-build-wheels.sh index f31f5873..001e8233 100755 --- a/scripts/internal/manylinux-build-wheels.sh +++ b/scripts/internal/manylinux-build-wheels.sh @@ -49,9 +49,6 @@ tbb_dir=/work/oneTBB-prefix/lib/cmake/TBB sudo ldconfig export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/work/oneTBB-prefix/lib:/usr/lib:/usr/lib64 -# TODO: More work is required to re-enable this feature. -SINGLE_WHEEL=0 - # Compile wheels re-using standalone project and archive cache for PYBIN in "${PYBINARIES[@]}"; do export Python3_EXECUTABLE=${PYBIN}/python3 @@ -73,97 +70,65 @@ for PYBIN in "${PYBINARIES[@]}"; do # Clean up previous invocations # rm -rf ${build_path} - if [[ ${SINGLE_WHEEL} == 1 ]]; then - - echo "#" - echo "# Build single ITK wheel" - echo "#" - + echo "#" + echo "# Build multiple ITK wheels" + echo "#" + + # Build ITK python + ( + mkdir -p ${build_path} \ + && cd ${build_path} \ + && cmake \ + -DCMAKE_BUILD_TYPE:STRING=${build_type} \ + -DITK_SOURCE_DIR:PATH=${source_path} \ + -DITK_BINARY_DIR:PATH=${build_path} \ + -DBUILD_TESTING:BOOL=OFF \ + -DPython3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ + -DPython3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ + -DCMAKE_CXX_COMPILER_TARGET:STRING=$(uname -m)-linux-gnu \ + -DCMAKE_CXX_FLAGS:STRING="$compile_flags" \ + -DCMAKE_C_FLAGS:STRING="$compile_flags" \ + -DCMAKE_BUILD_TYPE:STRING="${build_type}" \ + -DWRAP_ITK_INSTALL_COMPONENT_IDENTIFIER:STRING=PythonWheel \ + -DWRAP_ITK_INSTALL_COMPONENT_PER_MODULE:BOOL=ON \ + -DITK_WRAP_unsigned_short:BOOL=ON \ + -DITK_WRAP_double:BOOL=ON \ + -DITK_WRAP_complex_double:BOOL=ON \ + -DITK_WRAP_IMAGE_DIMS:STRING="2;3;4" \ + -DPY_SITE_PACKAGES_PATH:PATH="." \ + -DITK_LEGACY_SILENT:BOOL=ON \ + -DITK_WRAP_PYTHON:BOOL=ON \ + -DITK_WRAP_DOC:BOOL=ON \ + -DModule_ITKTBB:BOOL=ON \ + -DTBB_DIR:PATH=${tbb_dir} \ + -G Ninja \ + ${source_path} \ + && ninja \ + || exit 1 + ) + + wheel_names=$(cat ${script_dir}/../WHEEL_NAMES.txt) + for wheel_name in ${wheel_names}; do # Configure pyproject.toml - ${PYBIN}/python ${PYPROJECT_CONFIGURE} "itk" + ${PYBIN}/python ${PYPROJECT_CONFIGURE} ${wheel_name} # Generate wheel ${PYBIN}/python -m build \ - --verbose \ - --wheel \ - --outdir dist \ - --no-isolation \ - --skip-dependency-check \ - --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ - --config-setting=cmake.define.ITK_BINARY_DIR:PATH=${build_path} \ - --config-setting=cmake.define.ITKPythonPackage_ITK_BINARY_REUSE:BOOL=OFF \ - --config-setting=cmake.define.ITKPythonPackage_WHEEL_NAME:STRING=itk \ - --config-setting=cmake.define.CMAKE_CXX_COMPILER_TARGET:STRING=$(uname -m)-linux-gnu \ - "--config-setting=cmake.define.CMAKE_CXX_FLAGS:STRING=$compile_flags" \ - "--config-setting=cmake.define.CMAKE_C_FLAGS:STRING=$compile_flags" \ - "--config-setting=cmake.define.CMAKE_BUILD_TYPE:STRING=${build_type}" \ - --config-setting=cmake.define.Python3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ - --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ - --config-setting=cmake.define.Module_ITKTBB:BOOL=ON \ - --config-setting=cmake.define.TBB_DIR:PATH=${tbb_dir} \ - . - - else - - echo "#" - echo "# Build multiple ITK wheels" - echo "#" - - # Build ITK python - ( - mkdir -p ${build_path} \ - && cd ${build_path} \ - && cmake \ - -DCMAKE_BUILD_TYPE:STRING=${build_type} \ - -DITK_SOURCE_DIR:PATH=${source_path} \ - -DITK_BINARY_DIR:PATH=${build_path} \ - -DBUILD_TESTING:BOOL=OFF \ - -DPython3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ - -DPython3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ - -DCMAKE_CXX_COMPILER_TARGET:STRING=$(uname -m)-linux-gnu \ - -DCMAKE_CXX_FLAGS:STRING="$compile_flags" \ - -DCMAKE_C_FLAGS:STRING="$compile_flags" \ - -DCMAKE_BUILD_TYPE:STRING="${build_type}" \ - -DWRAP_ITK_INSTALL_COMPONENT_IDENTIFIER:STRING=PythonWheel \ - -DWRAP_ITK_INSTALL_COMPONENT_PER_MODULE:BOOL=ON \ - -DITK_WRAP_unsigned_short:BOOL=ON \ - -DITK_WRAP_double:BOOL=ON \ - -DITK_WRAP_complex_double:BOOL=ON \ - -DITK_WRAP_IMAGE_DIMS:STRING="2;3;4" \ - -DPY_SITE_PACKAGES_PATH:PATH="." \ - -DITK_LEGACY_SILENT:BOOL=ON \ - -DITK_WRAP_PYTHON:BOOL=ON \ - -DITK_WRAP_DOC:BOOL=ON \ - -DModule_ITKTBB:BOOL=ON \ - -DTBB_DIR:PATH=${tbb_dir} \ - -G Ninja \ - ${source_path} \ - && ninja \ + --verbose \ + --wheel \ + --outdir dist \ + --no-isolation \ + --skip-dependency-check \ + --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ + --config-setting=cmake.define.ITK_BINARY_DIR:PATH=${build_path} \ + --config-setting=cmake.define.ITKPythonPackage_ITK_BINARY_REUSE:BOOL=ON \ + --config-setting=cmake.define.ITKPythonPackage_WHEEL_NAME:STRING=${wheel_name} \ + --config-setting=cmake.define.Python3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ + --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ + --config-setting=cmake.define.CMAKE_CXX_FLAGS:STRING="${compile_flags}" \ + --config-setting=cmake.define.CMAKE_C_FLAGS:STRING="${compile_flags}" \ + . \ || exit 1 - ) - - wheel_names=$(cat ${script_dir}/../WHEEL_NAMES.txt) - for wheel_name in ${wheel_names}; do - # Configure pyproject.toml - ${PYBIN}/python ${PYPROJECT_CONFIGURE} ${wheel_name} - # Generate wheel - ${PYBIN}/python -m build \ - --verbose \ - --wheel \ - --outdir dist \ - --no-isolation \ - --skip-dependency-check \ - --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ - --config-setting=cmake.define.ITK_BINARY_DIR:PATH=${build_path} \ - --config-setting=cmake.define.ITKPythonPackage_ITK_BINARY_REUSE:BOOL=ON \ - --config-setting=cmake.define.ITKPythonPackage_WHEEL_NAME:STRING=${wheel_name} \ - --config-setting=cmake.define.Python3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ - --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ - --config-setting=cmake.define.CMAKE_CXX_FLAGS:STRING="${compile_flags}" \ - --config-setting=cmake.define.CMAKE_C_FLAGS:STRING="${compile_flags}" \ - . \ - || exit 1 - done - fi + done # Remove unnecessary files for building against ITK find ${build_path} -name '*.cpp' -delete -o -name '*.xml' -delete diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 73059147..43959556 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -92,8 +92,6 @@ pushd ITK-source > /dev/null 2>&1 ${NINJA_EXECUTABLE} -j$n_processors -l$n_processors popd > /dev/null 2>&1 -SINGLE_WHEEL=0 - # Compile wheels re-using standalone project and archive cache for VENV in "${VENVS[@]}"; do py_mm=$(basename ${VENV}) @@ -122,14 +120,46 @@ for VENV in "${VENVS[@]}"; do # Clean up previous invocations rm -rf ${build_path} - if [[ ${SINGLE_WHEEL} == 1 ]]; then - - echo "#" - echo "# Build single ITK wheel" - echo "#" - + echo "#" + echo "# Build multiple ITK wheels" + echo "#" + + # Build ITK python + ( + mkdir -p ${build_path} \ + && cd ${build_path} \ + && cmake \ + -DCMAKE_BUILD_TYPE:STRING=${build_type} \ + -DITK_SOURCE_DIR:PATH=${source_path} \ + -DITK_BINARY_DIR:PATH=${build_path} \ + -DBUILD_TESTING:BOOL=OFF \ + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ + -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ + -DITK_WRAP_unsigned_short:BOOL=ON \ + -DITK_WRAP_double:BOOL=ON \ + -DITK_WRAP_complex_double:BOOL=ON \ + -DITK_WRAP_IMAGE_DIMS:STRING="2;3;4" \ + -DPython3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ + -DPython3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ + -DWRAP_ITK_INSTALL_COMPONENT_IDENTIFIER:STRING=PythonWheel \ + -DWRAP_ITK_INSTALL_COMPONENT_PER_MODULE:BOOL=ON \ + "-DPY_SITE_PACKAGES_PATH:PATH=." \ + -DITK_LEGACY_SILENT:BOOL=ON \ + -DITK_WRAP_PYTHON:BOOL=ON \ + -DITK_WRAP_DOC:BOOL=ON \ + -DModule_ITKTBB:BOOL=${use_tbb} \ + -DTBB_DIR:PATH=${tbb_dir} \ + ${CMAKE_OPTIONS} \ + -G Ninja \ + ${source_path} \ + && ninja -j$n_processors -l$n_processors \ + || exit 1 + ) + + wheel_names=$(cat ${SCRIPT_DIR}/WHEEL_NAMES.txt) + for wheel_name in ${wheel_names}; do # Configure pyproject.toml - ${Python3_EXECUTABLE} ${PYPROJECT_CONFIGURE} "itk" + ${Python3_EXECUTABLE} ${PYPROJECT_CONFIGURE} ${wheel_name} # Generate wheel ${Python3_EXECUTABLE} -m build \ --verbose \ @@ -137,82 +167,19 @@ for VENV in "${VENVS[@]}"; do --outdir dist \ --no-isolation \ --skip-dependency-check \ - --config-setting=cmake.define.CMAKE_MAKE_PROGRAM:FILEPATH=${NINJA_EXECUTABLE} \ --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ --config-setting=cmake.define.ITK_BINARY_DIR:PATH=${build_path} \ --config-setting=cmake.define.CMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ --config-setting=cmake.define.CMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ + --config-setting=cmake.define.ITKPythonPackage_USE_TBB:BOOL=${use_tbb} \ + --config-setting=cmake.define.ITKPythonPackage_ITK_BINARY_REUSE:BOOL=ON \ + --config-setting=cmake.define.ITKPythonPackage_WHEEL_NAME:STRING=${wheel_name} \ --config-setting=cmake.define.Python3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ - --config-setting=cmake.define.Module_ITKTBB:BOOL=${use_tbb} \ - --config-setting=cmake.define.TBB_DIR:PATH=${tbb_dir} \ . \ - ${CMAKE_OPTIONS} - - else - - echo "#" - echo "# Build multiple ITK wheels" - echo "#" - - # Build ITK python - ( - mkdir -p ${build_path} \ - && cd ${build_path} \ - && cmake \ - -DCMAKE_BUILD_TYPE:STRING=${build_type} \ - -DITK_SOURCE_DIR:PATH=${source_path} \ - -DITK_BINARY_DIR:PATH=${build_path} \ - -DBUILD_TESTING:BOOL=OFF \ - -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ - -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ - -DITK_WRAP_unsigned_short:BOOL=ON \ - -DITK_WRAP_double:BOOL=ON \ - -DITK_WRAP_complex_double:BOOL=ON \ - -DITK_WRAP_IMAGE_DIMS:STRING="2;3;4" \ - -DPython3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ - -DPython3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ - -DWRAP_ITK_INSTALL_COMPONENT_IDENTIFIER:STRING=PythonWheel \ - -DWRAP_ITK_INSTALL_COMPONENT_PER_MODULE:BOOL=ON \ - "-DPY_SITE_PACKAGES_PATH:PATH=." \ - -DITK_LEGACY_SILENT:BOOL=ON \ - -DITK_WRAP_PYTHON:BOOL=ON \ - -DITK_WRAP_DOC:BOOL=ON \ - -DModule_ITKTBB:BOOL=${use_tbb} \ - -DTBB_DIR:PATH=${tbb_dir} \ - ${CMAKE_OPTIONS} \ - -G Ninja \ - ${source_path} \ - && ninja -j$n_processors -l$n_processors \ - || exit 1 - ) - - wheel_names=$(cat ${SCRIPT_DIR}/WHEEL_NAMES.txt) - for wheel_name in ${wheel_names}; do - # Configure pyproject.toml - ${Python3_EXECUTABLE} ${PYPROJECT_CONFIGURE} ${wheel_name} - # Generate wheel - ${Python3_EXECUTABLE} -m build \ - --verbose \ - --wheel \ - --outdir dist \ - --no-isolation \ - --skip-dependency-check \ - --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ - --config-setting=cmake.define.ITK_BINARY_DIR:PATH=${build_path} \ - --config-setting=cmake.define.CMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ - --config-setting=cmake.define.CMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ - --config-setting=cmake.define.ITKPythonPackage_USE_TBB:BOOL=${use_tbb} \ - --config-setting=cmake.define.ITKPythonPackage_ITK_BINARY_REUSE:BOOL=ON \ - --config-setting=cmake.define.ITKPythonPackage_WHEEL_NAME:STRING=${wheel_name} \ - --config-setting=cmake.define.Python3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ - --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ - . \ - ${CMAKE_OPTIONS} \ - || exit 1 - done - - fi + ${CMAKE_OPTIONS} \ + || exit 1 + done # Remove unnecessary files for building against ITK find ${build_path} -name '*.cpp' -delete -o -name '*.xml' -delete From 3a240bc8ffc46ffb3d54ba5bb2e730cfe80441d9 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 22 Nov 2025 09:20:32 -0600 Subject: [PATCH 08/45] COMP: Remove redundant CMAKE_BUILD_TYPE=Release setting --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d649df54..12667d99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,7 +124,6 @@ if(ITKPythonPackage_SUPERBUILD) URL_HASH SHA256=f0f78001c8c8edb4bddc3d4c5ee7428d56ae313254158ad1eec49eced57f6a5b CMAKE_ARGS -DTBB_TEST:BOOL=OFF - -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/../oneTBB-prefix -DCMAKE_INSTALL_LIBDIR:STRING=lib # Skip default initialization by GNUInstallDirs CMake module ${ep_common_cmake_cache_args} From 88b7ca80d3e67f9ece59ca1efc176861dd7e1803 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 22 Nov 2025 09:23:11 -0600 Subject: [PATCH 09/45] COMP: Match ninja requirements from ITK pyproject.toml ITK pyproject.toml requirements are matched to minimize version requirements in build configurations. --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 5fac7875..0e7f3ab3 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ -ninja==1.11.1.1 +ninja>=1.13.0,<2 scikit-build-core==0.10.7 build==1.2.1 pyproject-metadata From 889d8009cd4104905ffcdfb9eada2ff5cba38d63 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 22 Nov 2025 09:26:24 -0600 Subject: [PATCH 10/45] STYLE: ITK Python testing requires numpy Proposed ITK build requirements specify that NumPy must be found to successfully build ITK. --- requirements-dev.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-dev.txt b/requirements-dev.txt index 0e7f3ab3..365f4b0b 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,3 +4,4 @@ build==1.2.1 pyproject-metadata pathspec setuptools_scm==8.1.0 +numpy>=1.26 #1.26 is needed to support python3.9 From fe2ca911df4ff80ca4e7b1b59ef89323b2a9dc02 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 22 Nov 2025 18:30:43 -0600 Subject: [PATCH 11/45] ENH: Adding python-dotenv package to dependencies --- requirements-dev.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-dev.txt b/requirements-dev.txt index 365f4b0b..527377ec 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,3 +5,4 @@ pyproject-metadata pathspec setuptools_scm==8.1.0 numpy>=1.26 #1.26 is needed to support python3.9 +python-dotenv From 49b0a97587f4d04f0ea5aee864cae41c2bab45c8 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 22 Nov 2025 19:55:35 -0600 Subject: [PATCH 12/45] ENH: Use variables from build/package.env Remove unused variable setting file for linux --- scripts/dockcross-manylinux-build-wheels.sh | 41 ++++++-------- scripts/dockcross-manylinux-set-vars.sh | 62 --------------------- scripts/pyproject_configure.py | 7 ++- 3 files changed, 22 insertions(+), 88 deletions(-) delete mode 100755 scripts/dockcross-manylinux-set-vars.sh diff --git a/scripts/dockcross-manylinux-build-wheels.sh b/scripts/dockcross-manylinux-build-wheels.sh index 14f09a77..808ce168 100755 --- a/scripts/dockcross-manylinux-build-wheels.sh +++ b/scripts/dockcross-manylinux-build-wheels.sh @@ -7,42 +7,33 @@ # # scripts/dockcross-manylinux-build-wheels.sh cp39 # -# A specialized manylinux image and tag can be used by exporting to -# MANYLINUX_VERSION and IMAGE_TAG before running this script. -# See https://github.com/dockcross/dockcross for available versions and tags. +# A specialized manylinux image and tag can be used by setting +# MANYLINUX_VERSION and IMAGE_TAG in build/package.env before running this script. # # For example, -# -# export MANYLINUX_VERSION=2014 -# export IMAGE_TAG=20221205-459c9f0 +# generate_build_environment.sh # creates default build/package.env +# edit build/package.env with desired build elements # scripts/dockcross-manylinux-build-module-wheels.sh cp39 # script_dir=$(cd $(dirname $0) || exit 1; pwd) -source "${script_dir}/oci_exe.sh" - -oci_exe=$(ociExe) - -MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} - -if [[ ${MANYLINUX_VERSION} == _2_28 ]]; then - IMAGE_TAG=${IMAGE_TAG:=20250913-6ea98ba} -elif [[ ${MANYLINUX_VERSION} == 2014 ]]; then - IMAGE_TAG=${IMAGE_TAG:=20240304-9e57d2b} -else - echo "Unknown manylinux version ${MANYLINUX_VERSION}" - exit 1; +_ipp_dir=$(dirname ${script_dir}) +package_env_file=${_ipp_dir}/build/package.env +if [ ! -f "${package_env_file}" ]; then + source ${_ipp_dir}/generate_build_environment.sh.sh fi +source "${package_env_file}" +_local_dockercross_script=${_ipp_dir}/build/runner_dockcross-${MANYLINUX_VERSION}-x64_${IMAGE_TAG}.sh # Generate dockcross scripts -$oci_exe run --rm docker.io/dockcross/manylinux${MANYLINUX_VERSION}-x64:${IMAGE_TAG} > /tmp/dockcross-manylinux-x64 -chmod u+x /tmp/dockcross-manylinux-x64 +$oci_exe run --env-file "${_ipp_dir}/build/package.env" \ + --rm docker.io/dockcross/manylinux${MANYLINUX_VERSION}-x64:${IMAGE_TAG} > ${_local_dockercross_script} +chmod u+x ${_local_dockercross_script} # Build wheels -pushd $script_dir/.. +pushd ${_ipp_dir} mkdir -p dist -DOCKER_ARGS="-v $(pwd)/dist:/work/dist/" -DOCKER_ARGS+=" -e MANYLINUX_VERSION" -/tmp/dockcross-manylinux-x64 \ +DOCKER_ARGS="-v $(pwd)/dist:/work/dist/ --env-file ${package_env_file}" +${_local_dockercross_script} \ -a "$DOCKER_ARGS" \ ./scripts/internal/manylinux-build-wheels.sh "$@" popd diff --git a/scripts/dockcross-manylinux-set-vars.sh b/scripts/dockcross-manylinux-set-vars.sh deleted file mode 100755 index 8334284d..00000000 --- a/scripts/dockcross-manylinux-set-vars.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -######################################################################## -# Run this script to set common enviroment variables used in building the -# ITK Python wheel packages for Linux. -# -# ENVIRONMENT VARIABLES -# These environment variables will be populated by the script when invoked with `source` -# if their value is not set with `export` before invocation. -# For example, -# -# export ITK_PACKAGE_VERSION=v5.4.0 -# scripts/dockcross-manylinux-set-vars.sh cp39 -# -######################################################################## - -######################################################################## -# ITKPythonBuilds parameters - -# ITKPythonBuilds archive tag to use for ITK build artifacts. -# See https://github.com/insightSoftwareConsortium/ITKpythonbuilds for available tags. -ITK_PACKAGE_VERSION=${ITK_PACKAGE_VERSION:=v6.0b01} - -# Github organization for fetching ITKPythonPackage build scripts -ITKPYTHONPACKAGE_ORG=${ITKPYTHONPACKAGE_ORG:=InsightSoftwareConsortium} - -# ITKPythonPackage tag for fetching build scripts -ITKPYTHONPACKAGE_TAG=${ITKPYTHONPACKAGE_TAG:=main} - -######################################################################## -# Docker image parameters - -# Specialized manylinux image to use for building. Default is _2_28. -# See https://github.com/dockcross/dockcross for available versions and tags. -MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} - -# Target platform architecture (x64, aarch64) -TARGET_ARCH=${TARGET_ARCH:=x64} - -# Specialized manylinux image tag to use for building. -if [[ ${MANYLINUX_VERSION} == _2_28 && ${TARGET_ARCH} == x64 ]]; then - IMAGE_TAG=${IMAGE_TAG:=20250913-6ea98ba} -elif [[ ${MANYLINUX_VERSION} == _2_28 && ${TARGET_ARCH} == aarch64 ]]; then - IMAGE_TAG=${IMAGE_TAG:=2025.08.12-1} -elif [[ ${MANYLINUX_VERSION} == 2014 ]]; then - IMAGE_TAG=${IMAGE_TAG:=20240304-9e57d2b} -else - echo "Unknown manylinux version ${MANYLINUX_VERSION}" - exit 1; -fi - -# Set container for requested version/arch/tag. -if [[ ${TARGET_ARCH} == x64 ]]; then - MANYLINUX_IMAGE_NAME=${MANYLINUX_IMAGE_NAME:="manylinux${MANYLINUX_VERSION}-${TARGET_ARCH}:${IMAGE_TAG}"} - CONTAINER_SOURCE="docker.io/dockcross/${MANYLINUX_IMAGE_NAME}" -elif [[ ${TARGET_ARCH} == aarch64 ]]; then - MANYLINUX_IMAGE_NAME=${MANYLINUX_IMAGE_NAME:="manylinux${MANYLINUX_VERSION}_${TARGET_ARCH}:${IMAGE_TAG}"} - CONTAINER_SOURCE="quay.io/pypa/${MANYLINUX_IMAGE_NAME}" -else - echo "Unknown target architecture ${TARGET_ARCH}" - exit 1; -fi diff --git a/scripts/pyproject_configure.py b/scripts/pyproject_configure.py index 55ba9c2c..77c905ee 100755 --- a/scripts/pyproject_configure.py +++ b/scripts/pyproject_configure.py @@ -28,8 +28,13 @@ import os import re import sys +from dotenv import dotenv_values -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +ipp_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +package_file = os.path.join(ipp_dir, "build", "package.env") +package_env_config = dotenv_values(package_file) + +sys.path.append(ipp_dir) PARAMETER_OPTION_DEFAULTS = { "indent": 0, From 2599fb3de09b58094cbe603115ca5492ee4f3869 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 24 Nov 2025 10:41:39 -0600 Subject: [PATCH 13/45] ENH: Remove defaults that must be set in .env files Prefer failure to alternate default version. If a .env file is not processed correctly, partial success with mismatched defaults is very hard to debug. Fast failure is easier to identify and resolve the failures. --- ...kcross-manylinux-download-cache-and-build-module-wheels.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh b/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh index 85471726..32f1b204 100755 --- a/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh @@ -64,8 +64,8 @@ done # ----------------------------------------------------------------------- # Download and extract cache -echo "Fetching https://raw.githubusercontent.com/${ITKPYTHONPACKAGE_ORG:=InsightSoftwareConsortium}/ITKPythonPackage/${ITKPYTHONPACKAGE_TAG:=v5.4.0}/scripts/dockcross-manylinux-download-cache.sh" -curl -L https://raw.githubusercontent.com/${ITKPYTHONPACKAGE_ORG:=InsightSoftwareConsortium}/ITKPythonPackage/${ITKPYTHONPACKAGE_TAG:=v5.4.0}/scripts/dockcross-manylinux-download-cache.sh -O +echo "Fetching https://raw.githubusercontent.com/${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage/${ITKPYTHONPACKAGE_TAG}/scripts/dockcross-manylinux-download-cache.sh" +curl -L https://raw.githubusercontent.com/${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage/${ITKPYTHONPACKAGE_TAG}/scripts/dockcross-manylinux-download-cache.sh -O chmod u+x dockcross-manylinux-download-cache.sh ./dockcross-manylinux-download-cache.sh $1 From 8f468178aa36e1d316f1cb4082b57a40d8cd6b17 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Sat, 22 Nov 2025 15:48:17 -0600 Subject: [PATCH 14/45] ENH: A script that generates build/package.env The generate_build_environment.sh can be sourced in a zsh or bash shell to create build/package.env with important values set from the environment, or default values recorded for future use in other build stages (i.e. cmake, python, dockcross build stages). --- generate_build_environment.sh | 403 ++++++++++++++++++++++++++++++++++ 1 file changed, 403 insertions(+) create mode 100755 generate_build_environment.sh diff --git a/generate_build_environment.sh b/generate_build_environment.sh new file mode 100755 index 00000000..c77e5f4c --- /dev/null +++ b/generate_build_environment.sh @@ -0,0 +1,403 @@ +#!/bin/bash + +######################################################################## +# Run this script to set common enviroment variables used in building the +# ITK Python wheel packages for Linux. +# +# Any environmental variables that are exported in the calling environment, +# or # previously set in the input (-i) file will be retained. +# +# NOTE: only variables that are "exported" will be retained. To override +# values, use a set of VAR1=VALUE1 VAR2=VALUE2 elements at then +# end of the command line +# +# These environment variables will be populated by the script +# when invoked with `source ${_ipp_dir}/build/package.env` +# if their value is not set with `export` before invocation. +# For example, +# +# export ITK_GIT_TAG=main +# export ITK_SOURCE_DIR=/home/me/src/ITK +# NO_SUDO=1 <-- WARNING This will only be set in calling environment +# and not seen during generation of new -o .env +# +######################################################################## + +usage() { + echo "Usage:" + echo "export KEY0=VALUE0" + echo "$0 [-i input_file] [-o output_file] [KEY1=VALUE1 KEY2=VALUE2 ...]" + echo "PRIORITY OF SETTING VALUES" + echo " lowest 0: guessed values not declared elsewhere" + echo " 1: exported environmental variables. i.e. KEY0" + echo " 2: mappings specified in input_file mappings" + echo " highest 3: mappings given at the end of the command line. i.e. KEY1, KEY2" + exit 1 +} + +# Detect whether the script is being sourced +sourced=0 +# ZSH +if [ -n "${ZSH_VERSION:-}" ]; then + case $ZSH_EVAL_CONTEXT in + *:file) sourced=1 ;; + esac +# BASH +elif [ -n "${BASH_VERSION:-}" ]; then + # test whether $0 is the current shell, or $BASH_SOURCE differs + [[ "${BASH_SOURCE[0]}" != "$0" ]] && sourced=1 +# POSIX fallback: last resort +else + # If 'return' works, we're sourced. If it errors, we're executed. + (return 0 2>/dev/null) && sourced=1 +fi + +if [ "$sourced" -eq 1 ]; then + echo "*************************************************************" + echo "* Never source $0 script directly!" + echo "*" + echo "* Run as a script (i.e. 'ITK_SOURCE_DIR=/home/me/src/ITK bash $0')" + echo "* then 'source build/package.env' that results from the run" + echo "*************************************************************" + return +fi + +_ipp_dir=$(cd $(dirname $0) || exit 1; pwd) +BUILD_ENV_REPORT=${BUILD_ENV_REPORT:=${_ipp_dir}/build/package.env} +if [ -f "${BUILD_ENV_REPORT}" ]; then + REFERENCE_ENV_REPORT="${BUILD_ENV_REPORT}" +else + REFERENCE_ENV_REPORT="" +fi + +# Reset OPTIND so sourcing/re-running doesn't break parsing +OPTIND=1 +while getopts ":i:o:h" opt; do + case "$opt" in + i) + REFERENCE_ENV_REPORT="$OPTARG" + ;; + o) + BUILD_ENV_REPORT="$OPTARG" + ;; + h) + usage + ;; + :) + echo "ERROR: Option -$OPTARG requires an argument" >&2 + usage + ;; + \?) + echo "ERROR: Unknown option -$OPTARG" >&2 + usage + ;; + esac +done +shift $((OPTIND - 1)) # remove parsed flags from "$@" + +echo "Input: ${REFERENCE_ENV_REPORT:-}" +echo "Output: ${BUILD_ENV_REPORT:-}" + +if [ -f "${REFERENCE_ENV_REPORT}" ]; then + if [ "${REFERENCE_ENV_REPORT}" = "${BUILD_ENV_REPORT}" ]; then + # If BUILD_ENV_REPORT exists, make a backup + _candidate_config_filename=${BUILD_ENV_REPORT}_$(date +"%y%m%d.%H%M%S") + echo "${BUILD_ENV_REPORT} exists, backing up to ${_candidate_config_filename}" + cp ${BUILD_ENV_REPORT} ${_candidate_config_filename} + fi + # pre-load existing values + source "${REFERENCE_ENV_REPORT}" +fi + +# ---- Process trailing KEY=VALUE pairs that are intended to override previously stored values ---- +for kv in "$@"; do + case "$kv" in + *=*) + key=${kv%%=*} + value=${kv#*=} + if [[ "${value}" = "UNSET" ]]; then + unset ${key} + continue + fi + # Enforce valid shell identifier for the key + case "$key" in + ''|*[!A-Za-z0-9_]*) + echo "ERROR: Invalid variable name '$key' in '$kv'" >&2 + exit 1 + ;; + [0-9]*) + echo "ERROR: Invalid variable name '$key' (cannot start with digit)" >&2 + exit 1 + ;; + esac + + # Export into environment for downstream tools + export "$key=$value" + ;; + *) + echo "ERROR: Trailing argument '$kv' is not KEY=VALUE" >&2 + usage + ;; + esac +done + + +# Must run inside a git working tree +get_git_id() { + # 1. If current commit has an exact tag (no -gXXXX suffix) + if tag=$(git describe --tags --exact-match 2>/dev/null); then + echo "$tag" + return + fi + + # 2. If on a branch + if branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) && [[ "$branch" != "HEAD" ]]; then + echo "$branch" + return + fi + + # 3. Detached HEAD → fallback to short hash + git rev-parse --short HEAD +} + +# portable_indirect VAR_NAME → prints value of +# the variable that VAR_NAME points to in both zsh +# and bash +indirect() { + local ref="$1" + if [ -n "${ZSH_VERSION:-}" ]; then + # zsh: use (P) flag + print -r -- ${(P)ref} + else + # bash: use ${!name} + printf '%s\n' "${!ref}" + fi +} + +ITK_SOURCE_DIR=${ITK_SOURCE_DIR:=${_ipp_dir}/ITK-source/ITK} + +# determine the latest tag for ITKPythonPackage (current working directory) +pushd "${_ipp_dir}" || echo "can not enter ${ipp_dir}" + _ipp_latest_tag="$(get_git_id)" +popd +if [ ! -d "${ITK_SOURCE_DIR}" ]; then + # Need early checkout to get AUTOVERSION if none provided + git clone https://github.com/InsightSoftwareConsortium/ITK.git ${ITK_SOURCE_DIR} +fi +pushd "${ITK_SOURCE_DIR}" || echo "cannot enter ${ITK_SOURCE_DIR}" + git checkout ${ITK_GIT_TAG} +popd +# If the ITK_GIT_TAG != the ITKPythonPackage latest tag, +# then get a value to auto-generate the python packaging name +if [ -z "${ITK_PACKAGE_VERSION}" ]; then + if [ "${ITK_GIT_TAG}" = "${_ipp_latest_tag}" ]; then + ITK_PACKAGE_VERSION=${ITK_GIT_TAG} + else + # Get auto generated itk package version base semantic versioning + # rules for relative versioning based on git commits + pushd "${ITK_SOURCE_DIR}" || echo "cannot enter ${ITK_SOURCE_DIR}" + git fetch --tags + git checkout ${ITK_GIT_TAG} + ITK_PACKAGE_VERSION=$( git describe --tags --long --dirty --always \ + | sed -E 's/^([^-]+)-([0-9]+)-g([0-9a-f]+)(-dirty)?$/\1-dev.\2+\3\4/' + ) + popd + fi +fi + +######################################################################## +# Docker image parameters +MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} # <- The primary support target for ITK as of 20251114. Including upto Python 3.15 builds. +TARGET_ARCH=${TARGET_ARCH:=x64} + +if [[ ${MANYLINUX_VERSION} == _2_34 && ${TARGET_ARCH} == x64 ]]; then + # https://hub.docker.com/r/dockcross/manylinux_2_34-x64/tags + IMAGE_TAG=${IMAGE_TAG:=latest} #<- as of 20251114 this should primarily be used for testing +elif [[ ${MANYLINUX_VERSION} == _2_28 && ${TARGET_ARCH} == x64 ]]; then + # https://hub.docker.com/r/dockcross/manylinux_2_28-x64/tags + # IMAGE_TAG=${IMAGE_TAG:=20251011-8b9ace4} # <- Incompatible with ITK cast-xml on 2025-11-16 + IMAGE_TAG=${IMAGE_TAG:=20250913-6ea98ba} +elif [[ ${MANYLINUX_VERSION} == _2_28 && ${TARGET_ARCH} == aarch64 ]]; then + IMAGE_TAG=${IMAGE_TAG:=2025.08.12-1} +elif [[ ${MANYLINUX_VERSION} == 2014 ]]; then + IMAGE_TAG=${IMAGE_TAG:=20240304-9e57d2b} +else + echo "Unknown manylinux version ${MANYLINUX_VERSION}" + exit 1; +fi + +# Configure the oci executable (i.e. docker, containerd, other) +source "${_ipp_dir}/scripts/oci_exe.sh" + +mkdir -p ${_ipp_dir}/build + + +cat > ${BUILD_ENV_REPORT} << DEFAULT_ENV_SETTINGS +################################################ +################################################ +### ITKPythonPackage Environment Variables ### +### in .env format (KEY=VALUE) ### + +# - "ITK_GIT_TAG": Tag/branch/hash for ITKPythonBuilds build cache to use +# Which ITK git tag/hash/branch to use as reference for building wheels/modules +# https://github.com/InsightSoftwareConsortium/ITK.git@\${ITK_GIT_TAG} +# Examples: "v5.4.0", "v5.2.1.post1" "0ffcaed12552" "my-testing-branch" +# See available release tags at https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/tags +ITK_GIT_TAG=${ITK_GIT_TAG:=${_ipp_latest_tag}} + +# - "ITK_SOURCE_DIR": When building different "flavor" of ITK python packages +# on a given platform, explicitly setting the ITK_SOURCE_DIR options allow to +# speed up source-code downloads by re-using an existing repository. +# If the requested directory does not exist, manually clone and checkout ${ITK_GIT_TAG} +ITK_SOURCE_DIR=${ITK_SOURCE_DIR} + +# +# - "ITK_PACKAGE_VERSION" A valid versioning formatted tag. This may be ITK_GIT_TAG for tagged releases +# Use the keyword 'AUTOVERSION' to have a temporary version automatically created from based on +# git hash and the checked out ITK_GIT_TAG +# (in github action ITKRemoteModuleBuildTestPackage itk-wheel-tag is used to set this value) +ITK_PACKAGE_VERSION=${ITK_PACKAGE_VERSION:=${_ipp_latest_version}} + +# - "ITKPYTHONPACKAGE_ORG": Github organization or user to use for ITKPythonPackage build scripts +# Which script version to use in generating python packages +# https://github.com/InsightSoftwareConsortium/\${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage.git@\${ITKPYTHONPACKAGE_TAG} +# build script source. Default is InsightSoftwareConsortium. +# Ignored if ITKPYTHONPACKAGE_TAG is empty. +# (in github action ITKRemoteModuleBuildTestPackage itk-python-package-org is used to set this value) +ITKPYTHONPACKAGE_ORG=${ITKPYTHONPACKAGE_ORG:=InsightSoftwareConsortium} + +# - "ITKPYTHONPACKAGE_TAG": Tag for ITKPythonPackage build scripts to use. +# If ITKPYTHONPACKAGE_TAG is empty then the default scripts distributed +# with the ITKPythonBuilds archive will be used. +# (in github action ITKRemoteModuleBuildTestPackage itk-python-package-tag is used to set this value) +ITKPYTHONPACKAGE_TAG=${ITKPYTHONPACKAGE_TAG:=${_ipp_latest_tag}} + +# - "ITK_MODULE_PREQ": Prerequisite ITK modules that must be built before the requested module. +# Format is "/@:/@:...". +# For instance, "export ITK_MODULE_PREQ=InsightSoftwareConsortium/ITKMeshToPolyData@v0.10.0" +# See notes in "dockcross-manylinux-build-module-deps.sh". +# (in github action ITKRemoteModuleBuildTestPackage itk-module-deps is used to set this value) +ITK_MODULE_PREQ=${ITK_MODULE_PREQ:=} + +# - "NO_SUDO": +# Disable if running docker does not require sudo priveleges +# (set to 1 if your user account can run docker, set to 0 otherwise). +NO_SUDO=${NO_SUDO:=0} + +# - "ITK_MODULE_NO_CLEANUP": Option to skip cleanup steps. +# =1 <- Leave tempoary build files in place after completion, 0 <- remove temporary build files +ITK_MODULE_NO_CLEANUP=${ITK_MODULE_NO_CLEANUP:=1} + +DEFAULT_ENV_SETTINGS + +if [[ "$(uname)" == "Linux" ]]; then +# Linux uses dockcross containers to perform cross compilations +# for greater compliance across a wide range of linux distributions. +# Inside the containers it is asssumed that each container's default +# compilation envrionment is sufficeintly setup to not require +# setting CXX, CC, CFLAGS, CXXFLAGS etc from the HOST environment. +# +# The choice of container dictates the choice of compiler toolchain. + +cat >> ${BUILD_ENV_REPORT} << DEFAULT_LINUX_ENV_SETTINGS +# Which container to use for generating cross compiled packages +oci_exe=${oci_exe:=$(ociExe)} + +# - "MANYLINUX_VERSION": Specialized manylinux image to use for building. Default is _2_28. +# Examples: "_2_28", "2014" +# See https://github.com/dockcross/dockcross for available versions and tags. +# For instance, "export MANYLINUX_VERSION=_2_34" +MANYLINUX_VERSION=${MANYLINUX_VERSION} + +# - "TARGET_ARCH": Target architecture for which wheels should be built. +# Target platform architecture (x64, aarch64) +TARGET_ARCH=${TARGET_ARCH} + +# - "IMAGE_TAG": Specialized manylinux image tag to use for building. +# For instance, "export IMAGE_TAG=20221205-459c9f0". +# Tagged images are available at: +# - https://github.com/dockcross/dockcross (x64 architecture) +# - https://quay.io/organization/pypa (ARM architecture) +IMAGE_TAG=${IMAGE_TAG} + +# Environmental controls impacting dockcross-manylinux-build-module-wheels.sh +# - "LD_LIBRARY_PATH": Shared libraries to be included in the resulting wheel. +# For instance, "export LD_LIBRARY_PATH="/path/to/OpenCL.so:/path/to/OpenCL.so.1.2"" +LD_LIBRARY_PATH=${LD_LIBRARY_PATH} + +DEFAULT_LINUX_ENV_SETTINGS +fi + +if [[ "$(uname)" == "Darwin" ]]; then +# Darwin package builds do not do cross compilation in containers +# There is *only* the HOST environment is used for compilation, +# so ensure the compile influencing environmental variables are +# respected in the scripts. +# +# Setup system dependant compiler options, +# note cmake will respect environmental variables +# CC – C compiler +# CXX – C++ compiler +# CUDAHOSTCXX – Host compiler for CUDA +# CFLAGS – baseline C flags +# CXXFLAGS – baseline C++ flags +# CPPFLAGS – preprocessor flags (added to all languages) +# LDFLAGS – link flags for all languages +# Use cmake to find and set CC and CXX if not previously set +if [ -z "$CC" ]; then + test -f ${_ipp_dir}/build/cmake_system_information || cmake --system-information > ${_ipp_dir}/build/cmake_system_information 2>&1 + CC_DEFAULT=$(grep "CMAKE_C_COMPILER == " ${_ipp_dir}/build/cmake_system_information| tr " " "\n" |sed -n "3p") +fi +if [ -z "$CXX" ]; then + test -f ${_ipp_dir}/build/cmake_system_information || cmake --system-information > ${_ipp_dir}/build/cmake_system_information 2>&1 + CXX_DEFAULT=$(grep "CMAKE_CXX_COMPILER == " ${_ipp_dir}/build/cmake_system_information| tr " " "\n" |sed -n "3p") +fi + + + ################################################ + # when building in host environment + + # Append compiler Vars to persist across shells/tools + BUILD_VARS=( + CC + CXX + FC + CFLAGS + CXXFLAGS + FFLAGS + CPPFLAGS + LDFLAGS + SDKROOT + MACOSX_DEPLOYMENT_TARGET + PKG_CONFIG_PATH + PKG_CONFIG_LIBDIR + LD_LIBRARY_PATH + DYLD_LIBRARY_PATH + CC_DEFAULT # used as hint for developer + CXX_DEFAULT # used as hint for developer + ) + + { + # - "ITK_USE_LOCAL_PYTHON": For APPLE ONLY Determine how to get Python framework for build. + # - If empty, Python frameworks will be fetched from python.org + # - If not empty, frameworks already on machine will be used without fetching. + ITK_USE_LOCAL_PYTHON=${ITK_USE_LOCAL_PYTHON} + + echo "# Standard environmental build flags respected by cmake and other build tools" + echo "# Autogenerated build environment" + echo "# Generated: $(date)" + echo "# Source this file in bash/zsh/python(dot-env) before builds" + + for var in "${BUILD_VARS[@]}"; do + # Indirect expansion; empty if unset + value=$(indirect $var) + if [[ -n "${value}" ]]; then + # %q produces a shell-escaped representation (bash/zsh) + printf '%s=%q\n' "${var}" "${value}" + else + printf '## - %s=%q\n' "${var}" "${value}" + fi + done + } >> "${BUILD_ENV_REPORT}" +fi +cat ${BUILD_ENV_REPORT} From 7a00dd0e1789cb25480005c40ad67c32ffab0e6c Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 24 Nov 2025 08:55:28 -0600 Subject: [PATCH 15/45] DOC: Environmental Variable description in generate_build_environment.sh Keep all the environmental variable descriptions in one place to be consistent across entire toolkit. Centralizing environmental variable setting. --- CMakeLists.txt | 2 +- .../dockcross-manylinux-build-module-deps.sh | 15 ++++--- ...dockcross-manylinux-build-module-wheels.sh | 44 ++++--------------- scripts/dockcross-manylinux-build-wheels.sh | 2 +- scripts/dockcross-manylinux-cleanup.sh | 10 +---- ...-download-cache-and-build-module-wheels.sh | 24 ++++------ scripts/dockcross-manylinux-download-cache.sh | 19 +------- scripts/internal/manylinux-build-wheels.sh | 9 ++-- scripts/macpython-build-module-deps.sh | 7 +-- scripts/macpython-build-module-wheels.sh | 17 +++---- ...-download-cache-and-build-module-wheels.sh | 18 ++------ 11 files changed, 44 insertions(+), 123 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 12667d99..76c37072 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,7 +94,7 @@ if(ITKPythonPackage_SUPERBUILD) # Sanity checks if(DEFINED ITK_SOURCE_DIR AND NOT EXISTS ${ITK_SOURCE_DIR}) - message(FATAL_ERROR "ITK_SOURCE_DIR variable is defined but corresponds to nonexistent directory") + message(FATAL_ERROR "Variable is defined but corresponds to nonexistent directory:\nITK_SOURCE_DIR=${ITK_SOURCE_DIR}") endif() if(ITKPythonPackage_USE_TBB) diff --git a/scripts/dockcross-manylinux-build-module-deps.sh b/scripts/dockcross-manylinux-build-module-deps.sh index dede51d3..66209294 100755 --- a/scripts/dockcross-manylinux-build-module-deps.sh +++ b/scripts/dockcross-manylinux-build-module-deps.sh @@ -17,24 +17,25 @@ # .. # # =========================================== -# ENVIRONMENT VARIABLES -# -# - `ITK_MODULE_PREQ`: Prerequisite ITK modules that must be built before the requested module. -# Format is `/@:/@:...`. -# For instance, `export ITK_MODULE_PREQ=InsightSoftwareConsortium/ITKMeshToPolyData@v0.10.0` +# ENVIRONMENT VARIABLES: ITK_MODULE_PREQ # ######################################################################## # Initialize variables script_dir=$(cd $(dirname $0) || exit 1; pwd) +_ipp_dir=$(dirname ${script_dir}) +package_env_file=${_ipp_dir}/build/package.env +if [ ! -f "${package_env_file}" ]; then + ${_ipp_dir}/generate_build_environment.sh -o ${package_env_file} +fi +source "${package_env_file}" + if [[ ! -f "${script_dir}/dockcross-manylinux-download-cache-and-build-module-wheels.sh" ]]; then echo "Could not find download script to use for building module dependencies!" exit 1 fi -source "${script_dir}/dockcross-manylinux-set-vars.sh" - # Temporarily update prerequisite environment variable to prevent infinite recursion. ITK_MODULE_PREQ_TOPLEVEL=${ITK_MODULE_PREQ} ITK_MODULE_NO_CLEANUP_TOPLEVEL=${ITK_MODULE_NO_CLEANUP} diff --git a/scripts/dockcross-manylinux-build-module-wheels.sh b/scripts/dockcross-manylinux-build-module-wheels.sh index 74126861..c0a56589 100755 --- a/scripts/dockcross-manylinux-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-build-module-wheels.sh @@ -13,43 +13,17 @@ # scripts/dockcross-manylinux-build-module-wheels.sh cp39 # # =========================================== -# ENVIRONMENT VARIABLES -# -# These variables are set with the `export` bash command before calling the script.# -# For example, -# -# export MANYLINUX_VERSION="_2_28" -# scripts/dockcross-manylinux-build-module-wheels.sh cp39 -# -# `LD_LIBRARY_PATH`: Shared libraries to be included in the resulting wheel. -# For instance, `export LD_LIBRARY_PATH="/path/to/OpenCL.so:/path/to/OpenCL.so.1.2"` -# -# `MANYLINUX_VERSION`: Specialized manylinux image to use for building. Default is _2_28. -# See https://github.com/dockcross/dockcross for available versions and tags. -# For instance, `export MANYLINUX_VERSION=2014` -# -# `TARGET_ARCH`: Target architecture for which wheels should be built. -# For instance, `export MANYLINUX_VERSION=aarch64` -# -# `IMAGE_TAG`: Specialized manylinux image tag to use for building. -# For instance, `export IMAGE_TAG=20221205-459c9f0`. -# Tagged images are available at: -# - https://github.com/dockcross/dockcross (x64 architecture) -# - https://quay.io/organization/pypa (ARM architecture) -# -# `ITK_MODULE_PREQ`: Prerequisite ITK modules that must be built before the requested module. -# See notes in `dockcross-manylinux-build-module-deps.sh`. -# -# `ITK_MODULE_NO_CLEANUP`: Option to skip cleanup steps. -# -# - `NO_SUDO`: Disable the use of superuser permissions for running docker. -# +# See generate_build_environment.sh for description of environmental variable usage +# ENVIRONMENT VARIABLES: LD_LIBRARY_PATH, MANYLINUX_VERSION, TARGET_ARCH, IMAGE_TAG, ITK_MODULE_PREQ, ITK_MODULE_NO_CLEANUP, NO_SUDO ######################################################################## -# Handle case where the script directory is not the working directory -script_dir=$(cd $(dirname $0) || exit 1; pwd) -source "${script_dir}/dockcross-manylinux-set-vars.sh" -source "${script_dir}/oci_exe.sh" +script_dir=${script_dir:=$(cd $(dirname $0) || exit 1; pwd)} +_ipp_dir=$(dirname ${script_dir}) +package_env_file=${_ipp_dir}/build/package.env +if [ ! -f "${package_env_file}" ]; then + ${_ipp_dir}/generate_build_environment.sh -o ${package_env_file} +fi +source "${package_env_file}" oci_exe=$(ociExe) diff --git a/scripts/dockcross-manylinux-build-wheels.sh b/scripts/dockcross-manylinux-build-wheels.sh index 808ce168..b88907dc 100755 --- a/scripts/dockcross-manylinux-build-wheels.sh +++ b/scripts/dockcross-manylinux-build-wheels.sh @@ -19,7 +19,7 @@ script_dir=$(cd $(dirname $0) || exit 1; pwd) _ipp_dir=$(dirname ${script_dir}) package_env_file=${_ipp_dir}/build/package.env if [ ! -f "${package_env_file}" ]; then - source ${_ipp_dir}/generate_build_environment.sh.sh + ${_ipp_dir}/generate_build_environment.sh -o ${package_env_file} fi source "${package_env_file}" diff --git a/scripts/dockcross-manylinux-cleanup.sh b/scripts/dockcross-manylinux-cleanup.sh index 52702518..a5f6733f 100755 --- a/scripts/dockcross-manylinux-cleanup.sh +++ b/scripts/dockcross-manylinux-cleanup.sh @@ -9,15 +9,7 @@ # architectures. # # =========================================== -# ENVIRONMENT VARIABLES -# -# - `ITK_MODULE_PREQ`: Prerequisite ITK modules that must be built before the requested module. -# Format is `/@:/@:...`. -# For instance, `export ITK_MODULE_PREQ=InsightSoftwareConsortium/ITKMeshToPolyData@v0.10.0` -# -# - `NO_SUDO`: Disable the use of superuser permissions for removing directories. -# `sudo` is required by default for cleanup on Github Actions runners. -# +# ENVIRONMENT VARIABLES: ITK_MODULE_PREQ, NO_SUDO ######################################################################## echo "Cleaning up artifacts from module build" diff --git a/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh b/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh index 32f1b204..9cc80108 100755 --- a/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh @@ -13,23 +13,17 @@ # scripts/dockcross-manylinux-build-module-wheels.sh cp39 # # =========================================== -# ENVIRONMENT VARIABLES -# -# These variables are set with the `export` bash command before calling the script. -# For example, -# -# export ITK_PACKAGE_VERSION="v5.4.0" -# export ITKPYTHONPACKAGE_ORG="InsightSoftwareConsortium" -# scripts/dockcross-manylinux-download-cache-and-build-module-wheels cp39 -# -# `ITKPYTHONPACKAGE_ORG`: Github organization for fetching ITKPythonPackage build scripts. -# -# `ITKPYTHONPACKAGE_TAG`: ITKPythonPackage tag for fetching build scripts. -# -# Additional environment variables may be defined in accompanying build scripts. -# +# ENVIRONMENT VARIABLES: ITKPYTHONPACKAGE_ORG, ITKPYTHONPACKAGE_TAG ######################################################################## +script_dir=$(cd $(dirname $0) || exit 1; pwd) +_ipp_dir=$(dirname ${script_dir}) +package_env_file=${_ipp_dir}/build/package.env +if [ ! -f "${package_env_file}" ]; then + ${_ipp_dir}/generate_build_environment.sh -o ${package_env_file} +fi +source "${package_env_file}" + # ----------------------------------------------------------------------- # Script argument parsing # diff --git a/scripts/dockcross-manylinux-download-cache.sh b/scripts/dockcross-manylinux-download-cache.sh index bed112bd..613f3bb5 100755 --- a/scripts/dockcross-manylinux-download-cache.sh +++ b/scripts/dockcross-manylinux-download-cache.sh @@ -11,24 +11,7 @@ # steps not present in `dockcross-manylinux-download-cache-and-build-module-wheels.sh`. # # =========================================== -# ENVIRONMENT VARIABLES -# -# `ITK_PACKAGE_VERSION`: Tag for ITKPythonBuilds build cache to use -# Examples: "v5.4.0", "v5.2.1.post1" -# See available tags at https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/tags -# -# `MANYLINUX_VERSION`: manylinux specialization used to build ITK for cache -# Examples: "_2_28", "2014", "_2_28_aarch64" -# See https://github.com/dockcross/dockcross -# -# `ITKPYTHONPACKAGE_TAG`: Tag for ITKPythonPackage build scripts to use. -# If ITKPYTHONPACKAGE_TAG is empty then the default scripts distributed -# with the ITKPythonBuilds archive will be used. -# -# `ITKPYTHONPACKAGE_ORG`: Github organization or user to use for ITKPythonPackage -# build script source. Default is InsightSoftwareConsortium. -# Ignored if ITKPYTHONPACKAGE_TAG is empty. -# +# ENVIRONMENT VARIABLES: ITK_GIT_TAG, MANYLINUX_VERSION, ITKPYTHONPACKAGE_TAG, ITKPYTHONPACKAGE_ORG ######################################################################## # ----------------------------------------------------------------------- diff --git a/scripts/internal/manylinux-build-wheels.sh b/scripts/internal/manylinux-build-wheels.sh index 001e8233..89eeaa3d 100755 --- a/scripts/internal/manylinux-build-wheels.sh +++ b/scripts/internal/manylinux-build-wheels.sh @@ -20,19 +20,16 @@ # # For example, `docker run -e ` can be used to set an environment variable when launching a container: # -# export MANYLINUX_VERSION=2014 +# generate_build_environment.sh # creates default build/package.env +# edit build/package.env with desired build elements # docker run --rm dockcross/manylinux${MANYLINUX_VERSION}-x64:${IMAGE_TAG} > /tmp/dockcross-manylinux-x64 # chmod u+x /tmp/dockcross-manylinux-x64 # /tmp/dockcross-manylinux-x64 -e MANYLINUX_VERSION manylinux-build-module-wheels.sh cp39 # # ----------------------------------------------------------------------- -# These variables are set in common script: +# These variables are set in common script: ARCH, PYBINARIES, Python3_LIBRARY # -ARCH="" -PYBINARIES="" -Python3_LIBRARY="" - script_dir=$(cd $(dirname $0) || exit 1; pwd) source "${script_dir}/manylinux-build-common.sh" diff --git a/scripts/macpython-build-module-deps.sh b/scripts/macpython-build-module-deps.sh index a74e9da7..75062611 100644 --- a/scripts/macpython-build-module-deps.sh +++ b/scripts/macpython-build-module-deps.sh @@ -18,11 +18,6 @@ # # =========================================== # ENVIRONMENT VARIABLES -# -# - `ITK_MODULE_PREQ`: Prerequisite ITK modules that must be built before the requested module. -# Format is `/@:/@:...`. -# For instance, `export ITK_MODULE_PREQ=InsightSoftwareConsortium/ITKMeshToPolyData@v0.10.0` -# ######################################################################## script_dir=$(cd $(dirname $0) || exit 1; pwd) @@ -34,6 +29,8 @@ fi # Temporarily update prerequisite environment variable to prevent infinite recursion. ITK_MODULE_PREQ_TOPLEVEL=${ITK_MODULE_PREQ} ITK_USE_LOCAL_PYTHON_TOPLEVEL=${ITK_USE_LOCAL_PYTHON} + +# Temporary values within script (to be resored at end of the script). export ITK_MODULE_PREQ="" export ITK_USE_LOCAL_PYTHON="ON" diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index cb3496c8..d6a275bb 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -15,20 +15,13 @@ # running this script. # # =========================================== -# ENVIRONMENT VARIABLES +# ENVIRONMENT VARIABLES: DYLD_LIBRARY_PATH # -# These variables are set with the `export` bash command before calling the script. +# These variables are set in build/package.env before calling this script. # For example, -# -# export DYLD_LIBRARY_PATH="/path/to/libs" -# scripts/macpython-build-module-wheels.sh 3.7 3.9 -# -# `DYLD_LIBRARY_PATH`: Shared libraries to be included in the resulting wheel. -# For instance, `export DYLD_LIBRARY_PATH="/path/to/OpenCL.so:/path/to/OpenCL.so.1.2"` -# -# `ITK_MODULE_PREQ`: Prerequisite ITK modules that must be built before the requested module. -# Format is `/@:/@:...`. -# For instance, `export ITK_MODULE_PREQ=InsightSoftwareConsortium/ITKMeshToPolyData@v0.10.0` +# generate_build_environment.sh # creates default build/package.env +# edit build/package.env with desired build elements +# scripts/macpython-build-module-wheels.sh 3.9 # ######################################################################## diff --git a/scripts/macpython-download-cache-and-build-module-wheels.sh b/scripts/macpython-download-cache-and-build-module-wheels.sh index 297e827d..6723cff6 100755 --- a/scripts/macpython-download-cache-and-build-module-wheels.sh +++ b/scripts/macpython-download-cache-and-build-module-wheels.sh @@ -16,24 +16,14 @@ # running this script. # # =========================================== -# ENVIRONMENT VARIABLES +# ENVIRONMENT VARIABLES: ITK_GIT_TAG ITKPYTHONPACKAGE_ORG ITK_USE_LOCAL_PYTHON # # These variables are set with the `export` bash command before calling the script. # For example, # -# export DYLD_LIBRARY_PATH="/path/to/libs" -# -# `ITK_PACKAGE_VERSION`: ITKPythonBuilds archive tag to use for ITK build artifacts. -# See https://github.com/InsightSoftwareConsortium/ITKPythonBuilds for available tags. -# For instance, `export ITK_PACKAGE_VERSION=v5.4.0`. -# -# `ITKPYTHONPACKAGE_ORG`: Github organization for fetching ITKPythonPackage build scripts. -# -# `ITKPYTHONPACKAGE_TAG`: ITKPythonPackage tag for fetching build scripts. -# -# `ITK_USE_LOCAL_PYTHON`: Determine how to get Python framework for build. -# - If empty, Python frameworks will be fetched from python.org -# - If not empty, frameworks already on machine will be used without fetching. +# generate_build_environment.sh # creates default build/package.env +# edit build/package.env with desired build elements +# scripts/macpython-build-module-wheels.sh 3.7 3.9 # ######################################################################## From de4df916adbaeb92677f8f0331411dd1b9079a30 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 24 Nov 2025 10:36:31 -0600 Subject: [PATCH 16/45] ENH: Propogate env setting from files Use the files that were written to disk to consistently keep the various shell environments in sync. Add variables for distingishing paths that are inside containers and inside host environments to make tracking of settings more transparent. --- ...dockcross-manylinux-build-module-wheels.sh | 21 +++++-- scripts/dockcross-manylinux-build-wheels.sh | 26 ++++++--- ...-download-cache-and-build-module-wheels.sh | 33 ++++++++++- scripts/internal/manylinux-build-common.sh | 6 +- scripts/internal/manylinux-build-wheels.sh | 58 +++++++++++++------ scripts/macpython-build-module-wheels.sh | 6 ++ scripts/macpython-build-wheels.sh | 37 +++++++----- scripts/pyproject_configure.py | 27 ++++++--- scripts/windows_build_wheels.py | 6 +- 9 files changed, 164 insertions(+), 56 deletions(-) diff --git a/scripts/dockcross-manylinux-build-module-wheels.sh b/scripts/dockcross-manylinux-build-module-wheels.sh index c0a56589..47a2b76a 100755 --- a/scripts/dockcross-manylinux-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-build-module-wheels.sh @@ -25,7 +25,17 @@ if [ ! -f "${package_env_file}" ]; then fi source "${package_env_file}" -oci_exe=$(ociExe) +# Set container for requested version/arch/tag. +if [[ ${TARGET_ARCH} == x64 ]]; then + MANYLINUX_IMAGE_NAME=${MANYLINUX_IMAGE_NAME:="manylinux${MANYLINUX_VERSION}-${TARGET_ARCH}:${IMAGE_TAG}"} + CONTAINER_SOURCE="docker.io/dockcross/${MANYLINUX_IMAGE_NAME}" +elif [[ ${TARGET_ARCH} == aarch64 ]]; then + MANYLINUX_IMAGE_NAME=${MANYLINUX_IMAGE_NAME:="manylinux${MANYLINUX_VERSION}_${TARGET_ARCH}:${IMAGE_TAG}"} + CONTAINER_SOURCE="quay.io/pypa/${MANYLINUX_IMAGE_NAME}" +else + echo "Unknown target architecture ${TARGET_ARCH}" + exit 1; +fi if [[ -n ${ITK_MODULE_PREQ} ]]; then echo "Building module dependencies ${ITK_MODULE_PREQ}" @@ -58,14 +68,17 @@ if [[ "${TARGET_ARCH}" = "aarch64" ]]; then docker_prefix="sudo" fi - ${docker_prefix} $oci_exe run --privileged --rm tonistiigi/binfmt --install all + ${docker_prefix} $oci_exe run --env-file "${_ipp_dir}/build/package.env" \ + --privileged --rm tonistiigi/binfmt --install all # Build wheels DOCKER_ARGS+=" -v $(pwd):/work/ --rm" - ${docker_prefix} $oci_exe run $DOCKER_ARGS ${CONTAINER_SOURCE} "/ITKPythonPackage/scripts/internal/manylinux-aarch64-build-module-wheels.sh" "$@" + ${docker_prefix} $oci_exe run --env-file "${_ipp_dir}/build/package.env" \ + $DOCKER_ARGS ${CONTAINER_SOURCE} "/ITKPythonPackage/scripts/internal/manylinux-aarch64-build-module-wheels.sh" "$@" else # Generate dockcross scripts - $oci_exe run --rm ${CONTAINER_SOURCE} > /tmp/dockcross-manylinux-x64 + $oci_exe run --env-file "${_ipp_dir}/build/package.env" \ + --rm ${CONTAINER_SOURCE} > /tmp/dockcross-manylinux-x64 chmod u+x /tmp/dockcross-manylinux-x64 # Build wheels diff --git a/scripts/dockcross-manylinux-build-wheels.sh b/scripts/dockcross-manylinux-build-wheels.sh index b88907dc..4339fbce 100755 --- a/scripts/dockcross-manylinux-build-wheels.sh +++ b/scripts/dockcross-manylinux-build-wheels.sh @@ -29,11 +29,23 @@ $oci_exe run --env-file "${_ipp_dir}/build/package.env" \ --rm docker.io/dockcross/manylinux${MANYLINUX_VERSION}-x64:${IMAGE_TAG} > ${_local_dockercross_script} chmod u+x ${_local_dockercross_script} -# Build wheels -pushd ${_ipp_dir} -mkdir -p dist -DOCKER_ARGS="-v $(pwd)/dist:/work/dist/ --env-file ${package_env_file}" -${_local_dockercross_script} \ - -a "$DOCKER_ARGS" \ - ./scripts/internal/manylinux-build-wheels.sh "$@" +# Build wheels in dockcross environment +pushd ${_ipp_dir} # Must run _local_dockercross_script from the root of the directory with + # CMakeFile.txt to be processed by ./scripts/internal/manylinux-build-wheels.sh + + CONTAINER_WORK_DIR=/work + CONTAINER_PACKAGE_DIST=${CONTAINER_WORK_DIR}/dist + CONTAINER_PACKAGE_BUILD_DIR=${CONTAINER_WORK_DIR}/ITK-source + CONTAINER_ITK_SOURCE_DIR=${CONTAINER_PACKAGE_BUILD_DIR}/ITK + HOST_PACKAGE_DIST=${_ipp_dir}/dist + mkdir -p ${HOST_PACKAGE_DIST} + HOST_PACKAGE_BUILD_DIR=${_ipp_dir}/ITK-source + mkdir -p ${HOST_PACKAGE_BUILD_DIR} + + DOCKER_ARGS="-v ${_ipp_dir}/dist:${CONTAINER_WORK_DIR}/dist/ -v${ITK_SOURCE_DIR}:${CONTAINER_ITK_SOURCE_DIR} --env-file ${package_env_file}" + cmd=$(echo bash -x ${_local_dockercross_script} \ + -a \"$DOCKER_ARGS\" \ + ${CONTAINER_WORK_DIR}/scripts/internal/manylinux-build-wheels.sh "$@") + echo "RUNNING: $cmd" + eval $cmd popd diff --git a/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh b/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh index 9cc80108..adff33ff 100755 --- a/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh @@ -61,11 +61,40 @@ done echo "Fetching https://raw.githubusercontent.com/${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage/${ITKPYTHONPACKAGE_TAG}/scripts/dockcross-manylinux-download-cache.sh" curl -L https://raw.githubusercontent.com/${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage/${ITKPYTHONPACKAGE_TAG}/scripts/dockcross-manylinux-download-cache.sh -O chmod u+x dockcross-manylinux-download-cache.sh -./dockcross-manylinux-download-cache.sh $1 +_download_cmd=$(echo \ +ITK_GIT_TAG=${ITK_GIT_TAG} \ +ITKPYTHONPACKAGE_ORG=${ITKPYTHONPACKAGE_ORG} \ +ITKPYTHONPACKAGE_TAG=${ITKPYTHONPACKAGE_TAG} \ +MANYLINUX_VERSION=${MANYLINUX_VERSION} \ +TARGET_ARCH=${TARGET_ARCH} \ +${download_script_dir}/dockcross-manylinux-download-cache.sh $1 +) +echo "Running: ${_download_cmd}" +eval ${_download_cmd} + +#NOTE: in this scenerio, untarred_ipp_dir is extracted from tarball +# during ${download_script_dir}/dockcross-manylinux-download-cache.sh +untarred_ipp_dir=${download_script_dir}/ITKPythonPackage +package_env_file=${untarred_ipp_dir}/build/package.env +if [ ! -f "${package_env_file}" ]; then + source ${untarred_ipp_dir}/generate_build_environment.sh.sh +fi +source "${package_env_file}" + # ----------------------------------------------------------------------- # Build module wheels echo "Building module wheels" set -- "${FORWARD_ARGS[@]}"; # Restore initial argument list -./ITKPythonPackage/scripts/dockcross-manylinux-build-module-wheels.sh "$@" + +_bld_cmd=$(echo \ +NO_SUDO=${NO_SUDO} \ +LD_LIBRARY_PATH=${LD_LIBRARY_PATH} \ +IMAGE_TAG=${IMAGE_TAG} \ +ITK_MODULE_PREQ=${ITK_MODULE_PREQ} \ +ITK_MODULE_NO_CLEANUP=${ITK_MODULE_NO_CLEANUP} \ +${untarred_ipp_dir}/scripts/dockcross-manylinux-build-module-wheels.sh "$@" +) +echo "Running: ${_bld_cmd}" +eval ${_bld_cmd} diff --git a/scripts/internal/manylinux-build-common.sh b/scripts/internal/manylinux-build-common.sh index 8f257912..288b1921 100644 --- a/scripts/internal/manylinux-build-common.sh +++ b/scripts/internal/manylinux-build-common.sh @@ -3,6 +3,7 @@ set -e -x + script_dir=$(cd $(dirname $0) || exit 1; pwd) # Versions can be restricted by passing them in as arguments to the script @@ -46,6 +47,7 @@ case $(uname -m) in ARCH=x86 ;; x86_64) + ARCH=x64 if ! type doxygen > /dev/null 2>&1; then mkdir -p /work/tools pushd /work/tools > /dev/null 2>&1 @@ -58,7 +60,7 @@ case $(uname -m) in ARCH=aarch64 if ! type doxygen > /dev/null 2>&1; then mkdir -p /work/tools - pushd /work/tools > /dev/null 2>&1 + pushd /work/tools > /dev/null 2>&1 curl https://data.kitware.com/api/v1/file/62c4ed58bddec9d0c46f1388/download -o doxygen-1.8.16.linux.aarch64.bin.tar.gz tar -xvzf doxygen-1.8.16.linux.aarch64.bin.tar.gz popd > /dev/null 2>&1 @@ -76,7 +78,7 @@ if ! type ninja > /dev/null 2>&1; then git checkout release cmake -Bbuild-cmake -H. cmake --build build-cmake - cp build-cmake/ninja /usr/local/bin/ + sudo cp build-cmake/ninja /usr/local/bin/ popd fi diff --git a/scripts/internal/manylinux-build-wheels.sh b/scripts/internal/manylinux-build-wheels.sh index 89eeaa3d..aad476d9 100755 --- a/scripts/internal/manylinux-build-wheels.sh +++ b/scripts/internal/manylinux-build-wheels.sh @@ -34,17 +34,40 @@ script_dir=$(cd $(dirname $0) || exit 1; pwd) source "${script_dir}/manylinux-build-common.sh" # ----------------------------------------------------------------------- - +DOCKCROSS_MOUNTED_ITKPythonPackage_DIR=/work # <-- The location where ITKPythonPackage git checkout + # is mounted inside the dockcross container +CONTAINER_PACKAGE_ENV=${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/dist/container_package.env +# Load environmental variables +source ${CONTAINER_PACKAGE_ENV} +_CONTAINER_ITK_SOURCE_DIR=${ITK_SOURCE_DIR} # Build standalone project and populate archive cache -mkdir -p /work/ITK-source -pushd /work/ITK-source > /dev/null 2>&1 - cmake -DITKPythonPackage_BUILD_PYTHON:PATH=0 -G Ninja ../ +mkdir -p ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source +pushd ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source > /dev/null 2>&1 + if [ ! -d ${_CONTAINER_ITK_SOURCE_DIR} ]; then + git clone https://github.com/InsightSoftwareConsortium/ITK.git ${_CONTAINER_ITK_SOURCE_DIR} + fi + pushd ${_CONTAINER_ITK_SOURCE_DIR} > /dev/null 2>&1 + git checkout ${ITK_GIT_TAG} + popd > /dev/null 2>&1 + echo "CMAKE VERSION: $(cmake --version)" + cmd=$(echo cmake \ + -DITKPythonPackage_BUILD_PYTHON:PATH=0 \ + -DITK_SOURCE_DIR:PATH=${_CONTAINER_ITK_SOURCE_DIR} \ + -DITK_GIT_TAG:STRING=${ITK_GIT_TAG} \ + -DITK_PACKAGE_VERSION:STRING=${ITK_PACKAGE_VERSION} \ + -G Ninja \ + -S ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR} \ + -B ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source) + echo "RUNNING: $cmd" + eval $cmd ninja + echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" + echo "================================================================" popd > /dev/null 2>&1 -tbb_dir=/work/oneTBB-prefix/lib/cmake/TBB +tbb_dir=${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/oneTBB-prefix/lib/cmake/TBB # So auditwheel can find the libs sudo ldconfig -export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/work/oneTBB-prefix/lib:/usr/lib:/usr/lib64 +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/oneTBB-prefix/lib:/usr/lib:/usr/lib64 # Compile wheels re-using standalone project and archive cache for PYBIN in "${PYBINARIES[@]}"; do @@ -56,13 +79,11 @@ for PYBIN in "${PYBINARIES[@]}"; do echo "Python3_INCLUDE_DIR:${Python3_INCLUDE_DIR}" # Install dependencies - ${PYBIN}/pip install --upgrade -r /work/requirements-dev.txt + ${PYBIN}/pip install --upgrade -r ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/requirements-dev.txt build_type="Release" compile_flags="-O3 -DNDEBUG" - source_path=/work/ITK-source/ITK - build_path=/work/ITK-$(basename $(dirname ${PYBIN}))-manylinux${MANYLINUX_VERSION}_${ARCH} - PYPROJECT_CONFIGURE="${script_dir}/../pyproject_configure.py" + build_path=${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-$(basename $(dirname ${PYBIN}))-manylinux${MANYLINUX_VERSION}_${ARCH} # Clean up previous invocations # rm -rf ${build_path} @@ -75,9 +96,10 @@ for PYBIN in "${PYBINARIES[@]}"; do ( mkdir -p ${build_path} \ && cd ${build_path} \ + && echo "CMAKE VERSION: $(cmake --version)" \ && cmake \ -DCMAKE_BUILD_TYPE:STRING=${build_type} \ - -DITK_SOURCE_DIR:PATH=${source_path} \ + -DITK_SOURCE_DIR:PATH=${_CONTAINER_ITK_SOURCE_DIR} \ -DITK_BINARY_DIR:PATH=${build_path} \ -DBUILD_TESTING:BOOL=OFF \ -DPython3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ @@ -99,15 +121,17 @@ for PYBIN in "${PYBINARIES[@]}"; do -DModule_ITKTBB:BOOL=ON \ -DTBB_DIR:PATH=${tbb_dir} \ -G Ninja \ - ${source_path} \ + -S ${_CONTAINER_ITK_SOURCE_DIR} \ + -B ${build_path} \ && ninja \ || exit 1 ) wheel_names=$(cat ${script_dir}/../WHEEL_NAMES.txt) + PYPROJECT_CONFIGURE="${script_dir}/../pyproject_configure.py" for wheel_name in ${wheel_names}; do # Configure pyproject.toml - ${PYBIN}/python ${PYPROJECT_CONFIGURE} ${wheel_name} + ${PYBIN}/python ${PYPROJECT_CONFIGURE} --env-file ${CONTAINER_PACKAGE_ENV} ${wheel_name} # Generate wheel ${PYBIN}/python -m build \ --verbose \ @@ -115,7 +139,7 @@ for PYBIN in "${PYBINARIES[@]}"; do --outdir dist \ --no-isolation \ --skip-dependency-check \ - --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ + --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${_CONTAINER_ITK_SOURCE_DIR} \ --config-setting=cmake.define.ITK_BINARY_DIR:PATH=${build_path} \ --config-setting=cmake.define.ITKPythonPackage_ITK_BINARY_REUSE:BOOL=ON \ --config-setting=cmake.define.ITKPythonPackage_WHEEL_NAME:STRING=${wheel_name} \ @@ -139,11 +163,11 @@ sudo /opt/python/cp311-cp311/bin/pip3 install auditwheel wheel if test "${ARCH}" == "x64"; then # This step will fixup the wheel switching from 'linux' to 'manylinux' tag for whl in dist/itk_*linux_*.whl; do - /opt/python/cp311-cp311/bin/auditwheel repair --plat manylinux${MANYLINUX_VERSION}_x86_64 ${whl} -w /work/dist/ + /opt/python/cp311-cp311/bin/auditwheel repair --plat manylinux${MANYLINUX_VERSION}_x86_64 ${whl} -w ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/dist/ done else for whl in dist/itk_*$(uname -m).whl; do - /opt/python/cp311-cp311/bin/auditwheel repair ${whl} -w /work/dist/ + /opt/python/cp311-cp311/bin/auditwheel repair ${whl} -w ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/dist/ done fi @@ -167,7 +191,7 @@ rm dist/itk_*-linux_*.whl for PYBIN in "${PYBINARIES[@]}"; do ${PYBIN}/pip install --user numpy ${PYBIN}/pip install --upgrade pip - ${PYBIN}/pip install itk --user --no-cache-dir --no-index -f /work/dist + ${PYBIN}/pip install itk --user --no-cache-dir --no-index -f ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/dist (cd $HOME && ${PYBIN}/python -c 'from itk import ITKCommon;') (cd $HOME && ${PYBIN}/python -c 'import itk; image = itk.Image[itk.UC, 2].New()') (cd $HOME && ${PYBIN}/python -c 'import itkConfig; itkConfig.LazyLoading = False; import itk;') diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index d6a275bb..ef533f88 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -30,6 +30,12 @@ # (Optional) Build ITK module dependencies script_dir=$(cd $(dirname $0) || exit 1; pwd) +_ipp_dir=$(dirname ${script_dir}) +package_env_file=${_ipp_dir}/build/package.env +if [ ! -f "${package_env_file}" ]; then + ${_ipp_dir}/generate_build_environment.sh -o ${package_env_file} +fi +source "${package_env_file}" if [[ -n ${ITK_MODULE_PREQ} ]]; then source "${script_dir}/macpython-build-module-deps.sh" diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 43959556..fd2e1839 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -25,28 +25,35 @@ # * PYBINARIES # * PYTHON_VERSIONS # * NINJA_EXECUTABLE -# * SCRIPT_DIR +# * script_dir # * VENVS=() MACPYTHON_PY_PREFIX="" PYBINARIES="" -SCRIPT_DIR="" +script_dir="" script_dir=$(cd $(dirname $0) || exit 1; pwd) +_ipp_dir=$(dirname ${script_dir}) +package_env_file=${_ipp_dir}/build/package.env +if [ ! -f "${package_env_file}" ]; then + ${_ipp_dir}/generate_build_environment.sh -o ${package_env_file} +fi +source "${package_env_file}" + source "${script_dir}/macpython-build-common.sh" # ----------------------------------------------------------------------- # Remove previous virtualenv's -rm -rf ${SCRIPT_DIR}/../venvs +rm -rf ${script_dir}/../venvs # Create virtualenv's VENVS=() -mkdir -p ${SCRIPT_DIR}/../venvs +mkdir -p ${script_dir}/../venvs for PYBIN in "${PYBINARIES[@]}"; do if [[ $(basename $PYBIN) = "Current" ]]; then continue fi py_mm=$(basename ${PYBIN}) - VENV=${SCRIPT_DIR}/../venvs/${py_mm} + VENV=${script_dir}/../venvs/${py_mm} VIRTUALENV_EXECUTABLE="${PYBIN}/bin/python3 -m venv" ${VIRTUALENV_EXECUTABLE} ${VENV} VENVS+=(${VENV}) @@ -88,7 +95,7 @@ pushd ITK-source > /dev/null 2>&1 -DCMAKE_MAKE_PROGRAM:FILEPATH=${NINJA_EXECUTABLE} \ -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ - ${SCRIPT_DIR}/../ + ${script_dir}/../ ${NINJA_EXECUTABLE} -j$n_processors -l$n_processors popd > /dev/null 2>&1 @@ -102,20 +109,19 @@ for VENV in "${VENVS[@]}"; do echo "Python3_EXECUTABLE:${Python3_EXECUTABLE}" echo "Python3_INCLUDE_DIR:${Python3_INCLUDE_DIR}" - ${Python3_EXECUTABLE} -m pip install --upgrade -r ${SCRIPT_DIR}/../requirements-dev.txt + ${Python3_EXECUTABLE} -m pip install --upgrade -r ${script_dir}/../requirements-dev.txt if [[ $(arch) == "arm64" ]]; then plat_name="macosx-15.0-arm64" - build_path="${SCRIPT_DIR}/../ITK-${py_mm}-macosx_arm64" + build_path="${script_dir}/../ITK-${py_mm}-macosx_arm64" else plat_name="macosx-15.0-x86_64" - build_path="${SCRIPT_DIR}/../ITK-${py_mm}-macosx_x86_64" + build_path="${script_dir}/../ITK-${py_mm}-macosx_x86_64" fi if [[ ! -z "${MACOSX_DEPLOYMENT_TARGET}" ]]; then osx_target="${MACOSX_DEPLOYMENT_TARGET}" fi - source_path=${SCRIPT_DIR}/../ITK-source/ITK - PYPROJECT_CONFIGURE="${script_dir}/pyproject_configure.py" + source_path=${script_dir}/../ITK-source/ITK # Clean up previous invocations rm -rf ${build_path} @@ -156,10 +162,11 @@ for VENV in "${VENVS[@]}"; do || exit 1 ) - wheel_names=$(cat ${SCRIPT_DIR}/WHEEL_NAMES.txt) + PYPROJECT_CONFIGURE="${script_dir}/pyproject_configure.py" + wheel_names=$(cat ${script_dir}/WHEEL_NAMES.txt) for wheel_name in ${wheel_names}; do # Configure pyproject.toml - ${Python3_EXECUTABLE} ${PYPROJECT_CONFIGURE} ${wheel_name} + ${Python3_EXECUTABLE} ${PYPROJECT_CONFIGURE} --env-file ${package_env_file} ${wheel_name} # Generate wheel ${Python3_EXECUTABLE} -m build \ --verbose \ @@ -197,9 +204,9 @@ fi for VENV in "${VENVS[@]}"; do ${VENV}/bin/pip install numpy - ${VENV}/bin/pip install itk --no-cache-dir --no-index -f ${SCRIPT_DIR}/../dist + ${VENV}/bin/pip install itk --no-cache-dir --no-index -f ${script_dir}/../dist (cd $HOME && ${VENV}/bin/python -c 'import itk;') (cd $HOME && ${VENV}/bin/python -c 'import itk; image = itk.Image[itk.UC, 2].New()') (cd $HOME && ${VENV}/bin/python -c 'import itkConfig; itkConfig.LazyLoading = False; import itk;') - (cd $HOME && ${VENV}/bin/python ${SCRIPT_DIR}/../docs/code/test.py ) + (cd $HOME && ${VENV}/bin/python ${script_dir}/../docs/code/test.py ) done diff --git a/scripts/pyproject_configure.py b/scripts/pyproject_configure.py index 77c905ee..ad6e7a5c 100755 --- a/scripts/pyproject_configure.py +++ b/scripts/pyproject_configure.py @@ -8,7 +8,7 @@ Usage:: - pyproject_configure.py [-h] [--output-dir OUTPUT_DIR] wheel_name + pyproject_configure.py [-h] [--output-dir OUTPUT_DIR] [--env-file package.env] wheel_name positional arguments: wheel_name @@ -20,6 +20,7 @@ (default: /work) + Accepted values for `wheel_name` are ``itk`` and all values read from ``WHEEL_NAMES.txt``. """ @@ -31,11 +32,10 @@ from dotenv import dotenv_values ipp_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -package_file = os.path.join(ipp_dir, "build", "package.env") -package_env_config = dotenv_values(package_file) - sys.path.append(ipp_dir) +default_env_file = os.path.join(ipp_dir, "build", "package.env") + PARAMETER_OPTION_DEFAULTS = { "indent": 0, "newline_if_set": False, @@ -125,7 +125,7 @@ def from_group_to_wheel(group): return "itk-%s" % group.lower() -def update_wheel_pyproject_toml_parameters(): +def update_wheel_pyproject_toml_parameters(package_env_config: dict): global PYPROJECT_PY_PARAMETERS for wheel_name in get_wheel_names(): params = dict(ITK_PYPROJECT_PY_PARAMETERS) @@ -187,6 +187,9 @@ def update_wheel_pyproject_toml_parameters(): # cmake_args params["PYPROJECT_CMAKE_ARGS"] = list_to_str( [ + f"-DITK_SOURCE_DIR={package_env_config['ITK_SOURCE_DIR']}", + f"-DITK_GIT_TAG:STRING={package_env_config['ITK_GIT_TAG']}", + f"-DITK_PACKAGE_VERSION:STRING={package_env_config['ITK_PACKAGE_VERSION']}", "-DITK_WRAP_unsigned_short:BOOL=ON", "-DITK_WRAP_double:BOOL=ON", "-DITK_WRAP_complex_double:BOOL=ON", @@ -295,7 +298,6 @@ def get_wheel_dependencies(): PYPROJECT_PY_PARAMETERS = {"itk": ITK_PYPROJECT_PY_PARAMETERS} -update_wheel_pyproject_toml_parameters() def main(): @@ -313,14 +315,25 @@ def main(): help="Output directory for configured 'pyproject.toml'", default=default_output_dir, ) + parser.add_argument( + "--env-file", + type=str, + help=".env file with parameters used to configured 'pyproject.toml'", + default=default_env_file, + ) args = parser.parse_args() - template = os.path.join(SCRIPT_DIR, "pyproject.toml.in") + print(f"Reading configuration settings from {args.env_file}") + package_env_config = dotenv_values(args.env_file) + update_wheel_pyproject_toml_parameters(package_env_config) + if args.wheel_name not in PYPROJECT_PY_PARAMETERS.keys(): print("Unknown wheel name '%s'" % args.wheel_name) sys.exit(1) # Configure 'pyproject.toml' output_file = os.path.join(args.output_dir, "pyproject.toml") + print(f"Generating: {output_file}") + template = os.path.join(SCRIPT_DIR, "pyproject.toml.in") configure(template, PYPROJECT_PY_PARAMETERS[args.wheel_name], output_file) # Configure or remove 'itk/__init__.py' diff --git a/scripts/windows_build_wheels.py b/scripts/windows_build_wheels.py index afcc2deb..081c9e4a 100644 --- a/scripts/windows_build_wheels.py +++ b/scripts/windows_build_wheels.py @@ -136,6 +136,7 @@ def build_wheel( source_path = "%s/ITK" % ITK_SOURCE build_path = "%s/ITK-win_%s" % (ROOT_DIR, python_version) pyproject_configure = os.path.join(SCRIPT_DIR, "pyproject_configure.py") + env_file=os.path.join(os.path.dirname(SCRIPT_DIR), "build", "package.env") # Clean up previous invocations if cleanup and os.path.exists(build_path): @@ -148,7 +149,7 @@ def build_wheel( print("#") # Configure pyproject.toml - check_call([python_executable, pyproject_configure, "itk"]) + check_call([python_executable, pyproject_configure, "--env-file", env_file ,"itk"]) # Generate wheel check_call( @@ -208,9 +209,10 @@ def build_wheel( wheel_name.strip() for wheel_name in content.readlines() ] + env_file=os.path.join(os.path.dirname(SCRIPT_DIR), "build", "package.env") for wheel_name in wheel_names: # Configure pyproject.toml - check_call([python_executable, pyproject_configure, wheel_name]) + check_call([python_executable, pyproject_configure, "--env-file", env_file ,wheel_name]) # Generate wheel check_call( From 4793c7f680291eeee94966d88cac90fd225a72b1 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 10:02:39 -0600 Subject: [PATCH 17/45] ENH: dockcross-manylinux-download-cache-and-build-module-wheels.sh pathing Fix error in pathing of sourced files. --- ...anylinux-download-cache-and-build-module-wheels.sh | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh b/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh index adff33ff..59610378 100755 --- a/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-download-cache-and-build-module-wheels.sh @@ -16,14 +16,7 @@ # ENVIRONMENT VARIABLES: ITKPYTHONPACKAGE_ORG, ITKPYTHONPACKAGE_TAG ######################################################################## -script_dir=$(cd $(dirname $0) || exit 1; pwd) -_ipp_dir=$(dirname ${script_dir}) -package_env_file=${_ipp_dir}/build/package.env -if [ ! -f "${package_env_file}" ]; then - ${_ipp_dir}/generate_build_environment.sh -o ${package_env_file} -fi -source "${package_env_file}" - +download_script_dir=$(cd $(dirname $0) || exit 1; pwd) # ----------------------------------------------------------------------- # Script argument parsing # @@ -77,7 +70,7 @@ eval ${_download_cmd} untarred_ipp_dir=${download_script_dir}/ITKPythonPackage package_env_file=${untarred_ipp_dir}/build/package.env if [ ! -f "${package_env_file}" ]; then - source ${untarred_ipp_dir}/generate_build_environment.sh.sh + source ${untarred_ipp_dir}/generate_build_environment.sh -o ${package_env_file} fi source "${package_env_file}" From 56419af11b6957e887bb937c53c2c0401e6a4364 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 24 Nov 2025 10:46:01 -0600 Subject: [PATCH 18/45] ENH: Use capital OCI_EXE consistently instead of oci_exe alias dockcross downloaded envrionment, and scripts/oci_exe.sh both use OCI_EXE as the variable name to represent the container running executable. --- generate_build_environment.sh | 2 +- scripts/dockcross-manylinux-build-module-wheels.sh | 6 +++--- scripts/dockcross-manylinux-build-wheels.sh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/generate_build_environment.sh b/generate_build_environment.sh index c77e5f4c..d899e67a 100755 --- a/generate_build_environment.sh +++ b/generate_build_environment.sh @@ -301,7 +301,7 @@ if [[ "$(uname)" == "Linux" ]]; then cat >> ${BUILD_ENV_REPORT} << DEFAULT_LINUX_ENV_SETTINGS # Which container to use for generating cross compiled packages -oci_exe=${oci_exe:=$(ociExe)} +OCI_EXE=${OCI_EXE:=$(ociExe)} # - "MANYLINUX_VERSION": Specialized manylinux image to use for building. Default is _2_28. # Examples: "_2_28", "2014" diff --git a/scripts/dockcross-manylinux-build-module-wheels.sh b/scripts/dockcross-manylinux-build-module-wheels.sh index 47a2b76a..433524a7 100755 --- a/scripts/dockcross-manylinux-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-build-module-wheels.sh @@ -68,16 +68,16 @@ if [[ "${TARGET_ARCH}" = "aarch64" ]]; then docker_prefix="sudo" fi - ${docker_prefix} $oci_exe run --env-file "${_ipp_dir}/build/package.env" \ + ${docker_prefix} $OCI_EXE run --env-file "${_ipp_dir}/build/package.env" \ --privileged --rm tonistiigi/binfmt --install all # Build wheels DOCKER_ARGS+=" -v $(pwd):/work/ --rm" - ${docker_prefix} $oci_exe run --env-file "${_ipp_dir}/build/package.env" \ + ${docker_prefix} $OCI_EXE run --env-file "${_ipp_dir}/build/package.env" \ $DOCKER_ARGS ${CONTAINER_SOURCE} "/ITKPythonPackage/scripts/internal/manylinux-aarch64-build-module-wheels.sh" "$@" else # Generate dockcross scripts - $oci_exe run --env-file "${_ipp_dir}/build/package.env" \ + $OCI_EXE run --env-file "${_ipp_dir}/build/package.env" \ --rm ${CONTAINER_SOURCE} > /tmp/dockcross-manylinux-x64 chmod u+x /tmp/dockcross-manylinux-x64 diff --git a/scripts/dockcross-manylinux-build-wheels.sh b/scripts/dockcross-manylinux-build-wheels.sh index 4339fbce..1148593d 100755 --- a/scripts/dockcross-manylinux-build-wheels.sh +++ b/scripts/dockcross-manylinux-build-wheels.sh @@ -25,7 +25,7 @@ source "${package_env_file}" _local_dockercross_script=${_ipp_dir}/build/runner_dockcross-${MANYLINUX_VERSION}-x64_${IMAGE_TAG}.sh # Generate dockcross scripts -$oci_exe run --env-file "${_ipp_dir}/build/package.env" \ +$OCI_EXE run --env-file "${_ipp_dir}/build/package.env" \ --rm docker.io/dockcross/manylinux${MANYLINUX_VERSION}-x64:${IMAGE_TAG} > ${_local_dockercross_script} chmod u+x ${_local_dockercross_script} From 8db55110a6220a0117e52c7dd2fb902d6db65f95 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Mon, 24 Nov 2025 12:26:07 -0600 Subject: [PATCH 19/45] STYLE: Require macpython-build-common.sh to be sole setter of vars --- scripts/macpython-build-module-wheels.sh | 5 ----- scripts/macpython-build-wheels.sh | 7 +------ 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index ef533f88..a19d7209 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -53,11 +53,6 @@ fi # * SCRIPT_DIR # * SKBUILD_DIR # * VENVS=() - -MACPYTHON_PY_PREFIX="" -SCRIPT_DIR="" -VENVS=() - source "${script_dir}/macpython-build-common.sh" # ----------------------------------------------------------------------- diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index fd2e1839..412233ea 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -17,7 +17,7 @@ # # ----------------------------------------------------------------------- -# These variables are set in common script: +# These variables are set in macpython-build-common.sh script: # # * CMAKE_EXECUTABLE # * CMAKE_OPTIONS @@ -27,11 +27,6 @@ # * NINJA_EXECUTABLE # * script_dir # * VENVS=() - -MACPYTHON_PY_PREFIX="" -PYBINARIES="" -script_dir="" - script_dir=$(cd $(dirname $0) || exit 1; pwd) _ipp_dir=$(dirname ${script_dir}) package_env_file=${_ipp_dir}/build/package.env From 41770a3c4850b659475c215c364fb81cc0c5fa72 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Mon, 24 Nov 2025 12:45:07 -0600 Subject: [PATCH 20/45] ENH: If CXX or CC are set, respect that compiler choice If CXX or CC environmental variables are set, use those values for building resources. --- scripts/internal/manylinux-build-common.sh | 10 ++++++++++ scripts/internal/manylinux-build-module-wheels.sh | 1 + scripts/internal/manylinux-build-wheels.sh | 2 ++ scripts/macpython-build-common.sh | 10 ++++++++++ scripts/macpython-build-module-wheels.sh | 3 +-- scripts/macpython-build-wheels.sh | 2 ++ 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/scripts/internal/manylinux-build-common.sh b/scripts/internal/manylinux-build-common.sh index 288b1921..7b98b106 100644 --- a/scripts/internal/manylinux-build-common.sh +++ b/scripts/internal/manylinux-build-common.sh @@ -84,4 +84,14 @@ fi MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} +# ----------------------------------------------------------------------- +# Set cmake flags for compiler if CC or CXX are specified +CMAKE_COMPILER_ARGS="" +if [ ! -z "${CXX}" ]; then + CMAKE_COMPILER_ARGS="-DCMAKE_CXX_COMPILER:STRING=${CXX}" +fi +if [ ! -z "${CC}" ]; then + CMAKE_COMPILER_ARGS="${CMAKE_COMPILER_ARGS} -DCMAKE_C_COMPILER:STRING=${CC}" +fi + echo "Building wheels for $ARCH using manylinux${MANYLINUX_VERSION}" diff --git a/scripts/internal/manylinux-build-module-wheels.sh b/scripts/internal/manylinux-build-module-wheels.sh index 2a7940c7..8fce6e5f 100755 --- a/scripts/internal/manylinux-build-module-wheels.sh +++ b/scripts/internal/manylinux-build-module-wheels.sh @@ -124,6 +124,7 @@ for PYBIN in "${PYBINARIES[@]}"; do --config-setting=cmake.define.Python3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ ${CMAKE_OPTIONS//'-D'/'--config-setting=cmake.define.'} \ + ${CMAKE_COMPILER_ARGS//'-D'/'--config-setting=cmake.define.'} \ || exit 1 done diff --git a/scripts/internal/manylinux-build-wheels.sh b/scripts/internal/manylinux-build-wheels.sh index aad476d9..42a4f486 100755 --- a/scripts/internal/manylinux-build-wheels.sh +++ b/scripts/internal/manylinux-build-wheels.sh @@ -55,6 +55,7 @@ pushd ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source > /dev/null 2>&1 -DITK_SOURCE_DIR:PATH=${_CONTAINER_ITK_SOURCE_DIR} \ -DITK_GIT_TAG:STRING=${ITK_GIT_TAG} \ -DITK_PACKAGE_VERSION:STRING=${ITK_PACKAGE_VERSION} \ + ${CMAKE_COMPILER_ARGS} \ -G Ninja \ -S ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR} \ -B ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source) @@ -107,6 +108,7 @@ for PYBIN in "${PYBINARIES[@]}"; do -DCMAKE_CXX_COMPILER_TARGET:STRING=$(uname -m)-linux-gnu \ -DCMAKE_CXX_FLAGS:STRING="$compile_flags" \ -DCMAKE_C_FLAGS:STRING="$compile_flags" \ + ${CMAKE_COMPILER_ARGS} \ -DCMAKE_BUILD_TYPE:STRING="${build_type}" \ -DWRAP_ITK_INSTALL_COMPONENT_IDENTIFIER:STRING=PythonWheel \ -DWRAP_ITK_INSTALL_COMPONENT_PER_MODULE:BOOL=ON \ diff --git a/scripts/macpython-build-common.sh b/scripts/macpython-build-common.sh index 60fbbcce..77c373ab 100644 --- a/scripts/macpython-build-common.sh +++ b/scripts/macpython-build-common.sh @@ -71,6 +71,16 @@ for PYBIN in "${PYBINARIES[@]}"; do VENVS+=(${_VENV_DIR}) done +# ----------------------------------------------------------------------- +# Set cmake flags for compiler if CC or CXX are specified +CMAKE_COMPILER_ARGS="" +if [ ! -z "${CXX}" ]; then + CMAKE_COMPILER_ARGS="-DCMAKE_CXX_COMPILER:STRING=${CXX}" +fi +if [ ! -z "${CC}" ]; then + CMAKE_COMPILER_ARGS="${CMAKE_COMPILER_ARGS} -DCMAKE_C_COMPILER:STRING=${CC}" +fi + # ----------------------------------------------------------------------- # Ensure that requirements are met brew update diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index a19d7209..9dfdc20e 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -111,14 +111,13 @@ for VENV in "${VENVS[@]}"; do --config-setting=cmake.define.WRAP_ITK_INSTALL_COMPONENT_IDENTIFIER:STRING=PythonWheel \ --config-setting=cmake.define.CMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ --config-setting=cmake.define.CMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ - --config-setting=cmake.define.CMAKE_CXX_COMPILER:STRING=${CXX} \ - --config-setting=cmake.define.CMAKE_C_COMPILER:STRING=${CC} \ --config-setting=cmake.define.PY_SITE_PACKAGES_PATH:PATH="." \ --config-setting=wheel.py-api=$wheel_py_api \ --config-setting=cmake.define.BUILD_TESTING:BOOL=OFF \ --config-setting=cmake.define.Python3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ ${CMAKE_OPTIONS//'-D'/'--config-setting=cmake.define.'} \ + ${CMAKE_COMPILER_ARGS//'-D'/'--config-setting=cmake.define.'} \ || exit 1 done diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 412233ea..bd4746a3 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -27,6 +27,7 @@ # * NINJA_EXECUTABLE # * script_dir # * VENVS=() +# * CMAKE_COMPILE_ARGS script_dir=$(cd $(dirname $0) || exit 1; pwd) _ipp_dir=$(dirname ${script_dir}) package_env_file=${_ipp_dir}/build/package.env @@ -90,6 +91,7 @@ pushd ITK-source > /dev/null 2>&1 -DCMAKE_MAKE_PROGRAM:FILEPATH=${NINJA_EXECUTABLE} \ -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ + ${CMAKE_COMPILER_ARGS} \ ${script_dir}/../ ${NINJA_EXECUTABLE} -j$n_processors -l$n_processors popd > /dev/null 2>&1 From c65bb942f0147f1829504102176df5a95c69449b Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Mon, 24 Nov 2025 13:00:39 -0600 Subject: [PATCH 21/45] ENH: Respect environment compiler and repo settings If the environmental variables are set, respect them: CXX CC ITK_GIT_TAG ITK_SOURCE_DIR --- CMakeLists.txt | 62 ++++++++++++++++------ scripts/internal/manylinux-build-wheels.sh | 2 + scripts/macpython-build-wheels.sh | 4 +- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 76c37072..b9810b02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,12 +30,6 @@ if(ITKPythonPackage_SUPERBUILD) # Avoid "Manually-specified variables were not used by the project" warnings. ipp_unused_vars(${PYTHON_VERSION_STRING} ${SKBUILD}) - set(ep_common_cmake_cache_args ) - if(NOT CMAKE_CONFIGURATION_TYPES) - list(APPEND ep_common_cmake_cache_args - -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - ) - endif() set(ep_download_extract_timestamp_arg ) if(CMAKE_VERSION VERSION_EQUAL "3.24" OR CMAKE_VERSION VERSION_GREATER "3.24") # See https://cmake.org/cmake/help/latest/policy/CMP0135.html @@ -55,24 +49,52 @@ if(ITKPythonPackage_SUPERBUILD) option(ITKPythonPackage_BUILD_PYTHON "Build ITK python module" ON) mark_as_advanced(ITKPythonPackage_BUILD_PYTHON) + set(ep_common_cmake_cache_args ) + if(NOT CMAKE_CONFIGURATION_TYPES) + if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release") + endif() + list(APPEND ep_common_cmake_cache_args + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + ) + endif() + if(CMAKE_OSX_DEPLOYMENT_TARGET) list(APPEND ep_common_cmake_cache_args - -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET}) + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} + ) endif() if(CMAKE_OSX_ARCHITECTURES) list(APPEND ep_common_cmake_cache_args - -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES}) + -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES} + ) endif() if(CMAKE_MAKE_PROGRAM) list(APPEND ep_common_cmake_cache_args - -DCMAKE_MAKE_PROGRAM:FILEPATH=${CMAKE_MAKE_PROGRAM}) + -DCMAKE_MAKE_PROGRAM:FILEPATH=${CMAKE_MAKE_PROGRAM} + ) endif() - list(APPEND ep_common_cmake_cache_args + + if( CMAKE_CXX_COMPILER ) + list(APPEND ep_common_cmake_cache_args -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER} + ) + elseif( ENV{CXX} ) + list(APPEND ep_common_cmake_cache_args + -DCMAKE_CXX_COMPILER:PATH=$ENV{CXX} + ) + endif() + + if( CMAKE_C_COMPILER ) + list(APPEND ep_common_cmake_cache_args -DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER} - -DCMAKE_BUILD_TYPE:STRING=Release - ) + ) + elseif( ENV{CC} ) + list(APPEND ep_common_cmake_cache_args + -DCMAKE_C_COMPILER:PATH=$ENV{CC} + ) + endif() #----------------------------------------------------------------------------- # compile with multiple processors @@ -92,6 +114,10 @@ if(ITKPythonPackage_SUPERBUILD) message(STATUS "SuperBuild -") message(STATUS "SuperBuild - ITK-source-download") + if( NOT ITK_SOURCE_DIR AND ENV{ITK_SOURCE_DIR}) + set(ITK_SOURCE_DIR "$ENV{ITK_SOURCE_DIR}") + endif() + # Sanity checks if(DEFINED ITK_SOURCE_DIR AND NOT EXISTS ${ITK_SOURCE_DIR}) message(FATAL_ERROR "Variable is defined but corresponds to nonexistent directory:\nITK_SOURCE_DIR=${ITK_SOURCE_DIR}") @@ -143,13 +169,15 @@ if(ITKPythonPackage_SUPERBUILD) set(tbb_depends oneTBB) endif() - set(ITK_REPOSITORY "https://github.com/InsightSoftwareConsortium/ITK.git") - - # main branch, 2025-09-22 - set(ITK_GIT_TAG "0f93d6c875ab1a053ccb1a27f9f55b8aa2c4c20b") - if(NOT DEFINED ITK_SOURCE_DIR) + set(ITK_REPOSITORY "https://github.com/InsightSoftwareConsortium/ITK.git") + if ( ENV{ITK_GIT_TAG} ) + set(ITK_GIT_TAG "$ENV{ITK_GIT_TAG}") + elseif(NOT ITK_GIT_TAG) + # main branch, 2025-09-22 + set(ITK_GIT_TAG "0f93d6c875ab1a053ccb1a27f9f55b8aa2c4c20b") + endif() set(ITK_SOURCE_DIR ${CMAKE_BINARY_DIR}/ITK) ExternalProject_add(ITK-source-download diff --git a/scripts/internal/manylinux-build-wheels.sh b/scripts/internal/manylinux-build-wheels.sh index 42a4f486..aeddc643 100755 --- a/scripts/internal/manylinux-build-wheels.sh +++ b/scripts/internal/manylinux-build-wheels.sh @@ -149,6 +149,8 @@ for PYBIN in "${PYBINARIES[@]}"; do --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ --config-setting=cmake.define.CMAKE_CXX_FLAGS:STRING="${compile_flags}" \ --config-setting=cmake.define.CMAKE_C_FLAGS:STRING="${compile_flags}" \ + ${CMAKE_OPTIONS//'-D'/'--config-setting=cmake.define.'} \ + ${CMAKE_COMPILER_ARGS//'-D'/'--config-setting=cmake.define.'} \ . \ || exit 1 done diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index bd4746a3..03d7651c 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -138,6 +138,7 @@ for VENV in "${VENVS[@]}"; do -DBUILD_TESTING:BOOL=OFF \ -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ + ${CMAKE_COMPILER_ARGS} \ -DITK_WRAP_unsigned_short:BOOL=ON \ -DITK_WRAP_double:BOOL=ON \ -DITK_WRAP_complex_double:BOOL=ON \ @@ -180,8 +181,9 @@ for VENV in "${VENVS[@]}"; do --config-setting=cmake.define.ITKPythonPackage_WHEEL_NAME:STRING=${wheel_name} \ --config-setting=cmake.define.Python3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} \ --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ + ${CMAKE_OPTIONS//'-D'/'--config-setting=cmake.define.'} \ + ${CMAKE_COMPILER_ARGS//'-D'/'--config-setting=cmake.define.'} \ . \ - ${CMAKE_OPTIONS} \ || exit 1 done From a7e4355dcfa3aa4cb9186b2fd8d1478a4f8a5e31 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Mon, 24 Nov 2025 14:41:21 -0600 Subject: [PATCH 22/45] ENH: Remove unsued code DELOCATE_PATCH --- scripts/macpython-build-wheels.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 03d7651c..1aa5158d 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -61,7 +61,6 @@ ${Python3_EXECUTABLE} -m pip install --upgrade pip ${Python3_EXECUTABLE} -m pip install --no-cache-dir delocate DELOCATE_LISTDEPS=${VENV}/bin/delocate-listdeps DELOCATE_WHEEL=${VENV}/bin/delocate-wheel -DELOCATE_PATCH=${VENV}/bin/delocate-patch build_type="Release" From c035617d9f4208a2f8f1f694771539e95a8c591d Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Mon, 24 Nov 2025 14:46:54 -0600 Subject: [PATCH 23/45] ENH: Use standard env variable MACOSX_DEPLOYMENT_TARGET osx_target was an alias that was performing the same functionality as the standard MACOSX_DEPLOYMENT_TARGET --- scripts/macpython-build-wheels.sh | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 1aa5158d..d6be5196 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -63,19 +63,16 @@ DELOCATE_LISTDEPS=${VENV}/bin/delocate-listdeps DELOCATE_WHEEL=${VENV}/bin/delocate-wheel build_type="Release" +MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:="15.0"} if [[ $(arch) == "arm64" ]]; then - osx_target="15.0" osx_arch="arm64" use_tbb="OFF" else - osx_target="15.0" osx_arch="x86_64" use_tbb="OFF" fi -export MACOSX_DEPLOYMENT_TARGET=${osx_target} - # Build standalone project and populate archive cache tbb_dir=$PWD/oneTBB-prefix/lib/cmake/TBB n_processors=$(sysctl -n hw.ncpu) @@ -88,7 +85,7 @@ pushd ITK-source > /dev/null 2>&1 -G Ninja \ -DCMAKE_BUILD_TYPE:STRING=${build_type} \ -DCMAKE_MAKE_PROGRAM:FILEPATH=${NINJA_EXECUTABLE} \ - -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ ${CMAKE_COMPILER_ARGS} \ ${script_dir}/../ @@ -114,9 +111,6 @@ for VENV in "${VENVS[@]}"; do plat_name="macosx-15.0-x86_64" build_path="${script_dir}/../ITK-${py_mm}-macosx_x86_64" fi - if [[ ! -z "${MACOSX_DEPLOYMENT_TARGET}" ]]; then - osx_target="${MACOSX_DEPLOYMENT_TARGET}" - fi source_path=${script_dir}/../ITK-source/ITK # Clean up previous invocations @@ -135,7 +129,7 @@ for VENV in "${VENVS[@]}"; do -DITK_SOURCE_DIR:PATH=${source_path} \ -DITK_BINARY_DIR:PATH=${build_path} \ -DBUILD_TESTING:BOOL=OFF \ - -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ ${CMAKE_COMPILER_ARGS} \ -DITK_WRAP_unsigned_short:BOOL=ON \ @@ -173,7 +167,7 @@ for VENV in "${VENVS[@]}"; do --skip-dependency-check \ --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ --config-setting=cmake.define.ITK_BINARY_DIR:PATH=${build_path} \ - --config-setting=cmake.define.CMAKE_OSX_DEPLOYMENT_TARGET:STRING=${osx_target} \ + --config-setting=cmake.define.CMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ --config-setting=cmake.define.CMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ --config-setting=cmake.define.ITKPythonPackage_USE_TBB:BOOL=${use_tbb} \ --config-setting=cmake.define.ITKPythonPackage_ITK_BINARY_REUSE:BOOL=ON \ From 9562070e189b84496687eb58242ca9f551525337 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 05:15:28 -0600 Subject: [PATCH 24/45] ENH: Currently macos does not implement use of tbb tbb is currently disabled consistently in macos builds of python packages. --- scripts/macpython-build-module-wheels.sh | 9 ++++++++- scripts/macpython-build-wheels.sh | 12 ++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/scripts/macpython-build-module-wheels.sh b/scripts/macpython-build-module-wheels.sh index 9dfdc20e..b284fb24 100755 --- a/scripts/macpython-build-module-wheels.sh +++ b/scripts/macpython-build-module-wheels.sh @@ -62,7 +62,14 @@ dot_clean ${VENV} ${Python3_EXECUTABLE} -m pip install --no-cache-dir delocate DELOCATE_LISTDEPS=${VENV}/bin/delocate-listdeps DELOCATE_WHEEL=${VENV}/bin/delocate-wheel -export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${script_dir}/../oneTBB-prefix/lib + +use_tbb="OFF" +if [[ "${use_tbb}" -eq "ON" ]]; then + tbb_dir=$PWD/oneTBB-prefix/lib/cmake/TBB + export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${_ipp_dir}/oneTBB-prefix/lib +else + tbb_dir="NOT-FOUND" +fi _module_dir="$(pwd -P)" diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index d6be5196..b2e5e127 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -67,17 +67,21 @@ MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:="15.0"} if [[ $(arch) == "arm64" ]]; then osx_arch="arm64" - use_tbb="OFF" else osx_arch="x86_64" - use_tbb="OFF" fi # Build standalone project and populate archive cache -tbb_dir=$PWD/oneTBB-prefix/lib/cmake/TBB n_processors=$(sysctl -n hw.ncpu) # So delocate can find the libs -export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:$PWD/oneTBB-prefix/lib +use_tbb="OFF" +if [[ "${use_tbb}" -eq "ON" ]]; then + tbb_dir=$PWD/oneTBB-prefix/lib/cmake/TBB + export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:${_ipp_dir}/oneTBB-prefix/lib +else + tbb_dir="NOT-FOUND" +fi + mkdir -p ITK-source pushd ITK-source > /dev/null 2>&1 ${CMAKE_EXECUTABLE} -DITKPythonPackage_BUILD_PYTHON:PATH=0 \ From cd8450abb47ee87d5b19051e4dfbfcd69a8e9681 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Mon, 24 Nov 2025 19:51:11 -0600 Subject: [PATCH 25/45] ENH: Update pixi environment generation. --- .gitattributes | 2 + .gitignore | 3 + pixi.lock | 3591 ++++++++++++++++++++++++++++++++++++++++++++++++ pixi.toml | 29 + 4 files changed, 3625 insertions(+) create mode 100644 .gitattributes create mode 100644 pixi.lock create mode 100644 pixi.toml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..887a2c18 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true diff --git a/.gitignore b/.gitignore index cffba1ed..ef56f31c 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,6 @@ docs/_build # IDE junk .idea/* *.swp +# pixi environments +.pixi/* +!.pixi/config.toml diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 00000000..d7867af4 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,3591 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45-default_h4852527_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.10.0-h2b85faf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.2.0-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-13.4.0-h54dc52d_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.10.0-h1a2810e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/doxygen-1.13.2-h8e693c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.4.0-h81444f0_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.4.0-h69c5793_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.4.0-h0a5b801_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.4.0-h7467c50_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.4.0-haf17267_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.4.0-h494ab63_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.4.0-hba01cd7_107.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.4.0-h14bf0c3_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.4.0-hba01cd7_107.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.10.0-h6561dab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-4.2.0-hc9d863e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-13.4.0-h9b409da_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-1.10.0-heb6c788_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/doxygen-1.13.2-h5e0f5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-13.4.0-h6911c08_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-13.4.0-h69010b7_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-13.4.0-hbf9eca1_14.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-13.4.0-hb5ee532_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-13.4.0-hf6d83cf_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-13.4.0-he64a8ad_14.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-2_haddc8a3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-2_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-13.4.0-hd10b1b9_107.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h87db57e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-2_h88aeb00_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-13.4.0-h8a98f30_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.0-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-13.4.0-hd10b1b9_107.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.13.2-hdc560ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.3.5-py314haac167e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.6-h86ecc28_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda + osx-64: + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.10.0-h09a7c41_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1021.4-ha66f10e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1021.4-h508880d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_hc369343_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h1323312_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-18.1.8-h6a44ed1_25.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-18.1.8-h7e5c614_25.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.8-default_h1c12a56_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-18.1.8-h4b7810f_25.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-18.1.8-h7e5c614_25.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cmake-4.2.0-h29fc008_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-18.1.8-he914875_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-18.1.8-h138dee1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.10.0-h20888b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/doxygen-1.13.2-h27064b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-954.16-h4e51db5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-954.16-h28b3ac7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-2_he492b99_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-2_h9b27e0a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_hc369343_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-18.1.8-h7c275be_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h306097a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-h336fb69_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-2_h859234e_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_hc369343_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-h0ad03eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h23bb396_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.6-h472b3d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-default_hc369343_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_hc369343_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hf08249b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.0-hf88997e_102_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1300.6.5-h390ca13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.10.0-hdf49b6b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1021.4-hb4fb6a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1021.4-h12580ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-18-18.1.8-default_h73dfc95_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-18.1.8-default_hf9bcbb7_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-18.1.8-h2ae9ea5_25.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-18.1.8-h07b0088_25.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-18.1.8-default_h36137df_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-18.1.8-h555f467_25.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-18.1.8-h07b0088_25.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmake-4.2.0-h54ad630_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-18.1.8-h855ad52_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-18.1.8-he32a8d3_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-1.10.0-hba80287_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/doxygen-1.13.2-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-954.16-h4c6efb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-954.16-h9d5fcb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-2_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-2_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp18.1-18.1.8-default_h73dfc95_15.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-18.1.8-h6dc3340_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-2_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.8-default_h3f38c9c_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.6-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18-18.1.8-default_h3f38c9c_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18.1.8-default_h3f38c9c_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314h5b5928d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.2.0-hdcbee5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.10.0-h1c1089f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/doxygen-1.13.2-hbf3f430_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-2_hf2e6a31_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-2_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-2_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h692994f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h5d26750_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.6-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.0-h4b44e0e_102_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_32.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45-default_h4852527_104.conda + sha256: 1625ea421e0f44dbdde01e3e7d2c4958bea6c55731e6ac6954ba912d339982c2 + md5: d351e4894d6c4d9d8775bf169a97089d + depends: + - binutils_impl_linux-64 >=2.45,<2.46.0a0 + license: GPL-3.0-only + size: 35316 + timestamp: 1764007880473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45-default_hf1166c9_104.conda + sha256: 9bc583e5f93353723d7889ec18b9bca2c1cecf6fec14ea27ae5f758a28258cf9 + md5: c8a3dbfe30387152a796e2d1d4196131 + depends: + - binutils_impl_linux-aarch64 >=2.45,<2.46.0a0 + license: GPL-3.0-only + size: 35396 + timestamp: 1764007964053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_104.conda + sha256: 054a77ccab631071a803737ea8e5d04b5b18e57db5b0826a04495bd3fdf39a7c + md5: a7a67bf132a4a2dea92a7cb498cdc5b1 + depends: + - ld_impl_linux-64 2.45 default_hbd61a6d_104 + - sysroot_linux-64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + size: 3747046 + timestamp: 1764007847963 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45-default_h5f4c503_104.conda + sha256: b7694c53943941a5234406b77b168e28d92227f8e69c697edda3faf436dd26c1 + md5: 8107322440b07ab4234815368d1785a9 + depends: + - ld_impl_linux-aarch64 2.45 default_h1979696_104 + - sysroot_linux-aarch64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + size: 4850743 + timestamp: 1764007931341 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45-default_h4852527_104.conda + sha256: ed23fee4db69ad82320cca400fc77404c3874cd866606651a20bf743acd1a9b1 + md5: e30e71d685e23cc1e5ac1c1990ba1f81 + depends: + - binutils_impl_linux-64 2.45 default_hfdba357_104 + license: GPL-3.0-only + size: 36180 + timestamp: 1764007883258 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45-default_hf1166c9_104.conda + sha256: c93628f369264e5c7375915a5f589624d3211b5f4eb26a49395b1824976aeeb9 + md5: ddc3eece92177305e59ed62f95342d4b + depends: + - binutils_impl_linux-aarch64 2.45 default_h5f4c503_104 + license: GPL-3.0-only + size: 36380 + timestamp: 1764007966890 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + size: 260341 + timestamp: 1757437258798 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_8.conda + sha256: d2a296aa0b5f38ed9c264def6cf775c0ccb0f110ae156fcde322f3eccebf2e01 + md5: 2921ac0b541bf37c69e66bd6d9a43bca + depends: + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + size: 192536 + timestamp: 1757437302703 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + sha256: 8f50b58efb29c710f3cecf2027a8d7325ba769ab10c746eff75cea3ac050b10c + md5: 97c4b3bd8a90722104798175a1bdddbf + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 132607 + timestamp: 1757437730085 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 125061 + timestamp: 1757437486465 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda + sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692 + md5: 1077e9333c41ff0be8edd1a5ec0ddace + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + size: 55977 + timestamp: 1757437738856 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + sha256: f8003bef369f57396593ccd03d08a8e21966157269426f71e943f96e4b579aeb + md5: f7f0d6cc2dc986d42ac2689ec88192be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 206884 + timestamp: 1744127994291 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.5-h86ecc28_0.conda + sha256: ccae98c665d86723993d4cb0b456bd23804af5b0645052c09a31c9634eebc8df + md5: 5deaa903d46d62a1f8077ad359c3062e + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 215950 + timestamp: 1744127972012 +- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.5-hf13058a_0.conda + sha256: b37f5dacfe1c59e0a207c1d65489b760dff9ddb97b8df7126ceda01692ba6e97 + md5: eafe5d9f1a8c514afe41e6e833f66dfd + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 184824 + timestamp: 1744128064511 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda + sha256: b4bb55d0806e41ffef94d0e3f3c97531f322b3cb0ca1f7cdf8e47f62538b7a2b + md5: f8cd1beb98240c7edb1a95883360ccfa + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 179696 + timestamp: 1744128058734 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.10.0-h2b85faf_0.conda + sha256: 70be54bfe92b72794f664ad95b6fcef74d508710a9b2d790bc9c69f5a40239c3 + md5: 9256b7e5e900a1b98aedc8d6ffe91bec + depends: + - binutils + - gcc + - gcc_linux-64 13.* + license: BSD-3-Clause + license_family: BSD + size: 6667 + timestamp: 1751115555092 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-1.10.0-h6561dab_0.conda + sha256: d33f1f8373455bea2cbedbbbb1534c1123a8e1bba95ca4bf655990017533dcdf + md5: 53f1416f2e64d87fbac3a398f8e226e3 + depends: + - binutils + - gcc + - gcc_linux-aarch64 13.* + license: BSD-3-Clause + license_family: BSD + size: 6732 + timestamp: 1751115561791 +- conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.10.0-h09a7c41_0.conda + sha256: 6a3f6b72bf5ad154630f79bd600f6ccf0f5c6a4be5297e4831d63016f4220e62 + md5: 7b7c12e4774b83c18612c78073d12adc + depends: + - cctools >=949.0.1 + - clang_osx-64 18.* + - ld64 >=530 + - llvm-openmp + license: BSD-3-Clause + license_family: BSD + size: 6773 + timestamp: 1751115657381 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.10.0-hdf49b6b_0.conda + sha256: efc71f2ae5901bea633c67468b3aa774b6bcf46c9433e1ab5d640e3faf1680b9 + md5: 7ca1bdcc45db75f54ed7b3ac969ed888 + depends: + - cctools >=949.0.1 + - clang_osx-arm64 18.* + - ld64 >=530 + - llvm-openmp + license: BSD-3-Clause + license_family: BSD + size: 6758 + timestamp: 1751115540465 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-h4c7d964_0.conda + sha256: 686a13bd2d4024fc99a22c1e0e68a7356af3ed3304a8d3ff6bb56249ad4e82f0 + md5: f98fb7db808b94bc1ec5b0e62f9f1069 + depends: + - __win + license: ISC + size: 152827 + timestamp: 1762967310929 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda + sha256: b986ba796d42c9d3265602bc038f6f5264095702dd546c14bc684e60c385e773 + md5: f0991f0f84902f6b6009b4d2350a83aa + depends: + - __unix + license: ISC + size: 152432 + timestamp: 1762967197890 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cctools-1021.4-ha66f10e_0.conda + sha256: 1af7ea0c54e37ca1587c2d4e9c3a5add8dfd9bc4ff929f70a4330328f0c145ac + md5: 37619e89a65bb3688c67d82fd8645afc + depends: + - cctools_osx-64 1021.4 h508880d_0 + - ld64 954.16 h4e51db5_0 + - libllvm18 >=18.1.8,<18.2.0a0 + license: APSL-2.0 + license_family: Other + size: 21521 + timestamp: 1752818999237 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1021.4-hb4fb6a3_0.conda + sha256: 5492bfbb871086056daa5e7992f5845e317e09a882d1fe5fb94b3b2766462abc + md5: 0db10a7dbc9494ca7a918b762722f41b + depends: + - cctools_osx-arm64 1021.4 h12580ec_0 + - ld64 954.16 h4c6efb1_0 + - libllvm18 >=18.1.8,<18.2.0a0 + license: APSL-2.0 + license_family: Other + size: 21511 + timestamp: 1752819117398 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1021.4-h508880d_0.conda + sha256: 1fd96dc9abd1789d07e203ffac131edbbe773baeb8fc4038dcaf500f22c20c78 + md5: 4813f891c9cf3901d3c9c091000c6569 + depends: + - __osx >=10.13 + - ld64_osx-64 >=954.16,<954.17.0a0 + - libcxx + - libllvm18 >=18.1.8,<18.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 18.1.* + - sigtool + constrains: + - cctools 1021.4.* + - clang 18.1.* + - ld64 954.16.* + license: APSL-2.0 + license_family: Other + size: 792335 + timestamp: 1752818967832 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1021.4-h12580ec_0.conda + sha256: 9754bae92bfeafb1c4d724161ea402101769b0239fddbcec1de5b1612dcbae87 + md5: 8e0c8bd08a32fe607b6e504f8e0a00b5 + depends: + - __osx >=11.0 + - ld64_osx-arm64 >=954.16,<954.17.0a0 + - libcxx + - libllvm18 >=18.1.8,<18.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 18.1.* + - sigtool + constrains: + - ld64 954.16.* + - cctools 1021.4.* + - clang 18.1.* + license: APSL-2.0 + license_family: Other + size: 793113 + timestamp: 1752819079152 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.8-default_h1323312_15.conda + sha256: 45fe301fe485b615f02d260ec58d4a10fe4cad4cc8dd0c99f1935e7a20fb7623 + md5: 8465b838fe548f922617c0a2994a261c + depends: + - clang-18 18.1.8 default_hc369343_15 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 90096 + timestamp: 1757425347305 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-18.1.8-default_hf9bcbb7_15.conda + sha256: 5ff3ed0c46c54e290104fa25fbca85b2072d2e47c7af064cf5f4f54650f2bb97 + md5: 1045b495e806490d4fbb9194c4205477 + depends: + - clang-18 18.1.8 default_h73dfc95_15 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 90148 + timestamp: 1757423543704 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.8-default_hc369343_15.conda + sha256: 835619f721d32bb0255cc92871a0a70f888e6692364cd7f697e1aa0cb42382cb + md5: ef4eb713097a577d3f734914a2c37044 + depends: + - __osx >=10.13 + - libclang-cpp18.1 18.1.8 default_hc369343_15 + - libcxx >=18.1.8 + - libllvm18 >=18.1.8,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 823944 + timestamp: 1757425114726 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-18-18.1.8-default_h73dfc95_15.conda + sha256: f0d5af48b9d5b709c57601e01dd907c7241043c2a4c992f14598b9390e50267f + md5: 87dad5b58d6ad0f4e66abc01a34d85e2 + depends: + - __osx >=11.0 + - libclang-cpp18.1 18.1.8 default_h73dfc95_15 + - libcxx >=18.1.8 + - libllvm18 >=18.1.8,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 824675 + timestamp: 1757423264061 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-18.1.8-h6a44ed1_25.conda + sha256: fffb43ba2a04e6b25484840818628397be320f4ff0e5efcce8167f9d06216a94 + md5: bfc995f8ab9e8c22ebf365844da3383d + depends: + - cctools_osx-64 + - clang 18.1.8.* + - compiler-rt 18.1.8.* + - ld64_osx-64 + - llvm-tools 18.1.8.* + license: BSD-3-Clause + license_family: BSD + size: 18256 + timestamp: 1748575659622 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-18.1.8-h2ae9ea5_25.conda + sha256: 35273ca91fb998f979402c76066af008ad3108a61a3b161d881fcb37700a48bb + md5: 9eb023cfc47dac4c22097b9344a943b4 + depends: + - cctools_osx-arm64 + - clang 18.1.8.* + - compiler-rt 18.1.8.* + - ld64_osx-arm64 + - llvm-tools 18.1.8.* + license: BSD-3-Clause + license_family: BSD + size: 18331 + timestamp: 1748575702758 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-18.1.8-h7e5c614_25.conda + sha256: 7f6aea0def866f1664b3ddf730d91e1b94da734b585c3e49cd51d3c4c66a1a49 + md5: 1fea06d9ced6b87fe63384443bc2efaf + depends: + - clang_impl_osx-64 18.1.8 h6a44ed1_25 + license: BSD-3-Clause + license_family: BSD + size: 21534 + timestamp: 1748575663505 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-18.1.8-h07b0088_25.conda + sha256: 4d1e695cd776783f6192fb8d4c7892c03e9f1f185dbb96cefdaab2f183430281 + md5: d9ee862b94f4049c9e121e6dd18cc874 + depends: + - clang_impl_osx-arm64 18.1.8 h2ae9ea5_25 + license: BSD-3-Clause + license_family: BSD + size: 21563 + timestamp: 1748575706504 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.8-default_h1c12a56_15.conda + sha256: d47840dba48a16ceda4157c56598652ab793faa2f9d7bceb0051b4d819eb5d13 + md5: c7e0ff7f8a57b8b0cf6ae9656bbd8e6d + depends: + - clang 18.1.8 default_h1323312_15 + - libcxx-devel 18.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 90178 + timestamp: 1757425374470 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-18.1.8-default_h36137df_15.conda + sha256: 3ef13e4f8df76fed12700860b1ce720930ffe50b033c80cdbe715a3c1006ba32 + md5: a4d198561ddb8225e8a3019d31bff3dc + depends: + - clang 18.1.8 default_hf9bcbb7_15 + - libcxx-devel 18.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 90185 + timestamp: 1757423570516 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-18.1.8-h4b7810f_25.conda + sha256: 1b2ee79318f37b356d36cbcfc46ff8a0a4e1d8e5fdaed1e5dbc5a2b58cacbad7 + md5: c03c94381d9ffbec45c98b800e7d3e86 + depends: + - clang_osx-64 18.1.8 h7e5c614_25 + - clangxx 18.1.8.* + - libcxx >=18 + - libllvm18 >=18.1.8,<18.2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 18390 + timestamp: 1748575690740 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-18.1.8-h555f467_25.conda + sha256: d0fb67a4ed19e9b40db08fce19afb342dcebc3609374a1b86c0d7a40abaf655c + md5: 4d72782682bc7d61a3612fea2c93299f + depends: + - clang_osx-arm64 18.1.8 h07b0088_25 + - clangxx 18.1.8.* + - libcxx >=18 + - libllvm18 >=18.1.8,<18.2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 18459 + timestamp: 1748575734378 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-18.1.8-h7e5c614_25.conda + sha256: 1a1a31eae8b491104d33d422b57578f041d34afafb4da0a7355ef16fd5174090 + md5: 2e5c84e93a3519d77a0d8d9b3ea664fd + depends: + - clang_osx-64 18.1.8 h7e5c614_25 + - clangxx_impl_osx-64 18.1.8 h4b7810f_25 + license: BSD-3-Clause + license_family: BSD + size: 19947 + timestamp: 1748575697030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-18.1.8-h07b0088_25.conda + sha256: aae6cad658c9899f13d5941bcadc942f1a471acdfc43cd86c3635d0e353babc9 + md5: 4280e791148c1f9a3f8c0660d7a54acb + depends: + - clang_osx-arm64 18.1.8 h07b0088_25 + - clangxx_impl_osx-arm64 18.1.8 h555f467_25 + license: BSD-3-Clause + license_family: BSD + size: 19924 + timestamp: 1748575738546 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.2.0-hc85cc9f_0.conda + sha256: 3e9f674f99f06ae0f5a7bdbbc57ee696d95981dbe70734aec9954339f7aba30f + md5: 10a7bb07fe7ac977d78a54ba99401f0d + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.17.0,<9.0a0 + - libexpat >=2.7.3,<3.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 22345904 + timestamp: 1763585347008 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-4.2.0-hc9d863e_0.conda + sha256: 367e8cfc30981addf9a4c1fee36b9d2a4326b76980d8b1b24e59cae03173bcf3 + md5: f24f4f303d4ef8d375ad9ed58b91701e + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.17.0,<9.0a0 + - libexpat >=2.7.3,<3.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 21510371 + timestamp: 1763585110427 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cmake-4.2.0-h29fc008_0.conda + sha256: 826b3ddafa3cf9ff2befa00b1c92d9bda75dc3cac2b1577e633d5353334c9de7 + md5: 8b8277fa364d6306dfe00cb709e7cdb0 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.17.0,<9.0a0 + - libcxx >=19 + - libexpat >=2.7.3,<3.0a0 + - liblzma >=5.8.1,<6.0a0 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 18985077 + timestamp: 1763585819739 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmake-4.2.0-h54ad630_0.conda + sha256: 007cedc8b883e2ffbd2bd2c61adf2a744a540d69e7413c189b8795b99c42b4a1 + md5: 60a05652ff183e12b6c7def1ae4948a3 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.17.0,<9.0a0 + - libcxx >=19 + - libexpat >=2.7.3,<3.0a0 + - liblzma >=5.8.1,<6.0a0 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 17715312 + timestamp: 1763585835188 +- conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.2.0-hdcbee5b_0.conda + sha256: d50662b3e5b766dc350a4502b9a235abd7cceadb82748894d1a5f0d6964ff63f + md5: 25d27af806c07587c5c68d3b911ef5b8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.17.0,<9.0a0 + - libexpat >=2.7.3,<3.0a0 + - liblzma >=5.8.1,<6.0a0 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 15805683 + timestamp: 1763586003613 +- conda: https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-18.1.8-he914875_2.conda + sha256: b3d23e4e53cf22c110d3816f3faa83dc0eb9842a7c3a98e4307977b7b6576bd8 + md5: 56e9de1d62975db80c58b00dd620c158 + depends: + - __osx >=10.13 + - clang 18.1.8.* + - compiler-rt_osx-64 18.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 96219 + timestamp: 1757436225599 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-18.1.8-h855ad52_2.conda + sha256: 93a26ec6d7e3d93db2d80c794e9710fc422d436680da165e78d7ff73b8ef6c12 + md5: 8fa0332f248b2f65fdd497a888ab371e + depends: + - __osx >=11.0 + - clang 18.1.8.* + - compiler-rt_osx-arm64 18.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 95924 + timestamp: 1757436417546 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-18.1.8-h138dee1_2.conda + sha256: 35195a920e3dae8479d1e5295adf8003845ab9682747847a54585c9a2bdc6ad4 + md5: b457ba56dbaaa3e09b6ed2271f9cb1b3 + depends: + - clang 18.1.8.* + constrains: + - clangxx 18.1.8 + - compiler-rt 18.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 10231779 + timestamp: 1757436151261 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-18.1.8-he32a8d3_2.conda + sha256: fd0e6d142d38ac54404fb8f8413fae181a2c58e7aca3f6304df58f03ab8df55b + md5: e30e8ab85b13f0cab4c345d7758d525c + depends: + - clang 18.1.8.* + constrains: + - compiler-rt 18.1.8 + - clangxx 18.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 10204065 + timestamp: 1757436348646 +- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-13.4.0-h54dc52d_7.conda + sha256: ab5d1ca92419e367be9fb9cd7334f6450cb825f2e2938b95478b4c2538d9f56b + md5: 1bd050fd3d8abd8dcf4ec73e3a94e3ef + depends: + - gcc_impl_linux-64 >=13.4.0,<13.4.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 33277 + timestamp: 1759964906008 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-13.4.0-h9b409da_7.conda + sha256: 43b76c3aa5bb842c29e4e6ba7faddc17428166495b1c36e10ecb94ba5f7b6146 + md5: 5894adbe8636d6265342b50cbd1e6a55 + depends: + - gcc_impl_linux-aarch64 >=13.4.0,<13.4.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 32965 + timestamp: 1759973675826 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.10.0-h1a2810e_0.conda + sha256: 88ff4a72ad70a3b9a20a0296e395c0caaa6dc0a0e46a752aa683fb42be03facd + md5: 3cd322edac3d40904ff07355a8be8086 + depends: + - c-compiler 1.10.0 h2b85faf_0 + - gxx + - gxx_linux-64 13.* + license: BSD-3-Clause + license_family: BSD + size: 6633 + timestamp: 1751115555450 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-1.10.0-heb6c788_0.conda + sha256: d9545fc477c561d0d77e14d9bf683ed5af24b157517436aa0dd3bd85a5f13bd9 + md5: 0ced8888a4d506775eec668a2ce93623 + depends: + - c-compiler 1.10.0 h6561dab_0 + - gxx + - gxx_linux-aarch64 13.* + license: BSD-3-Clause + license_family: BSD + size: 6705 + timestamp: 1751115562352 +- conda: https://conda.anaconda.org/conda-forge/osx-64/cxx-compiler-1.10.0-h20888b2_0.conda + sha256: 15f6ea7258555b2e34d147d378f4e8e08343ca3e71a18bd98b89a3dbc43142a2 + md5: b3a935ade707c54ebbea5f8a7c6f4549 + depends: + - c-compiler 1.10.0 h09a7c41_0 + - clangxx_osx-64 18.* + license: BSD-3-Clause + license_family: BSD + size: 6785 + timestamp: 1751115659099 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-1.10.0-hba80287_0.conda + sha256: 52cbfc615a9727294fccdd507f11919ca01ff29bd928bb5aa0b211697a983e9f + md5: 7fca30a1585a85ec8ab63579afcac5d3 + depends: + - c-compiler 1.10.0 hdf49b6b_0 + - clangxx_osx-arm64 18.* + license: BSD-3-Clause + license_family: BSD + size: 6784 + timestamp: 1751115541888 +- conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.10.0-h1c1089f_0.conda + sha256: 123ef5fd4829b7c78d49df141bbdf6120fc63a17538b2209d56a6f4dc5eccf21 + md5: 1c4dad99c85e243e25828c6f12f28e0d + depends: + - vs2022_win-64 + license: BSD-3-Clause + license_family: BSD + size: 6987 + timestamp: 1751115642859 +- conda: https://conda.anaconda.org/conda-forge/linux-64/doxygen-1.13.2-h8e693c7_0.conda + sha256: 349c4c872357b4a533e127b2ade8533796e8e062abc2cd685756a1a063ae1e35 + md5: 0869f41ea5c64643dd2f5b47f32709ca + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libstdcxx >=13 + license: GPL-2.0-only + license_family: GPL + size: 13148627 + timestamp: 1738164137421 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/doxygen-1.13.2-h5e0f5ae_0.conda + sha256: 671fc9849fcdb9138daf2ab6b2d45b0650055ba1496cda19c415f57cabc381b8 + md5: 9091aa1c92ed01d5fe3d34d7e585b6a1 + depends: + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libstdcxx >=13 + license: GPL-2.0-only + license_family: GPL + size: 13227405 + timestamp: 1738171320483 +- conda: https://conda.anaconda.org/conda-forge/osx-64/doxygen-1.13.2-h27064b9_0.conda + sha256: 3eae05a4e8453698a52a265455a7045c70570e312db82c0829d33c576471da08 + md5: c8504720e9ad1565788e8bf91bfb0aeb + depends: + - __osx >=10.13 + - libcxx >=18 + - libiconv >=1.17,<2.0a0 + license: GPL-2.0-only + license_family: GPL + size: 11693372 + timestamp: 1738164323712 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/doxygen-1.13.2-h493aca8_0.conda + sha256: 2327ad4e6214accc1e71aea371aee9b9fed864ec36c20f829fd1cb71d4c85202 + md5: 3f5795e9004521711fa3a586b65fde05 + depends: + - __osx >=11.0 + - libcxx >=18 + - libiconv >=1.17,<2.0a0 + license: GPL-2.0-only + license_family: GPL + size: 11260324 + timestamp: 1738164659 +- conda: https://conda.anaconda.org/conda-forge/win-64/doxygen-1.13.2-hbf3f430_0.conda + sha256: 7a0fd40fd704e97a8f6533a081ba29579766d7a60bcb8e5de76679b066c4a72e + md5: 5cb2e11931773612d7a24b53f0c57594 + depends: + - libiconv >=1.17,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-2.0-only + license_family: GPL + size: 9219343 + timestamp: 1738165042524 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.4.0-h81444f0_7.conda + sha256: 11e1793a6eefbeb6b8bdcabb333fb1eebb504fd649425ec8ec4c82d2c6ac1486 + md5: 927ca740c61a86c1576d431cdeb95e2c + depends: + - conda-gcc-specs + - gcc_impl_linux-64 13.4.0.* + license: BSD-3-Clause + license_family: BSD + size: 31024 + timestamp: 1759965018168 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-13.4.0-h6911c08_7.conda + sha256: 742b7ca170cefa65e28fdc7acec43d5cb3e51b4cd0034334cdfb6ee4b8612b63 + md5: 807d9f24f1890e5ed43cbdaab04b0a79 + depends: + - conda-gcc-specs + - gcc_impl_linux-aarch64 13.4.0.* + license: BSD-3-Clause + license_family: BSD + size: 30970 + timestamp: 1759973772571 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.4.0-h69c5793_7.conda + sha256: 0171c6df0489fe61fda674dd84e6193225dbbeb6df554794fcd2f09a759df5d8 + md5: 8597ac73ca24f6ccb124957fdaa59017 + depends: + - binutils_impl_linux-64 >=2.40 + - libgcc >=13.4.0 + - libgcc-devel_linux-64 13.4.0 hba01cd7_107 + - libgomp >=13.4.0 + - libsanitizer 13.4.0 h14bf0c3_7 + - libstdcxx >=13.4.0 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 66926199 + timestamp: 1759964810732 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-13.4.0-h69010b7_7.conda + sha256: c244a3f24af27552b18b9d559d3acb966f780ba10381c1efe6cd84ef86150ed9 + md5: f892022c37891da7a13e0ebb7fae79f7 + depends: + - binutils_impl_linux-aarch64 >=2.40 + - libgcc >=13.4.0 + - libgcc-devel_linux-aarch64 13.4.0 hd10b1b9_107 + - libgomp >=13.4.0 + - libsanitizer 13.4.0 h8a98f30_7 + - libstdcxx >=13.4.0 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 60709962 + timestamp: 1759973598076 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.4.0-h0a5b801_14.conda + sha256: 383132e3ec7cc16f273d58da6b19b49352ee96cea66db61f4b8c88896a637264 + md5: 29fbf705f311002c8db8b1c3fa619d14 + depends: + - gcc_impl_linux-64 13.4.0.* + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + size: 27989 + timestamp: 1763757838809 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-13.4.0-hbf9eca1_14.conda + sha256: 0d95afe465e3d3aee68f8de249337daf2b8f45b54718ff66bcb2d1eb4055da75 + md5: 56afc7e94099393d590bf975fc8089f9 + depends: + - gcc_impl_linux-aarch64 13.4.0.* + - binutils_linux-aarch64 + - sysroot_linux-aarch64 + license: BSD-3-Clause + license_family: BSD + size: 27757 + timestamp: 1763757830983 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.4.0-h7467c50_7.conda + sha256: dcb950f9bd7391a67296ead83ecb106c0da91c188969e9310fe2be4271058002 + md5: 2f9af6f2a4a9ad68593fd2738b46d3fd + depends: + - gcc 13.4.0.* + - gxx_impl_linux-64 13.4.0.* + license: BSD-3-Clause + license_family: BSD + size: 30507 + timestamp: 1759965051922 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-13.4.0-hb5ee532_7.conda + sha256: 082e7e231684ffd84358ebb72b34dbd49eeebc34587501cd83223632d61b110b + md5: 5f80edc423b4e1aba3e7b645cf9cd5b7 + depends: + - gcc 13.4.0.* + - gxx_impl_linux-aarch64 13.4.0.* + license: BSD-3-Clause + license_family: BSD + size: 30451 + timestamp: 1759973798763 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.4.0-haf17267_7.conda + sha256: fca070814b1e51f4b646462208d7a735597e3a897094580cb53dce187e585b58 + md5: db49b83aa376e75ce2d7f5359a8d4e77 + depends: + - gcc_impl_linux-64 13.4.0 h69c5793_7 + - libstdcxx-devel_linux-64 13.4.0 hba01cd7_107 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 13518456 + timestamp: 1759964992050 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-13.4.0-hf6d83cf_7.conda + sha256: 9efa25889e6711cb1eb3263ea8b8a5b9680215647614ff6c11dfef4e83b6c64d + md5: 60e7cc1031587409b1c80cfb4624da4d + depends: + - gcc_impl_linux-aarch64 13.4.0 h69010b7_7 + - libstdcxx-devel_linux-aarch64 13.4.0 hd10b1b9_107 + - sysroot_linux-aarch64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 12349035 + timestamp: 1759973753417 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.4.0-h494ab63_14.conda + sha256: 734649ce934531678c9a9f8d6ecde6e9fcc7d63fd93b03680cb73fea4f8d5749 + md5: 5a3c537657f4d5cbb09b479828e73e3a + depends: + - gxx_impl_linux-64 13.4.0.* + - gcc_linux-64 ==13.4.0 h0a5b801_14 + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + size: 27069 + timestamp: 1763757838809 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-13.4.0-he64a8ad_14.conda + sha256: 5ffdcc949267dcea9e14ac2634dd492fb5a3049ef87ab06db5b8aa3d4a8284b2 + md5: 4644b9ae248d0cf7b4c4e6867f4a9d06 + depends: + - gxx_impl_linux-aarch64 13.4.0.* + - gcc_linux-aarch64 ==13.4.0 hbf9eca1_14 + - binutils_linux-aarch64 + - sysroot_linux-aarch64 + license: BSD-3-Clause + license_family: BSD + size: 26866 + timestamp: 1763757830983 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda + sha256: 305c22a251db227679343fd73bfde121e555d466af86e537847f4c8b9436be0d + md5: ff007ab0f0fdc53d245972bba8a6d40c + constrains: + - sysroot_linux-64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 1272697 + timestamp: 1752669126073 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_8.conda + sha256: 9d0a86bd0c52c39db8821405f6057bc984789d36e15e70fa5c697f8ba83c1a19 + md5: 2ab884dda7f1a08758fe12c32cc31d08 + constrains: + - sysroot_linux-aarch64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 1244709 + timestamp: 1752669116535 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda + sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 + md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 + depends: + - libgcc >=13 + license: LGPL-2.1-or-later + size: 129048 + timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 + md5: 29c10432a2ca1472b53f299ffb2ffa37 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1474620 + timestamp: 1719463205834 +- conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + sha256: 83b52685a4ce542772f0892a0f05764ac69d57187975579a0835ff255ae3ef9c + md5: d4765c524b1d91567886bde656fb514b + depends: + - __osx >=10.13 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1185323 + timestamp: 1719463492984 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b + md5: c6dc8a0fdec13a0565936655c33069a1 + depends: + - __osx >=11.0 + - libcxx >=16 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1155530 + timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + sha256: 18e8b3430d7d232dad132f574268f56b3eb1a19431d6d5de8c53c29e6c18fa81 + md5: 31aec030344e962fbd7dbbbbd68e60a9 + depends: + - openssl >=3.3.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 712034 + timestamp: 1719463874284 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-954.16-h4e51db5_0.conda + sha256: c03cbac3550460fbf685dccd8df486ce0680abfd609ccec0407a852b9a055e0b + md5: 98b4c4a0eb19523f11219ea5cc21c17b + depends: + - ld64_osx-64 954.16 h28b3ac7_0 + - libllvm18 >=18.1.8,<18.2.0a0 + constrains: + - cctools 1021.4.* + - cctools_osx-64 1021.4.* + license: APSL-2.0 + license_family: Other + size: 18815 + timestamp: 1752818984788 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-954.16-h4c6efb1_0.conda + sha256: 722595fb6f81552a88864f79f87238f0dba8e2d3f6c5adf4322a66259c4ea825 + md5: 04733a89c85df5b0fa72826b9e88b3a8 + depends: + - ld64_osx-arm64 954.16 h9d5fcb0_0 + - libllvm18 >=18.1.8,<18.2.0a0 + constrains: + - cctools_osx-arm64 1021.4.* + - cctools 1021.4.* + license: APSL-2.0 + license_family: Other + size: 18863 + timestamp: 1752819098768 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-954.16-h28b3ac7_0.conda + sha256: 9ec626913646076c7514f294f46191b27e43fd87da24e98577078651a9b425f0 + md5: e198e41dada835a065079e4c70905974 + depends: + - __osx >=10.13 + - libcxx + - libllvm18 >=18.1.8,<18.2.0a0 + - sigtool + - tapi >=1300.6.5,<1301.0a0 + constrains: + - cctools 1021.4.* + - ld 954.16.* + - clang >=18.1.8,<19.0a0 + - cctools_osx-64 1021.4.* + license: APSL-2.0 + license_family: Other + size: 1100874 + timestamp: 1752818929757 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-954.16-h9d5fcb0_0.conda + sha256: 825b56e7016fa64f3fb3b25ba535e838c914264c71ba47075bab91b56a738cbb + md5: f46ccafd4b646514c45cf9857f9b4059 + depends: + - __osx >=11.0 + - libcxx + - libllvm18 >=18.1.8,<18.2.0a0 + - sigtool + - tapi >=1300.6.5,<1301.0a0 + constrains: + - ld 954.16.* + - cctools_osx-arm64 1021.4.* + - cctools 1021.4.* + - clang >=18.1.8,<19.0a0 + license: APSL-2.0 + license_family: Other + size: 1022059 + timestamp: 1752819033976 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda + sha256: 9e191baf2426a19507f1d0a17be0fdb7aa155cdf0f61d5a09c808e0a69464312 + md5: a6abd2796fc332536735f68ba23f7901 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45 + license: GPL-3.0-only + size: 725545 + timestamp: 1764007826689 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda + sha256: 7a13072581fa23f658a04f62f62c4677c57d3c9696fbc01cc954a88fc354b44d + md5: 28035705fe0c977ea33963489cd008ad + depends: + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-aarch64 2.45 + license: GPL-3.0-only + size: 875534 + timestamp: 1764007911054 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda + build_number: 2 + sha256: 4287aa2742828dc869b09a17c9f1171903fc1146bdc8f7bdf62ffe5c20674f31 + md5: 6146bf1b7f58113d54614c6ec683c14a + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - blas 2.302 openblas + - liblapacke 3.11.0 2*_openblas + - mkl <2026 + - libcblas 3.11.0 2*_openblas + - liblapack 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18495 + timestamp: 1763828445618 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-2_haddc8a3_openblas.conda + build_number: 2 + sha256: a67e74373ce56cb4baa3be1ce24a8c14f709010f1bcefe2e1521a15765cee78f + md5: 1a4b8fba71eb980ac7fb0f2ab86f295d + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapacke 3.11.0 2*_openblas + - blas 2.302 openblas + - libcblas 3.11.0 2*_openblas + - mkl <2026 + - liblapack 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18542 + timestamp: 1763828536071 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-2_he492b99_openblas.conda + build_number: 2 + sha256: c9ded973b66a1d0d000bdd6c5a253101d4f8768ad168dc72f99f99fa0c1fbbf3 + md5: 1c8b502902eacae5a3df66477e61a636 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - libcblas 3.11.0 2*_openblas + - liblapack 3.11.0 2*_openblas + - mkl <2026 + - liblapacke 3.11.0 2*_openblas + - blas 2.302 openblas + license: BSD-3-Clause + license_family: BSD + size: 18653 + timestamp: 1763829098255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-2_h51639a9_openblas.conda + build_number: 2 + sha256: f45ee569d6ab29217271d5dddfbf8ab76dcd2dc74de9296df3548333c9f3ce78 + md5: 811e17323f5afeeb5eb6cc83d90c4292 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - liblapack 3.11.0 2*_openblas + - blas 2.302 openblas + - libcblas 3.11.0 2*_openblas + - mkl <2026 + - liblapacke 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18675 + timestamp: 1763829114755 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-2_hf2e6a31_mkl.conda + build_number: 2 + sha256: f82077ce40cbd07bb4f6dd037052733c472b85afff3e816cb16effa7b15ad949 + md5: 04a13a6c1bfd0b69b48e0fd81a1138fa + depends: + - mkl >=2025.3.0,<2026.0a0 + constrains: + - blas 2.302 mkl + - liblapacke 3.11.0 2*_mkl + - liblapack 3.11.0 2*_mkl + - libcblas 3.11.0 2*_mkl + license: BSD-3-Clause + license_family: BSD + size: 67907 + timestamp: 1763829115272 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda + build_number: 2 + sha256: 02286c8941f156d11087dedc551b86b99bd55d9d4bdef61316566a2fc133608b + md5: a84b2b7ed34206d14739fb8d29cd2799 + depends: + - libblas 3.11.0 2_h4a7cf45_openblas + constrains: + - blas 2.302 openblas + - liblapacke 3.11.0 2*_openblas + - liblapack 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18458 + timestamp: 1763828452799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-2_hd72aa62_openblas.conda + build_number: 2 + sha256: d0aa5f39deed6f4b98193076ee2bbfc1dd7e9950944df1077bda945d89cb25c5 + md5: a074a14e43abb50d4a38fff28a791259 + depends: + - libblas 3.11.0 2_haddc8a3_openblas + constrains: + - blas 2.302 openblas + - liblapacke 3.11.0 2*_openblas + - liblapack 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18555 + timestamp: 1763828541646 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-2_h9b27e0a_openblas.conda + build_number: 2 + sha256: e64c0a3d5b4bca38f85d0699dcf904b58e1bc5757f83e220f87ed9df8b6bc16f + md5: 4340614c0af5534339786cfd3b79211f + depends: + - libblas 3.11.0 2_he492b99_openblas + constrains: + - liblapacke 3.11.0 2*_openblas + - blas 2.302 openblas + - liblapack 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18665 + timestamp: 1763829114632 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-2_hb0561ab_openblas.conda + build_number: 2 + sha256: 9716a0b87913db25f46ad5c0be7daf6591e64ab9781fa0301727393d369ffb27 + md5: f0d6abadf8be9bf4271123eb37ac4f4e + depends: + - libblas 3.11.0 2_h51639a9_openblas + constrains: + - liblapack 3.11.0 2*_openblas + - blas 2.302 openblas + - liblapacke 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18638 + timestamp: 1763829127867 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-2_h2a3cdd5_mkl.conda + build_number: 2 + sha256: 3338b38c7f3cec4be701ff5d615adbef6a3758945b2e1523879e73909a8c8699 + md5: 5b04388898707d7b8d25c6353818f8f3 + depends: + - libblas 3.11.0 2_hf2e6a31_mkl + constrains: + - blas 2.302 mkl + - liblapacke 3.11.0 2*_mkl + - liblapack 3.11.0 2*_mkl + license: BSD-3-Clause + license_family: BSD + size: 68271 + timestamp: 1763829148523 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_hc369343_15.conda + sha256: a837da43358956b3f0eb15510e3ce27fdd645d4a824267112e2d85d781027e79 + md5: c08858fbc3c6e015a210f73b084eee5b + depends: + - __osx >=10.13 + - libcxx >=18.1.8 + - libllvm18 >=18.1.8,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 14078837 + timestamp: 1757424842305 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp18.1-18.1.8-default_h73dfc95_15.conda + sha256: 88646de816c02d4b4ae4c357e6714e2b600e4893b882b2ccc74f4798db590af5 + md5: 782b06c663896f1c3060134fb55ea150 + depends: + - __osx >=11.0 + - libcxx >=18.1.8 + - libllvm18 >=18.1.8,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 13334764 + timestamp: 1757423065039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 + md5: 01e149d4a53185622dc2e788281961f2 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 460366 + timestamp: 1762333743748 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda + sha256: 100443d6cc03bd31f07082190d151fc84734a64624a79778e792b9b70754ffe5 + md5: 468c392e41a0cfc30aed58139fc8d58f + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=14 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 478880 + timestamp: 1762333723924 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda + sha256: a58ca5a28c1cb481f65800781cee9411bd68e8bda43a69817aaeb635d25f7d75 + md5: b3985ef7ca4cd2db59756bae2963283a + depends: + - __osx >=10.13 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 412858 + timestamp: 1762334472915 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda + sha256: 2980c5de44ac3ca2ecbd4a00756da1648ea2945d9e4a2ad9f216c7787df57f10 + md5: 791003efe92c17ed5949b309c61a5ab1 + depends: + - __osx >=11.0 + - krb5 >=1.21.3,<1.22.0a0 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 394183 + timestamp: 1762334288445 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_0.conda + sha256: 651daa5d2bad505b5c72b1d5d4d8c7fc0776ab420e67af997ca9391b6854b1b3 + md5: cfade9be135edb796837e7d4c288c0fb + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: curl + license_family: MIT + size: 378897 + timestamp: 1762333969177 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda + sha256: 91335ef5f9d228399550937628fc8739c914f106a116b89da1580c4412902ac4 + md5: 866af4d7269cd8c9b70f5b49ad6173aa + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 569027 + timestamp: 1763470314045 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda + sha256: 6c8d5c50f398035c39f118a6decf91b11d2461c88aef99f81e5c5de200d2a7fa + md5: 3ea79e55a64bff6c3cbd4588c89a527a + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 569823 + timestamp: 1763470498512 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-18.1.8-h7c275be_8.conda + sha256: cb3cce2b312aa1fb7391672807001bbab4d6e2deb16d912caecf6219f58ee1f4 + md5: a9513c41f070a9e2d5c370ba5d6c0c00 + depends: + - libcxx >=18.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 794361 + timestamp: 1742451346844 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-18.1.8-h6dc3340_8.conda + sha256: ff83d001603476033eca155ce77f7ba614d9dc70c5811e2ce9915a3cadacb56f + md5: fdf0850d6d1496f33e3996e377f605ed + depends: + - libcxx >=18.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 794791 + timestamp: 1742451369695 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda + sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 + md5: fb640d776fc92b682a14e001980825b1 + depends: + - ncurses + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 148125 + timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + sha256: 6cc49785940a99e6a6b8c6edbb15f44c2dd6c789d9c283e5ee7bdfedd50b4cd6 + md5: 1f4ed31220402fcddc083b4bff406868 + depends: + - ncurses + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 115563 + timestamp: 1738479554273 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda + sha256: 973af77e297f1955dd1f69c2cbdc5ab9dfc88388a5576cd152cda178af0fd006 + md5: a9a13cb143bbaa477b1ebaefbe47a302 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 115123 + timestamp: 1702146237623 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 + md5: 899db79329439820b7e8f8de41bca902 + license: BSD-2-Clause + license_family: BSD + size: 106663 + timestamp: 1702146352558 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f + md5: 8b09ae86839581147ef2e5c5e229d164 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + size: 76643 + timestamp: 1763549731408 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda + sha256: cc2581a78315418cc2e0bb2a273d37363203e79cefe78ba6d282fed546262239 + md5: b414e36fbb7ca122030276c75fa9c34a + depends: + - libgcc >=14 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + size: 76201 + timestamp: 1763549910086 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda + sha256: d11b3a6ce5b2e832f430fd112084533a01220597221bee16d6c7dc3947dffba6 + md5: 222e0732a1d0780a622926265bee14ef + depends: + - __osx >=10.13 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + size: 74058 + timestamp: 1763549886493 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda + sha256: fce22610ecc95e6d149e42a42fbc3cc9d9179bd4eb6232639a60f06e080eec98 + md5: b79875dbb5b1db9a4a22a4520f918e1a + depends: + - __osx >=11.0 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + size: 67800 + timestamp: 1763549994166 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda + sha256: 844ab708594bdfbd7b35e1a67c379861bcd180d6efe57b654f482ae2f7f5c21e + md5: 8c9e4f1a0e688eef2e95711178061a0f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.7.3.* + license: MIT + license_family: MIT + size: 70137 + timestamp: 1763550049107 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + md5: 35f29eec58405aaf55e01cb470d8c26a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + size: 57821 + timestamp: 1760295480630 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda + sha256: 6c3332e78a975e092e54f87771611db81dcb5515a3847a3641021621de76caea + md5: 0c5ad486dcfb188885e3cf8ba209b97b + depends: + - libgcc >=14 + license: MIT + license_family: MIT + size: 55586 + timestamp: 1760295405021 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda + sha256: 277dc89950f5d97f1683f26e362d6dca3c2efa16cb2f6fdb73d109effa1cd3d0 + md5: d214916b24c625bcc459b245d509f22e + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 52573 + timestamp: 1760295626449 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda + sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f + md5: 411ff7cd5d1472bba0f55c0faf04453b + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 40251 + timestamp: 1760295839166 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda + sha256: ddff25aaa4f0aa535413f5d831b04073789522890a4d8626366e43ecde1534a3 + md5: ba4ad812d2afc22b9a34ce8327a0930f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 44866 + timestamp: 1760295760649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 + md5: c0374badb3a5d4b1372db28d19462c53 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.2.0 h767d61c_7 + - libgcc-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 822552 + timestamp: 1759968052178 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda + sha256: 616f5960930ad45b48c57f49c3adddefd9423674b331887ef0e69437798c214b + md5: afa05d91f8d57dd30985827a09c21464 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.2.0 he277a41_7 + - libgcc-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 510719 + timestamp: 1759967448307 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.4.0-hba01cd7_107.conda + sha256: a57b8999a05fcb57d6fd20fb6a7883d6ebb428ca20b9d05c572aba3d2dd0793f + md5: f4269cc08f10c433c83e4ce4f2346051 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 2576281 + timestamp: 1759964641552 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-13.4.0-hd10b1b9_107.conda + sha256: 6b592d0d53aefd0e32e451bb682cb2e90656f85c2b3911e0fcffe15b9704438a + md5: 9de1dcf753efe7ec867623b797de3dd2 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 2028353 + timestamp: 1759973452927 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + sha256: 2045066dd8e6e58aaf5ae2b722fb6dfdbb57c862b5f34ac7bfb58c40ef39b6ad + md5: 280ea6eee9e2ddefde25ff799c4f0363 + depends: + - libgcc 15.2.0 h767d61c_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29313 + timestamp: 1759968065504 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda + sha256: 7d98979b2b5698330007b0146b8b4b95b3790378de12129ce13c9fc88c1ef45a + md5: a5ce1f0a32f02c75c11580c5b2f9258a + depends: + - libgcc 15.2.0 he277a41_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29261 + timestamp: 1759967452303 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda + sha256: 9ca24328e31c8ef44a77f53104773b9fe50ea8533f4c74baa8489a12de916f02 + md5: 8621a450add4e231f676646880703f49 + depends: + - libgfortran5 15.2.0 hcd61629_7 + constrains: + - libgfortran-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29275 + timestamp: 1759968110483 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_7.conda + sha256: 78d958444dd41c4b590f030950a29b4278922147f36c2221c84175eedcbc13f1 + md5: ffe6ad135bd85bb594a6da1d78768f7c + depends: + - libgfortran5 15.2.0 h87db57e_7 + constrains: + - libgfortran-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29294 + timestamp: 1759967474985 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h306097a_1.conda + sha256: 97551952312cf4954a7ad6ba3fd63c739eac65774fe96ddd121c67b5196a8689 + md5: cd5393330bff47a00d37a117c65b65d0 + depends: + - libgfortran5 15.2.0 h336fb69_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 134506 + timestamp: 1759710031253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda + sha256: e9a5d1208b9dc0b576b35a484d527d9b746c4e65620e0d77c44636033b2245f0 + md5: f699348e3f4f924728e33551b1920f79 + depends: + - libgfortran5 15.2.0 h742603c_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 134016 + timestamp: 1759712902814 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda + sha256: e93ceda56498d98c9f94fedec3e2d00f717cbedfc97c49be0e5a5828802f2d34 + md5: f116940d825ffc9104400f0d7f1a4551 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1572758 + timestamp: 1759968082504 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h87db57e_7.conda + sha256: ae9a8290a7ff0fa28f540208906896460c62dcfbfa31ff9b8c2b398b5bbd34b1 + md5: dd7233e2874ea59e92f7d24d26bb341b + depends: + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1145738 + timestamp: 1759967460371 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-h336fb69_1.conda + sha256: 1d53bad8634127b3c51281ce6ad3fbf00f7371824187490a36e5182df83d6f37 + md5: b6331e2dcc025fc79cd578f4c181d6f2 + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1236316 + timestamp: 1759709318982 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda + sha256: 18808697013a625ca876eeee3d86ee5b656f17c391eca4a4bc70867717cc5246 + md5: afccf412b03ce2f309f875ff88419173 + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 764028 + timestamp: 1759712189275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca + md5: f7b4d76975aac7e5d9e6ad13845f92fe + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 447919 + timestamp: 1759967942498 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda + sha256: 0a024f1e4796f5d90fb8e8555691dad1b3bdfc6ac3c2cd14d876e30f805fcac7 + md5: 34cef4753287c36441f907d5fdd78d42 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 450308 + timestamp: 1759967379407 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda + sha256: 266dfe151066c34695dbdc824ba1246b99f016115ef79339cbcf005ac50527c1 + md5: b0cac6e5b06ca5eeb14b4f7cf908619f + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + size: 2414731 + timestamp: 1757624335056 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + size: 790176 + timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda + sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 + md5: 5a86bf847b9b926f3a4f203339748d78 + depends: + - libgcc >=14 + license: LGPL-2.1-only + size: 791226 + timestamp: 1754910975665 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 + md5: 210a85a1119f97ea7887188d176db135 + depends: + - __osx >=10.13 + license: LGPL-2.1-only + size: 737846 + timestamp: 1754908900138 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + size: 750379 + timestamp: 1754909073836 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + size: 696926 + timestamp: 1754909290005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda + build_number: 2 + sha256: d51497ff0af63c4fa854ee7eadca5589eebfc3c9f50eaaa5ede97becde4682ca + md5: 9fb20e74a7436dc94dd39d9a9decddc3 + depends: + - libblas 3.11.0 2_h4a7cf45_openblas + constrains: + - blas 2.302 openblas + - liblapacke 3.11.0 2*_openblas + - libcblas 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18489 + timestamp: 1763828460613 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-2_h88aeb00_openblas.conda + build_number: 2 + sha256: 8af90bb3c7027a70e12b8a696a2c37e10fdae3965953fb687a13112c9db1884d + md5: c73b83da5563196bdfd021579c45d54c + depends: + - libblas 3.11.0 2_haddc8a3_openblas + constrains: + - blas 2.302 openblas + - libcblas 3.11.0 2*_openblas + - liblapacke 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18557 + timestamp: 1763828547154 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-2_h859234e_openblas.conda + build_number: 2 + sha256: c2cdcb92054eba36b98a3217bf13ce2548128269570cb1c2ffd52fda096f1896 + md5: 8db178ce18ce1a024920967144b9f0b8 + depends: + - libblas 3.11.0 2_he492b99_openblas + constrains: + - liblapacke 3.11.0 2*_openblas + - libcblas 3.11.0 2*_openblas + - blas 2.302 openblas + license: BSD-3-Clause + license_family: BSD + size: 18665 + timestamp: 1763829128647 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-2_hd9741b5_openblas.conda + build_number: 2 + sha256: 1aa32435fa1f8273c2d1c1ac6229daa84f2ac1103e5da0bd652c48ce381dd583 + md5: f63fdb2504b1fc4527314641fa34efb4 + depends: + - libblas 3.11.0 2_h51639a9_openblas + constrains: + - blas 2.302 openblas + - libcblas 3.11.0 2*_openblas + - liblapacke 3.11.0 2*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18651 + timestamp: 1763829141511 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-2_hf9ab0e9_mkl.conda + build_number: 2 + sha256: 36c7bddd82fa835e3a30863df6c8888877338b1775fb9a6a4b0b1e9ade0eb6f4 + md5: 4126ff2758e017e9f9c312a36b961738 + depends: + - libblas 3.11.0 2_hf2e6a31_mkl + constrains: + - blas 2.302 mkl + - liblapacke 3.11.0 2*_mkl + - libcblas 3.11.0 2*_mkl + license: BSD-3-Clause + license_family: BSD + size: 80476 + timestamp: 1763829180808 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_hc369343_10.conda + sha256: 8cf834f2dc9251ac73f0221a09b5a55c333d4ef993dc971e59a593a937c838d5 + md5: 8a5219d1f850e7e7690df1d594535d60 + depends: + - __osx >=10.13 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 27732503 + timestamp: 1757362103825 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.8-default_h3f38c9c_10.conda + sha256: 2de525b426da3c9e8a07b3506dc377564589d2d5c17a5ca1661657905360ddb6 + md5: df8e3f7dd302c42baccfc1c637bc5ce7 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 25883667 + timestamp: 1757359756811 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda + sha256: 498ea4b29155df69d7f20990a7028d75d91dbea24d04b2eb8a3d6ef328806849 + md5: 7d362346a479256857ab338588190da0 + depends: + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 125103 + timestamp: 1749232230009 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda + sha256: 7e22fd1bdb8bf4c2be93de2d4e718db5c548aa082af47a7430eb23192de6bb36 + md5: 8468beea04b9065b9807fc8b9cdc5894 + depends: + - __osx >=10.13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104826 + timestamp: 1749230155443 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda + sha256: 0cb92a9e026e7bd4842f410a5c5c665c89b2eb97794ffddba519a626b8ce7285 + md5: d6df911d4564d77c4374b02552cb17d1 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 92286 + timestamp: 1749230283517 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc + md5: c15148b2e18da456f5108ccb5e411446 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 104935 + timestamp: 1749230611612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee + md5: c7e925f37e3b40d893459e625f6a53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + size: 91183 + timestamp: 1748393666725 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda + sha256: ef8697f934c80b347bf9d7ed45650928079e303bad01bd064995b0e3166d6e7a + md5: 78cfed3f76d6f3f279736789d319af76 + depends: + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + size: 114064 + timestamp: 1748393729243 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda + sha256: 98299c73c7a93cd4f5ff8bb7f43cd80389f08b5a27a296d806bdef7841cc9b9e + md5: 18b81186a6adb43f000ad19ed7b70381 + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + size: 77667 + timestamp: 1748393757154 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda + sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 + md5: 85ccccb47823dd9f7a99d2c7f530342f + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + size: 71829 + timestamp: 1748393749336 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 88657 + timestamp: 1723861474602 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 + md5: b499ce4b026493a13774bcf0f4c33849 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.5,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + size: 666600 + timestamp: 1756834976695 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + sha256: b03f406fd5c3f865a5e08c89b625245a9c4e026438fd1a445e45e6a0d69c2749 + md5: 981082c1cc262f514a5a2cf37cab9b81 + depends: + - c-ares >=1.34.5,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + size: 728661 + timestamp: 1756835019535 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda + sha256: c48d7e1cc927aef83ff9c48ae34dd1d7495c6ccc1edc4a3a6ba6aff1624be9ac + md5: e7630cef881b1174d40f3e69a883e55f + depends: + - __osx >=10.13 + - c-ares >=1.34.5,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + size: 605680 + timestamp: 1756835898134 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + sha256: a07cb53b5ffa2d5a18afc6fd5a526a5a53dd9523fbc022148bd2f9395697c46d + md5: a4b4dd73c67df470d091312ab87bf6ae + depends: + - __osx >=11.0 + - c-ares >=1.34.5,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + size: 575454 + timestamp: 1756835746393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 + md5: be43915efc66345cccb3c310b6ed0374 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 5927939 + timestamp: 1763114673331 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda + sha256: 794a7270ea049ec931537874cd8d2de0ef4b3cef71c055cfd8b4be6d2f4228b0 + md5: 11d7d57b7bdd01da745bbf2b67020b2e + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4959359 + timestamp: 1763114173544 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda + sha256: ba642353f7f41ab2d2eb6410fbe522238f0f4483bcd07df30b3222b4454ee7cd + md5: 9241a65e6e9605e4581a2a8005d7f789 + depends: + - __osx >=10.13 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 6268795 + timestamp: 1763117623665 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda + sha256: dcc626c7103503d1dfc0371687ad553cb948b8ed0249c2a721147bdeb8db4a73 + md5: a18a7f471c517062ee71b843ef95eb8a + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4285762 + timestamp: 1761749506256 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.4.0-h14bf0c3_7.conda + sha256: 762a1245ad2892e574bb677dcd0da647be6c7c0cf69fa3f4637446d0fb489b1e + md5: 035f201f22e6b3be67c89bfa0b221283 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13.4.0 + - libstdcxx >=13.4.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 4579364 + timestamp: 1759964758456 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-13.4.0-h8a98f30_7.conda + sha256: d4c6e23d21f738e45fa776940cdca37039f1086c8f087746028c580a5e75e607 + md5: 43d89997265d1f8bfd21f96041a7dfff + depends: + - libgcc >=13.4.0 + - libstdcxx >=13.4.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 4508655 + timestamp: 1759973549899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 + md5: 729a572a3ebb8c43933b30edcc628ceb + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 945576 + timestamp: 1762299687230 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.0-h022381a_0.conda + sha256: f66a40b6e07a6f8ce6ccbd38d079b7394217d8f8ae0a05efa644aa0a40140671 + md5: 8920ce2226463a3815e2183c8b5008b8 + depends: + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 938476 + timestamp: 1762299829629 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda + sha256: ad151af8192c17591fad0b68c9ffb7849ad9f4be9da2020b38b8befd2c5f6f02 + md5: 1ee9b74571acd6dd87e6a0f783989426 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 986898 + timestamp: 1762300146976 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda + sha256: b43d198f147f46866e5336c4a6b91668beef698bfba69d1706158460eadb2c1b + md5: 5fb1945dbc6380e6fe7e939a62267772 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libzlib >=1.3.1,<2.0a0 + license: blessing + size: 909508 + timestamp: 1762300078624 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda + sha256: 2373bd7450693bd0f624966e1bee2f49b0bf0ffbc114275ed0a43cf35aec5b21 + md5: d2c9300ebd2848862929b18c264d1b1e + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + size: 1292710 + timestamp: 1762299749044 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: eecce068c7e4eddeb169591baac20ac4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 304790 + timestamp: 1745608545575 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + sha256: 1e289bcce4ee6a5817a19c66e296f3c644dcfa6e562e5c1cba807270798814e7 + md5: eecc495bcfdd9da8058969656f916cc2 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 311396 + timestamp: 1745609845915 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + sha256: 00654ba9e5f73aa1f75c1f69db34a19029e970a4aeb0fa8615934d8e9c369c3c + md5: a6cb15db1c2dc4d3a5f6cf3772e09e81 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 284216 + timestamp: 1745608575796 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a + md5: b68e8f66b94b44aaa8de4583d3d4cc40 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 279193 + timestamp: 1745608793272 +- conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + sha256: cbdf93898f2e27cefca5f3fe46519335d1fab25c4ea2a11b11502ff63e602c09 + md5: 9dce2f112bfd3400f4f432b3d0ac07b2 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 292785 + timestamp: 1745608759342 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 + md5: 5b767048b1b3ee9a954b06f4084f93dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 h767d61c_7 + constrains: + - libstdcxx-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3898269 + timestamp: 1759968103436 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda + sha256: 4c6d1a2ae58044112233a57103bbf06000bd4c2aad44a0fd3b464b05fa8df514 + md5: 6a2f0ee17851251a85fbebafbe707d2d + depends: + - libgcc 15.2.0 he277a41_7 + constrains: + - libstdcxx-ng ==15.2.0=*_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3831785 + timestamp: 1759967470295 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.4.0-hba01cd7_107.conda + sha256: f40f7c336eff57fe26306885070c61ca7a7cb46a58af37f2bbcb26d141fcdc92 + md5: 81a790d5f292f459d87533e5467fbdf9 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 12569626 + timestamp: 1759964668012 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-13.4.0-hd10b1b9_107.conda + sha256: d80e0ee6b4211bcde7f5ebc83208c698090a185929c17af0a15b4a86f05c416f + md5: 9cd5f9e38072dbc65cdc53717ef5d0e2 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 11416503 + timestamp: 1759973472959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + sha256: 024fd46ac3ea8032a5ec3ea7b91c4c235701a8bf0e6520fe5e6539992a6bd05f + md5: f627678cf829bd70bccf141a19c3ad3e + depends: + - libstdcxx 15.2.0 h8f9b012_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29343 + timestamp: 1759968157195 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda + sha256: 26fc1bdb39042f27302b363785fea6f6b9607f9c2f5eb949c6ae0bdbb8599574 + md5: 9e5deec886ad32f3c6791b3b75c78681 + depends: + - libstdcxx 15.2.0 h3f4de04_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29341 + timestamp: 1759967498023 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 + md5: 80c07c68d2f6870250959dcc95b209d1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + size: 37135 + timestamp: 1758626800002 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda + sha256: 7aed28ac04e0298bf8f7ad44a23d6f8ee000aa0445807344b16fceedc67cce0f + md5: 3a68e44fdf2a2811672520fdd62996bd + depends: + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + size: 39172 + timestamp: 1758626850999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda + sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b + md5: 0f03292cc56bf91a077a134ea8747118 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + size: 895108 + timestamp: 1753948278280 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda + sha256: 7a0fb5638582efc887a18b7d270b0c4a6f6e681bf401cab25ebafa2482569e90 + md5: 8e62bf5af966325ee416f19c6f14ffa3 + depends: + - libgcc >=14 + license: MIT + license_family: MIT + size: 629238 + timestamp: 1753948296190 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda + sha256: d90dd0eee6f195a5bd14edab4c5b33be3635b674b0b6c010fb942b956aa2254c + md5: fbfc6cf607ae1e1e498734e256561dc3 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 422612 + timestamp: 1753948458902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + sha256: 042c7488ad97a5629ec0a991a8b2a3345599401ecc75ad6a5af73b60e6db9689 + md5: c0d87c3c8e075daf1daf6c31b53e8083 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 421195 + timestamp: 1753948426421 +- conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda + sha256: f03dc82e6fb1725788e73ae97f0cd3d820d5af0d351a274104a0767035444c59 + md5: 31e1545994c48efc3e6ea32ca02a8724 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + size: 297087 + timestamp: 1753948490874 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + size: 36621 + timestamp: 1759768399557 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h23bb396_0.conda + sha256: a40ec252d9c50fee7cb0b15be7e358a10888c89dadb23deac254789fcb047de7 + md5: 65dd26de1eea407dda59f0da170aed22 + depends: + - __osx >=10.13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h0ad03eb_0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + license: MIT + license_family: MIT + size: 40433 + timestamp: 1761016207984 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h9329255_0.conda + sha256: c409e384ddf5976a42959265100d6b2c652017d250171eb10bae47ef8166193f + md5: fb5ce61da27ee937751162f86beba6d1 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h0ff4647_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 40607 + timestamp: 1761016108361 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h5d26750_0.conda + sha256: f507960adf64ee9c9c7b7833d8b11980765ebd2bf5345f73d5a3b21b259eaed5 + md5: 9176ee05643a1bfe7f2e7b4c921d2c3d + depends: + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.1 h692994f_0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - icu <0.0a0 + license: MIT + license_family: MIT + size: 43209 + timestamp: 1761016354235 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-h0ad03eb_0.conda + sha256: 00ddbcfbd0318f3c5dbf2b1e1bc595915efe2a61e73b844df422b11fec39d7d8 + md5: 8487998051f3d300fef701a49c27f282 + depends: + - __osx >=10.13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - icu <0.0a0 + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 493432 + timestamp: 1761016183078 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda + sha256: ebe2dd9da94280ad43da936efa7127d329b559f510670772debc87602b49b06d + md5: 438c97d1e9648dd7342f86049dd44638 + depends: + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 464952 + timestamp: 1761016087733 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h692994f_0.conda + sha256: 04129dc2df47a01c55e5ccf8a18caefab94caddec41b3b10fbc409e980239eb9 + md5: 70ca4626111579c3cd63a7108fe737f9 + depends: + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - icu <0.0a0 + - libxml2 2.15.1 + license: MIT + license_family: MIT + size: 518135 + timestamp: 1761016320405 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 55476 + timestamp: 1727963768015 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.6-h472b3d1_0.conda + sha256: 589a5d1c7af859096e19acd7665534a63b6d9ead2684f5c906747052f56adb9c + md5: d002bb48f35085405e90a62ffeebebfb + depends: + - __osx >=10.13 + constrains: + - openmp 21.1.6|21.1.6.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 310985 + timestamp: 1763529609247 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.6-h4a912ad_0.conda + sha256: 51ebeacae9225649e2c3bbfc9ed2ed690400b78ba79d0d3ee9ff428e8b951fed + md5: 4a274d80967416bce3c7d89bf43923ec + depends: + - __osx >=11.0 + constrains: + - openmp 21.1.6|21.1.6.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 286206 + timestamp: 1763529774822 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.6-h4fa8253_0.conda + sha256: 59bffd08dab73dbb42c6dc433db4f30bdaff7b63baf53217c2d6eda965a635c5 + md5: 92db366ac0d445e2a3f939b50a9437d1 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - openmp 21.1.6|21.1.6.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 347152 + timestamp: 1763549264124 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_hc369343_10.conda + sha256: c059b3fd7f1556a56fa05cac59f47b604a3e0433316f3a99dae99d75aa18d20b + md5: a75abb84bd173d9438e7f9c2a679f155 + depends: + - __osx >=10.13 + - libllvm18 18.1.8 default_hc369343_10 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools-18 18.1.8 default_hc369343_10 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - llvmdev 18.1.8 + - clang 18.1.8 + - clang-tools 18.1.8 + - llvm 18.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 93443 + timestamp: 1757362587080 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18.1.8-default_h3f38c9c_10.conda + sha256: deb09342a6943025197d76c82420fb2a19a411eaf05322a8f2f563063c673f90 + md5: c010e5a8a0892457fcde7810b794803a + depends: + - __osx >=11.0 + - libllvm18 18.1.8 default_h3f38c9c_10 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools-18 18.1.8 default_h3f38c9c_10 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - clang 18.1.8 + - llvmdev 18.1.8 + - clang-tools 18.1.8 + - llvm 18.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 93637 + timestamp: 1757359985731 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18-18.1.8-default_hc369343_10.conda + sha256: 475a8582f85eca652d7d3e19d4a9ea52495023877ed599fbe41c85143635a4d5 + md5: 860cf69caefcb6bc7885480bfe0d384d + depends: + - __osx >=10.13 + - libllvm18 18.1.8 default_hc369343_10 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 25194301 + timestamp: 1757362438161 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18-18.1.8-default_h3f38c9c_10.conda + sha256: 6934265cfdf38574560ab1812ae2d1d73ded108c71aa6f503b86128d9f7729a6 + md5: 5e036dc20439a44f77f65fa4b975ae77 + depends: + - __osx >=11.0 + - libllvm18 18.1.8 default_h3f38c9c_10 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 23454430 + timestamp: 1757359894665 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda + sha256: 3c432e77720726c6bd83e9ee37ac8d0e3dd7c4cf9b4c5805e1d384025f9e9ab6 + md5: c83ec81713512467dfe1b496a8292544 + depends: + - llvm-openmp >=21.1.4 + - tbb >=2022.2.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + size: 99909095 + timestamp: 1761668703167 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda + sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 + md5: 182afabe009dc78d8b73100255ee6868 + depends: + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 926034 + timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + sha256: ea4a5d27ded18443749aefa49dc79f6356da8506d508b5296f60b8d51e0c4bd9 + md5: ced34dd9929f491ca6dab6a2927aff25 + depends: + - __osx >=10.13 + license: X11 AND BSD-3-Clause + size: 822259 + timestamp: 1738196181298 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda + sha256: 6f7d59dbec0a7b00bf5d103a4306e8886678b796ff2151b62452d4582b2a53fb + md5: b518e9e92493721281a60fa975bddc65 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: Apache-2.0 + license_family: APACHE + size: 186323 + timestamp: 1763688260928 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.13.2-hdc560ac_0.conda + sha256: 45fbc7c8c44681f5cefba1e5b26ca504a4485b000c5dfaa31cec0b7bc78d0de4 + md5: 8b5222a41b5d51fb1a5a2c514e770218 + depends: + - libstdcxx >=14 + - libgcc >=14 + license: Apache-2.0 + license_family: APACHE + size: 182666 + timestamp: 1763688214250 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda + sha256: 1646832e3c2389595569ab9a6234c119a4dedf6f4e55532a8bf07edab7f8037d + md5: afda563484aa0017278866707807a335 + depends: + - libcxx >=19 + - __osx >=10.13 + license: Apache-2.0 + license_family: APACHE + size: 178071 + timestamp: 1763688235442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda + sha256: 18d33c17b28d4771fc0b91b7b963c9ce31aca0a9af7dc8e9ee7c974bb207192c + md5: 175809cc57b2c67f27a0f238bd7f069d + depends: + - __osx >=11.0 + - libcxx >=19 + license: Apache-2.0 + license_family: APACHE + size: 164450 + timestamp: 1763688228613 +- conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda + sha256: e41a945c34a5f0bd2109b73a65486cd93023fa0a9bcba3ef98f9a3da40ba1180 + md5: 7ecb9f2f112c66f959d2bb7dbdb89b67 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: Apache-2.0 + license_family: APACHE + size: 309417 + timestamp: 1763688227932 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_0.conda + sha256: 4fa3b8b80dd848a70f679b31d74d6fb28f9c4de9cd81086aa8e10256e9de20d1 + md5: 6d2cff81447b8fe424645d7dd3bde8bf + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 8983459 + timestamp: 1763350996398 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.3.5-py314haac167e_0.conda + sha256: e7015a79fb2d8d0573ae1b55db71792292285a86111ccf2683872db848734db8 + md5: ea4652f80053fb52748bc10e0b401b2f + depends: + - python + - libgcc >=14 + - python 3.14.* *_cp314 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.14.* *_cp314 + - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7815328 + timestamp: 1763351321550 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hf08249b_0.conda + sha256: 77e0b2ddb433ac23ca9d587c37a8f6da9baee3888c34d19e530fe8cbaaf49bdc + md5: 5c9e4bc0c170115fd3602d7377c9e8da + depends: + - python + - libcxx >=19 + - __osx >=10.13 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 8140127 + timestamp: 1763350902772 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314h5b5928d_0.conda + sha256: a8731e3e31013be69cb585dbc57cb225437bb0c945ddce9a550c1cd10b6fad37 + md5: e126981f973ddc2510d7a249c5b69533 + depends: + - python + - python 3.14.* *_cp314 + - __osx >=11.0 + - libcxx >=19 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + - liblapack >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6861174 + timestamp: 1763350930747 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_0.conda + sha256: e64d4c049c9c69ef02d924ac1750b32e08f57732cbc6a3fe11794f3169b59d14 + md5: ddc6687a8f402695bd22229aaf69fb26 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7588219 + timestamp: 1763350950306 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda + sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d + md5: 9ee58d5c534af06558933af3c845a780 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3165399 + timestamp: 1762839186699 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda + sha256: 8dd3b4c31fe176a3e51c5729b2c7f4c836a2ce3bd5c82082dc2a503ba9ee0af3 + md5: 7624c6e01aecba942e9115e0f5a2af9d + depends: + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + size: 3705625 + timestamp: 1762841024958 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda + sha256: 36fe9fb316be22fcfb46d5fa3e2e85eec5ef84f908b7745f68f768917235b2d5 + md5: 3f50cdf9a97d0280655758b735781096 + depends: + - __osx >=10.13 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 2778996 + timestamp: 1762840724922 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda + sha256: ebe93dafcc09e099782fe3907485d4e1671296bc14f8c383cb6f3dfebb773988 + md5: b34dc4172653c13dcf453862f251af2b + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3108371 + timestamp: 1762839712322 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda + sha256: 6d72d6f766293d4f2aa60c28c244c8efed6946c430814175f959ffe8cab899b3 + md5: 84f8fb4afd1157f59098f618cd2437e4 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + size: 9440812 + timestamp: 1762841722179 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + build_number: 102 + sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 + md5: 0a19d2cc6eb15881889b0c6fa7d6a78d + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 36681389 + timestamp: 1761176838143 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda + build_number: 102 + sha256: a930ea81356110d84993527772577276af034d689e7333f937005ee527bd11bf + md5: c2bbf19a6b366d492f9137257ad19416 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libuuid >=2.41.2,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 37128758 + timestamp: 1761175738259 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.0-hf88997e_102_cp314.conda + build_number: 102 + sha256: 2470866eee70e75d6be667aa537424b63f97c397a0a90f05f2bab347b9ed5a51 + md5: 7917d1205eed3e72366a3397dca8a2af + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 14427639 + timestamp: 1761177864469 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda + build_number: 102 + sha256: 3ca1da026fe5df8a479d60e1d3ed02d9bc50fcbafd5f125d86abe70d21a34cc7 + md5: a9ff09231c555da7e30777747318321b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 13590581 + timestamp: 1761177195716 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.0-h4b44e0e_102_cp314.conda + build_number: 102 + sha256: 2b8c8fcafcc30690b4c5991ee28eb80c962e50e06ce7da03b2b302e2d39d6a81 + md5: 3e1ce2fb0f277cebcae01a3c418eb5e2 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.7.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.1,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - python_abi 3.14.* *_cp314 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + size: 16706286 + timestamp: 1761175439068 + python_site_packages_path: Lib/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda + sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 + md5: c0f08fc2737967edde1a272d4bf41ed9 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 291806 + timestamp: 1740380591358 +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda + sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 + md5: 342570f8e02f2f022147a7f841475784 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 256712 + timestamp: 1740379577668 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda + sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 + md5: 63ef3f6e6d6d5c589e64f11263dc5676 + depends: + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 252359 + timestamp: 1740379663071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda + sha256: d5c73079c1dd2c2a313c3bfd81c73dbd066b7eb08d213778c8bff520091ae894 + md5: c1c9b02933fdb2cfb791d936c20e887e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 193775 + timestamp: 1748644872902 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.6-h86ecc28_1.conda + sha256: 0fe6f40213f2d8af4fcb7388eeb782a4e496c8bab32c189c3a34b37e8004e5a4 + md5: 745d02c0c22ea2f28fbda2cb5dbec189 + depends: + - libgcc >=13 + license: MIT + license_family: MIT + size: 207475 + timestamp: 1748644952027 +- conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda + sha256: 65c946fc5a9bb71772a7ac9bad64ff08ac07f7d5311306c2dcc1647157b96706 + md5: d0fcaaeff83dd4b6fb035c2f36df198b + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 185180 + timestamp: 1748644989546 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda + sha256: f4957c05f4fbcd99577de8838ca4b5b1ae4b400a44be647a0159c14f85b9bfc0 + md5: 029e812c8ae4e0d4cf6ff4f7d8dc9366 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 185448 + timestamp: 1748645057503 +- conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 + sha256: 46fdeadf8f8d725819c4306838cdfd1099cd8fe3e17bd78862a5dfdcd6de61cf + md5: fbfb84b9de9a6939cb165c02c69b1865 + depends: + - openssl >=3.0.0,<4.0a0 + license: MIT + license_family: MIT + size: 213817 + timestamp: 1643442169866 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 + sha256: 70791ae00a3756830cb50451db55f63e2a42a2fa2a8f1bab1ebd36bbb7d55bff + md5: 4a2cac04f86a4540b8c9b8d8f597848f + depends: + - openssl >=3.0.0,<4.0a0 + license: MIT + license_family: MIT + size: 210264 + timestamp: 1643442231687 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda + sha256: 0053c17ffbd9f8af1a7f864995d70121c292e317804120be4667f37c92805426 + md5: 1bad93f0aa428d618875ef3a588a889e + depends: + - __glibc >=2.28 + - kernel-headers_linux-64 4.18.0 he073ed8_8 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 24210909 + timestamp: 1752669140965 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda + sha256: 8ab275b5c5fbe36416c7d3fb8b71241eca2d024e222361f8e15c479f17050c0e + md5: 1263d6ac8dadaea7c60b29f1b4af45b8 + depends: + - __glibc >=2.28 + - kernel-headers_linux-aarch64 4.18.0 h05a177a_8 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + size: 23863575 + timestamp: 1752669129101 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1300.6.5-h390ca13_0.conda + sha256: f97372a1c75b749298cb990405a690527e8004ff97e452ed2c59e4bc6a35d132 + md5: c6ee25eb54accb3f1c8fc39203acfaf1 + depends: + - __osx >=10.13 + - libcxx >=17.0.0.a0 + - ncurses >=6.5,<7.0a0 + license: NCSA + license_family: MIT + size: 221236 + timestamp: 1725491044729 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda + sha256: 37cd4f62ec023df8a6c6f9f6ffddde3d6620a83cbcab170a8fff31ef944402e5 + md5: b703bc3e6cba5943acf0e5f987b5d0e2 + depends: + - __osx >=11.0 + - libcxx >=17.0.0.a0 + - ncurses >=6.5,<7.0a0 + license: NCSA + license_family: MIT + size: 207679 + timestamp: 1725491499758 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda + sha256: c31cac57913a699745d124cdc016a63e31c5749f16f60b3202414d071fc50573 + md5: 17c38aaf14c640b85c4617ccb59c1146 + depends: + - libhwloc >=2.12.1,<2.12.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + size: 155714 + timestamp: 1762510341121 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda + sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 + md5: 86bc20552bf46075e3d92b67f089172d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + size: 3284905 + timestamp: 1763054914403 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda + sha256: 154e73f6269f92ad5257aa2039278b083998fd19d371e150f307483fb93c07ae + md5: 631db4799bc2bfe4daccf80bb3cbc433 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + size: 3333495 + timestamp: 1763059192223 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda + sha256: 0d0b6cef83fec41bc0eb4f3b761c4621b7adfb14378051a8177bd9bb73d26779 + md5: bd9f1de651dbd80b51281c694827f78f + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3262702 + timestamp: 1763055085507 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda + sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 + md5: a73d54a5abba6543cb2f0af1bfbd6851 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3125484 + timestamp: 1763055028377 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda + sha256: 4581f4ffb432fefa1ac4f85c5682cc27014bcd66e7beaa0ee330e927a7858790 + md5: 7cb36e506a7dba4817970f8adb6396f9 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3472313 + timestamp: 1763055164278 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 + md5: 4222072737ccff51314b5ece9c7d6f5a + license: LicenseRef-Public-Domain + size: 122968 + timestamp: 1742727099393 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 694692 + timestamp: 1756385147981 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda + sha256: 82250af59af9ff3c6a635dd4c4764c631d854feb334d6747d356d949af44d7cf + md5: ef02bbe151253a72b8eda264a935db66 + depends: + - vc14_runtime >=14.42.34433 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 18861 + timestamp: 1760418772353 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda + sha256: e3a3656b70d1202e0d042811ceb743bd0d9f7e00e2acdf824d231b044ef6c0fd + md5: 378d5dcec45eaea8d303da6f00447ac0 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_32 + constrains: + - vs2015_runtime 14.44.35208.* *_32 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 682706 + timestamp: 1760418629729 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda + sha256: f3790c88fbbdc55874f41de81a4237b1b91eab75e05d0e58661518ff04d2a8a1 + md5: 58f67b437acbf2764317ba273d731f1d + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_32 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 114846 + timestamp: 1760418593847 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_32.conda + sha256: 0694683d118d0d8448cd997fe776dbe33858c0f3957d9886b2b855220babe895 + md5: c61ef6a81142ee3bd6c3b0c9a0c91e35 + depends: + - vswhere + constrains: + - vs_win-64 2022.14 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 22206 + timestamp: 1760418596437 +- conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + sha256: b72270395326dc56de9bd6ca82f63791b3c8c9e2b98e25242a9869a4ca821895 + md5: f622897afff347b715d046178ad745a5 + depends: + - __win + license: MIT + license_family: MIT + size: 238764 + timestamp: 1745560912727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 567578 + timestamp: 1742433379869 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda + sha256: 0812e7b45f087cfdd288690ada718ce5e13e8263312e03b643dd7aa50d08b51b + md5: 5be90c5a3e4b43c53e38f50a85e11527 + depends: + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 551176 + timestamp: 1742433378347 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda + sha256: c171c43d0c47eed45085112cb00c8c7d4f0caa5a32d47f2daca727e45fb98dca + md5: cd60a4a5a8d6a476b30d8aa4bb49251a + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 485754 + timestamp: 1742433356230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda + sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 + md5: e6f69c7bcccdefa417f056fa593b40f0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 399979 + timestamp: 1742433432699 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda + sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 + md5: 21f56217d6125fb30c3c3f10c786d751 + depends: + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 354697 + timestamp: 1742433568506 diff --git a/pixi.toml b/pixi.toml new file mode 100644 index 00000000..11d7ef6c --- /dev/null +++ b/pixi.toml @@ -0,0 +1,29 @@ +[workspace] +authors = [ + "Insight Software Consortium <>", + "Matt McCormick ", + "Jean-Christophe Fillion-Robin ", + "Tom Birdsong ", + "Hans J. Johnson ", + "Dženan Zukić ", + "Simon Rit ", + "Francois Budin ", + "LucasGandel ", + "Davis Marc Vigneault ", + "Jon Haitz Legarreta Gorroño ", + "Lee Newberg " +] + +channels = ["conda-forge"] +name = "ITKPythonPackage" +platforms = ["linux-64", "linux-aarch64", "win-64", "osx-64", "osx-arm64"] +version = "0.1.0" + +[tasks] + +[dependencies] +doxygen = ">=1.13.2,<2" +ninja = ">=1.13.2,<2" +cmake = ">=4.2.0,<5" +numpy = ">=2.3.5,<3" +cxx-compiler = "==1.10.0" From 99e247abcb8af6ae9868a699affb976d7e0e045b Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 06:53:06 -0600 Subject: [PATCH 26/45] ENH: Remove redundant setting of VENVS in two scripts. --- scripts/macpython-build-common.sh | 4 ++++ scripts/macpython-build-wheels.sh | 17 ----------------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/scripts/macpython-build-common.sh b/scripts/macpython-build-common.sh index 77c373ab..24a3d325 100644 --- a/scripts/macpython-build-common.sh +++ b/scripts/macpython-build-common.sh @@ -57,9 +57,11 @@ else PYBINARIES+=(${MACPYTHON_PY_PREFIX}/*${version}*) done fi +# # ----------------------------------------------------------------------- # Remove previous virtualenv's +rm -rf ${script_dir}/../venvs VENVS=() mkdir -p ${SCRIPT_DIR}/../venvs for PYBIN in "${PYBINARIES[@]}"; do @@ -68,6 +70,8 @@ for PYBIN in "${PYBINARIES[@]}"; do fi py_mm=$(basename ${PYBIN}) _VENV_DIR=${SCRIPT_DIR}/../venvs/${py_mm} + VIRTUALENV_EXECUTABLE="${PYBIN}/bin/python3 -m venv" + ${VIRTUALENV_EXECUTABLE} ${_VENV_DIR} VENVS+=(${_VENV_DIR}) done diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index b2e5e127..49e4517a 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -38,23 +38,6 @@ source "${package_env_file}" source "${script_dir}/macpython-build-common.sh" -# ----------------------------------------------------------------------- -# Remove previous virtualenv's -rm -rf ${script_dir}/../venvs -# Create virtualenv's -VENVS=() -mkdir -p ${script_dir}/../venvs -for PYBIN in "${PYBINARIES[@]}"; do - if [[ $(basename $PYBIN) = "Current" ]]; then - continue - fi - py_mm=$(basename ${PYBIN}) - VENV=${script_dir}/../venvs/${py_mm} - VIRTUALENV_EXECUTABLE="${PYBIN}/bin/python3 -m venv" - ${VIRTUALENV_EXECUTABLE} ${VENV} - VENVS+=(${VENV}) -done - VENV="${VENVS[0]}" Python3_EXECUTABLE=${VENV}/bin/python3 ${Python3_EXECUTABLE} -m pip install --upgrade pip From dd7d1b319fc4e2519cb96119de117d2177217184 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 07:05:01 -0600 Subject: [PATCH 27/45] ENH: Add explicit build/source directory to cmake Add explicit setting of ITK_SOURCE_DIR to the build configuration. --- scripts/macpython-build-wheels.sh | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 49e4517a..4c92d7ce 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -65,19 +65,23 @@ else tbb_dir="NOT-FOUND" fi -mkdir -p ITK-source -pushd ITK-source > /dev/null 2>&1 - ${CMAKE_EXECUTABLE} -DITKPythonPackage_BUILD_PYTHON:PATH=0 \ - -DITKPythonPackage_USE_TBB:BOOL=${use_tbb} \ - -G Ninja \ - -DCMAKE_BUILD_TYPE:STRING=${build_type} \ - -DCMAKE_MAKE_PROGRAM:FILEPATH=${NINJA_EXECUTABLE} \ - -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ - -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ - ${CMAKE_COMPILER_ARGS} \ - ${script_dir}/../ - ${NINJA_EXECUTABLE} -j$n_processors -l$n_processors -popd > /dev/null 2>&1 +# ----------------------------------------------------------------------- +IPP_BUILD_DIR=${_ipp_dir}/ITK-source +mkdir -p ${IPP_BUILD_DIR} +echo "CMAKE VERSION: $(${CMAKE_EXECUTABLE} --version)" +${CMAKE_EXECUTABLE} -DITKPythonPackage_BUILD_PYTHON:PATH=0 \ + -DITKPythonPackage_USE_TBB:BOOL=${use_tbb} \ + -G Ninja \ + -DCMAKE_BUILD_TYPE:STRING=${build_type} \ + -DCMAKE_MAKE_PROGRAM:FILEPATH=${NINJA_EXECUTABLE} \ + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ + -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ + -DITK_SOURCE_DIR=${ITK_SOURCE_DIR} \ + ${CMAKE_COMPILER_ARGS} \ + -S ${_ipp_dir} \ + -B ${IPP_BUILD_DIR} \ + \ + && ${NINJA_EXECUTABLE} -C ${IPP_BUILD_DIR} -j$n_processors -l$n_processors # Compile wheels re-using standalone project and archive cache for VENV in "${VENVS[@]}"; do From 19ff16ef727971193fc3e3e88d0b3f7a1d3995df Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 07:31:12 -0600 Subject: [PATCH 28/45] ENH: Add ability to specify that ccache is enabled ccache can accelerate rebuilds. The first build may take slightly longer, but rebuilds can be significantly faster. When building for multiple python versions, many of the build files can take advantage of the ccache. --- generate_build_environment.sh | 3 +++ scripts/macpython-build-common.sh | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/generate_build_environment.sh b/generate_build_environment.sh index d899e67a..2d67eafb 100755 --- a/generate_build_environment.sh +++ b/generate_build_environment.sh @@ -288,6 +288,9 @@ NO_SUDO=${NO_SUDO:=0} # =1 <- Leave tempoary build files in place after completion, 0 <- remove temporary build files ITK_MODULE_NO_CLEANUP=${ITK_MODULE_NO_CLEANUP:=1} +# - "USE_CCACHE": Option to indicate that ccache should be used +# =1 <- Set cmake settings to use ccache for acclerating rebuilds, 0 <- no ccache usage +USE_CCACHE=${USE_CCACHE:=0} DEFAULT_ENV_SETTINGS if [[ "$(uname)" == "Linux" ]]; then diff --git a/scripts/macpython-build-common.sh b/scripts/macpython-build-common.sh index 24a3d325..640f1584 100644 --- a/scripts/macpython-build-common.sh +++ b/scripts/macpython-build-common.sh @@ -85,6 +85,12 @@ if [ ! -z "${CC}" ]; then CMAKE_COMPILER_ARGS="${CMAKE_COMPILER_ARGS} -DCMAKE_C_COMPILER:STRING=${CC}" fi +if [[ ${USE_CCACHE} == "ON" ]];then + # CCACHE_BASEDIR allows cache hits when only the base directory changes + export CCACHE_BASEDIR=${ITK_SOURCE_DIR} + CMAKE_COMPILER_ARGS="${CMAKE_COMPILER_ARGS} -DCMAKE_C_COMPILER_LAUNCHER=$(which ccache) -DCMAKE_CXX_COMPILER_LAUNCHER=$(which ccache)" +fi + # ----------------------------------------------------------------------- # Ensure that requirements are met brew update From 232a692fd36e136bf6c03ae0b6b13652bdf3c168 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 10:03:19 -0600 Subject: [PATCH 29/45] ENH: Force included scripts to be sourced, not executed --- scripts/macpython-build-common.sh | 9 ++++++--- scripts/macpython-build-module-deps.sh | 6 +++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/scripts/macpython-build-common.sh b/scripts/macpython-build-common.sh index 640f1584..bb85b610 100644 --- a/scripts/macpython-build-common.sh +++ b/scripts/macpython-build-common.sh @@ -3,7 +3,10 @@ set -e -x -SCRIPT_DIR=$(cd $(dirname $0) || exit 1; pwd) +if [ "${BASH_SOURCE[0]}" == "${0}" ]; then + echo "ERROR: This script must be sourced with _ipp_dir predefined, not executed as a script." + exit 1 +fi MACPYTHON_PY_PREFIX=/Library/Frameworks/Python.framework/Versions @@ -63,13 +66,13 @@ fi # Remove previous virtualenv's rm -rf ${script_dir}/../venvs VENVS=() -mkdir -p ${SCRIPT_DIR}/../venvs +mkdir -p ${_ipp_dir}/venvs for PYBIN in "${PYBINARIES[@]}"; do if [[ $(basename $PYBIN) = "Current" ]]; then continue fi py_mm=$(basename ${PYBIN}) - _VENV_DIR=${SCRIPT_DIR}/../venvs/${py_mm} + _VENV_DIR=${_ipp_dir}/venvs/${py_mm} VIRTUALENV_EXECUTABLE="${PYBIN}/bin/python3 -m venv" ${VIRTUALENV_EXECUTABLE} ${_VENV_DIR} VENVS+=(${_VENV_DIR}) diff --git a/scripts/macpython-build-module-deps.sh b/scripts/macpython-build-module-deps.sh index 75062611..2c11b939 100644 --- a/scripts/macpython-build-module-deps.sh +++ b/scripts/macpython-build-module-deps.sh @@ -20,7 +20,11 @@ # ENVIRONMENT VARIABLES ######################################################################## -script_dir=$(cd $(dirname $0) || exit 1; pwd) +if [ "${BASH_SOURCE[0]}" == "${0}" ]; then + echo "ERROR: This script must be sourced with _ipp_dir predefined, not executed as a script." + exit 1 +fi + if [[ ! -f "${script_dir}/macpython-download-cache-and-build-module-wheels.sh" ]]; then echo "Could not find download script to use for building module dependencies!" exit 1 From 2cad8beee20defbd1a5d12e6ce099207459c4cfd Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 07:51:27 -0600 Subject: [PATCH 30/45] STYLE: Use named directory for _ipp_dir explicitly --- scripts/macpython-build-wheels.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 4c92d7ce..52bb0029 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -93,16 +93,16 @@ for VENV in "${VENVS[@]}"; do echo "Python3_EXECUTABLE:${Python3_EXECUTABLE}" echo "Python3_INCLUDE_DIR:${Python3_INCLUDE_DIR}" - ${Python3_EXECUTABLE} -m pip install --upgrade -r ${script_dir}/../requirements-dev.txt + ${Python3_EXECUTABLE} -m pip install --upgrade -r ${_ipp_dir}/requirements-dev.txt if [[ $(arch) == "arm64" ]]; then plat_name="macosx-15.0-arm64" - build_path="${script_dir}/../ITK-${py_mm}-macosx_arm64" + build_path="${_ipp_dir}/ITK-${py_mm}-macosx_arm64" else plat_name="macosx-15.0-x86_64" - build_path="${script_dir}/../ITK-${py_mm}-macosx_x86_64" + build_path="${_ipp_dir}/ITK-${py_mm}-macosx_x86_64" fi - source_path=${script_dir}/../ITK-source/ITK + source_path=${_ipp_dir}/ITK-source/ITK # Clean up previous invocations rm -rf ${build_path} @@ -153,7 +153,7 @@ for VENV in "${VENVS[@]}"; do ${Python3_EXECUTABLE} -m build \ --verbose \ --wheel \ - --outdir dist \ + --outdir ${_ipp_dir}/dist \ --no-isolation \ --skip-dependency-check \ --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ @@ -167,7 +167,7 @@ for VENV in "${VENVS[@]}"; do --config-setting=cmake.define.Python3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIR} \ ${CMAKE_OPTIONS//'-D'/'--config-setting=cmake.define.'} \ ${CMAKE_COMPILER_ARGS//'-D'/'--config-setting=cmake.define.'} \ - . \ + ${_ipp_dir} \ || exit 1 done @@ -178,7 +178,7 @@ for VENV in "${VENVS[@]}"; do done if [[ $(arch) != "arm64" ]]; then - for wheel in dist/itk_*.whl; do + for wheel in ${_ipp_dir}/dist/itk_*.whl; do echo "Delocating $wheel" ${DELOCATE_LISTDEPS} $wheel # lists library dependencies ${DELOCATE_WHEEL} $wheel # copies library dependencies into wheel @@ -187,9 +187,9 @@ fi for VENV in "${VENVS[@]}"; do ${VENV}/bin/pip install numpy - ${VENV}/bin/pip install itk --no-cache-dir --no-index -f ${script_dir}/../dist + ${VENV}/bin/pip install itk --no-cache-dir --no-index -f ${_ipp_dir}/dist (cd $HOME && ${VENV}/bin/python -c 'import itk;') (cd $HOME && ${VENV}/bin/python -c 'import itk; image = itk.Image[itk.UC, 2].New()') (cd $HOME && ${VENV}/bin/python -c 'import itkConfig; itkConfig.LazyLoading = False; import itk;') - (cd $HOME && ${VENV}/bin/python ${script_dir}/../docs/code/test.py ) + (cd $HOME && ${VENV}/bin/python ${_ipp_dir}/docs/code/test.py ) done From 60fffd83100f4e097ed1199e0908ded190ff2be7 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 07:52:38 -0600 Subject: [PATCH 31/45] BUG: Use MACOSX_DEPLOYMENT_TARGET setting for plat_name --- scripts/macpython-build-wheels.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 52bb0029..51449a29 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -96,10 +96,10 @@ for VENV in "${VENVS[@]}"; do ${Python3_EXECUTABLE} -m pip install --upgrade -r ${_ipp_dir}/requirements-dev.txt if [[ $(arch) == "arm64" ]]; then - plat_name="macosx-15.0-arm64" + plat_name="macosx-${MACOSX_DEPLOYMENT_TARGET}-arm64" build_path="${_ipp_dir}/ITK-${py_mm}-macosx_arm64" else - plat_name="macosx-15.0-x86_64" + plat_name="macosx-${MACOSX_DEPLOYMENT_TARGET}-x86_64" build_path="${_ipp_dir}/ITK-${py_mm}-macosx_x86_64" fi source_path=${_ipp_dir}/ITK-source/ITK From b1fdabaf134afc3f7c52a556478f62966fc339c6 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 07:54:05 -0600 Subject: [PATCH 32/45] ENH: Respect ITK_MODULE_NO_CLEANUP setting. --- scripts/macpython-build-wheels.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 51449a29..3d7bf099 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -105,7 +105,9 @@ for VENV in "${VENVS[@]}"; do source_path=${_ipp_dir}/ITK-source/ITK # Clean up previous invocations - rm -rf ${build_path} + if [ "${ITK_MODULE_NO_CLEANUP:-0}" -eq 0 ]; then + rm -rf ${build_path} + fi echo "#" echo "# Build multiple ITK wheels" @@ -172,9 +174,11 @@ for VENV in "${VENVS[@]}"; do done # Remove unnecessary files for building against ITK - find ${build_path} -name '*.cpp' -delete -o -name '*.xml' -delete - rm -rf ${build_path}/Wrapping/Generators/castxml* - find ${build_path} -name '*.o' -delete + if [ "${ITK_MODULE_NO_CLEANUP:-0}" -eq 0 ]; then + find ${build_path} -name '*.cpp' -delete -o -name '*.xml' -delete + rm -rf ${build_path}/Wrapping/Generators/castxml* + find ${build_path} -name '*.o' -delete + fi done if [[ $(arch) != "arm64" ]]; then From dd758a3c8da8c948903b7b3c12fa2f23192d7aa5 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 07:55:39 -0600 Subject: [PATCH 33/45] BUG: Use centrally defined ITK_SOURCE_DIR instead of source_path alias --- scripts/macpython-build-wheels.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 3d7bf099..a1233149 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -102,7 +102,6 @@ for VENV in "${VENVS[@]}"; do plat_name="macosx-${MACOSX_DEPLOYMENT_TARGET}-x86_64" build_path="${_ipp_dir}/ITK-${py_mm}-macosx_x86_64" fi - source_path=${_ipp_dir}/ITK-source/ITK # Clean up previous invocations if [ "${ITK_MODULE_NO_CLEANUP:-0}" -eq 0 ]; then @@ -119,7 +118,7 @@ for VENV in "${VENVS[@]}"; do && cd ${build_path} \ && cmake \ -DCMAKE_BUILD_TYPE:STRING=${build_type} \ - -DITK_SOURCE_DIR:PATH=${source_path} \ + -DITK_SOURCE_DIR:PATH=${ITK_SOURCE_DIR} \ -DITK_BINARY_DIR:PATH=${build_path} \ -DBUILD_TESTING:BOOL=OFF \ -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ @@ -141,7 +140,7 @@ for VENV in "${VENVS[@]}"; do -DTBB_DIR:PATH=${tbb_dir} \ ${CMAKE_OPTIONS} \ -G Ninja \ - ${source_path} \ + ${ITK_SOURCE_DIR} \ && ninja -j$n_processors -l$n_processors \ || exit 1 ) @@ -158,7 +157,7 @@ for VENV in "${VENVS[@]}"; do --outdir ${_ipp_dir}/dist \ --no-isolation \ --skip-dependency-check \ - --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${source_path} \ + --config-setting=cmake.define.ITK_SOURCE_DIR:PATH=${ITK_SOURCE_DIR} \ --config-setting=cmake.define.ITK_BINARY_DIR:PATH=${build_path} \ --config-setting=cmake.define.CMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ --config-setting=cmake.define.CMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ From 7a472b81fc23a60e17e3afb6d2cf538410d73be1 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 07:56:43 -0600 Subject: [PATCH 34/45] ENH: Adding explicit build and source directories to cmake. --- scripts/macpython-build-wheels.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index a1233149..c5e72618 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -140,8 +140,9 @@ for VENV in "${VENVS[@]}"; do -DTBB_DIR:PATH=${tbb_dir} \ ${CMAKE_OPTIONS} \ -G Ninja \ - ${ITK_SOURCE_DIR} \ - && ninja -j$n_processors -l$n_processors \ + -S ${ITK_SOURCE_DIR} \ + -B ${build_path} \ + && ninja -C ${build_path} -j$n_processors -l$n_processors \ || exit 1 ) From ce840de49f90feeda3f713ca87da02326964c08b Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 07:58:42 -0600 Subject: [PATCH 35/45] DOC: Provide build diagnostics for tracking script progress. --- scripts/macpython-build-wheels.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index c5e72618..4dff9017 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -116,6 +116,7 @@ for VENV in "${VENVS[@]}"; do ( mkdir -p ${build_path} \ && cd ${build_path} \ + && echo "CMAKE VERSION: $(cmake --version)" \ && cmake \ -DCMAKE_BUILD_TYPE:STRING=${build_type} \ -DITK_SOURCE_DIR:PATH=${ITK_SOURCE_DIR} \ @@ -146,9 +147,11 @@ for VENV in "${VENVS[@]}"; do || exit 1 ) + echo "BUILDING ITK Wheels" PYPROJECT_CONFIGURE="${script_dir}/pyproject_configure.py" wheel_names=$(cat ${script_dir}/WHEEL_NAMES.txt) for wheel_name in ${wheel_names}; do + echo "==building ${wheel_name} in ${build_path} ==" # Configure pyproject.toml ${Python3_EXECUTABLE} ${PYPROJECT_CONFIGURE} --env-file ${package_env_file} ${wheel_name} # Generate wheel From fbb38b8466d934f8f8da116ba58a6a8efbfdeb1d Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 08:25:24 -0600 Subject: [PATCH 36/45] ENH: Get values from environment if not set on command line When using superbuild to download ITK source, get environmental variables if the values are not set on the command line. If ITK_SOURCE_DIR is set explicitly, do not perform the superbuild download of ITK source-code, but use the explicityly set value. --- CMakeLists.txt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b9810b02..f6550155 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,7 +120,7 @@ if(ITKPythonPackage_SUPERBUILD) # Sanity checks if(DEFINED ITK_SOURCE_DIR AND NOT EXISTS ${ITK_SOURCE_DIR}) - message(FATAL_ERROR "Variable is defined but corresponds to nonexistent directory:\nITK_SOURCE_DIR=${ITK_SOURCE_DIR}") + message(FATAL_ERROR "ITK_SOURCE_DIR variable is defined but corresponds to nonexistent directory") endif() if(ITKPythonPackage_USE_TBB) @@ -169,17 +169,18 @@ if(ITKPythonPackage_SUPERBUILD) set(tbb_depends oneTBB) endif() - if(NOT DEFINED ITK_SOURCE_DIR) - set(ITK_REPOSITORY "https://github.com/InsightSoftwareConsortium/ITK.git") + set(ITK_REPOSITORY "https://github.com/InsightSoftwareConsortium/ITK.git") - if ( ENV{ITK_GIT_TAG} ) + if(NOT DEFINED ITK_GIT_TAG AND DEFINED ENV{ITK_GIT_TAG}) set(ITK_GIT_TAG "$ENV{ITK_GIT_TAG}") - elseif(NOT ITK_GIT_TAG) - # main branch, 2025-09-22 - set(ITK_GIT_TAG "0f93d6c875ab1a053ccb1a27f9f55b8aa2c4c20b") - endif() - set(ITK_SOURCE_DIR ${CMAKE_BINARY_DIR}/ITK) + endif() + if(NOT DEFINED ITK_GIT_TAG) + message(FATAL_ERROR "ITK_GIT_TAG must be defined when configuring cmake") + endif() + # Only add ITK-source-download ExternalProject if directory does not + # already exist + if(NOT EXISTS ${ITK_SOURCE_DIR}) ExternalProject_add(ITK-source-download SOURCE_DIR ${ITK_SOURCE_DIR} GIT_REPOSITORY ${ITK_REPOSITORY} @@ -199,7 +200,6 @@ if(ITKPythonPackage_SUPERBUILD) "" ) set(proj_status " (REUSE)") - endif() message(STATUS "SuperBuild - ITK_SOURCE_DIR: ${ITK_SOURCE_DIR}") From 6ccd1d16e2ccc7d5d5de4eede7b56ba151c94dea Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 08:26:33 -0600 Subject: [PATCH 37/45] ENH: Setup the configuration of itkVersion.py dynamically Use the ITK_PACKAGE_VERSION specified in build/package.env to configure_file() the itkVersion.py for the current environment. --- .gitignore | 1 + CMakeLists.txt | 12 ++++++++++++ itkVersion.py => itkVersion.py.in | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) rename itkVersion.py => itkVersion.py.in (94%) diff --git a/.gitignore b/.gitignore index ef56f31c..b384aa15 100644 --- a/.gitignore +++ b/.gitignore @@ -73,6 +73,7 @@ docs/_build # IDE junk .idea/* *.swp +/itkVersion.py # pixi environments .pixi/* !.pixi/config.toml diff --git a/CMakeLists.txt b/CMakeLists.txt index f6550155..d6deeddc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,18 @@ message(STATUS "SuperBuild - ITKPythonPackage_WHEEL_NAME:${ITKPythonPackage_WHEE option(ITKPythonPackage_USE_TBB "Build and use oneTBB in the ITK python package" ON) + +if(NOT DEFINED ITK_PACKAGE_VERSION AND DEFINED ENV{ITK_PACKAGE_VERSION}) + set(ITK_PACKAGE_VERSION $ENV{ITK_PACKAGE_VERSION}) +endif() + +if(NOT DEFINED ITK_PACKAGE_VERSION) + message(FATAL_ERROR "ITK_PACKAGE_VERSION must be defined when configuring cmake") +endif() +# configure itkVersion.py file with ITK_PACKAGE_VERSION +configure_file(${CMAKE_SOURCE_DIR}/itkVersion.py.in ${CMAKE_SOURCE_DIR}/itkVersion.py) + + if(ITKPythonPackage_SUPERBUILD) #----------------------------------------------------------------------------- diff --git a/itkVersion.py b/itkVersion.py.in similarity index 94% rename from itkVersion.py rename to itkVersion.py.in index d73dbe78..a82d19c5 100644 --- a/itkVersion.py +++ b/itkVersion.py.in @@ -1,7 +1,7 @@ from packaging.version import Version # Version needs to be python PEP 440 compliant (no leading v) -VERSION = '6.0b1'.removeprefix("v") +VERSION = '@ITK_PACKAGE_VERSION@'.removeprefix("v") def get_versions(): """Returns versions for the ITK Python package. From 786d51cd7f4bfb238295e053e9fd657fb6d443dc Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 09:12:08 -0600 Subject: [PATCH 38/45] ENH: Install missing executables and set .env values on init When initializing the build, ensure that the required executables are present. --- generate_build_environment.sh | 86 ++++++++++++++++++++++ scripts/internal/manylinux-build-common.sh | 44 +---------- scripts/internal/manylinux-build-wheels.sh | 25 +++++-- scripts/macpython-build-common.sh | 9 --- scripts/macpython-build-wheels.sh | 6 +- 5 files changed, 109 insertions(+), 61 deletions(-) diff --git a/generate_build_environment.sh b/generate_build_environment.sh index 2d67eafb..158f4cec 100755 --- a/generate_build_environment.sh +++ b/generate_build_environment.sh @@ -174,6 +174,88 @@ indirect() { fi } +# ----------------------------------------------------------------------- +# ----------------------------------------------------------------------- +# Install setup platform dependant executables +# Ensure that required executables are found for each platform +case "$(uname -s)" in + Linux*) + OS=linux + # Install prerequirements + export PATH=${_ipp_dir}/tools/doxygen-1.8.16/bin:$PATH + case $(uname -m) in + i686) + ARCH=x86 + ;; + x86_64) + ARCH=x64 + if ! type doxygen > /dev/null 2>&1; then + mkdir -p ${_ipp_dir}/tools + pushd ${_ipp_dir}/tools > /dev/null 2>&1 + curl https://data.kitware.com/api/v1/file/62c4d615bddec9d0c46cb705/download -o doxygen-1.8.16.linux.bin.tar.gz + tar -xvzf doxygen-1.8.16.linux.bin.tar.gz + popd > /dev/null 2>&1 + DOXYGEN_EXECUTABLE=${_ipp_dir}/tools/doxygen-1.8.16/bin/doxygen + fi + ;; + aarch64) + ARCH=aarch64 + if ! type doxygen > /dev/null 2>&1; then + mkdir -p ${_ipp_dir}/tools + pushd ${_ipp_dir}/tools > /dev/null 2>&1 + curl https://data.kitware.com/api/v1/file/62c4ed58bddec9d0c46f1388/download -o doxygen-1.8.16.linux.aarch64.bin.tar.gz + tar -xvzf doxygen-1.8.16.linux.aarch64.bin.tar.gz + popd > /dev/null 2>&1 + DOXYGEN_EXECUTABLE=${_ipp_dir}/tools/doxygen-1.8.16/bin/doxygen + fi + ;; + *) + die "Unknown architecture $(uname -m)" + ;; + esac + if ! type ninja > /dev/null 2>&1; then + if test ! -d ninja; then + git clone https://github.com/ninja-build/ninja.git + fi + pushd ninja + git checkout release + cmake -Bbuild-cmake -H. + cmake --build build-cmake + sudo cp build-cmake/ninja /usr/local/bin/ + popd + NINJA_EXECUTABLE=/usr/local/bin/ninja + fi + ;; + Darwin*) + OS=darwin + brew info doxygen | grep --quiet 'Not installed' && brew update && brew install doxygen + brew info ninja | grep --quiet 'Not installed' && brew update && brew install ninja + brew info cmake | grep --quiet 'Not installed' && brew update && brew install cmake + ;; + + CYGWIN*|MINGW*|MSYS*) + OS=windows + echo "WINDOWS NOT SUPPORTED WITH BASH ENVIRONMENTAL VARIABLES" + exit 1 + ;; + + *) + echo "Unsupported platform: $(uname -s)" >&2 + exit 1 + ;; +esac +DOXYGEN_EXECUTABLE=${DOXYGEN_EXECUTABLE:=$(which doxygen)} +NINJA_EXECUTABLE=${NINJA_EXECUTABLE:=$(which ninja)} +CMAKE_EXECUTABLE=${CMAKE_EXECUTABLE:=$(which cmake)} +for required_exec in DOXYGEN_EXECUTABLE NINJA_EXECUTABLE CMAKE_EXECUTABLE; do + if [ ! -f "$(indirect $required_exec)" ]; then + echo "MISSING: ${required_exec} not found at $(indirect $required_exec)" + echo "aborting until required executables can be found" + exit 1 + fi +done +# ----------------------------------------------------------------------- + ITK_SOURCE_DIR=${ITK_SOURCE_DIR:=${_ipp_dir}/ITK-source/ITK} # determine the latest tag for ITKPythonPackage (current working directory) @@ -291,6 +373,10 @@ ITK_MODULE_NO_CLEANUP=${ITK_MODULE_NO_CLEANUP:=1} # - "USE_CCACHE": Option to indicate that ccache should be used # =1 <- Set cmake settings to use ccache for acclerating rebuilds, 0 <- no ccache usage USE_CCACHE=${USE_CCACHE:=0} + +DOXYGEN_EXECUTABLE=${DOXYGEN_EXECUTABLE} +NINJA_EXECUTABLE=${NINJA_EXECUTABLE} +CMAKE_EXECUTABLE=${CMAKE_EXECUTABLE} DEFAULT_ENV_SETTINGS if [[ "$(uname)" == "Linux" ]]; then diff --git a/scripts/internal/manylinux-build-common.sh b/scripts/internal/manylinux-build-common.sh index 7b98b106..5e233890 100644 --- a/scripts/internal/manylinux-build-common.sh +++ b/scripts/internal/manylinux-build-common.sh @@ -5,7 +5,7 @@ set -e -x script_dir=$(cd $(dirname $0) || exit 1; pwd) - +PATH=$(dirname ${DOXYGEN_EXECUTABLE}):$(dirname ${NINJA_EXECUTABLE}):$(dirname ${CMAKE_EXECUTABLE})$PATH # Versions can be restricted by passing them in as arguments to the script # For example, # manylinux-build-wheels.sh cp39 @@ -40,48 +40,6 @@ case $(uname -m) in ;; esac -# Install prerequirements -export PATH=/work/tools/doxygen-1.8.16/bin:$PATH -case $(uname -m) in - i686) - ARCH=x86 - ;; - x86_64) - ARCH=x64 - if ! type doxygen > /dev/null 2>&1; then - mkdir -p /work/tools - pushd /work/tools > /dev/null 2>&1 - curl https://data.kitware.com/api/v1/file/62c4d615bddec9d0c46cb705/download -o doxygen-1.8.16.linux.bin.tar.gz - tar -xvzf doxygen-1.8.16.linux.bin.tar.gz - popd > /dev/null 2>&1 - fi - ;; - aarch64) - ARCH=aarch64 - if ! type doxygen > /dev/null 2>&1; then - mkdir -p /work/tools - pushd /work/tools > /dev/null 2>&1 - curl https://data.kitware.com/api/v1/file/62c4ed58bddec9d0c46f1388/download -o doxygen-1.8.16.linux.aarch64.bin.tar.gz - tar -xvzf doxygen-1.8.16.linux.aarch64.bin.tar.gz - popd > /dev/null 2>&1 - fi - ;; - *) - die "Unknown architecture $(uname -m)" - ;; -esac -if ! type ninja > /dev/null 2>&1; then - if test ! -d ninja; then - git clone https://github.com/ninja-build/ninja.git - fi - pushd ninja - git checkout release - cmake -Bbuild-cmake -H. - cmake --build build-cmake - sudo cp build-cmake/ninja /usr/local/bin/ - popd -fi - MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} # ----------------------------------------------------------------------- diff --git a/scripts/internal/manylinux-build-wheels.sh b/scripts/internal/manylinux-build-wheels.sh index aeddc643..8412348f 100755 --- a/scripts/internal/manylinux-build-wheels.sh +++ b/scripts/internal/manylinux-build-wheels.sh @@ -36,7 +36,20 @@ source "${script_dir}/manylinux-build-common.sh" # ----------------------------------------------------------------------- DOCKCROSS_MOUNTED_ITKPythonPackage_DIR=/work # <-- The location where ITKPythonPackage git checkout # is mounted inside the dockcross container + +package_env_file=${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/build/package.env CONTAINER_PACKAGE_ENV=${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/dist/container_package.env +#Make a new package_env file for the container environment +#Unset CC and CXX assuming that defaults are correct in dockcross environment +#give alternative location for ITK_SOURCE_DIR +${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/generate_build_environment.sh \ + -i ${package_env_file} -o ${CONTAINER_PACKAGE_ENV} \ + CC=UNSET CXX=UNSET \ + DOXYGEN_EXECUTABLE=UNSET CMAKE_EXECUTABLE=UNSET NINJA_EXECUTABLE=UNSET \ + ITK_SOURCE_DIR=${CONTAINER_ITK_SOURCE_DIR} + +export PATH=${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/tools/doxygen-1.8.16/bin:$PATH + # Load environmental variables source ${CONTAINER_PACKAGE_ENV} _CONTAINER_ITK_SOURCE_DIR=${ITK_SOURCE_DIR} @@ -49,8 +62,8 @@ pushd ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source > /dev/null 2>&1 pushd ${_CONTAINER_ITK_SOURCE_DIR} > /dev/null 2>&1 git checkout ${ITK_GIT_TAG} popd > /dev/null 2>&1 - echo "CMAKE VERSION: $(cmake --version)" - cmd=$(echo cmake \ + echo "CMAKE VERSION: $(${CMAKE_EXECUTABLE} --version)" + cmd=$(echo ${CMAKE_EXECUTABLE} \ -DITKPythonPackage_BUILD_PYTHON:PATH=0 \ -DITK_SOURCE_DIR:PATH=${_CONTAINER_ITK_SOURCE_DIR} \ -DITK_GIT_TAG:STRING=${ITK_GIT_TAG} \ @@ -61,7 +74,7 @@ pushd ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source > /dev/null 2>&1 -B ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source) echo "RUNNING: $cmd" eval $cmd - ninja + ${NINJA_EXECUTABLE} -C ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" echo "================================================================" popd > /dev/null 2>&1 @@ -97,8 +110,8 @@ for PYBIN in "${PYBINARIES[@]}"; do ( mkdir -p ${build_path} \ && cd ${build_path} \ - && echo "CMAKE VERSION: $(cmake --version)" \ - && cmake \ + && echo "CMAKE VERSION: $(${CMAKE_EXECUTABLE} --version)" \ + && ${CMAKE_EXECUTABLE} \ -DCMAKE_BUILD_TYPE:STRING=${build_type} \ -DITK_SOURCE_DIR:PATH=${_CONTAINER_ITK_SOURCE_DIR} \ -DITK_BINARY_DIR:PATH=${build_path} \ @@ -125,7 +138,7 @@ for PYBIN in "${PYBINARIES[@]}"; do -G Ninja \ -S ${_CONTAINER_ITK_SOURCE_DIR} \ -B ${build_path} \ - && ninja \ + && ${NINJA_EXECUTABLE} -C ${build_path} \ || exit 1 ) diff --git a/scripts/macpython-build-common.sh b/scripts/macpython-build-common.sh index bb85b610..51ad79ba 100644 --- a/scripts/macpython-build-common.sh +++ b/scripts/macpython-build-common.sh @@ -93,12 +93,3 @@ if [[ ${USE_CCACHE} == "ON" ]];then export CCACHE_BASEDIR=${ITK_SOURCE_DIR} CMAKE_COMPILER_ARGS="${CMAKE_COMPILER_ARGS} -DCMAKE_C_COMPILER_LAUNCHER=$(which ccache) -DCMAKE_CXX_COMPILER_LAUNCHER=$(which ccache)" fi - -# ----------------------------------------------------------------------- -# Ensure that requirements are met -brew update -brew info doxygen | grep --quiet 'Not installed' && brew install doxygen -brew info ninja | grep --quiet 'Not installed' && brew install ninja -NINJA_EXECUTABLE=$(which ninja) -brew info cmake | grep --quiet 'Not installed' && brew install cmake -CMAKE_EXECUTABLE=$(which cmake) diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 4dff9017..3f54f471 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -116,8 +116,8 @@ for VENV in "${VENVS[@]}"; do ( mkdir -p ${build_path} \ && cd ${build_path} \ - && echo "CMAKE VERSION: $(cmake --version)" \ - && cmake \ + && echo "CMAKE VERSION: $(${CMAKE_EXECUTABLE} --version)" \ + && ${CMAKE_EXECUTABLE} \ -DCMAKE_BUILD_TYPE:STRING=${build_type} \ -DITK_SOURCE_DIR:PATH=${ITK_SOURCE_DIR} \ -DITK_BINARY_DIR:PATH=${build_path} \ @@ -143,7 +143,7 @@ for VENV in "${VENVS[@]}"; do -G Ninja \ -S ${ITK_SOURCE_DIR} \ -B ${build_path} \ - && ninja -C ${build_path} -j$n_processors -l$n_processors \ + && ${NINJA_EXECUTABLE} -C ${build_path} -j$n_processors -l$n_processors \ || exit 1 ) From 3210df7d6752bafbf46d35d6635857b918fcf8c5 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 09:22:43 -0600 Subject: [PATCH 39/45] ENH: Consolidate defaults in .env file for consistency Do not allow defaults variables. Require explicit setting in package.env files. --- scripts/dockcross-manylinux-build-module-wheels.sh | 2 +- scripts/dockcross-manylinux-download-cache.sh | 7 +++---- scripts/macpython-build-wheels.sh | 1 - .../macpython-download-cache-and-build-module-wheels.sh | 6 +++--- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/scripts/dockcross-manylinux-build-module-wheels.sh b/scripts/dockcross-manylinux-build-module-wheels.sh index 433524a7..f93e5102 100755 --- a/scripts/dockcross-manylinux-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-build-module-wheels.sh @@ -17,7 +17,7 @@ # ENVIRONMENT VARIABLES: LD_LIBRARY_PATH, MANYLINUX_VERSION, TARGET_ARCH, IMAGE_TAG, ITK_MODULE_PREQ, ITK_MODULE_NO_CLEANUP, NO_SUDO ######################################################################## -script_dir=${script_dir:=$(cd $(dirname $0) || exit 1; pwd)} +script_dir=$(cd $(dirname $0) || exit 1; pwd) _ipp_dir=$(dirname ${script_dir}) package_env_file=${_ipp_dir}/build/package.env if [ ! -f "${package_env_file}" ]; then diff --git a/scripts/dockcross-manylinux-download-cache.sh b/scripts/dockcross-manylinux-download-cache.sh index 613f3bb5..4c36929c 100755 --- a/scripts/dockcross-manylinux-download-cache.sh +++ b/scripts/dockcross-manylinux-download-cache.sh @@ -57,7 +57,6 @@ ${unzstd_exe} --version # ----------------------------------------------------------------------- # Fetch build archive -MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} TARGET_ARCH=${TARGET_ARCH:=x64} case ${TARGET_ARCH} in @@ -71,8 +70,8 @@ esac TARBALL_NAME="ITKPythonBuilds-linux${TARBALL_SPECIALIZATION}.tar" if [[ ! -f ${TARBALL_NAME}.zst ]]; then - echo "Fetching https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${ITK_PACKAGE_VERSION:=v5.4.0}/${TARBALL_NAME}.zst" - curl -L https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${ITK_PACKAGE_VERSION:=v5.4.0}/${TARBALL_NAME}.zst -O + echo "Fetching https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${ITK_PACKAGE_VERSION}/${TARBALL_NAME}.zst" + curl -L https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${ITK_PACKAGE_VERSION}/${TARBALL_NAME}.zst -O fi if [[ ! -f ./${TARBALL_NAME}.zst ]]; then echo "ERROR: can not find required binary './${TARBALL_NAME}.zst'" @@ -101,7 +100,7 @@ ln -s ITKPythonPackage/oneTBB-prefix ./ # since the archives were generated. if [[ -n ${ITKPYTHONPACKAGE_TAG} ]]; then - echo "Updating build scripts to ${ITKPYTHONPACKAGE_ORG:=InsightSoftwareConsortium}/ITKPythonPackage@${ITKPYTHONPACKAGE_TAG}" + echo "Updating build scripts to ${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage@${ITKPYTHONPACKAGE_TAG}" git clone "https://github.com/${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage.git" "IPP-tmp" pushd IPP-tmp/ diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 3f54f471..20078225 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -46,7 +46,6 @@ DELOCATE_LISTDEPS=${VENV}/bin/delocate-listdeps DELOCATE_WHEEL=${VENV}/bin/delocate-wheel build_type="Release" -MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:="15.0"} if [[ $(arch) == "arm64" ]]; then osx_arch="arm64" diff --git a/scripts/macpython-download-cache-and-build-module-wheels.sh b/scripts/macpython-download-cache-and-build-module-wheels.sh index 6723cff6..21a87de1 100755 --- a/scripts/macpython-download-cache-and-build-module-wheels.sh +++ b/scripts/macpython-download-cache-and-build-module-wheels.sh @@ -39,9 +39,9 @@ else fi # Fetch ITKPythonBuilds archive containing ITK build artifacts rm -fr ITKPythonPackage -echo "Fetching https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${ITK_PACKAGE_VERSION:=v5.4.0}/ITKPythonBuilds-macosx${tarball_arch}.tar.zst" +echo "Fetching https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${ITK_PACKAGE_VERSION}/ITKPythonBuilds-macosx${tarball_arch}.tar.zst" if [[ ! -f ITKPythonBuilds-macosx${tarball_arch}.tar.zst ]]; then - aria2c -c --file-allocation=none -o ITKPythonBuilds-macosx${tarball_arch}.tar.zst -s 10 -x 10 https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${ITK_PACKAGE_VERSION:=v5.4.0}/ITKPythonBuilds-macosx${tarball_arch}.tar.zst + aria2c -c --file-allocation=none -o ITKPythonBuilds-macosx${tarball_arch}.tar.zst -s 10 -x 10 https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${ITK_PACKAGE_VERSION}/ITKPythonBuilds-macosx${tarball_arch}.tar.zst fi unzstd --long=31 ITKPythonBuilds-macosx${tarball_arch}.tar.zst -o ITKPythonBuilds-macosx${tarball_arch}.tar PATH="$(dirname $(brew list gnu-tar | grep gnubin)):$PATH" @@ -63,7 +63,7 @@ rm ITKPythonBuilds-macosx${tarball_arch}.tar # Optional: Update build scripts if [[ -n ${ITKPYTHONPACKAGE_TAG} ]]; then - echo "Updating build scripts to ${ITKPYTHONPACKAGE_ORG:=InsightSoftwareConsortium}/ITKPythonPackage@${ITKPYTHONPACKAGE_TAG}" + echo "Updating build scripts to ${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage@${ITKPYTHONPACKAGE_TAG}" git clone "https://github.com/${ITKPYTHONPACKAGE_ORG}/ITKPythonPackage.git" "IPP-tmp" pushd IPP-tmp/ git checkout "${ITKPYTHONPACKAGE_TAG}" From 1b16a05f84ce861fdc716621a34e012483a8d174 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 09:42:56 -0600 Subject: [PATCH 40/45] ENH: Make ARCH->TARGET_ARCH add CONTAINER_SOURCE setting to .env --- generate_build_environment.sh | 34 ++++++++++++++++--- ...dockcross-manylinux-build-module-wheels.sh | 11 ------ scripts/dockcross-manylinux-download-cache.sh | 3 -- scripts/internal/manylinux-build-common.sh | 20 ----------- .../internal/manylinux-build-module-wheels.sh | 10 ++---- scripts/internal/manylinux-build-wheels.sh | 6 ++-- 6 files changed, 35 insertions(+), 49 deletions(-) diff --git a/generate_build_environment.sh b/generate_build_environment.sh index 158f4cec..1c178569 100755 --- a/generate_build_environment.sh +++ b/generate_build_environment.sh @@ -185,10 +185,8 @@ case "$(uname -s)" in export PATH=${_ipp_dir}/tools/doxygen-1.8.16/bin:$PATH case $(uname -m) in i686) - ARCH=x86 ;; x86_64) - ARCH=x64 if ! type doxygen > /dev/null 2>&1; then mkdir -p ${_ipp_dir}/tools pushd ${_ipp_dir}/tools > /dev/null 2>&1 @@ -199,7 +197,6 @@ case "$(uname -s)" in fi ;; aarch64) - ARCH=aarch64 if ! type doxygen > /dev/null 2>&1; then mkdir -p ${_ipp_dir}/tools pushd ${_ipp_dir}/tools > /dev/null 2>&1 @@ -290,7 +287,20 @@ fi ######################################################################## # Docker image parameters MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} # <- The primary support target for ITK as of 20251114. Including upto Python 3.15 builds. -TARGET_ARCH=${TARGET_ARCH:=x64} +case $(uname -m) in + i686) + TARGET_ARCH=x86 + ;; + x86_64) + TARGET_ARCH=x64 + ;; + aarch64) + TARGET_ARCH=aarch64 + ;; + *) + die "Unknown architecture $(uname -m)" + ;; +esac if [[ ${MANYLINUX_VERSION} == _2_34 && ${TARGET_ARCH} == x64 ]]; then # https://hub.docker.com/r/dockcross/manylinux_2_34-x64/tags @@ -307,6 +317,18 @@ else echo "Unknown manylinux version ${MANYLINUX_VERSION}" exit 1; fi +# +# Set container for requested version/arch/tag. +if [[ ${TARGET_ARCH} == x64 ]]; then + MANYLINUX_IMAGE_NAME=${MANYLINUX_IMAGE_NAME:="manylinux${MANYLINUX_VERSION}-${TARGET_ARCH}:${IMAGE_TAG}"} + CONTAINER_SOURCE=${CONTAINER_SOURCE:="docker.io/dockcross/${MANYLINUX_IMAGE_NAME}"} +elif [[ ${TARGET_ARCH} == aarch64 ]]; then + MANYLINUX_IMAGE_NAME=${MANYLINUX_IMAGE_NAME:="manylinux${MANYLINUX_VERSION}_${TARGET_ARCH}:${IMAGE_TAG}"} + CONTAINER_SOURCE=${CONTAINER_SOURCE:="quay.io/pypa/${MANYLINUX_IMAGE_NAME}"} +else + echo "Unknown target architecture ${TARGET_ARCH}" + exit 1; +fi # Configure the oci executable (i.e. docker, containerd, other) source "${_ipp_dir}/scripts/oci_exe.sh" @@ -414,6 +436,10 @@ IMAGE_TAG=${IMAGE_TAG} # For instance, "export LD_LIBRARY_PATH="/path/to/OpenCL.so:/path/to/OpenCL.so.1.2"" LD_LIBRARY_PATH=${LD_LIBRARY_PATH} +# Almost never change MANYLINUX_IMAGE_NAME or CONTAINER_SOURCE, keep in sync with +MANYLINUX_IMAGE_NAME=manylinux\${MANYLINUX_VERSION}_\${TARGET_ARCH}:\${IMAGE_TAG} +CONTAINER_SOURCE=${CONTAINER_SOURCE} + DEFAULT_LINUX_ENV_SETTINGS fi diff --git a/scripts/dockcross-manylinux-build-module-wheels.sh b/scripts/dockcross-manylinux-build-module-wheels.sh index f93e5102..09f0b15b 100755 --- a/scripts/dockcross-manylinux-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-build-module-wheels.sh @@ -25,17 +25,6 @@ if [ ! -f "${package_env_file}" ]; then fi source "${package_env_file}" -# Set container for requested version/arch/tag. -if [[ ${TARGET_ARCH} == x64 ]]; then - MANYLINUX_IMAGE_NAME=${MANYLINUX_IMAGE_NAME:="manylinux${MANYLINUX_VERSION}-${TARGET_ARCH}:${IMAGE_TAG}"} - CONTAINER_SOURCE="docker.io/dockcross/${MANYLINUX_IMAGE_NAME}" -elif [[ ${TARGET_ARCH} == aarch64 ]]; then - MANYLINUX_IMAGE_NAME=${MANYLINUX_IMAGE_NAME:="manylinux${MANYLINUX_VERSION}_${TARGET_ARCH}:${IMAGE_TAG}"} - CONTAINER_SOURCE="quay.io/pypa/${MANYLINUX_IMAGE_NAME}" -else - echo "Unknown target architecture ${TARGET_ARCH}" - exit 1; -fi if [[ -n ${ITK_MODULE_PREQ} ]]; then echo "Building module dependencies ${ITK_MODULE_PREQ}" diff --git a/scripts/dockcross-manylinux-download-cache.sh b/scripts/dockcross-manylinux-download-cache.sh index 4c36929c..78e5a919 100755 --- a/scripts/dockcross-manylinux-download-cache.sh +++ b/scripts/dockcross-manylinux-download-cache.sh @@ -56,9 +56,6 @@ ${unzstd_exe} --version # ----------------------------------------------------------------------- # Fetch build archive - -TARGET_ARCH=${TARGET_ARCH:=x64} - case ${TARGET_ARCH} in x64) TARBALL_SPECIALIZATION="-manylinux${MANYLINUX_VERSION}" diff --git a/scripts/internal/manylinux-build-common.sh b/scripts/internal/manylinux-build-common.sh index 5e233890..9ab1eafd 100644 --- a/scripts/internal/manylinux-build-common.sh +++ b/scripts/internal/manylinux-build-common.sh @@ -3,7 +3,6 @@ set -e -x - script_dir=$(cd $(dirname $0) || exit 1; pwd) PATH=$(dirname ${DOXYGEN_EXECUTABLE}):$(dirname ${NINJA_EXECUTABLE}):$(dirname ${CMAKE_EXECUTABLE})$PATH # Versions can be restricted by passing them in as arguments to the script @@ -24,24 +23,6 @@ else done fi -# i686 or x86_64 ? -case $(uname -m) in - i686) - ARCH=x86 - ;; - x86_64) - ARCH=x64 - ;; - aarch64) - ARCH=aarch64 - ;; - *) - die "Unknown architecture $(uname -m)" - ;; -esac - -MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} - # ----------------------------------------------------------------------- # Set cmake flags for compiler if CC or CXX are specified CMAKE_COMPILER_ARGS="" @@ -52,4 +33,3 @@ if [ ! -z "${CC}" ]; then CMAKE_COMPILER_ARGS="${CMAKE_COMPILER_ARGS} -DCMAKE_C_COMPILER:STRING=${CC}" fi -echo "Building wheels for $ARCH using manylinux${MANYLINUX_VERSION}" diff --git a/scripts/internal/manylinux-build-module-wheels.sh b/scripts/internal/manylinux-build-module-wheels.sh index 8fce6e5f..aa7d1b34 100755 --- a/scripts/internal/manylinux-build-module-wheels.sh +++ b/scripts/internal/manylinux-build-module-wheels.sh @@ -59,12 +59,6 @@ done PYTHON_VERSION="$@" # ----------------------------------------------------------------------- -# ----------------------------------------------------------------------- -# These variables are set in common script: -# -ARCH="" -PYBINARIES="" - script_dir=$(cd $(dirname $0) || exit 1; pwd) source "${script_dir}/manylinux-build-common.sh" # ----------------------------------------------------------------------- @@ -91,8 +85,8 @@ for PYBIN in "${PYBINARIES[@]}"; do version=$(basename $(dirname ${PYBIN})) # Remove "m" -- not present in Python 3.8 and later version=${version:0:9} - itk_build_dir=/work/$(basename /ITKPythonPackage/ITK-${version}*-manylinux${MANYLINUX_VERSION}_${ARCH}) - ln -fs /ITKPythonPackage/ITK-${version}*-manylinux${MANYLINUX_VERSION}_${ARCH} $itk_build_dir + itk_build_dir=/work/$(basename /ITKPythonPackage/ITK-${version}*-manylinux${MANYLINUX_VERSION}_${TARGET_ARCH}) + ln -fs /ITKPythonPackage/ITK-${version}*-manylinux${MANYLINUX_VERSION}_${TARGET_ARCH} $itk_build_dir if [[ ! -d ${itk_build_dir} ]]; then echo 'ITK build tree not available!' 1>&2 exit 1 diff --git a/scripts/internal/manylinux-build-wheels.sh b/scripts/internal/manylinux-build-wheels.sh index 8412348f..49cda881 100755 --- a/scripts/internal/manylinux-build-wheels.sh +++ b/scripts/internal/manylinux-build-wheels.sh @@ -28,7 +28,7 @@ # # ----------------------------------------------------------------------- -# These variables are set in common script: ARCH, PYBINARIES, Python3_LIBRARY +# These variables are set in common script: TARGET_ARCH, PYBINARIES, Python3_LIBRARY # script_dir=$(cd $(dirname $0) || exit 1; pwd) source "${script_dir}/manylinux-build-common.sh" @@ -97,7 +97,7 @@ for PYBIN in "${PYBINARIES[@]}"; do build_type="Release" compile_flags="-O3 -DNDEBUG" - build_path=${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-$(basename $(dirname ${PYBIN}))-manylinux${MANYLINUX_VERSION}_${ARCH} + build_path=${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-$(basename $(dirname ${PYBIN}))-manylinux${MANYLINUX_VERSION}_${TARGET_ARCH} # Clean up previous invocations # rm -rf ${build_path} @@ -177,7 +177,7 @@ done sudo /opt/python/cp311-cp311/bin/pip3 install auditwheel wheel -if test "${ARCH}" == "x64"; then +if test "${TARGET_ARCH}" == "x64"; then # This step will fixup the wheel switching from 'linux' to 'manylinux' tag for whl in dist/itk_*linux_*.whl; do /opt/python/cp311-cp311/bin/auditwheel repair --plat manylinux${MANYLINUX_VERSION}_x86_64 ${whl} -w ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/dist/ From 2798b93f8b38b2e78a18e1920156a9105dece7e0 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Tue, 25 Nov 2025 10:59:07 -0600 Subject: [PATCH 41/45] ENH: Pass ITK_GIT_TAG needed for ITK download Suppress cmake warning when ITK_GIT_TAG is not used. --- CMakeLists.txt | 21 +++++++++++---------- scripts/macpython-build-wheels.sh | 1 + 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d6deeddc..1cfddee5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -181,18 +181,18 @@ if(ITKPythonPackage_SUPERBUILD) set(tbb_depends oneTBB) endif() - set(ITK_REPOSITORY "https://github.com/InsightSoftwareConsortium/ITK.git") - - if(NOT DEFINED ITK_GIT_TAG AND DEFINED ENV{ITK_GIT_TAG}) - set(ITK_GIT_TAG "$ENV{ITK_GIT_TAG}") - endif() - - if(NOT DEFINED ITK_GIT_TAG) - message(FATAL_ERROR "ITK_GIT_TAG must be defined when configuring cmake") - endif() # Only add ITK-source-download ExternalProject if directory does not # already exist if(NOT EXISTS ${ITK_SOURCE_DIR}) + set(ITK_REPOSITORY "https://github.com/InsightSoftwareConsortium/ITK.git") + + if(NOT DEFINED ITK_GIT_TAG AND DEFINED ENV{ITK_GIT_TAG}) + set(ITK_GIT_TAG "$ENV{ITK_GIT_TAG}") + endif() + + if(NOT DEFINED ITK_GIT_TAG) + message(FATAL_ERROR "ITK_GIT_TAG must be defined when configuring cmake") + endif() ExternalProject_add(ITK-source-download SOURCE_DIR ${ITK_SOURCE_DIR} GIT_REPOSITORY ${ITK_REPOSITORY} @@ -206,7 +206,8 @@ if(ITKPythonPackage_SUPERBUILD) set(proj_status "") else() - + # Suppress unused variable warning + set(_unused "${ITK_GIT_TAG}") ipp_ExternalProject_Add_Empty( ITK-source-download "" diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index 20078225..172bb74d 100755 --- a/scripts/macpython-build-wheels.sh +++ b/scripts/macpython-build-wheels.sh @@ -76,6 +76,7 @@ ${CMAKE_EXECUTABLE} -DITKPythonPackage_BUILD_PYTHON:PATH=0 \ -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_TARGET} \ -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ -DITK_SOURCE_DIR=${ITK_SOURCE_DIR} \ + -DITK_GIT_TAG=${ITK_GIT_TAG} \ ${CMAKE_COMPILER_ARGS} \ -S ${_ipp_dir} \ -B ${IPP_BUILD_DIR} \ From 805308d41d8fa988b7d934053d5e4adb658d3da3 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 25 Nov 2025 18:39:23 -0600 Subject: [PATCH 42/45] ENH: Update internal/manylinux-build-module-wheels.sh for new .evn Give explicit names to HOST and CONTAINER loctions. --- ...dockcross-manylinux-build-module-wheels.sh | 43 +++++++++++++++---- .../internal/manylinux-build-module-wheels.sh | 4 +- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/scripts/dockcross-manylinux-build-module-wheels.sh b/scripts/dockcross-manylinux-build-module-wheels.sh index 09f0b15b..617c26bd 100755 --- a/scripts/dockcross-manylinux-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-build-module-wheels.sh @@ -31,11 +31,37 @@ if [[ -n ${ITK_MODULE_PREQ} ]]; then source "${script_dir}/dockcross-manylinux-build-module-deps.sh" fi +# NOTE: Directory must be in ${MODULE_ROOT_DIR}/ITKPythonPackage/scripts +# ^ | ^ | ^ +# HOST_MODULE_DIRECTORY| _ipp_dir |scripts_dir +HOST_MODULE_DIRECTORY=$(dirname ${_ipp_dir}) + # Set up paths and variables for build -mkdir -p $(pwd)/tools -chmod 777 $(pwd)/tools -mkdir -p dist -DOCKER_ARGS="-v $(pwd)/dist:/work/dist/ -v ${script_dir}/..:/ITKPythonPackage -v $(pwd)/tools:/tools" +HOST_MODULE_TOOLS_DIR=${HOST_MODULE_DIRECTORY}/tools +mkdir -p ${HOST_MODULE_TOOLS_DIR} +chmod 777 ${HOST_MODULE_TOOLS_DIR} + +CONTAINER_WORK_DIR=/work +CONTAINER_PACKAGE_DIST=${CONTAINER_WORK_DIR}/dist +CONTAINER_PACKAGE_BUILD_DIR=${CONTAINER_WORK_DIR}/ITK-source +HOST_PACKAGE_BUILD_DIR=${_ipp_dir}/ITK-source +CONTAINER_ITK_SOURCE_DIR=${CONTAINER_PACKAGE_BUILD_DIR}/ITK +HOST_PACKAGE_DIST=${HOST_MODULE_DIRECTORY}/dist +mkdir -p ${HOST_PACKAGE_DIST} +HOST_PACKAGE_BUILD_DIR=${_ipp_dir}/ITK-source +mkdir -p ${HOST_PACKAGE_BUILD_DIR} +CONTAINER_IPP_DIR=/ITKPythonPackage +CONTAINER_TOOL_DIR=/tools +HOST_ONETBB_DIR=${_ipp_dir}/oneTBB-prefix +CONTAINER_ONETBB_DIR=/work/oneTBB-prefix + +DOCKER_ARGS="-v ${HOST_MODULE_DIRECTORY}:${CONTAINER_WORK_DIR}" +DOCKER_ARGS+=" -v ${_ipp_dir}:${CONTAINER_IPP_DIR}" +DOCKER_ARGS+=" -v ${HOST_MODULE_TOOLS_DIR}:${CONTAINER_TOOL_DIR}" +DOCKER_ARGS+=" -v ${HOST_ONETBB_DIR}:${CONTAINER_ONETBB_DIR}" +DOCKER_ARGS+=" -v ${HOST_PACKAGE_BUILD_DIR}:${CONTAINER_PACKAGE_BUILD_DIR}" +DOCKER_ARGS+=" -v ${ITK_SOURCE_DIR}:${CONTAINER_ITK_SOURCE_DIR}" +DOCKER_ARGS+=" --env-file ${package_env_file}" DOCKER_ARGS+=" -e MANYLINUX_VERSION" DOCKER_ARGS+=" -e LD_LIBRARY_PATH" # Mount any shared libraries @@ -61,17 +87,18 @@ if [[ "${TARGET_ARCH}" = "aarch64" ]]; then --privileged --rm tonistiigi/binfmt --install all # Build wheels - DOCKER_ARGS+=" -v $(pwd):/work/ --rm" + DOCKER_ARGS+=" --rm" ${docker_prefix} $OCI_EXE run --env-file "${_ipp_dir}/build/package.env" \ $DOCKER_ARGS ${CONTAINER_SOURCE} "/ITKPythonPackage/scripts/internal/manylinux-aarch64-build-module-wheels.sh" "$@" else # Generate dockcross scripts + _local_dockercross_script=${_ipp_dir}/build/runner_module_dockcross-${MANYLINUX_VERSION}-x64_${IMAGE_TAG}.sh $OCI_EXE run --env-file "${_ipp_dir}/build/package.env" \ - --rm ${CONTAINER_SOURCE} > /tmp/dockcross-manylinux-x64 - chmod u+x /tmp/dockcross-manylinux-x64 + --rm ${CONTAINER_SOURCE} > ${_local_dockercross_script} + chmod u+x ${_local_dockercross_script} # Build wheels - /tmp/dockcross-manylinux-x64 \ + ${_local_dockercross_script} \ -a "$DOCKER_ARGS" \ "/ITKPythonPackage/scripts/internal/manylinux-build-module-wheels.sh" "$@" fi diff --git a/scripts/internal/manylinux-build-module-wheels.sh b/scripts/internal/manylinux-build-module-wheels.sh index aa7d1b34..ca4a2435 100755 --- a/scripts/internal/manylinux-build-module-wheels.sh +++ b/scripts/internal/manylinux-build-module-wheels.sh @@ -88,11 +88,11 @@ for PYBIN in "${PYBINARIES[@]}"; do itk_build_dir=/work/$(basename /ITKPythonPackage/ITK-${version}*-manylinux${MANYLINUX_VERSION}_${TARGET_ARCH}) ln -fs /ITKPythonPackage/ITK-${version}*-manylinux${MANYLINUX_VERSION}_${TARGET_ARCH} $itk_build_dir if [[ ! -d ${itk_build_dir} ]]; then - echo 'ITK build tree not available!' 1>&2 + echo 'ITK build tree not available! /ITKPythonPackage/ITK-${version}*-manylinux${MANYLINUX_VERSION}_${TARGET_ARCH} is missing' 1>&2 exit 1 fi itk_source_dir=/work/ITK-source/ITK - ln -fs /ITKPythonPackage/ITK-source/ /work/ITK-source + ln -fs /ITKPythonPackage/ITK-source/ /work/ITK-source/ if [[ ! -d ${itk_source_dir} ]]; then echo 'ITK source tree not available!' 1>&2 exit 1 From de05972291dc0d508efcba07345fef4d50cf5a47 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 26 Nov 2025 07:44:01 -0600 Subject: [PATCH 43/45] ENH: Use package.env ITK_SOURCE_DIR, modularize globals The global variable settings are not inside functions that allow delayed initialization to occur after the environmental variables are read in. --- scripts/pyproject.toml.in | 2 +- scripts/pyproject_configure.py | 80 ++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/scripts/pyproject.toml.in b/scripts/pyproject.toml.in index 1ed3b17b..b9a35aeb 100644 --- a/scripts/pyproject.toml.in +++ b/scripts/pyproject.toml.in @@ -9,7 +9,7 @@ name = "@PYPROJECT_NAME@" version = "@PYPROJECT_VERSION@" description = "@PYPROJECT_DESCRIPTION@" -readme = "ITK-source/ITK/README.md" +readme = "@ITK_SOURCE_DIR@/README.md" license = {file = "LICENSE"} authors = [ { name = "Insight Software Consortium", email = "community@itk.org" }, diff --git a/scripts/pyproject_configure.py b/scripts/pyproject_configure.py index ad6e7a5c..f48beba3 100755 --- a/scripts/pyproject_configure.py +++ b/scripts/pyproject_configure.py @@ -260,47 +260,52 @@ def get_wheel_dependencies(): all_depends["itk-meta"].append("numpy") return all_depends +def init_pyproject_globals(package_env_config): + global ITK_PYPROJECT_PY_PARAMETERS + global PYPROJECT_PY_PARAMETERS -SCRIPT_DIR = os.path.dirname(__file__) -SCRIPT_NAME = os.path.basename(__file__) - -ITK_PYPROJECT_PY_PARAMETERS = { - "PYPROJECT_GENERATOR": "python %s '%s'" % (SCRIPT_NAME, "itk"), - "PYPROJECT_NAME": r"itk", - "PYPROJECT_VERSION": get_version(), - "PYPROJECT_CMAKE_ARGS": r"", - "PYPROJECT_PY_API": get_py_api(), - "PYPROJECT_PLATLIB": r"true", - "PYPROJECT_PY_MODULES": list_to_str( - [ - "itkBase", - "itkConfig", - "itkExtras", - "itkHelpers", - "itkLazy", - "itkTemplate", - "itkTypes", - "itkVersion", - "itkBuildOptions", - ] - ), - "PYPROJECT_DOWNLOAD_URL": r"https://github.com/InsightSoftwareConsortium/ITK/releases", - "PYPROJECT_DESCRIPTION": r"ITK is an open-source toolkit for multidimensional image analysis", # noqa: E501 - "PYPROJECT_LONG_DESCRIPTION": r"ITK is an open-source, cross-platform library that " - "provides developers with an extensive suite of software " - "tools for image analysis. Developed through extreme " - "programming methodologies, ITK employs leading-edge " - "algorithms for registering and segmenting " - "multidimensional scientific images.", - "PYPROJECT_EXTRA_KEYWORDS": r'"scientific", "medical", "image", "imaging"', - "PYPROJECT_DEPENDENCIES": r"", -} - -PYPROJECT_PY_PARAMETERS = {"itk": ITK_PYPROJECT_PY_PARAMETERS} - + ITK_PYPROJECT_PY_PARAMETERS = { + "PYPROJECT_GENERATOR": "python %s '%s'" % (SCRIPT_NAME, "itk"), + "PYPROJECT_NAME": r"itk", + "PYPROJECT_VERSION": get_version(), + "PYPROJECT_CMAKE_ARGS": r"", + "PYPROJECT_PY_API": get_py_api(), + "PYPROJECT_PLATLIB": r"true", + "ITK_SOURCE_DIR": package_env_config['ITK_SOURCE_DIR'], + "PYPROJECT_PY_MODULES": list_to_str( + [ + "itkBase", + "itkConfig", + "itkExtras", + "itkHelpers", + "itkLazy", + "itkTemplate", + "itkTypes", + "itkVersion", + "itkBuildOptions", + ] + ), + "PYPROJECT_DOWNLOAD_URL": r"https://github.com/InsightSoftwareConsortium/ITK/releases", + "PYPROJECT_DESCRIPTION": r"ITK is an open-source toolkit for multidimensional image analysis", # noqa: E501 + "PYPROJECT_LONG_DESCRIPTION": r"ITK is an open-source, cross-platform library that " + "provides developers with an extensive suite of software " + "tools for image analysis. Developed through extreme " + "programming methodologies, ITK employs leading-edge " + "algorithms for registering and segmenting " + "multidimensional scientific images.", + "PYPROJECT_EXTRA_KEYWORDS": r'"scientific", "medical", "image", "imaging"', + "PYPROJECT_DEPENDENCIES": r"", + } + + PYPROJECT_PY_PARAMETERS = {"itk": ITK_PYPROJECT_PY_PARAMETERS} def main(): + global SCRIPT_DIR + global SCRIPT_NAME + + SCRIPT_DIR = os.path.dirname(__file__) + SCRIPT_NAME = os.path.basename(__file__) # Defaults default_output_dir = os.path.abspath(os.path.join(SCRIPT_DIR, "..")) @@ -324,6 +329,7 @@ def main(): args = parser.parse_args() print(f"Reading configuration settings from {args.env_file}") package_env_config = dotenv_values(args.env_file) + init_pyproject_globals(package_env_config) update_wheel_pyproject_toml_parameters(package_env_config) if args.wheel_name not in PYPROJECT_PY_PARAMETERS.keys(): From 296441a8cbfaf39c01281c33fb02fea5d63a8c28 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 26 Nov 2025 07:44:32 -0600 Subject: [PATCH 44/45] SQME: WIP more pixi environment setting to be squashed. --- pixi.lock | 1038 ----------------------------------------------------- pixi.toml | 13 +- 2 files changed, 12 insertions(+), 1039 deletions(-) diff --git a/pixi.lock b/pixi.lock index d7867af4..8cd95bde 100644 --- a/pixi.lock +++ b/pixi.lock @@ -24,49 +24,33 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.4.0-h7467c50_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.4.0-haf17267_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.4.0-h494ab63_14.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.4.0-hba01cd7_107.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.4.0-h14bf0c3_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.4.0-hba01cd7_107.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_8.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda linux-aarch64: @@ -92,44 +76,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45-default_h1979696_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-2_haddc8a3_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-2_hd72aa62_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.17.0-h7bfdcfb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.3-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-he277a41_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-13.4.0-hd10b1b9_107.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h87db57e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-he277a41_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-2_h88aeb00_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.1-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-13.4.0-h8a98f30_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.0-h022381a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-h3f4de04_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-13.4.0-hd10b1b9_107.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hf1166c9_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.13.2-hdc560ac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.3.5-py314haac167e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.0-h8e36d6e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.6-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_8.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-hbcf94c1_2.conda osx-64: @@ -154,8 +123,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-954.16-h4e51db5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-954.16-h28b3ac7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-2_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-2_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_hc369343_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.17.0-h7dd4100_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.6-h3d58e20_0.conda @@ -163,17 +130,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h306097a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-h336fb69_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-2_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_hc369343_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-h0ad03eb_0.conda @@ -184,16 +144,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_hc369343_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hf08249b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.0-hf88997e_102_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1300.6.5-h390ca13_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h8210216_2.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda @@ -218,8 +172,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-954.16-h4c6efb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-954.16-h9d5fcb0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-2_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-2_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp18.1-18.1.8-default_h73dfc95_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.17.0-hdece5d2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.6-hf598326_0.conda @@ -227,17 +179,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.3-haf25636_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-2_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm18-18.1.8-default_h3f38c9c_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h0ff4647_0.conda @@ -248,16 +193,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-18.1.8-default_h3f38c9c_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314h5b5928d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda @@ -266,33 +205,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.10.0-h1c1089f_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/doxygen-1.13.2-hbf3f430_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-2_hf2e6a31_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-2_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.17.0-h43ecb02_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-2_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.51.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h692994f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h5d26750_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.6-h4fa8253_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.0-h4b44e0e_102_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda @@ -1147,17 +1068,6 @@ packages: license_family: BSD size: 26866 timestamp: 1763757830983 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e - md5: 8b189310083baabfb622af68fd9d3ae3 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: MIT - license_family: MIT - size: 12129203 - timestamp: 1720853576813 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 md5: 5eb22c1d7b3fc4abb50d92d621583137 @@ -1351,159 +1261,6 @@ packages: license: GPL-3.0-only size: 875534 timestamp: 1764007911054 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda - build_number: 2 - sha256: 4287aa2742828dc869b09a17c9f1171903fc1146bdc8f7bdf62ffe5c20674f31 - md5: 6146bf1b7f58113d54614c6ec683c14a - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - blas 2.302 openblas - - liblapacke 3.11.0 2*_openblas - - mkl <2026 - - libcblas 3.11.0 2*_openblas - - liblapack 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18495 - timestamp: 1763828445618 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-2_haddc8a3_openblas.conda - build_number: 2 - sha256: a67e74373ce56cb4baa3be1ce24a8c14f709010f1bcefe2e1521a15765cee78f - md5: 1a4b8fba71eb980ac7fb0f2ab86f295d - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - liblapacke 3.11.0 2*_openblas - - blas 2.302 openblas - - libcblas 3.11.0 2*_openblas - - mkl <2026 - - liblapack 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18542 - timestamp: 1763828536071 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-2_he492b99_openblas.conda - build_number: 2 - sha256: c9ded973b66a1d0d000bdd6c5a253101d4f8768ad168dc72f99f99fa0c1fbbf3 - md5: 1c8b502902eacae5a3df66477e61a636 - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - libcblas 3.11.0 2*_openblas - - liblapack 3.11.0 2*_openblas - - mkl <2026 - - liblapacke 3.11.0 2*_openblas - - blas 2.302 openblas - license: BSD-3-Clause - license_family: BSD - size: 18653 - timestamp: 1763829098255 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-2_h51639a9_openblas.conda - build_number: 2 - sha256: f45ee569d6ab29217271d5dddfbf8ab76dcd2dc74de9296df3548333c9f3ce78 - md5: 811e17323f5afeeb5eb6cc83d90c4292 - depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 - constrains: - - liblapack 3.11.0 2*_openblas - - blas 2.302 openblas - - libcblas 3.11.0 2*_openblas - - mkl <2026 - - liblapacke 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18675 - timestamp: 1763829114755 -- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-2_hf2e6a31_mkl.conda - build_number: 2 - sha256: f82077ce40cbd07bb4f6dd037052733c472b85afff3e816cb16effa7b15ad949 - md5: 04a13a6c1bfd0b69b48e0fd81a1138fa - depends: - - mkl >=2025.3.0,<2026.0a0 - constrains: - - blas 2.302 mkl - - liblapacke 3.11.0 2*_mkl - - liblapack 3.11.0 2*_mkl - - libcblas 3.11.0 2*_mkl - license: BSD-3-Clause - license_family: BSD - size: 67907 - timestamp: 1763829115272 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda - build_number: 2 - sha256: 02286c8941f156d11087dedc551b86b99bd55d9d4bdef61316566a2fc133608b - md5: a84b2b7ed34206d14739fb8d29cd2799 - depends: - - libblas 3.11.0 2_h4a7cf45_openblas - constrains: - - blas 2.302 openblas - - liblapacke 3.11.0 2*_openblas - - liblapack 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18458 - timestamp: 1763828452799 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-2_hd72aa62_openblas.conda - build_number: 2 - sha256: d0aa5f39deed6f4b98193076ee2bbfc1dd7e9950944df1077bda945d89cb25c5 - md5: a074a14e43abb50d4a38fff28a791259 - depends: - - libblas 3.11.0 2_haddc8a3_openblas - constrains: - - blas 2.302 openblas - - liblapacke 3.11.0 2*_openblas - - liblapack 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18555 - timestamp: 1763828541646 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-2_h9b27e0a_openblas.conda - build_number: 2 - sha256: e64c0a3d5b4bca38f85d0699dcf904b58e1bc5757f83e220f87ed9df8b6bc16f - md5: 4340614c0af5534339786cfd3b79211f - depends: - - libblas 3.11.0 2_he492b99_openblas - constrains: - - liblapacke 3.11.0 2*_openblas - - blas 2.302 openblas - - liblapack 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18665 - timestamp: 1763829114632 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-2_hb0561ab_openblas.conda - build_number: 2 - sha256: 9716a0b87913db25f46ad5c0be7daf6591e64ab9781fa0301727393d369ffb27 - md5: f0d6abadf8be9bf4271123eb37ac4f4e - depends: - - libblas 3.11.0 2_h51639a9_openblas - constrains: - - liblapack 3.11.0 2*_openblas - - blas 2.302 openblas - - liblapacke 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18638 - timestamp: 1763829127867 -- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-2_h2a3cdd5_mkl.conda - build_number: 2 - sha256: 3338b38c7f3cec4be701ff5d615adbef6a3758945b2e1523879e73909a8c8699 - md5: 5b04388898707d7b8d25c6353818f8f3 - depends: - - libblas 3.11.0 2_hf2e6a31_mkl - constrains: - - blas 2.302 mkl - - liblapacke 3.11.0 2*_mkl - - liblapack 3.11.0 2*_mkl - license: BSD-3-Clause - license_family: BSD - size: 68271 - timestamp: 1763829148523 - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.8-default_hc369343_15.conda sha256: a837da43358956b3f0eb15510e3ce27fdd645d4a824267112e2d85d781027e79 md5: c08858fbc3c6e015a210f73b084eee5b @@ -1772,54 +1529,6 @@ packages: license_family: MIT size: 70137 timestamp: 1763550049107 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 - md5: 35f29eec58405aaf55e01cb470d8c26a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - size: 57821 - timestamp: 1760295480630 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-hd65408f_0.conda - sha256: 6c3332e78a975e092e54f87771611db81dcb5515a3847a3641021621de76caea - md5: 0c5ad486dcfb188885e3cf8ba209b97b - depends: - - libgcc >=14 - license: MIT - license_family: MIT - size: 55586 - timestamp: 1760295405021 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-h750e83c_0.conda - sha256: 277dc89950f5d97f1683f26e362d6dca3c2efa16cb2f6fdb73d109effa1cd3d0 - md5: d214916b24c625bcc459b245d509f22e - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - size: 52573 - timestamp: 1760295626449 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-he5f378a_0.conda - sha256: 9b8acdf42df61b7bfe8bdc545c016c29e61985e79748c64ad66df47dbc2e295f - md5: 411ff7cd5d1472bba0f55c0faf04453b - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 40251 - timestamp: 1760295839166 -- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h52bdfb6_0.conda - sha256: ddff25aaa4f0aa535413f5d831b04073789522890a4d8626366e43ecde1534a3 - md5: ba4ad812d2afc22b9a34ce8327a0930f - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: MIT - license_family: MIT - size: 44866 - timestamp: 1760295760649 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 md5: c0374badb3a5d4b1372db28d19462c53 @@ -1881,91 +1590,6 @@ packages: license_family: GPL size: 29261 timestamp: 1759967452303 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda - sha256: 9ca24328e31c8ef44a77f53104773b9fe50ea8533f4c74baa8489a12de916f02 - md5: 8621a450add4e231f676646880703f49 - depends: - - libgfortran5 15.2.0 hcd61629_7 - constrains: - - libgfortran-ng ==15.2.0=*_7 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 29275 - timestamp: 1759968110483 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_7.conda - sha256: 78d958444dd41c4b590f030950a29b4278922147f36c2221c84175eedcbc13f1 - md5: ffe6ad135bd85bb594a6da1d78768f7c - depends: - - libgfortran5 15.2.0 h87db57e_7 - constrains: - - libgfortran-ng ==15.2.0=*_7 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 29294 - timestamp: 1759967474985 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h306097a_1.conda - sha256: 97551952312cf4954a7ad6ba3fd63c739eac65774fe96ddd121c67b5196a8689 - md5: cd5393330bff47a00d37a117c65b65d0 - depends: - - libgfortran5 15.2.0 h336fb69_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 134506 - timestamp: 1759710031253 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-hfcf01ff_1.conda - sha256: e9a5d1208b9dc0b576b35a484d527d9b746c4e65620e0d77c44636033b2245f0 - md5: f699348e3f4f924728e33551b1920f79 - depends: - - libgfortran5 15.2.0 h742603c_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 134016 - timestamp: 1759712902814 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda - sha256: e93ceda56498d98c9f94fedec3e2d00f717cbedfc97c49be0e5a5828802f2d34 - md5: f116940d825ffc9104400f0d7f1a4551 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1572758 - timestamp: 1759968082504 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h87db57e_7.conda - sha256: ae9a8290a7ff0fa28f540208906896460c62dcfbfa31ff9b8c2b398b5bbd34b1 - md5: dd7233e2874ea59e92f7d24d26bb341b - depends: - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1145738 - timestamp: 1759967460371 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-h336fb69_1.conda - sha256: 1d53bad8634127b3c51281ce6ad3fbf00f7371824187490a36e5182df83d6f37 - md5: b6331e2dcc025fc79cd578f4c181d6f2 - depends: - - llvm-openmp >=8.0.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1236316 - timestamp: 1759709318982 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-h742603c_1.conda - sha256: 18808697013a625ca876eeee3d86ee5b656f17c391eca4a4bc70867717cc5246 - md5: afccf412b03ce2f309f875ff88419173 - depends: - - llvm-openmp >=8.0.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 764028 - timestamp: 1759712189275 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca md5: f7b4d76975aac7e5d9e6ad13845f92fe @@ -1982,20 +1606,6 @@ packages: license_family: GPL size: 450308 timestamp: 1759967379407 -- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.1-default_h64bd3f2_1002.conda - sha256: 266dfe151066c34695dbdc824ba1246b99f016115ef79339cbcf005ac50527c1 - md5: b0cac6e5b06ca5eeb14b4f7cf908619f - depends: - - libwinpthread >=12.0.0.r4.gg4f2fc60ca - - libxml2 - - libxml2-16 >=2.14.6 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: BSD-3-Clause - license_family: BSD - size: 2414731 - timestamp: 1757624335056 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -2039,76 +1649,6 @@ packages: license: LGPL-2.1-only size: 696926 timestamp: 1754909290005 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda - build_number: 2 - sha256: d51497ff0af63c4fa854ee7eadca5589eebfc3c9f50eaaa5ede97becde4682ca - md5: 9fb20e74a7436dc94dd39d9a9decddc3 - depends: - - libblas 3.11.0 2_h4a7cf45_openblas - constrains: - - blas 2.302 openblas - - liblapacke 3.11.0 2*_openblas - - libcblas 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18489 - timestamp: 1763828460613 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-2_h88aeb00_openblas.conda - build_number: 2 - sha256: 8af90bb3c7027a70e12b8a696a2c37e10fdae3965953fb687a13112c9db1884d - md5: c73b83da5563196bdfd021579c45d54c - depends: - - libblas 3.11.0 2_haddc8a3_openblas - constrains: - - blas 2.302 openblas - - libcblas 3.11.0 2*_openblas - - liblapacke 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18557 - timestamp: 1763828547154 -- conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-2_h859234e_openblas.conda - build_number: 2 - sha256: c2cdcb92054eba36b98a3217bf13ce2548128269570cb1c2ffd52fda096f1896 - md5: 8db178ce18ce1a024920967144b9f0b8 - depends: - - libblas 3.11.0 2_he492b99_openblas - constrains: - - liblapacke 3.11.0 2*_openblas - - libcblas 3.11.0 2*_openblas - - blas 2.302 openblas - license: BSD-3-Clause - license_family: BSD - size: 18665 - timestamp: 1763829128647 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-2_hd9741b5_openblas.conda - build_number: 2 - sha256: 1aa32435fa1f8273c2d1c1ac6229daa84f2ac1103e5da0bd652c48ce381dd583 - md5: f63fdb2504b1fc4527314641fa34efb4 - depends: - - libblas 3.11.0 2_h51639a9_openblas - constrains: - - blas 2.302 openblas - - libcblas 3.11.0 2*_openblas - - liblapacke 3.11.0 2*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18651 - timestamp: 1763829141511 -- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-2_hf9ab0e9_mkl.conda - build_number: 2 - sha256: 36c7bddd82fa835e3a30863df6c8888877338b1775fb9a6a4b0b1e9ade0eb6f4 - md5: 4126ff2758e017e9f9c312a36b961738 - depends: - - libblas 3.11.0 2_hf2e6a31_mkl - constrains: - - blas 2.302 mkl - - liblapacke 3.11.0 2*_mkl - - libcblas 3.11.0 2*_mkl - license: BSD-3-Clause - license_family: BSD - size: 80476 - timestamp: 1763829180808 - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.8-default_hc369343_10.conda sha256: 8cf834f2dc9251ac73f0221a09b5a55c333d4ef993dc971e59a593a937c838d5 md5: 8a5219d1f850e7e7690df1d594535d60 @@ -2190,54 +1730,6 @@ packages: license: 0BSD size: 104935 timestamp: 1749230611612 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - sha256: 3aa92d4074d4063f2a162cd8ecb45dccac93e543e565c01a787e16a43501f7ee - md5: c7e925f37e3b40d893459e625f6a53f1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: BSD-2-Clause - license_family: BSD - size: 91183 - timestamp: 1748393666725 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-h86ecc28_0.conda - sha256: ef8697f934c80b347bf9d7ed45650928079e303bad01bd064995b0e3166d6e7a - md5: 78cfed3f76d6f3f279736789d319af76 - depends: - - libgcc >=13 - license: BSD-2-Clause - license_family: BSD - size: 114064 - timestamp: 1748393729243 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - sha256: 98299c73c7a93cd4f5ff8bb7f43cd80389f08b5a27a296d806bdef7841cc9b9e - md5: 18b81186a6adb43f000ad19ed7b70381 - depends: - - __osx >=10.13 - license: BSD-2-Clause - license_family: BSD - size: 77667 - timestamp: 1748393757154 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - sha256: 0a1875fc1642324ebd6c4ac864604f3f18f57fbcf558a8264f6ced028a3c75b2 - md5: 85ccccb47823dd9f7a99d2c7f530342f - depends: - - __osx >=11.0 - license: BSD-2-Clause - license_family: BSD - size: 71829 - timestamp: 1748393749336 -- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf - md5: 74860100b2029e2523cf480804c76b9b - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: BSD-2-Clause - license_family: BSD - size: 88657 - timestamp: 1723861474602 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 md5: b499ce4b026493a13774bcf0f4c33849 @@ -2299,61 +1791,6 @@ packages: license_family: MIT size: 575454 timestamp: 1756835746393 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 - md5: be43915efc66345cccb3c310b6ed0374 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - constrains: - - openblas >=0.3.30,<0.3.31.0a0 - license: BSD-3-Clause - license_family: BSD - size: 5927939 - timestamp: 1763114673331 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda - sha256: 794a7270ea049ec931537874cd8d2de0ef4b3cef71c055cfd8b4be6d2f4228b0 - md5: 11d7d57b7bdd01da745bbf2b67020b2e - depends: - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - constrains: - - openblas >=0.3.30,<0.3.31.0a0 - license: BSD-3-Clause - license_family: BSD - size: 4959359 - timestamp: 1763114173544 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - sha256: ba642353f7f41ab2d2eb6410fbe522238f0f4483bcd07df30b3222b4454ee7cd - md5: 9241a65e6e9605e4581a2a8005d7f789 - depends: - - __osx >=10.13 - - libgfortran - - libgfortran5 >=14.3.0 - - llvm-openmp >=19.1.7 - constrains: - - openblas >=0.3.30,<0.3.31.0a0 - license: BSD-3-Clause - license_family: BSD - size: 6268795 - timestamp: 1763117623665 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda - sha256: dcc626c7103503d1dfc0371687ad553cb948b8ed0249c2a721147bdeb8db4a73 - md5: a18a7f471c517062ee71b843ef95eb8a - depends: - - __osx >=11.0 - - libgfortran - - libgfortran5 >=14.3.0 - - llvm-openmp >=19.1.7 - constrains: - - openblas >=0.3.30,<0.3.31.0a0 - license: BSD-3-Clause - license_family: BSD - size: 4285762 - timestamp: 1761749506256 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.4.0-h14bf0c3_7.conda sha256: 762a1245ad2892e574bb677dcd0da647be6c7c0cf69fa3f4637446d0fb489b1e md5: 035f201f22e6b3be67c89bfa0b221283 @@ -2375,55 +1812,6 @@ packages: license_family: GPL size: 4508655 timestamp: 1759973549899 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda - sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 - md5: 729a572a3ebb8c43933b30edcc628ceb - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=75.1,<76.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: blessing - size: 945576 - timestamp: 1762299687230 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.51.0-h022381a_0.conda - sha256: f66a40b6e07a6f8ce6ccbd38d079b7394217d8f8ae0a05efa644aa0a40140671 - md5: 8920ce2226463a3815e2183c8b5008b8 - depends: - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: blessing - size: 938476 - timestamp: 1762299829629 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.0-h86bffb9_0.conda - sha256: ad151af8192c17591fad0b68c9ffb7849ad9f4be9da2020b38b8befd2c5f6f02 - md5: 1ee9b74571acd6dd87e6a0f783989426 - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: blessing - size: 986898 - timestamp: 1762300146976 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.0-h8adb53f_0.conda - sha256: b43d198f147f46866e5336c4a6b91668beef698bfba69d1706158460eadb2c1b - md5: 5fb1945dbc6380e6fe7e939a62267772 - depends: - - __osx >=11.0 - - icu >=75.1,<76.0a0 - - libzlib >=1.3.1,<2.0a0 - license: blessing - size: 909508 - timestamp: 1762300078624 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.0-hf5d6505_0.conda - sha256: 2373bd7450693bd0f624966e1bee2f49b0bf0ffbc114275ed0a43cf35aec5b21 - md5: d2c9300ebd2848862929b18c264d1b1e - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: blessing - size: 1292710 - timestamp: 1762299749044 - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 @@ -2540,25 +1928,6 @@ packages: license_family: GPL size: 29341 timestamp: 1759967498023 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda - sha256: e5ec6d2ad7eef538ddcb9ea62ad4346fde70a4736342c4ad87bd713641eb9808 - md5: 80c07c68d2f6870250959dcc95b209d1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - size: 37135 - timestamp: 1758626800002 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.2-h3e4203c_0.conda - sha256: 7aed28ac04e0298bf8f7ad44a23d6f8ee000aa0445807344b16fceedc67cce0f - md5: 3a68e44fdf2a2811672520fdd62996bd - depends: - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - size: 39172 - timestamp: 1758626850999 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b md5: 0f03292cc56bf91a077a134ea8747118 @@ -2607,17 +1976,6 @@ packages: license_family: MIT size: 297087 timestamp: 1753948490874 -- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 - md5: 8a86073cf3b343b87d03f41790d8b4e5 - depends: - - ucrt - constrains: - - pthreads-win32 <0.0a0 - - msys2-conda-epoch <0.0a0 - license: MIT AND BSD-3-Clause-Clear - size: 36621 - timestamp: 1759768399557 - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h23bb396_0.conda sha256: a40ec252d9c50fee7cb0b15be7e358a10888c89dadb23deac254789fcb047de7 md5: 65dd26de1eea407dda59f0da170aed22 @@ -2647,23 +2005,6 @@ packages: license_family: MIT size: 40607 timestamp: 1761016108361 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h5d26750_0.conda - sha256: f507960adf64ee9c9c7b7833d8b11980765ebd2bf5345f73d5a3b21b259eaed5 - md5: 9176ee05643a1bfe7f2e7b4c921d2c3d - depends: - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libxml2-16 2.15.1 h692994f_0 - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - icu <0.0a0 - license: MIT - license_family: MIT - size: 43209 - timestamp: 1761016354235 - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-h0ad03eb_0.conda sha256: 00ddbcfbd0318f3c5dbf2b1e1bc595915efe2a61e73b844df422b11fec39d7d8 md5: 8487998051f3d300fef701a49c27f282 @@ -2694,23 +2035,6 @@ packages: license_family: MIT size: 464952 timestamp: 1761016087733 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h692994f_0.conda - sha256: 04129dc2df47a01c55e5ccf8a18caefab94caddec41b3b10fbc409e980239eb9 - md5: 70ca4626111579c3cd63a7108fe737f9 - depends: - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.1,<6.0a0 - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - icu <0.0a0 - - libxml2 2.15.1 - license: MIT - license_family: MIT - size: 518135 - timestamp: 1761016320405 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -2793,20 +2117,6 @@ packages: license_family: APACHE size: 286206 timestamp: 1763529774822 -- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.6-h4fa8253_0.conda - sha256: 59bffd08dab73dbb42c6dc433db4f30bdaff7b63baf53217c2d6eda965a635c5 - md5: 92db366ac0d445e2a3f939b50a9437d1 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - constrains: - - openmp 21.1.6|21.1.6.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 347152 - timestamp: 1763549264124 - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.8-default_hc369343_10.conda sha256: c059b3fd7f1556a56fa05cac59f47b604a3e0433316f3a99dae99d75aa18d20b md5: a75abb84bd173d9438e7f9c2a679f155 @@ -2875,19 +2185,6 @@ packages: license_family: Apache size: 23454430 timestamp: 1757359894665 -- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_454.conda - sha256: 3c432e77720726c6bd83e9ee37ac8d0e3dd7c4cf9b4c5805e1d384025f9e9ab6 - md5: c83ec81713512467dfe1b496a8292544 - depends: - - llvm-openmp >=21.1.4 - - tbb >=2022.2.0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: LicenseRef-IntelSimplifiedSoftwareOct2022 - license_family: Proprietary - size: 99909095 - timestamp: 1761668703167 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 md5: 47e340acb35de30501a76c7c799c41d7 @@ -2976,100 +2273,6 @@ packages: license_family: APACHE size: 309417 timestamp: 1763688227932 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_0.conda - sha256: 4fa3b8b80dd848a70f679b31d74d6fb28f9c4de9cd81086aa8e10256e9de20d1 - md5: 6d2cff81447b8fe424645d7dd3bde8bf - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - size: 8983459 - timestamp: 1763350996398 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.3.5-py314haac167e_0.conda - sha256: e7015a79fb2d8d0573ae1b55db71792292285a86111ccf2683872db848734db8 - md5: ea4652f80053fb52748bc10e0b401b2f - depends: - - python - - libgcc >=14 - - python 3.14.* *_cp314 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.14.* *_cp314 - - liblapack >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - size: 7815328 - timestamp: 1763351321550 -- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hf08249b_0.conda - sha256: 77e0b2ddb433ac23ca9d587c37a8f6da9baee3888c34d19e530fe8cbaaf49bdc - md5: 5c9e4bc0c170115fd3602d7377c9e8da - depends: - - python - - libcxx >=19 - - __osx >=10.13 - - libcblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - - libblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - size: 8140127 - timestamp: 1763350902772 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314h5b5928d_0.conda - sha256: a8731e3e31013be69cb585dbc57cb225437bb0c945ddce9a550c1cd10b6fad37 - md5: e126981f973ddc2510d7a249c5b69533 - depends: - - python - - python 3.14.* *_cp314 - - __osx >=11.0 - - libcxx >=19 - - libcblas >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - - liblapack >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - size: 6861174 - timestamp: 1763350930747 -- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_0.conda - sha256: e64d4c049c9c69ef02d924ac1750b32e08f57732cbc6a3fe11794f3169b59d14 - md5: ddc6687a8f402695bd22229aaf69fb26 - depends: - - python - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - - liblapack >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - - libcblas >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - size: 7588219 - timestamp: 1763350950306 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d md5: 9ee58d5c534af06558933af3c845a780 @@ -3123,179 +2326,6 @@ packages: license_family: Apache size: 9440812 timestamp: 1762841722179 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda - build_number: 102 - sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 - md5: 0a19d2cc6eb15881889b0c6fa7d6a78d - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libuuid >=2.41.2,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.14.* *_cp314 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 36681389 - timestamp: 1761176838143 - python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.0-hb06a95a_102_cp314.conda - build_number: 102 - sha256: a930ea81356110d84993527772577276af034d689e7333f937005ee527bd11bf - md5: c2bbf19a6b366d492f9137257ad19416 - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-aarch64 >=2.36.1 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libuuid >=2.41.2,<3.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.14.* *_cp314 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 37128758 - timestamp: 1761175738259 - python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.0-hf88997e_102_cp314.conda - build_number: 102 - sha256: 2470866eee70e75d6be667aa537424b63f97c397a0a90f05f2bab347b9ed5a51 - md5: 7917d1205eed3e72366a3397dca8a2af - depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.14.* *_cp314 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 14427639 - timestamp: 1761177864469 - python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.0-h40d2674_102_cp314.conda - build_number: 102 - sha256: 3ca1da026fe5df8a479d60e1d3ed02d9bc50fcbafd5f125d86abe70d21a34cc7 - md5: a9ff09231c555da7e30777747318321b - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.14.* *_cp314 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 13590581 - timestamp: 1761177195716 - python_site_packages_path: lib/python3.14/site-packages -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.0-h4b44e0e_102_cp314.conda - build_number: 102 - sha256: 2b8c8fcafcc30690b4c5991ee28eb80c962e50e06ce7da03b2b302e2d39d6a81 - md5: 3e1ce2fb0f277cebcae01a3c418eb5e2 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.1,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.1,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.50.4,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 - - python_abi 3.14.* *_cp314 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - zstd >=1.5.7,<1.6.0a0 - license: Python-2.0 - size: 16706286 - timestamp: 1761175439068 - python_site_packages_path: Lib/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - build_number: 8 - sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 - md5: 0539938c55b6b1a59b560e843ad864a4 - constrains: - - python 3.14.* *_cp314 - license: BSD-3-Clause - license_family: BSD - size: 6989 - timestamp: 1752805904792 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c - md5: 283b96675859b20a825f8fa30f311446 - depends: - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 282480 - timestamp: 1740379431762 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8382b9d_2.conda - sha256: 54bed3a3041befaa9f5acde4a37b1a02f44705b7796689574bcf9d7beaad2959 - md5: c0f08fc2737967edde1a272d4bf41ed9 - depends: - - libgcc >=13 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 291806 - timestamp: 1740380591358 -- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - sha256: 53017e80453c4c1d97aaf78369040418dea14cf8f46a2fa999f31bd70b36c877 - md5: 342570f8e02f2f022147a7f841475784 - depends: - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 256712 - timestamp: 1740379577668 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 - md5: 63ef3f6e6d6d5c589e64f11263dc5676 - depends: - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 252359 - timestamp: 1740379663071 - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda sha256: d5c73079c1dd2c2a313c3bfd81c73dbd066b7eb08d213778c8bff520091ae894 md5: c1c9b02933fdb2cfb791d936c20e887e @@ -3395,74 +2425,6 @@ packages: license_family: MIT size: 207679 timestamp: 1725491499758 -- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-hd094cb3_1.conda - sha256: c31cac57913a699745d124cdc016a63e31c5749f16f60b3202414d071fc50573 - md5: 17c38aaf14c640b85c4617ccb59c1146 - depends: - - libhwloc >=2.12.1,<2.12.2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: Apache-2.0 - license_family: APACHE - size: 155714 - timestamp: 1762510341121 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - sha256: 1544760538a40bcd8ace2b1d8ebe3eb5807ac268641f8acdc18c69c5ebfeaf64 - md5: 86bc20552bf46075e3d92b67f089172d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - size: 3284905 - timestamp: 1763054914403 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h561c983_103.conda - sha256: 154e73f6269f92ad5257aa2039278b083998fd19d371e150f307483fb93c07ae - md5: 631db4799bc2bfe4daccf80bb3cbc433 - depends: - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - constrains: - - xorg-libx11 >=1.8.12,<2.0a0 - license: TCL - license_family: BSD - size: 3333495 - timestamp: 1763059192223 -- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - sha256: 0d0b6cef83fec41bc0eb4f3b761c4621b7adfb14378051a8177bd9bb73d26779 - md5: bd9f1de651dbd80b51281c694827f78f - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - size: 3262702 - timestamp: 1763055085507 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - sha256: ad0c67cb03c163a109820dc9ecf77faf6ec7150e942d1e8bb13e5d39dc058ab7 - md5: a73d54a5abba6543cb2f0af1bfbd6851 - depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - size: 3125484 - timestamp: 1763055028377 -- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - sha256: 4581f4ffb432fefa1ac4f85c5682cc27014bcd66e7beaa0ee330e927a7858790 - md5: 7cb36e506a7dba4817970f8adb6396f9 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: TCL - license_family: BSD - size: 3472313 - timestamp: 1763055164278 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 md5: 4222072737ccff51314b5ece9c7d6f5a diff --git a/pixi.toml b/pixi.toml index 11d7ef6c..f0ae7818 100644 --- a/pixi.toml +++ b/pixi.toml @@ -25,5 +25,16 @@ version = "0.1.0" doxygen = ">=1.13.2,<2" ninja = ">=1.13.2,<2" cmake = ">=4.2.0,<5" -numpy = ">=2.3.5,<3" cxx-compiler = "==1.10.0" + +[feature.python-pkgs.dependencies] +ninja = ">=1.13.0,<2" +scikit-build-core = "==0.10.7" +build = "==1.2.1" +pyproject-metadata = "*" +pathspec = "*" +setuptools_scm = "==8.1.0" +numpy = ">=1.26" +python-dotenv = "*" + + From 1b9b6ff18db1d892c9bf3a075437c534c5732066 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Wed, 26 Nov 2025 07:53:02 -0600 Subject: [PATCH 45/45] DOC: Remove reference to setup.py, initial changes The documentation still needs a lot of work. Removing references to setup.py implies the correct path to look for making the packages. --- docs/Build_ITK_Python_packages.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/Build_ITK_Python_packages.rst b/docs/Build_ITK_Python_packages.rst index bb0d647c..8058af3b 100644 --- a/docs/Build_ITK_Python_packages.rst +++ b/docs/Build_ITK_Python_packages.rst @@ -100,15 +100,15 @@ is enabled by default. .. .. To create source distributions, sdist's, that will be used by pip to compile a wheel for installation if a binary wheel is not available for the current Python version or platform:: .. -.. $ python setup.py sdist --formats=gztar,zip +.. $ python -m build --sdist .. [...] .. .. $ ls -1 dist/ .. itk-4.11.0.dev20170216.tar.gz .. itk-4.11.0.dev20170216.zip .. -.. Manual builds -.. ============= +.. Manual builds (not recommended) +.. =============================== .. .. Building ITK Python wheels .. -------------------------- @@ -117,8 +117,8 @@ is enabled by default. .. .. python3 -m venv build-itk .. ./build-itk/bin/pip install --upgrade pip -.. ./build-itk/bin/pip install -r requirements-dev.txt numpy -.. ./build-itk/bin/python setup.py bdist_wheel +.. ./build-itk/bin/pip install -r requirements-dev.txt +.. ./build-itk/bin/python -m build .. .. Build a wheel for a custom version of ITK .. ----------------------------------------- @@ -126,7 +126,7 @@ is enabled by default. .. To build a wheel for a custom version of ITK, point to your ITK git repository .. with the `ITK_SOURCE_DIR` CMake variable:: .. -.. ./build-itk/bin/python setup.py bdist_wheel -- \ +.. ./build-itk/bin/python -m build --wheel -- \ .. -DITK_SOURCE_DIR:PATH=/path/to/ITKPythonPackage-core-build/ITK .. .. Other CMake variables can also be passed with `-D` after the double dash.