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..b384aa15 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +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 28f0e96b..1cfddee5 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) #----------------------------------------------------------------------------- @@ -30,12 +42,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,18 +61,51 @@ 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() + + 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} + ) + elseif( ENV{CC} ) + list(APPEND ep_common_cmake_cache_args + -DCMAKE_C_COMPILER:PATH=$ENV{CC} + ) endif() #----------------------------------------------------------------------------- @@ -80,11 +119,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 @@ -92,6 +126,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 "ITK_SOURCE_DIR variable is defined but corresponds to nonexistent directory") @@ -124,13 +162,11 @@ 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} ${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 @@ -145,11 +181,18 @@ if(ITKPythonPackage_SUPERBUILD) set(tbb_depends oneTBB) 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_SOURCE_DIR) - - set(ITK_SOURCE_DIR ${CMAKE_BINARY_DIR}/ITK) + 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} @@ -163,13 +206,13 @@ if(ITKPythonPackage_SUPERBUILD) set(proj_status "") else() - + # Suppress unused variable warning + set(_unused "${ITK_GIT_TAG}") ipp_ExternalProject_Add_Empty( ITK-source-download "" ) set(proj_status " (REUSE)") - endif() message(STATUS "SuperBuild - ITK_SOURCE_DIR: ${ITK_SOURCE_DIR}") 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. diff --git a/generate_build_environment.sh b/generate_build_environment.sh new file mode 100755 index 00000000..1c178569 --- /dev/null +++ b/generate_build_environment.sh @@ -0,0 +1,518 @@ +#!/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 +} + +# ----------------------------------------------------------------------- +# ----------------------------------------------------------------------- +# 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) + ;; + x86_64) + 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) + 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) +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. +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 + 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 +# +# 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" + +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} + +# - "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 +# 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} + +# 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 + +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} 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. diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 00000000..8cd95bde --- /dev/null +++ b/pixi.lock @@ -0,0 +1,2553 @@ +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/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/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/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/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/liblzma-5.8.1-hb9d3cd8_2.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/libsanitizer-13.4.0-h14bf0c3_7.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/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/openssl-3.6.0-h26f9b46_0.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/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/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/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/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/liblzma-5.8.1-h86ecc28_2.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/libsanitizer-13.4.0-h8a98f30_7.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/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/openssl-3.6.0-h8e36d6e_0.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/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/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/libiconv-1.18-h57a12c2_2.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/libnghttp2-1.67.0-h3338091_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/openssl-3.6.0-h230baf5_0.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/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/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/libiconv-1.18-h23cfdf5_2.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/libnghttp2-1.67.0-hc438710_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/openssl-3.6.0-h5503f6c_0.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/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/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/libiconv-1.18-hc1393d2_2.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/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/libzlib-1.3.1-h2466b09_2.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/openssl-3.6.0-h725018a_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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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..f0ae7818 --- /dev/null +++ b/pixi.toml @@ -0,0 +1,40 @@ +[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" +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 = "*" + + diff --git a/requirements-dev.txt b/requirements-dev.txt index 5fac7875..527377ec 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,6 +1,8 @@ -ninja==1.11.1.1 +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 #1.26 is needed to support python3.9 +python-dotenv 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..617c26bd 100755 --- a/scripts/dockcross-manylinux-build-module-wheels.sh +++ b/scripts/dockcross-manylinux-build-module-wheels.sh @@ -13,56 +13,55 @@ # 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" +_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) if [[ -n ${ITK_MODULE_PREQ} ]]; then echo "Building module dependencies ${ITK_MODULE_PREQ}" 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 @@ -84,18 +83,22 @@ 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_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 - $oci_exe run --rm ${CONTAINER_SOURCE} > /tmp/dockcross-manylinux-x64 - chmod u+x /tmp/dockcross-manylinux-x64 + _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} > ${_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/dockcross-manylinux-build-wheels.sh b/scripts/dockcross-manylinux-build-wheels.sh index 14f09a77..1148593d 100755 --- a/scripts/dockcross-manylinux-build-wheels.sh +++ b/scripts/dockcross-manylinux-build-wheels.sh @@ -7,42 +7,45 @@ # # 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 + ${_ipp_dir}/generate_build_environment.sh -o ${package_env_file} 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 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} -# Build wheels -pushd $script_dir/.. -mkdir -p dist -DOCKER_ARGS="-v $(pwd)/dist:/work/dist/" -DOCKER_ARGS+=" -e MANYLINUX_VERSION" -/tmp/dockcross-manylinux-x64 \ - -a "$DOCKER_ARGS" \ - ./scripts/internal/manylinux-build-wheels.sh "$@" + 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-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 85471726..59610378 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,10 @@ # 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 ######################################################################## +download_script_dir=$(cd $(dirname $0) || exit 1; pwd) # ----------------------------------------------------------------------- # Script argument parsing # @@ -64,14 +51,43 @@ 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 +_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 -o ${package_env_file} +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/dockcross-manylinux-download-cache.sh b/scripts/dockcross-manylinux-download-cache.sh index bed112bd..78e5a919 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 ######################################################################## # ----------------------------------------------------------------------- @@ -73,10 +56,6 @@ ${unzstd_exe} --version # ----------------------------------------------------------------------- # Fetch build archive - -MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} -TARGET_ARCH=${TARGET_ARCH:=x64} - case ${TARGET_ARCH} in x64) TARBALL_SPECIALIZATION="-manylinux${MANYLINUX_VERSION}" @@ -88,8 +67,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'" @@ -118,7 +97,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/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/internal/manylinux-build-common.sh b/scripts/internal/manylinux-build-common.sh index 8f257912..9ab1eafd 100644 --- a/scripts/internal/manylinux-build-common.sh +++ b/scripts/internal/manylinux-build-common.sh @@ -4,7 +4,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 @@ -23,63 +23,13 @@ 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 - -# Install prerequirements -export PATH=/work/tools/doxygen-1.8.16/bin:$PATH -case $(uname -m) in - i686) - ARCH=x86 - ;; - x86_64) - 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 - cp build-cmake/ninja /usr/local/bin/ - popd +# ----------------------------------------------------------------------- +# 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 -MANYLINUX_VERSION=${MANYLINUX_VERSION:=_2_28} - -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..ca4a2435 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,14 +85,14 @@ 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 + 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 @@ -124,6 +118,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 f31f5873..49cda881 100755 --- a/scripts/internal/manylinux-build-wheels.sh +++ b/scripts/internal/manylinux-build-wheels.sh @@ -20,37 +20,68 @@ # # 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: TARGET_ARCH, PYBINARIES, Python3_LIBRARY # -ARCH="" -PYBINARIES="" -Python3_LIBRARY="" - 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 + +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} # 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 ../ - 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_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} \ + -DITK_PACKAGE_VERSION:STRING=${ITK_PACKAGE_VERSION} \ + ${CMAKE_COMPILER_ARGS} \ + -G Ninja \ + -S ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR} \ + -B ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source) + echo "RUNNING: $cmd" + eval $cmd + ${NINJA_EXECUTABLE} -C ${DOCKCROSS_MOUNTED_ITKPythonPackage_DIR}/ITK-source + 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 - -# TODO: More work is required to re-enable this feature. -SINGLE_WHEEL=0 +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 @@ -62,108 +93,80 @@ 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}_${TARGET_ARCH} # 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} \ + && 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} \ + -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" \ + ${CMAKE_COMPILER_ARGS} \ + -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 \ + -S ${_CONTAINER_ITK_SOURCE_DIR} \ + -B ${build_path} \ + && ${NINJA_EXECUTABLE} -C ${build_path} \ + || 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} "itk" + ${PYBIN}/python ${PYPROJECT_CONFIGURE} --env-file ${CONTAINER_PACKAGE_ENV} ${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=${_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} \ + --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}" \ + ${CMAKE_OPTIONS//'-D'/'--config-setting=cmake.define.'} \ + ${CMAKE_COMPILER_ARGS//'-D'/'--config-setting=cmake.define.'} \ + . \ || 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 @@ -174,14 +177,14 @@ 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 /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 @@ -205,7 +208,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-common.sh b/scripts/macpython-build-common.sh index 9325c7cd..51ad79ba 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 @@ -57,23 +60,36 @@ else PYBINARIES+=(${MACPYTHON_PY_PREFIX}/*${version}*) done 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=${SCRIPT_DIR}/../venvs/${py_mm} - VENVS+=(${VENV}) + _VENV_DIR=${_ipp_dir}/venvs/${py_mm} + VIRTUALENV_EXECUTABLE="${PYBIN}/bin/python3 -m venv" + ${VIRTUALENV_EXECUTABLE} ${_VENV_DIR} + VENVS+=(${_VENV_DIR}) done # ----------------------------------------------------------------------- -# 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) +# 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 + +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 diff --git a/scripts/macpython-build-module-deps.sh b/scripts/macpython-build-module-deps.sh index a74e9da7..2c11b939 100644 --- a/scripts/macpython-build-module-deps.sh +++ b/scripts/macpython-build-module-deps.sh @@ -18,14 +18,13 @@ # # =========================================== # 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) +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 @@ -34,6 +33,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 ebea1635..b284fb24 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 # ######################################################################## @@ -37,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" @@ -54,23 +53,25 @@ fi # * SCRIPT_DIR # * SKBUILD_DIR # * VENVS=() - -MACPYTHON_PY_PREFIX="" -SCRIPT_DIR="" -VENVS=() - 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 -# So delocate can find the libs -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)" # Compile wheels re-using standalone project and archive cache for VENV in "${VENVS[@]}"; do @@ -83,20 +84,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,14 +109,14 @@ 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.PY_SITE_PACKAGES_PATH:PATH="." \ --config-setting=wheel.py-api=$wheel_py_api \ @@ -125,10 +124,11 @@ for VENV in "${VENVS[@]}"; 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 -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 diff --git a/scripts/macpython-build-wheels.sh b/scripts/macpython-build-wheels.sh index fb04b3e7..172bb74d 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 @@ -25,74 +25,63 @@ # * PYBINARIES # * PYTHON_VERSIONS # * NINJA_EXECUTABLE -# * SCRIPT_DIR +# * script_dir # * VENVS=() - -MACPYTHON_PY_PREFIX="" -PYBINARIES="" -SCRIPT_DIR="" - +# * CMAKE_COMPILE_ARGS script_dir=$(cd $(dirname $0) || exit 1; pwd) -source "${script_dir}/macpython-build-common.sh" +_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}" -# ----------------------------------------------------------------------- -# 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 +source "${script_dir}/macpython-build-common.sh" 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 build_type="Release" 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) # So delocate can find the libs -export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:$PWD/oneTBB-prefix/lib -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=${osx_target} \ - -DCMAKE_OSX_ARCHITECTURES:STRING=${osx_arch} \ - ${SCRIPT_DIR}/../ - ${NINJA_EXECUTABLE} -j$n_processors -l$n_processors -popd > /dev/null 2>&1 - -SINGLE_WHEEL=0 +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 + +# ----------------------------------------------------------------------- +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} \ + -DITK_GIT_TAG=${ITK_GIT_TAG} \ + ${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 @@ -104,124 +93,99 @@ 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" + plat_name="macosx-${MACOSX_DEPLOYMENT_TARGET}-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" + plat_name="macosx-${MACOSX_DEPLOYMENT_TARGET}-x86_64" + build_path="${_ipp_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" # Clean up previous invocations - rm -rf ${build_path} - - if [[ ${SINGLE_WHEEL} == 1 ]]; then - - echo "#" - echo "# Build single ITK wheel" - echo "#" + if [ "${ITK_MODULE_NO_CLEANUP:-0}" -eq 0 ]; then + rm -rf ${build_path} + fi + echo "#" + echo "# Build multiple ITK wheels" + echo "#" + + # Build ITK python + ( + mkdir -p ${build_path} \ + && cd ${build_path} \ + && 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} \ + -DBUILD_TESTING:BOOL=OFF \ + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${MACOSX_DEPLOYMENT_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 \ + -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 \ + -S ${ITK_SOURCE_DIR} \ + -B ${build_path} \ + && ${NINJA_EXECUTABLE} -C ${build_path} -j$n_processors -l$n_processors \ + || 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} "itk" + ${Python3_EXECUTABLE} ${PYPROJECT_CONFIGURE} --env-file ${package_env_file} ${wheel_name} # Generate wheel ${Python3_EXECUTABLE} -m build \ --verbose \ --wheel \ - --outdir dist \ + --outdir ${_ipp_dir}/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_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=${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 \ + --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//'-D'/'--config-setting=cmake.define.'} \ + ${CMAKE_COMPILER_ARGS//'-D'/'--config-setting=cmake.define.'} \ + ${_ipp_dir} \ + || exit 1 + 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 - 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 @@ -230,9 +194,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 diff --git a/scripts/macpython-download-cache-and-build-module-wheels.sh b/scripts/macpython-download-cache-and-build-module-wheels.sh index 297e827d..21a87de1 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 # ######################################################################## @@ -49,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" @@ -73,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}" 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 55ba9c2c..f48beba3 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``. """ @@ -28,8 +29,12 @@ import os import re import sys +from dotenv import dotenv_values + +ipp_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append(ipp_dir) -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +default_env_file = os.path.join(ipp_dir, "build", "package.env") PARAMETER_OPTION_DEFAULTS = { "indent": 0, @@ -120,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) @@ -182,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", @@ -252,48 +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} - -update_wheel_pyproject_toml_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, "..")) @@ -308,14 +320,26 @@ 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) + init_pyproject_globals(package_env_config) + 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(