From fd2f1eca99af03f90933d25e28788c04c633ca73 Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Wed, 12 Aug 2026 12:39:22 -0400 Subject: [PATCH 1/8] build(cuda.core): spike scikit-build-core migration --- .github/workflows/ci-pixi-source-test.yml | 2 + .github/workflows/test-sdist-linux.yml | 2 +- .github/workflows/test-sdist-windows.yml | 2 +- cuda_core/AGENTS.md | 5 +- cuda_core/CMakeLists.txt | 275 +++ cuda_core/MANIFEST.in | 9 - cuda_core/build_hooks.py | 420 ++--- cuda_core/cuda/core/_include/aoti_shim.def | 4 +- cuda_core/cuda/core/_include/aoti_shim.h | 4 +- cuda_core/pixi.lock | 1938 ++++++++++++++------ cuda_core/pixi.toml | 7 +- cuda_core/pyproject.toml | 50 +- cuda_core/setup.py | 94 - cuda_core/tests/test_build_hooks.py | 91 +- 14 files changed, 1924 insertions(+), 979 deletions(-) create mode 100644 cuda_core/CMakeLists.txt delete mode 100644 cuda_core/MANIFEST.in delete mode 100644 cuda_core/setup.py diff --git a/.github/workflows/ci-pixi-source-test.yml b/.github/workflows/ci-pixi-source-test.yml index cdae1b0cf26..cfdcb8cdfdf 100644 --- a/.github/workflows/ci-pixi-source-test.yml +++ b/.github/workflows/ci-pixi-source-test.yml @@ -35,6 +35,8 @@ on: - "**/pixi.lock" - "cuda_bindings/build_hooks.py" - "cuda_core/build_hooks.py" + - "cuda_core/CMakeLists.txt" + - "cuda_core/pyproject.toml" - "cuda_bindings/cuda/bindings/**" # generated bindings sources - "cuda_bindings/tests/cython/**" - "cuda_core/tests/cython/**" diff --git a/.github/workflows/test-sdist-linux.yml b/.github/workflows/test-sdist-linux.yml index 42262a8aa29..d1de3f656b3 100644 --- a/.github/workflows/test-sdist-linux.yml +++ b/.github/workflows/test-sdist-linux.yml @@ -119,7 +119,7 @@ jobs: printf 'cuda-bindings @ %s\n' "${bindings_uri}" } | tee wheel-constraints/cuda-core.txt - # cuda_core sdist delegates to setuptools (no CTK needed), but + # cuda_core sdist delegates directly to scikit-build-core (no CTK needed), but # wheel-from-sdist needs CTK and cuda-bindings (dynamic build dep via # get_requires_for_build_wheel in build_hooks.py). - name: Build cuda.core sdist and wheel-from-sdist diff --git a/.github/workflows/test-sdist-windows.yml b/.github/workflows/test-sdist-windows.yml index eb4e25b5fc5..1930db4a25b 100644 --- a/.github/workflows/test-sdist-windows.yml +++ b/.github/workflows/test-sdist-windows.yml @@ -109,7 +109,7 @@ jobs: printf 'cuda-bindings @ %s\n' "${bindings_uri}" } | tee wheel-constraints/cuda-core.txt - # cuda_core sdist delegates to setuptools (no CTK needed), but + # cuda_core sdist delegates directly to scikit-build-core (no CTK needed), but # wheel-from-sdist needs CTK and cuda-bindings (dynamic build dep via # get_requires_for_build_wheel in build_hooks.py). - name: Build cuda.core sdist and wheel-from-sdist diff --git a/cuda_core/AGENTS.md b/cuda_core/AGENTS.md index 83c96800e9d..55699b75aaf 100644 --- a/cuda_core/AGENTS.md +++ b/cuda_core/AGENTS.md @@ -21,8 +21,9 @@ This file describes `cuda_core`, the high-level Pythonic CUDA subpackage in the - execution path: `_launcher.pyx`, `_launch_config.pyx`, `_stream.pyx` - **C++ helpers**: module-specific C++ implementations live under `cuda/core/_cpp/`. -- **Build backend**: `build_hooks.py` handles Cython extension setup and build - dependency wiring. +- **Build backend**: `CMakeLists.txt` defines the Cython extension build; + `build_hooks.py` wraps scikit-build-core to provide CUDA-major-specific build + dependency wiring and compatibility build settings. ## Build and version coupling diff --git a/cuda_core/CMakeLists.txt b/cuda_core/CMakeLists.txt new file mode 100644 index 00000000000..16fce0741c7 --- /dev/null +++ b/cuda_core/CMakeLists.txt @@ -0,0 +1,275 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.21...4.4) + +project(cuda_core LANGUAGES CXX) + +find_package( + Python + COMPONENTS Interpreter Development.Module + REQUIRED +) +find_package(Cython 3.2.5...<3.3 MODULE REQUIRED) +include(UseCython) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +set(CUDA_CORE_CUDA_ROOT "" CACHE PATH "CUDA Toolkit root used to compile cuda-core") +set(CUDA_CORE_BUILD_MAJOR "" CACHE STRING "CUDA major version for Cython compile-time conditionals") +set(CUDA_PYTHON_COVERAGE "$ENV{CUDA_PYTHON_COVERAGE}" CACHE STRING "Build Cython line tracing support") + +if(NOT CUDA_CORE_CUDA_ROOT) + if(DEFINED ENV{CUDA_HOME} AND NOT "$ENV{CUDA_HOME}" STREQUAL "") + set(CUDA_CORE_CUDA_ROOT "$ENV{CUDA_HOME}") + elseif(DEFINED ENV{CUDA_PATH} AND NOT "$ENV{CUDA_PATH}" STREQUAL "") + set(CUDA_CORE_CUDA_ROOT "$ENV{CUDA_PATH}") + endif() +endif() +if(NOT CUDA_CORE_CUDA_ROOT) + message(FATAL_ERROR "CUDA_CORE_CUDA_ROOT, CUDA_HOME, or CUDA_PATH must point to a CUDA Toolkit installation") +endif() + +cmake_path(ABSOLUTE_PATH CUDA_CORE_CUDA_ROOT NORMALIZE) +set(_cuda_header "${CUDA_CORE_CUDA_ROOT}/include/cuda.h") +if(NOT EXISTS "${_cuda_header}") + message(FATAL_ERROR "CUDA header not found: ${_cuda_header}") +endif() + +if(NOT CUDA_CORE_BUILD_MAJOR) + file(STRINGS "${_cuda_header}" _cuda_version_line REGEX "^#[ \t]*define[ \t]+CUDA_VERSION[ \t]+[0-9]+[ \t]*$") + if(NOT _cuda_version_line) + message(FATAL_ERROR "Cannot determine CUDA major version from ${_cuda_header}; set CUDA_CORE_BUILD_MAJOR") + endif() + string(REGEX MATCH "[0-9]+" _cuda_version "${_cuda_version_line}") + math(EXPR CUDA_CORE_BUILD_MAJOR "${_cuda_version} / 1000") +endif() +if(NOT CUDA_CORE_BUILD_MAJOR MATCHES "^[0-9]+$") + message(FATAL_ERROR "CUDA_CORE_BUILD_MAJOR must be an integer, got ${CUDA_CORE_BUILD_MAJOR}") +endif() +message(STATUS "Building cuda-core for CUDA ${CUDA_CORE_BUILD_MAJOR} using ${CUDA_CORE_CUDA_ROOT}") + +execute_process( + COMMAND + "${Python_EXECUTABLE}" -c + "from pathlib import Path; import cuda.bindings; print(Path(cuda.bindings.__file__).resolve().parents[2])" + RESULT_VARIABLE _cuda_bindings_result + OUTPUT_VARIABLE _cuda_bindings_package_root + ERROR_VARIABLE _cuda_bindings_error + OUTPUT_STRIP_TRAILING_WHITESPACE +) +if(NOT _cuda_bindings_result STREQUAL "0" OR NOT EXISTS "${_cuda_bindings_package_root}/cuda/bindings") + message( + FATAL_ERROR + "Could not resolve the physical cuda.bindings package root needed by Cython. " + "Ensure the CUDA-major-compatible cuda-bindings build dependency is installed.\n${_cuda_bindings_error}" + ) +endif() +message(STATUS "Using cuda-bindings Cython declarations from ${_cuda_bindings_package_root}") + +if(WIN32) + execute_process( + COMMAND + "${Python_EXECUTABLE}" -c + "import sysconfig; print(int(bool(sysconfig.get_config_var('Py_GIL_DISABLED'))))" + RESULT_VARIABLE _python_freethreaded_result + OUTPUT_VARIABLE _python_freethreaded + ERROR_VARIABLE _python_freethreaded_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT _python_freethreaded_result STREQUAL "0") + message(FATAL_ERROR "Could not determine whether Python is free-threaded.\n${_python_freethreaded_error}") + endif() +endif() + +if(CUDA_PYTHON_COVERAGE STREQUAL "") + set(CUDA_PYTHON_COVERAGE OFF) +endif() +if(CUDA_PYTHON_COVERAGE) + set(_coverage_directive -X linetrace=True) +endif() + +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") + message(FATAL_ERROR "Debuggable builds are not supported on Windows") +endif() + +set(_cuda_core_source_root "${CMAKE_CURRENT_SOURCE_DIR}/cuda/core") +set(_cython_common_args + --cplus + -3 + -Werror + -X embedsignature=True + -X warn.deprecated.IF=False + -X freethreading_compatible=True + -E CUDA_CORE_BUILD_MAJOR=${CUDA_CORE_BUILD_MAJOR} + -I "${CMAKE_CURRENT_SOURCE_DIR}" + -I "${_cuda_bindings_package_root}" + ${_coverage_directive} +) + +if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT WIN32) + list(APPEND _cython_common_args --gdb) +endif() + +file( + GLOB_RECURSE _cuda_core_pyx_files + CONFIGURE_DEPENDS + RELATIVE "${_cuda_core_source_root}" + "${_cuda_core_source_root}/*.pyx" +) + +# Stage regular wheels through CMake to keep them independent of ignored, +# in-place extension artifacts. Editable builds map these files to the live +# source tree instead. +if(NOT SKBUILD_STATE STREQUAL "editable") + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/cuda/" + DESTINATION cuda + FILES_MATCHING + PATTERN "*.h" + PATTERN "*.hpp" + PATTERN "*.pxd" + PATTERN "*.py" + PATTERN "*.pyi" + PATTERN "py.typed" + ) + if(CUDA_PYTHON_COVERAGE) + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/cuda/" + DESTINATION cuda + FILES_MATCHING + PATTERN "*.cpp" + PATTERN "*.pxi" + PATTERN "*.pyx" + ) + endif() +else() + # Cython resolves external .pxd files from physical sys.path entries, not + # PEP 660 meta-path finders. Preserve the bindings declaration path for + # downstream Cython consumers of an editable cuda-core installation. + set(_cuda_bindings_cython_pth "${CMAKE_CURRENT_BINARY_DIR}/_cuda_core_cython_include.pth") + file(WRITE "${_cuda_bindings_cython_pth}" "${_cuda_bindings_package_root}\n") + install(FILES "${_cuda_bindings_cython_pth}" DESTINATION ".") +endif() + +if(MSVC) + set(_aoti_shim_def "${_cuda_core_source_root}/_include/aoti_shim.def") + set(_aoti_shim_lib "${CMAKE_CURRENT_BINARY_DIR}/aoti_shim.lib") + if(CMAKE_GENERATOR_PLATFORM MATCHES "^(ARM64|arm64)$" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$") + set(_aoti_machine ARM64) + else() + set(_aoti_machine X64) + endif() + add_custom_command( + OUTPUT "${_aoti_shim_lib}" + COMMAND + "${CMAKE_AR}" + "/DEF:${_aoti_shim_def}" + "/OUT:${_aoti_shim_lib}" + "/MACHINE:${_aoti_machine}" + DEPENDS "${_aoti_shim_def}" + COMMENT "Generating the AOTI shim import library" + VERBATIM + ) + add_custom_target(cuda_core_aoti_shim DEPENDS "${_aoti_shim_lib}") +endif() + +function(cuda_core_add_cython_module module_path) + string(REPLACE "/" "." module_suffix "${module_path}") + string(REPLACE "/" "_" target_suffix "${module_path}") + set(module_name "cuda.core.${module_suffix}") + set(target_name "cuda_core${target_suffix}") + set(pyx_file "${_cuda_core_source_root}/${module_path}.pyx") + set(cython_cpp "${CMAKE_CURRENT_BINARY_DIR}/cython/${module_path}.cpp") + cmake_path(GET cython_cpp PARENT_PATH cython_output_directory) + file(MAKE_DIRECTORY "${cython_output_directory}") + cmake_path(GET module_path FILENAME module_filename) + cmake_path(GET module_path PARENT_PATH module_directory) + if(module_directory) + set(install_directory "cuda/core/${module_directory}") + set(module_output_directory "${CMAKE_CURRENT_BINARY_DIR}/extensions/${module_directory}") + else() + set(install_directory "cuda/core") + set(module_output_directory "${CMAKE_CURRENT_BINARY_DIR}/extensions") + endif() + + cython_transpile( + "${pyx_file}" + LANGUAGE CXX + OUTPUT "${cython_cpp}" + OUTPUT_VARIABLE generated_cpp + CYTHON_ARGS ${_cython_common_args} --module-name "${module_name}" + ) + + set(module_sources "${generated_cpp}") + string(REGEX REPLACE "^_" "" helper_cpp_path "${module_path}") + set(extra_cpp "${_cuda_core_source_root}/_cpp/${helper_cpp_path}.cpp") + if(EXISTS "${extra_cpp}") + list(APPEND module_sources "${extra_cpp}") + endif() + + python_add_library("${target_name}" MODULE WITH_SOABI ${module_sources}) + set_target_properties( + "${target_name}" + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${module_output_directory}" + LIBRARY_OUTPUT_DIRECTORY "${module_output_directory}" + OUTPUT_NAME "${module_filename}" + RUNTIME_OUTPUT_DIRECTORY "${module_output_directory}" + ) + target_include_directories( + "${target_name}" + PRIVATE + "${_cuda_core_source_root}" + "${_cuda_core_source_root}/_include" + "${_cuda_core_source_root}/_cpp" + "${CUDA_CORE_CUDA_ROOT}/include" + ) + + if(MSVC) + target_compile_options("${target_name}" PRIVATE /std:c++17) + else() + target_compile_options( + "${target_name}" + PRIVATE + $<$:-g;-O0> + $<$>:-O2> + ) + target_compile_definitions("${target_name}" PRIVATE $<$:_GLIBCXX_ASSERTIONS>) + target_link_options("${target_name}" PRIVATE $<$>:-Wl,--strip-all>) + endif() + + if(CUDA_PYTHON_COVERAGE) + target_compile_definitions( + "${target_name}" + PRIVATE + CYTHON_TRACE_NOGIL=1 + CYTHON_USE_SYS_MONITORING=0 + ) + install(FILES "${generated_cpp}" DESTINATION "${install_directory}") + endif() + + if(WIN32 AND _python_freethreaded) + # Windows shares Python headers between GIL and free-threaded builds, so + # extension builds must supply the ABI selection macro themselves. + target_compile_definitions("${target_name}" PRIVATE Py_GIL_DISABLED=1) + endif() + + if(MSVC AND module_path STREQUAL "_tensor_bridge") + add_dependencies("${target_name}" cuda_core_aoti_shim) + target_link_libraries("${target_name}" PRIVATE "${_aoti_shim_lib}") + endif() + + install(TARGETS "${target_name}" LIBRARY DESTINATION "${install_directory}" RUNTIME DESTINATION "${install_directory}") +endfunction() + +foreach(pyx_file IN LISTS _cuda_core_pyx_files) + string(REGEX REPLACE "\\.pyx$" "" module_path "${pyx_file}") + if(WIN32 AND module_path STREQUAL "_utils/_wsl_locale") + continue() + endif() + cuda_core_add_cython_module("${module_path}") +endforeach() diff --git a/cuda_core/MANIFEST.in b/cuda_core/MANIFEST.in deleted file mode 100644 index f63b324cab7..00000000000 --- a/cuda_core/MANIFEST.in +++ /dev/null @@ -1,9 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - -recursive-include cuda/core *.pyx *.pxd *.pxi *.pyi -recursive-include cuda/core/_cpp *.cpp *.h *.hpp -recursive-include cuda/core/_include *.h *.hpp -include cuda/core/py.typed -include NOTICE diff --git a/cuda_core/build_hooks.py b/cuda_core/build_hooks.py index 626d50355ab..728fb4c2dd0 100644 --- a/cuda_core/build_hooks.py +++ b/cuda_core/build_hooks.py @@ -2,31 +2,30 @@ # # SPDX-License-Identifier: Apache-2.0 -# This module implements basic PEP 517 backend support, see e.g. -# - https://peps.python.org/pep-0517/ -# - https://setuptools.pypa.io/en/latest/build_meta.html#dynamic-build-dependencies-and-other-build-meta-tweaks -# Specifically, there are 5 APIs required to create a proper build backend, see below. +"""PEP 517 wrapper for cuda.core's scikit-build-core backend. + +The wrapper keeps CUDA-major-dependent build requirements out of the static +``build-system.requires`` list. Compilation and wheel assembly are delegated to +scikit-build-core. +""" + +from __future__ import annotations import functools -import glob import os import re import sys -import tempfile -import zipfile +from collections.abc import Callable, Mapping from pathlib import Path +from typing import Any -from Cython.Build import cythonize -from Cython.Compiler import Options as _CythonOptions -from setuptools import Extension -from setuptools import build_meta as _build_meta +import scikit_build_core.build as _build_backend -prepare_metadata_for_build_editable = _build_meta.prepare_metadata_for_build_editable -prepare_metadata_for_build_wheel = _build_meta.prepare_metadata_for_build_wheel -build_sdist = _build_meta.build_sdist -get_requires_for_build_sdist = _build_meta.get_requires_for_build_sdist +build_sdist = _build_backend.build_sdist +get_requires_for_build_sdist = _build_backend.get_requires_for_build_sdist -COMPILE_FOR_COVERAGE = bool(int(os.environ.get("CUDA_PYTHON_COVERAGE", "0"))) +_ConfigSettings = Mapping[str, str | list[str] | bool] | None +_MISSING = object() # Please keep in sync with the copy in cuda_bindings/build_hooks.py. @@ -48,13 +47,17 @@ def _import_get_cuda_path_or_home(): for p in sys.path: sp_cuda = Path(p) / "cuda" if (sp_cuda / "pathfinder").is_dir(): + if cuda is None: + raise ModuleNotFoundError( + "The cuda namespace package is unavailable even though cuda-pathfinder was found." + ) from exc cuda.__path__ = list(cuda.__path__) + [str(sp_cuda)] break else: raise ModuleNotFoundError( "cuda-pathfinder is not installed in the build environment. " "Ensure 'cuda-pathfinder>=1.5' is in build-system.requires." - ) + ) from exc import cuda.pathfinder pathfinder_dir = Path(cuda.pathfinder.__file__).parent @@ -72,279 +75,190 @@ def _get_cuda_path() -> str: if not cuda_path: raise RuntimeError("Environment variable CUDA_PATH or CUDA_HOME is not set") print("CUDA path:", cuda_path) - return cuda_path - - -@functools.cache -def _determine_cuda_major_version() -> str: - """Determine the CUDA major version for building cuda.core. + return os.fspath(cuda_path) - This version is used for two purposes: - 1. Determining which cuda-bindings version to install as a build dependency - 2. Setting CUDA_CORE_BUILD_MAJOR for Cython compile-time conditionals - The version is derived from (in order of priority): - 1. CUDA_CORE_BUILD_MAJOR environment variable (explicit override, e.g. in CI) - 2. CUDA_VERSION macro in cuda.h from CUDA_PATH or CUDA_HOME - - Since CUDA_PATH or CUDA_HOME is required for the build (to provide include - directories), the cuda.h header should always be available. - """ - # Explicit override, e.g. in CI. - cuda_major = os.environ.get("CUDA_CORE_BUILD_MAJOR") - if cuda_major is not None: - print("CUDA MAJOR VERSION:", cuda_major) - return cuda_major - - # Derive from the CUDA headers (the authoritative source for what we compile against). - cuda_path = _get_cuda_path() +def _cuda_major_from_headers(cuda_path: str) -> str: cuda_h = os.path.join(cuda_path, "include", "cuda.h") try: with open(cuda_h, encoding="utf-8") as f: for line in f: - m = re.match(r"^#\s*define\s+CUDA_VERSION\s+(\d+)\s*$", line) - if m: - v = int(m.group(1)) + match = re.match(r"^#\s*define\s+CUDA_VERSION\s+(\d+)\s*$", line) + if match: # CUDA_VERSION is e.g. 12020 for 12.2. - cuda_major = str(v // 1000) - print("CUDA MAJOR VERSION:", cuda_major) - return cuda_major + return str(int(match.group(1)) // 1000) except OSError: pass - # CUDA_PATH or CUDA_HOME is required for the build, so we should not reach here - # in normal circumstances. Raise an error to make the issue clear. raise RuntimeError( "Cannot determine CUDA major version. " - "Set CUDA_CORE_BUILD_MAJOR environment variable, or ensure CUDA_PATH or CUDA_HOME " - "points to a valid CUDA installation with include/cuda.h." + "Set CUDA_CORE_BUILD_MAJOR, or ensure CUDA_PATH or CUDA_HOME points " + "to a valid CUDA installation with include/cuda.h." ) -# used later by setup() -_extensions = None - - -def _build_cuda_core(debug=False): - # Customizing the build hooks is needed because we must defer cythonization until cuda-bindings, - # now a required build-time dependency that's dynamically installed via the other hook below, - # is installed. Otherwise, cimport any cuda.bindings modules would fail! - # - # This function populates "_extensions". - global _extensions +@functools.cache +def _determine_cuda_major_version(cuda_path: str | None = None) -> str: + """Determine the CUDA major used for build requirements and Cython.""" + cuda_major = os.environ.get("CUDA_CORE_BUILD_MAJOR") + if cuda_major is None: + cuda_major = _cuda_major_from_headers(cuda_path or _get_cuda_path()) + + if not re.fullmatch(r"\d+", cuda_major): + raise RuntimeError(f"CUDA_CORE_BUILD_MAJOR must be an integer, got {cuda_major!r}") + + print("CUDA MAJOR VERSION:", cuda_major) + return cuda_major + + +def _setting_value(config_settings: _ConfigSettings, *names: str) -> str | bool | None: + if config_settings is None: + return None + for name in names: + value = config_settings.get(name) + if isinstance(value, list): + if not value: + return None + value = value[-1] + if value is not None: + return value + return None + + +def _configured_cuda_root(config_settings: _ConfigSettings) -> str: + cuda_root = _setting_value( + config_settings, + "cmake.define.CUDA_CORE_CUDA_ROOT", + "skbuild.cmake.define.CUDA_CORE_CUDA_ROOT", + ) + return os.fspath(cuda_root) if cuda_root is not None else _get_cuda_path() - # Resolve CUDA first so the pathfinder import repairs PEP 517 namespace shadowing before importing bindings. - cuda_path = _get_cuda_path() - # Add cuda-bindings to sys.path so Cython can find .pxd files - # This is needed for editable installs where meta path finders don't work for Cython - # We need to add the directory containing the 'cuda' package so Cython can resolve - # "from cuda.bindings cimport cydriver" - try: - import cuda.bindings - - bindings_path = Path(cuda.bindings.__file__).parent # .../cuda/bindings/ - print(f"Using cuda-bindings {cuda.bindings.__version__} from {bindings_path}", file=sys.stderr) - cuda_package_dir = bindings_path.parent.parent # .../cuda_bindings/ (contains cuda/) - if str(cuda_package_dir) not in sys.path: - sys.path.insert(0, str(cuda_package_dir)) - print(f"Added cuda-bindings parent path for Cython: {cuda_package_dir}", file=sys.stderr) - except ImportError: - # cuda-bindings not available in editable mode, will use installed version - pass - - _posix_only_modules = frozenset( - { - "_utils/_wsl_locale", - } +def _configured_cuda_major(config_settings: _ConfigSettings) -> str: + cuda_major = _setting_value( + config_settings, + "cmake.define.CUDA_CORE_BUILD_MAJOR", + "skbuild.cmake.define.CUDA_CORE_BUILD_MAJOR", ) - - # It seems setuptools' wildcard support has problems for namespace packages, - # so we explicitly spell out all Extension instances. - def module_names(): - root_path = os.path.sep.join(["cuda", "core", ""]) - for filename in glob.glob(f"{root_path}/**/*.pyx", recursive=True): - mod = filename[len(root_path) : -4] - if sys.platform == "win32" and mod.replace(os.path.sep, "/") in _posix_only_modules: - continue - yield mod - - def get_sources(mod_name): - """Get source files for a module, including any .cpp files.""" - sources = [f"cuda/core/{mod_name}.pyx"] - - # Add module-specific .cpp file from _cpp/ directory if it exists - # Example: _resource_handles.pyx finds _cpp/resource_handles.cpp. - cpp_file = f"cuda/core/_cpp/{mod_name.lstrip('_')}.cpp" - if os.path.exists(cpp_file): - sources.append(cpp_file) - - return sources - - all_include_dirs = [os.path.join(cuda_path, "include")] - extra_compile_args = [] - extra_link_args = [] - extra_cythonize_kwargs = {} - if sys.platform == "win32": - extra_compile_args += ["/std:c++17"] - if debug: - raise RuntimeError("Debuggable builds are not supported on Windows.") - else: - extra_compile_args += ["-std=c++17"] - if debug: - extra_cythonize_kwargs["gdb_debug"] = True - extra_compile_args += ["-g", "-O0"] - extra_compile_args += ["-D _GLIBCXX_ASSERTIONS"] - else: - extra_compile_args += ["-O2"] - extra_link_args += ["-Wl,--strip-all"] - if COMPILE_FOR_COVERAGE: - # CYTHON_TRACE_NOGIL indicates to trace nogil functions. It is not - # related to free-threading builds. - extra_compile_args += ["-DCYTHON_TRACE_NOGIL=1", "-DCYTHON_USE_SYS_MONITORING=0"] - - ext_modules = tuple( - Extension( - f"cuda.core.{mod.replace(os.path.sep, '.')}", - sources=get_sources(mod), - include_dirs=[ - "cuda/core/_include", - "cuda/core/_cpp", - ] - + all_include_dirs, - language="c++", - extra_compile_args=extra_compile_args, - extra_link_args=extra_link_args, + if cuda_major is None: + configured_root = _setting_value( + config_settings, + "cmake.define.CUDA_CORE_CUDA_ROOT", + "skbuild.cmake.define.CUDA_CORE_CUDA_ROOT", ) - for mod in module_names() - ) + return _determine_cuda_major_version(os.fspath(configured_root) if configured_root is not None else None) + + cuda_major = str(cuda_major) + if not re.fullmatch(r"\d+", cuda_major): + raise RuntimeError(f"CUDA_CORE_BUILD_MAJOR must be an integer, got {cuda_major!r}") + return cuda_major + + +def _parse_bool(value: str | bool, *, setting: str) -> bool: + if isinstance(value, bool): + return value + normalized = value.strip().lower() + if normalized in {"1", "true", "on", "yes", "y"}: + return True + if normalized in {"0", "false", "off", "no", "n"}: + return False + raise ValueError(f"{setting} must be a boolean value, got {value!r}") + + +def _translate_config_settings(config_settings: _ConfigSettings, *, editable: bool) -> dict[str, Any]: + settings = dict(config_settings or {}) + debug = settings.pop("debug", _MISSING) + build_type_keys = ("cmake.build-type", "skbuild.cmake.build-type") + + if debug is not _MISSING and any(key in settings for key in build_type_keys): + raise ValueError("debug and cmake.build-type cannot both be specified") + + if debug is not _MISSING: + if isinstance(debug, list): + if not debug: + raise ValueError("debug must have a value") + debug = debug[-1] + debug_enabled = _parse_bool(debug, setting="debug") + if debug_enabled and sys.platform == "win32": + raise RuntimeError("Debuggable builds are not supported on Windows.") + settings["cmake.build-type"] = "Debug" if debug_enabled else "Release" + elif editable and not any(key in settings for key in build_type_keys): + # Preserve the setuptools backend's developer-friendly editable default. + settings["cmake.build-type"] = "Release" if sys.platform == "win32" else "Debug" - nthreads = int(os.environ.get("CUDA_PYTHON_PARALLEL_LEVEL", os.cpu_count() // 2)) - compile_time_env = {"CUDA_CORE_BUILD_MAJOR": int(_determine_cuda_major_version())} - compiler_directives = {"embedsignature": True, "warn.deprecated.IF": False, "freethreading_compatible": True} - _CythonOptions.warning_errors = True - if COMPILE_FOR_COVERAGE: - compiler_directives["linetrace"] = True - _extensions = cythonize( - ext_modules, - verbose=True, - language_level=3, - build_dir="." if COMPILE_FOR_COVERAGE else "build/cython", - nthreads=nthreads, - compiler_directives=compiler_directives, - compile_time_env=compile_time_env, - **extra_cythonize_kwargs, - ) + return settings - return +def _set_cmake_define(settings: dict[str, Any], name: str, value: str) -> None: + keys = (f"cmake.define.{name}", f"skbuild.cmake.define.{name}") + if not any(key in settings for key in keys): + settings[keys[0]] = value -def _add_cython_include_paths_to_pth(wheel_path: str) -> None: - """ - Modify the .pth file in an editable install wheel to add Cython include paths. - This is needed because Cython cannot find .pxd files through meta path finders, - it only looks in sys.path directories. By adding direct paths to the .pth file, - we enable Cython to find .pxd files from editable-installed cuda-bindings. +def _build_config_settings(config_settings: _ConfigSettings, *, editable: bool) -> dict[str, Any]: + settings = _translate_config_settings(config_settings, editable=editable) + cuda_root = _configured_cuda_root(settings) + cuda_major = _configured_cuda_major(settings) + coverage = _parse_bool(os.environ.get("CUDA_PYTHON_COVERAGE", "0"), setting="CUDA_PYTHON_COVERAGE") - See: https://github.com/scikit-build/scikit-build-core/pull/516 - See: https://github.com/cython/cython/issues/7326 - """ - # Find cuda-bindings location - # When building with pixi path dependencies, cuda-bindings should be importable + _set_cmake_define(settings, "CUDA_CORE_CUDA_ROOT", cuda_root) + _set_cmake_define(settings, "CUDA_CORE_BUILD_MAJOR", cuda_major) + _set_cmake_define(settings, "CUDA_PYTHON_COVERAGE", "1" if coverage else "0") + return settings + + +def _call_build_hook(hook: Callable[..., str], *args: Any, **kwargs: Any) -> str: + parallel_level = os.environ.get("CUDA_PYTHON_PARALLEL_LEVEL") + old_parallel_level = os.environ.get("CMAKE_BUILD_PARALLEL_LEVEL", _MISSING) + if parallel_level is not None and old_parallel_level is _MISSING: + os.environ["CMAKE_BUILD_PARALLEL_LEVEL"] = parallel_level try: - import cuda.bindings - - bindings_path = Path(cuda.bindings.__file__).parent # .../cuda/bindings/ - # We need the directory containing the 'cuda' package for Cython imports - cuda_package_dir = bindings_path.parent.parent # .../cuda_bindings/ (contains cuda/) - print(f"Found cuda-bindings at: {bindings_path}", file=sys.stderr) - print(f"Will add to .pth for Cython: {cuda_package_dir}", file=sys.stderr) - except ImportError: - # If cuda-bindings isn't available yet, we can't add the path - # This might happen in some build scenarios, but it's okay - the - # wildcard dependency will work in those cases - print("cuda-bindings not found in current environment, skipping .pth modification") - return - - # Create a temporary directory for wheel manipulation - with tempfile.TemporaryDirectory() as tmpdir: - tmpdir_path = Path(tmpdir) - wheel_file = Path(wheel_path) - - # Extract the wheel - extract_dir = tmpdir_path / "extracted" - with zipfile.ZipFile(wheel_file, "r") as zf: - zf.extractall(extract_dir) - - # Find the .pth file (should be named something like __editable___cuda_core-*.pth) - pth_files = list(extract_dir.glob("**/*.pth")) - if not pth_files: - print("Warning: No .pth file found in editable wheel", file=sys.stderr) - return - - # Modify each .pth file (usually just one) - for pth_file in pth_files: - print(f"Modifying {pth_file.name} to add Cython include paths", file=sys.stderr) - - # Read existing content - content = pth_file.read_text() - - # Add the cuda-bindings source path to sys.path for Cython - # This allows Cython to find .pxd files via direct path lookup - # The path must be the directory containing the 'cuda' package - path_to_add = str(cuda_package_dir.absolute()) - - # Ensure content ends with newline before adding path - if not content.endswith("\n"): - content += "\n" - - # Append to the .pth file (after the import hook line) - if path_to_add not in content: - pth_file.write_text(content + path_to_add + "\n") - print(f"Added Cython include path: {cuda_package_dir}", file=sys.stderr) - - # Repackage the wheel - # Remove the old wheel first - wheel_file.unlink() - - # Create new wheel with same name - with zipfile.ZipFile(wheel_file, "w", zipfile.ZIP_DEFLATED) as zf: - for file_path in extract_dir.rglob("*"): - if file_path.is_file(): - arcname = file_path.relative_to(extract_dir) - zf.write(file_path, arcname) - - print(f"Successfully patched {wheel_file.name}", file=sys.stderr) + return hook(*args, **kwargs) + finally: + if parallel_level is not None and old_parallel_level is _MISSING: + os.environ.pop("CMAKE_BUILD_PARALLEL_LEVEL", None) -def build_editable(wheel_directory, config_settings=None, metadata_directory=None): - debug_default = sys.platform != "win32" # Debug builds not supported on Windows - debug = config_settings.get("debug", debug_default) if config_settings else debug_default - _build_cuda_core(debug=debug) - wheel_name = _build_meta.build_editable(wheel_directory, config_settings, metadata_directory) +def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): + settings = _translate_config_settings(config_settings, editable=False) + return _build_backend.prepare_metadata_for_build_wheel(metadata_directory, settings) - # Patch the .pth file to add Cython include paths - wheel_path = os.path.join(wheel_directory, wheel_name) - _add_cython_include_paths_to_pth(wheel_path) - return wheel_name +def prepare_metadata_for_build_editable(metadata_directory, config_settings=None): + settings = _translate_config_settings(config_settings, editable=True) + return _build_backend.prepare_metadata_for_build_editable(metadata_directory, settings) def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): - debug = config_settings.get("debug", False) if config_settings else False - _build_cuda_core(debug=debug) - return _build_meta.build_wheel(wheel_directory, config_settings, metadata_directory) + settings = _build_config_settings(config_settings, editable=False) + return _call_build_hook( + _build_backend.build_wheel, + wheel_directory, + settings, + metadata_directory, + ) -def _get_cuda_bindings_require(): - cuda_major = _determine_cuda_major_version() - return [f"cuda-bindings=={cuda_major}.*"] +def build_editable(wheel_directory, config_settings=None, metadata_directory=None): + settings = _build_config_settings(config_settings, editable=True) + return _call_build_hook( + _build_backend.build_editable, + wheel_directory, + settings, + metadata_directory, + ) -def get_requires_for_build_editable(config_settings=None): - return _build_meta.get_requires_for_build_editable(config_settings) + _get_cuda_bindings_require() +def _get_cuda_bindings_require(config_settings: _ConfigSettings = None) -> list[str]: + cuda_major = _configured_cuda_major(config_settings) + return [f"cuda-bindings=={cuda_major}.*"] def get_requires_for_build_wheel(config_settings=None): - return _build_meta.get_requires_for_build_wheel(config_settings) + _get_cuda_bindings_require() + settings = _translate_config_settings(config_settings, editable=False) + return _build_backend.get_requires_for_build_wheel(settings) + _get_cuda_bindings_require(settings) + + +def get_requires_for_build_editable(config_settings=None): + settings = _translate_config_settings(config_settings, editable=True) + return _build_backend.get_requires_for_build_editable(settings) + _get_cuda_bindings_require(settings) diff --git a/cuda_core/cuda/core/_include/aoti_shim.def b/cuda_core/cuda/core/_include/aoti_shim.def index 3cd1e31aeac..356e9dd92e9 100644 --- a/cuda_core/cuda/core/_include/aoti_shim.def +++ b/cuda_core/cuda/core/_include/aoti_shim.def @@ -4,8 +4,8 @@ ; At runtime the symbols resolve from torch_cpu.dll (loaded by 'import torch'). ; ; IMPORTANT: Keep this export list in sync with the AOTI_SHIM_API declarations -; in aoti_shim.h. setup.py turns this file into the stub import library -; that MSVC uses to link _tensor_bridge, so any added/removed/renamed AOTI +; in aoti_shim.h. CMake turns this file into the stub import library that MSVC +; uses to link _tensor_bridge, so any added/removed/renamed AOTI ; symbol must be updated in both files. LIBRARY torch_cpu.dll EXPORTS diff --git a/cuda_core/cuda/core/_include/aoti_shim.h b/cuda_core/cuda/core/_include/aoti_shim.h index bf8894d940a..4bf84879d75 100644 --- a/cuda_core/cuda/core/_include/aoti_shim.h +++ b/cuda_core/cuda/core/_include/aoti_shim.h @@ -52,8 +52,8 @@ typedef struct AtenTensorOpaque* AtenTensorHandle; /* * IMPORTANT: Keep the AOTI_SHIM_API declaration list below in sync with - * aoti_shim.def. On Windows, setup.py generates that stub import library - * during build_ext so MSVC can link _tensor_bridge without making PyTorch a + * aoti_shim.def. On Windows, CMake generates that stub import library so + * MSVC can link _tensor_bridge without making PyTorch a * build-time dependency. If you add, remove, or rename an imported AOTI * symbol here, update aoti_shim.def in the same change. * diff --git a/cuda_core/pixi.lock b/cuda_core/pixi.lock index b8f6cbac479..5fbb5302f86 100644 --- a/cuda_core/pixi.lock +++ b/cuda_core/pixi.lock @@ -235,12 +235,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -251,6 +254,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda @@ -258,7 +262,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-core[e53261c5] @ . + - conda_source: cuda-core[bbcafd42] @ . - pypi: ../cuda_python_test_helpers linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda @@ -442,12 +446,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -458,13 +465,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-core[6e9d4edb] @ . + - conda_source: cuda-core[fe1119ad] @ . - pypi: ../cuda_python_test_helpers win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda @@ -489,6 +497,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_win-64-15.2.0-hbb59886_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_win-64-12.9.86-h57928b3_2.conda @@ -499,6 +509,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-windows-default-manifest-6.4-he206cdd_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-winpthreads-git-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -509,6 +520,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -615,7 +627,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-core[18c68942] @ . + - conda_source: cuda-core[9f8da934] @ . - pypi: ../cuda_python_test_helpers cu13: channels: @@ -806,11 +818,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -821,6 +836,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda @@ -829,7 +845,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda_source: cuda-bindings[6c91bfdd] @ ../cuda_bindings - - conda_source: cuda-core[adf7f1da] @ . + - conda_source: cuda-core[c60a7d63] @ . - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder - pypi: ../cuda_python_test_helpers linux-aarch64: @@ -1007,11 +1023,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -1022,6 +1041,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda @@ -1029,7 +1049,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda_source: cuda-bindings[3db1bf41] @ ../cuda_bindings - - conda_source: cuda-core[7b4f4a3f] @ . + - conda_source: cuda-core[c4773ab0] @ . - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder - pypi: ../cuda_python_test_helpers win-64: @@ -1053,6 +1073,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_win-64-15.2.0-hbb59886_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_win-64-15.2.0-h0a72980_118.conda @@ -1062,6 +1084,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-windows-default-manifest-6.4-he206cdd_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-winpthreads-git-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -1072,6 +1095,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1173,7 +1197,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - conda_source: cuda-bindings[4664b262] @ ../cuda_bindings - - conda_source: cuda-core[2b0a529b] @ . + - conda_source: cuda-core[d6c205a8] @ . - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder - pypi: ../cuda_python_test_helpers default: @@ -1365,11 +1389,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -1380,6 +1407,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda @@ -1388,7 +1416,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda_source: cuda-bindings[6c91bfdd] @ ../cuda_bindings - - conda_source: cuda-core[adf7f1da] @ . + - conda_source: cuda-core[c60a7d63] @ . - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder - pypi: ../cuda_python_test_helpers linux-aarch64: @@ -1566,11 +1594,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.2.0-h55c397f_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.2.0-ha7b1723_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -1581,6 +1612,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda @@ -1588,7 +1620,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - conda_source: cuda-bindings[3db1bf41] @ ../cuda_bindings - - conda_source: cuda-core[7b4f4a3f] @ . + - conda_source: cuda-core[c4773ab0] @ . - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder - pypi: ../cuda_python_test_helpers win-64: @@ -1612,6 +1644,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_win-64-15.2.0-hbb59886_118.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_win-64-15.2.0-h0a72980_118.conda @@ -1621,6 +1655,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-windows-default-manifest-6.4-he206cdd_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mingw-w64-ucrt-x86_64-winpthreads-git-12.0.0.r4.gg4f2fc60ca-hd8ed1ab_10.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyglet-2.1.13-pyhd8ed1ab_0.conda @@ -1631,6 +1666,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1732,7 +1768,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - conda_source: cuda-bindings[4664b262] @ ../cuda_bindings - - conda_source: cuda-core[2b0a529b] @ . + - conda_source: cuda-core[d6c205a8] @ . - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder - pypi: ../cuda_python_test_helpers docs: @@ -1918,9 +1954,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[91169b48] @ ../cuda_bindings - - conda_source: cuda-core[83c371ca] @ . - - conda_source: cuda-pathfinder[3890e449] @ ../cuda_pathfinder + - conda_source: cuda-bindings[29afc263] @ ../cuda_bindings + - conda_source: cuda-core[79948b31] @ . + - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder - pypi: https://files.pythonhosted.org/packages/8c/79/017fab2f7167a9a9795665f894d04f77aafceca80821b51589bb4b23ff5c/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda @@ -2100,9 +2136,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda_source: cuda-bindings[4e633ee8] @ ../cuda_bindings - - conda_source: cuda-core[29d2d05a] @ . - - conda_source: cuda-pathfinder[640a9949] @ ../cuda_pathfinder + - conda_source: cuda-bindings[4338e640] @ ../cuda_bindings + - conda_source: cuda-core[bf994188] @ . + - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder - pypi: https://files.pythonhosted.org/packages/8c/79/017fab2f7167a9a9795665f894d04f77aafceca80821b51589bb4b23ff5c/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -2270,9 +2306,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[8b6a309f] @ ../cuda_bindings - - conda_source: cuda-core[e56c61a7] @ . - - conda_source: cuda-pathfinder[bcd0ad48] @ ../cuda_pathfinder + - conda_source: cuda-bindings[c75d4d07] @ ../cuda_bindings + - conda_source: cuda-core[e9974f1b] @ . + - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder - pypi: https://files.pythonhosted.org/packages/8c/79/017fab2f7167a9a9795665f894d04f77aafceca80821b51589bb4b23ff5c/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl examples: channels: @@ -2502,9 +2538,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - - conda_source: cuda-bindings[91169b48] @ ../cuda_bindings - - conda_source: cuda-core[83c371ca] @ . - - conda_source: cuda-pathfinder[3890e449] @ ../cuda_pathfinder + - conda_source: cuda-bindings[29afc263] @ ../cuda_bindings + - conda_source: cuda-core[79948b31] @ . + - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder p2: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -2723,9 +2759,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda_source: cuda-bindings[4e633ee8] @ ../cuda_bindings - - conda_source: cuda-core[29d2d05a] @ . - - conda_source: cuda-pathfinder[640a9949] @ ../cuda_pathfinder + - conda_source: cuda-bindings[4338e640] @ ../cuda_bindings + - conda_source: cuda-core[bf994188] @ . + - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder p3: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -2821,9 +2857,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/x264-1!164.3095-h8ffe710_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/x265-3.5-h2d74725_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-bindings[8b6a309f] @ ../cuda_bindings - - conda_source: cuda-core[e56c61a7] @ . - - conda_source: cuda-pathfinder[bcd0ad48] @ ../cuda_pathfinder + - conda_source: cuda-bindings[c75d4d07] @ ../cuda_bindings + - conda_source: cuda-core[e9974f1b] @ . + - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder numba-classic: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -3830,6 +3866,21 @@ packages: - bzip2 >=1.0.8,<2.0a0 size: 260182 timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-h280c20c_1.conda + sha256: 5139b6afbfaca91c47104ba9a6a40f81211e1c9200e96b73ce3a56f0ca1902f4 + md5: 2cef891b791040aab83e218c7d137679 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - c-ares-static <0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - c-ares >=1.34.8,<2.0a0 + size: 226755 + timestamp: 1786116641939 - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a md5: bb6c4808bfa69d6f7f6b07e5846ced37 @@ -3871,6 +3922,27 @@ packages: license_family: MIT size: 300271 timestamp: 1761203085220 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.4.2-hc85cc9f_0.conda + sha256: 5c8027d6f51e4aea86dfa74a09481f6e275742a620c5a88b132ec01405e9bd6e + md5: c7d7ad5d723ffc37a7892d9dd9dd115d + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - libexpat >=2.8.1,<3.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 23711960 + timestamp: 1785533746305 - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda sha256: b90ec0e6a9eb22f7240b3584fe785457cff961fec68d40e6aece5d596f9bbd9a md5: 0e3e144115c43c9150d18fa20db5f31c @@ -5135,6 +5207,19 @@ packages: - icu >=78.3,<79.0a0 size: 14455340 timestamp: 1784916378180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + sha256: 9f07834f0c546ab14d885ce0366285f61f44e326c0edd1fc63b8294e113ae432 + md5: 72a381cbad04f24b1c2a43ef707f45b4 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + license: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14459115 + timestamp: 1786545741408 - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda sha256: bc231d69eb6663db0e09738fb916c5e5507147cf1ac60f364f964004e0b29bab md5: 10909406c1b0e4b57f9f4f0eb0999af8 @@ -5195,6 +5280,9 @@ packages: - libgcc >=13 license: LGPL-2.1-or-later purls: [] + run_exports: + weak: + - keyutils >=1.6.3,<2.0a0 size: 134088 timestamp: 1754905959823 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda @@ -5213,6 +5301,24 @@ packages: purls: [] size: 1386730 timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + sha256: 9b07046870772f28740e3f6149f09ff222843733087a33c5540b169c6289652d + md5: 54157a1c8c0bb70f62dd0b17fba7e7f2 + depends: + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1388990 + timestamp: 1781859420533 - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab md5: a8832b479f93521a9e7b5b743803be51 @@ -5674,6 +5780,26 @@ packages: license: LicenseRef-NVIDIA-End-User-License-Agreement size: 43805393 timestamp: 1779897559895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-heca4667_4.conda + sha256: aff8ef75636d0825ce34911e0bef2f26816e7afd090a9dcb4b9bacab75cbf584 + md5: 3f2fd5617cfacac49c85f6dc63842ea1 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.68.1,<2.0a0 + - libpsl >=0.23.0,<0.24.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + run_exports: + weak: + - libcurl >=8.21.0,<9.0a0 + size: 480565 + timestamp: 1785500108494 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-12.2.2.18-h676940d_0.conda sha256: 96d35c33ff30aec3f2226ffc2308f8bdb5b6e9bf661769038f1287976110cb2b md5: 6fe9b15c855e59034cb62fd86e4d3eea @@ -5759,6 +5885,9 @@ packages: license: BSD-2-Clause license_family: BSD purls: [] + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 size: 134676 timestamp: 1738479519902 - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda @@ -5781,6 +5910,19 @@ packages: purls: [] size: 46500 timestamp: 1779728188901 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + sha256: e4418f68d01a6307c4431b585c71b584f40189877364e542ee87deb777f5e85b + md5: 7bc31538d6e3fb349e897353969237ec + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: BSD-2-Clause OR GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 43220 + timestamp: 1785917328200 - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -6427,6 +6569,25 @@ packages: run_exports: {} size: 92400 timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + sha256: 663444d77a42f2265f54fb8b48c5450bfff4388d9c0f8253dd7855f0d993153f + md5: 2a45e7f8af083626f009645a6481f12d + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.6,<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.5,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 663344 + timestamp: 1773854035739 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda sha256: ba7c5d294e3d80f08ac5a39564217702d1a752e352e486210faff794ac5001b4 md5: db63358239cbe1ff86242406d440e44a @@ -7232,6 +7393,21 @@ packages: purls: [] size: 3675765 timestamp: 1780003831209 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hf670292_0.conda + sha256: 2e6405feb59e3f40a5a4641dfa73afda158046893aa73d478e23415e18997ece + md5: c8217f5bdd5b018087bdea081912cda5 + depends: + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libpsl >=0.23.1,<0.24.0a0 + size: 72505 + timestamp: 1786443494718 - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.60.2-h61e6d4b_0.conda sha256: 38b3189cf246f7265e06917f32d046ac375117c88834d045efe73ec48ceacc59 md5: d62da3d560992bfa2feb611d7be813b8 @@ -7399,6 +7575,21 @@ packages: - libsqlite >=3.53.4,<4.0a0 size: 964200 timestamp: 1785016112246 +- 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 + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 304790 + timestamp: 1745608545575 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e md5: 1b08cd684f34175e4514474793d44bcb @@ -7694,6 +7885,19 @@ packages: license_family: MIT size: 895108 timestamp: 1753948278280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + sha256: 67761d0206f84140047a367eaf9befe03a7e157a29ee25aee0047b40801cc6b6 + md5: 01c4ed87826af55996768af6dbc936b4 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libuv >=1.52.1,<2.0a0 + size: 420040 + timestamp: 1785914567661 - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.23.0-he1eb515_0.conda sha256: 255c7d00b54e26f19fad9340db080716bced1d8539606e2b8396c57abd40007c md5: 25813fe38b3e541fc40007592f12bae5 @@ -8104,6 +8308,18 @@ packages: - ncurses >=6.6,<7.0a0 size: 918956 timestamp: 1777422145199 +- 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 + run_exports: {} + size: 186323 + timestamp: 1763688260928 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py314h2b28147_1.conda sha256: 1d8377c8001c15ed12c2713b723213474b435706ab9d34ede69795d64af9e94d md5: 4ea6b620fdf24a1a0bc4f1c7134dfafb @@ -8692,6 +8908,19 @@ packages: - readline >=8.3,<9.0a0 size: 345073 timestamp: 1765813471974 +- 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 + run_exports: + weak: + - rhash >=1.4.6,<2.0a0 + size: 193775 + timestamp: 1748644872902 - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 md5: c1c368b5437b0d1a68f372ccf01cb133 @@ -9499,6 +9728,20 @@ packages: - bzip2 >=1.0.8,<2.0a0 size: 192412 timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h80f16a2_1.conda + sha256: 537be62d1835ba3d211941537a13302f6c827d9b1316ca11384c0f47ca755cc8 + md5: 9aaa63e98eb2cf6d22d1d2f87ec9adba + depends: + - libgcc >=14 + constrains: + - c-ares-static <0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - c-ares >=1.34.8,<2.0a0 + size: 236990 + timestamp: 1786116643290 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda sha256: 675db823f3d6fb6bf747fab3b0170ba99b269a07cf6df1e49fff2f9972be9cd1 md5: 043c13ed3a18396994be9b4fab6572ad @@ -9538,6 +9781,26 @@ packages: license_family: MIT size: 318357 timestamp: 1761203973223 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-4.4.2-hc9d863e_0.conda + sha256: af8fdf10434247a3ee65da72a25db8049f85c05b0dd11310b5f800c587451c70 + md5: c15f13e35473edd3780e68bed9a4bb96 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - libexpat >=2.8.1,<3.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 22903513 + timestamp: 1785533746259 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_18.conda sha256: 7b018e74d2f828e887faabc9d5c5bef6d432c3356dcac3e691ee6b24bc82ef52 md5: 184c1aba41c40e6bc59fa91b37cd7c3f @@ -10785,6 +11048,18 @@ packages: - icu >=78.3,<79.0a0 size: 12870753 timestamp: 1784588696185 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda + sha256: 54d921defd947adb58a90e10203d3bfe6c1f209f5f1a1ad2c6a9f7617f2fb59e + md5: b35bbb1b957440ed742f35fb96eb7f1c + depends: + - libgcc >=14 + - libstdcxx >=14 + license: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14688525 + timestamp: 1786545779464 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 @@ -10792,8 +11067,28 @@ packages: - libgcc >=13 license: LGPL-2.1-or-later purls: [] + run_exports: + weak: + - keyutils >=1.6.3,<2.0a0 size: 129048 timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h2fb54aa_1.conda + sha256: b644718416a22b5d57c1194ea7207b7f8d33d6a2b42775763782d76cd7457aea + md5: 5fd2304064ef6199d1f91ec60ee7b820 + depends: + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1518484 + timestamp: 1781859412954 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba md5: d9ca108bd680ea86a963104b6b3e95ca @@ -11225,6 +11520,25 @@ packages: license: LicenseRef-NVIDIA-End-User-License-Agreement size: 44131451 timestamp: 1779897594729 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.21.0-h23397ac_4.conda + sha256: 5a99beaf91963d212f9b488b5361a2d7aeb69ae3d44b40b65a3e87f128c5417e + md5: 5afef6f29ea234741802980cdcee6f5e + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.68.1,<2.0a0 + - libpsl >=0.23.0,<0.24.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + run_exports: + weak: + - libcurl >=8.21.0,<9.0a0 + size: 505770 + timestamp: 1785500029413 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcusolver-12.2.2.18-he38c790_0.conda sha256: 7e1a9a63fc748e928f7507c1cfbc5b922a5de1096a00f6269a43c810503a4af8 md5: c9ac2d284899e955da7a4c456403608a @@ -11310,6 +11624,9 @@ packages: license: BSD-2-Clause license_family: BSD purls: [] + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 size: 148125 timestamp: 1738479808948 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-1.7.0-hd24410f_2.conda @@ -11330,6 +11647,18 @@ packages: purls: [] size: 54600 timestamp: 1779728234591 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda + sha256: 4475f79a020e9ff2a5a0308c48cb2970a25d55c3dd724a97ab28bfac3be6cd49 + md5: f679b30a53d410d0b5ae0cb8f5b7397e + depends: + - libgcc >=14 + license: BSD-2-Clause OR GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 45746 + timestamp: 1785917328690 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 md5: 57f3b3da02a50a1be2a6fe847515417d @@ -11917,6 +12246,24 @@ packages: run_exports: {} size: 114056 timestamp: 1769482343003 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda + sha256: 13782715b9eeebc4ad16d36e84ca569d1495e3516aea3fe546a32caa0a597d82 + md5: be5f0f007a4500a226ef001115535a3d + depends: + - c-ares >=1.34.6,<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.5,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 726928 + timestamp: 1773854039807 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda sha256: 2e603bf640738511faf80de284daa031f0e67de66b77bed7d0da1045ef062abf md5: bb24d3dd7d028b70f0bb5f6d6e1329c0 @@ -12468,6 +12815,20 @@ packages: purls: [] size: 3502676 timestamp: 1780003320814 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-h36cc0f4_0.conda + sha256: edb7661283a27cdb4dfde61c463ae5684e994d9a4631c2435d4b7cd5a0380565 + md5: 8c47b55f12f25d0e8c41c01ce0514f15 + depends: + - libstdcxx >=14 + - libgcc >=14 + - icu >=78.3,<79.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libpsl >=0.23.1,<0.24.0a0 + size: 74615 + timestamp: 1786443500085 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.60.2-h8171147_0.conda sha256: d02d3b23aa58d7767b820289b5b50653e73d70ae32f6ee5b88f63c5c5d96c2de md5: 1d6f1aff501c8104f7292ab787d65f15 @@ -12624,6 +12985,20 @@ packages: - libsqlite >=3.53.4,<4.0a0 size: 963888 timestamp: 1785016056926 +- 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 + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 311396 + timestamp: 1745609845915 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 md5: f56573d05e3b735cb03efeb64a15f388 @@ -12904,6 +13279,18 @@ packages: license_family: MIT size: 629238 timestamp: 1753948296190 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda + sha256: 52f4bc6e340bde53bfe38e45f6cb1080a2d5f8891da9a647087f7cc6a6edfc22 + md5: 8e2136432f02841b9d8b848045f66d7d + depends: + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libuv >=1.52.1,<2.0a0 + size: 457209 + timestamp: 1785914582944 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvorbis-1.3.7-h7ac5ae9_2.conda sha256: 066708ca7179a1c6e5639d015de7ed6e432b93ad50525843db67d57eb1ba1faf md5: 9d099329070afe52d797462ca7bf35f3 @@ -13239,6 +13626,17 @@ packages: - ncurses >=6.6,<7.0a0 size: 960036 timestamp: 1777422174534 +- 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 + run_exports: {} + size: 182666 + timestamp: 1763688214250 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.2-py314haac167e_1.conda sha256: 1e1366e700156cbddc4daae0fec34a72b74105ba45f9c144f777120552924747 md5: 98ef547c85356475adb2197965c716b6 @@ -13787,6 +14185,18 @@ packages: - readline >=8.3,<9.0a0 size: 357597 timestamp: 1765815673644 +- 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 + run_exports: + weak: + - rhash >=1.4.6,<2.0a0 + size: 207475 + timestamp: 1748644952027 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda sha256: a587240f16eac7c6a80f9585cef679cd1cb9a287b8dfcdd36dcef1f7e7db15dc md5: e7f6ed9e60043bb5cbcc527764897f0d @@ -15362,6 +15772,19 @@ packages: run_exports: {} size: 22083 timestamp: 1779891651771 +- conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + sha256: 6fcfe24a3240264a7b22ad42189f345c1c6fbe2f0944fa67881fde56d8966188 + md5: 8e10311eb34925d0df1b9ec4590c1b55 + depends: + - python >=3.10 + - importlib_resources + - cython + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 39080 + timestamp: 1783869947930 - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda sha256: c17c6b9937c08ad63cb20a26f403a3234088e57d4455600974a0ce865cb14017 md5: 9ce473d1d1be1cc3810856a48b3fab32 @@ -15449,6 +15872,7 @@ packages: license: MIT and PSF-2.0 purls: - pkg:pypi/exceptiongroup?source=hash-mapping + run_exports: {} size: 21333 timestamp: 1763918099466 - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda @@ -15644,6 +16068,18 @@ packages: purls: [] size: 9724 timestamp: 1736252443859 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + sha256: 6a2f86ef0965605d742b5b94229bf8b829258d0a9f640e3651901cc72ef9a0a5 + md5: e3bffa82b874f8b9a2631bddb3869529 + depends: + - importlib_resources >=7.1.0,<7.1.1.0a0 + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 10354 + timestamp: 1776068852701 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 md5: c85c76dc67d75619a92f51dfbce06992 @@ -15658,6 +16094,21 @@ packages: - pkg:pypi/importlib-resources?source=hash-mapping size: 33781 timestamp: 1736252433366 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + sha256: a563a51aa522998172838e867e6dedcf630bc45796e8612f5a1f6d73e9c8125a + md5: 0ba6225c279baf7ea9473a62ea0ec9ae + depends: + - python >=3.10 + - zipp >=3.1.0 + constrains: + - importlib-resources >=7.1.0,<7.1.1.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources?source=hash-mapping + run_exports: {} + size: 34809 + timestamp: 1776068839274 - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 md5: 9614359868482abba1bd15ce465e3c42 @@ -16451,6 +16902,18 @@ packages: - pkg:pypi/parso?source=hash-mapping size: 82287 timestamp: 1770676243987 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 + md5: 11adc78451c998c0fd162584abfa3559 + depends: + - python >=3.10 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + run_exports: {} + size: 56559 + timestamp: 1777271601895 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a md5: d0d408b1f18883a944376da5cf8101ea @@ -16889,6 +17352,25 @@ packages: - pkg:pypi/ruamel-yaml?source=hash-mapping size: 98448 timestamp: 1767538149184 +- conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + sha256: 8c01a200a00e60f7ba69d8370ac6572fe85356da7b8cec539349499d86db4315 + md5: 5d9f7061c53e8f854b161c3dd89bf135 + depends: + - python >=3.8 + - exceptiongroup >=1.0 + - importlib-resources >=1.3 + - packaging >=23.2 + - pathspec >=0.12.0 + - tomli >=1.2.2 + - typing_extensions >=4 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/scikit-build-core?source=hash-mapping + run_exports: {} + size: 339601 + timestamp: 1783871121076 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda sha256: 82088a6e4daa33329a30bc26dc19a98c7c1d3f05c0f73ce9845d4eab4924e9e1 md5: 8e194e7b992f99a5015edbd4ebd38efd @@ -17447,6 +17929,17 @@ packages: - pkg:pypi/zipp?source=hash-mapping size: 24194 timestamp: 1764460141901 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 + md5: ba3dcdc8584155c97c648ae9c044b7a3 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 24190 + timestamp: 1779159948016 - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 sha256: 8a1cee28bd0ee7451ada1cd50b64720e57e17ff994fc62dd8329bef570d382e4 @@ -17579,15 +18072,33 @@ packages: license_family: MIT size: 294731 timestamp: 1761203441365 -- conda: https://conda.anaconda.org/conda-forge/win-64/conda-gcc-specs-15.2.0-hd546029_18.conda - sha256: 21062850a891e5a82b7a473de0a2fa4bfafff6fcba9455a619604343018c9f99 - md5: 071dbd17ed598f723c5f48624ae455f9 +- conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.4.2-hdcbee5b_0.conda + sha256: 6c6b1c4d05a30bdd6c0cac0c9c7799f929bb632c76e251da20a7868103dd0f2c + md5: 0603f36777dc08a502a48bf50d9a4f00 depends: - - gcc_impl_win-64 >=15.2.0,<15.2.1.0a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 54725 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - libexpat >=2.8.1,<3.0a0 + - liblzma >=5.8.3,<6.0a0 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<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 + run_exports: {} + size: 16549322 + timestamp: 1785535021930 +- conda: https://conda.anaconda.org/conda-forge/win-64/conda-gcc-specs-15.2.0-hd546029_18.conda + sha256: 21062850a891e5a82b7a473de0a2fa4bfafff6fcba9455a619604343018c9f99 + md5: 071dbd17ed598f723c5f48624ae455f9 + depends: + - gcc_impl_win-64 >=15.2.0,<15.2.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54725 timestamp: 1771382417485 - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-12.9.6-py314hdc4d7ff_0.conda sha256: 62ebdca571dff04c6af652584b6d7b99c296a6f5718f889cfdc0c7e104613f1c @@ -18399,6 +18910,20 @@ packages: purls: [] size: 13222158 timestamp: 1767970128854 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h5112557_2.conda + sha256: 75c549b55b673e15de8785a8e5dd85bca7eb612eee0ff4dc8d7bdaa15eacbdbb + md5: e596942e8ee6ee17fdcf1e6a77757a66 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 16835644 + timestamp: 1784916416303 - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda sha256: 1bda728d70a619731b278c859eda364146cb5b4b8c739a64da8128353d81d1c4 md5: 0097b24800cb696915c3dbd1f5335d3f @@ -18424,6 +18949,21 @@ packages: purls: [] size: 751055 timestamp: 1769769688841 +- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h719d79b_1.conda + sha256: c55745796e762ba9e817ab1fc0f21f1a049e202f90fa762df39578f37923f6c2 + md5: 00335c2c4a98656554771aaf6f1a7400 + depends: + - openssl >=3.5.7,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 750320 + timestamp: 1781859644591 - conda: https://conda.anaconda.org/conda-forge/win-64/lame-3.100-hcfcfb64_1003.tar.bz2 sha256: 824988a396b97bb9138823a1b3aabd8326e06da5834b3011253d72bb45fd3a88 md5: d92e64077c44c9e32c72d4b5799d47e4 @@ -18591,6 +19131,24 @@ packages: purls: [] size: 68443 timestamp: 1779859701498 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.21.0-hdb0ef4a_4.conda + sha256: af17c990ec52b6aba29e052c438d7ac61bfd541d6d183a8f09aa4f2c532c9bab + md5: 5e9c5b83929cf7ab2c04121af771e7b5 + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libpsl >=0.23.0,<0.24.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: curl + license_family: MIT + run_exports: + weak: + - libcurl >=8.21.0,<9.0a0 + size: 404586 + timestamp: 1785500241182 - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda sha256: 834e4881a18b690d5ec36f44852facd38e13afe599e369be62d29bd675f107ee md5: e77030e67343e28b084fabd7db0ce43e @@ -19099,6 +19657,21 @@ packages: purls: [] size: 385227 timestamp: 1776315248638 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpsl-0.23.1-h9b16d47_0.conda + sha256: 1f92f663cb283c4fd90db8a8a3851a4f17f1e9778746adcbfb7736fde8e5455f + md5: 16ccdcddc776dbb14cd866ab480561ff + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - icu >=78.3,<79.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libpsl >=0.23.1,<0.24.0a0 + size: 73424 + timestamp: 1786443553911 - conda: https://conda.anaconda.org/conda-forge/win-64/librsvg-2.60.0-hd5e4115_1.conda sha256: 3d06becb70212a7ed609eea07728b6545ddcff4889844290fed14a5d2fc18cd9 md5: a105938a4fae24539c89de6e7671d279 @@ -19191,6 +19764,22 @@ packages: - libsqlite >=3.53.4,<4.0a0 size: 1313790 timestamp: 1785016158097 +- 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 + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 292785 + timestamp: 1745608759342 - conda: https://conda.anaconda.org/conda-forge/win-64/libstdcxx-15.2.0-hae5796f_18.conda sha256: 7134b90a850f0e14f15bd0f0218fd728f19cd5c58420a90c2f561f58272b8519 md5: 7c09facd8f5aced6b4c146e1c4053e50 @@ -19235,6 +19824,20 @@ packages: purls: [] size: 118204 timestamp: 1748856290542 +- conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.52.1-h6a83c73_1.conda + sha256: 0d62467380061cd0fa4b27e579c805a95c7ef55a41ecb067de0c4d2d42490c66 + md5: 4ccef39545e98553cc900ea557dff085 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - libuv >=1.52.1,<2.0a0 + size: 331195 + timestamp: 1785914602690 - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h5112557_2.conda sha256: 429124709c73b2e8fae5570bdc6b42f5418a7551ba72e591bb960b752e87b365 md5: 42a8a56c60882da5d451aa95b8455111 @@ -19606,6 +20209,21 @@ packages: - pkg:pypi/msgpack?source=hash-mapping size: 88657 timestamp: 1762504357246 +- 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 + run_exports: {} + size: 309417 + timestamp: 1763688227932 - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.2-py314h06c3c77_1.conda sha256: 34fc25b81cfa987e1825586ddb1a4ac76a246fdef343c9171109017674ad6503 md5: 2fccd2c4e9feb4e4c2a90043015525d6 @@ -20526,6 +21144,109 @@ packages: - zstd >=1.5.7,<1.6.0a0 size: 388453 timestamp: 1764777142545 +- conda_source: cuda-bindings[29afc263] @ ../cuda_bindings + variants: + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 13.3.* + python: 3.14.* + target_platform: linux-64 + depends: + - python + - python >=3.10 + - cuda-version + - cuda-pathfinder + - libnvjitlink + - cuda-nvrtc + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-nvvm + - libnvfatbin + - libcufile + - libcufile >=1.18.1.6,<2.0a0 + - libgcc >=15 + - libgcc >=15 + - libstdcxx >=15 + - __glibc >=2.28,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + source_depends: + cuda-pathfinder: + path: ../cuda_pathfinder + build_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-hcb00b6d_27.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.18.1.6-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda + - conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder - conda_source: cuda-bindings[3db1bf41] @ ../cuda_bindings variants: c_stdlib: sysroot @@ -20630,79 +21351,7 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder -- conda_source: cuda-bindings[4664b262] @ ../cuda_bindings - variants: - c_compiler: vs2022 - cuda_version: 13.3.* - cxx_compiler: vs2022 - python: 3.14.* - target_platform: win-64 - depends: - - python - - python >=3.10 - - cuda-version - - cuda-pathfinder - - libnvjitlink - - cuda-nvrtc - - cuda-nvrtc >=13.3.33,<14.0a0 - - cuda-nvvm - - libnvfatbin - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - source_depends: - cuda-pathfinder: - path: ../cuda_pathfinder - build_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda - host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-13.3.73-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-dev-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-static-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-13.3.33-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-13.3.73-h719f0c7_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.73-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-13.3.27-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.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/uv-0.12.2-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder -- conda_source: cuda-bindings[4e633ee8] @ ../cuda_bindings +- conda_source: cuda-bindings[4338e640] @ ../cuda_bindings variants: c_stdlib: sysroot c_stdlib_version: '2.28' @@ -20806,8 +21455,80 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda_source: cuda-pathfinder[640a9949] @ ../cuda_pathfinder -- conda_source: cuda-bindings[6c91bfdd] @ ../cuda_bindings + - conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder +- conda_source: cuda-bindings[4664b262] @ ../cuda_bindings + variants: + c_compiler: vs2022 + cuda_version: 13.3.* + cxx_compiler: vs2022 + python: 3.14.* + target_platform: win-64 + depends: + - python + - python >=3.10 + - cuda-version + - cuda-pathfinder + - libnvjitlink + - cuda-nvrtc + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-nvvm + - libnvfatbin + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + source_depends: + cuda-pathfinder: + path: ../cuda_pathfinder + build_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-13.3.73-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-dev-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-static-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-13.3.73-h719f0c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-13.3.73-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-profiler-api-13.3.27-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.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/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder +- conda_source: cuda-bindings[6c91bfdd] @ ../cuda_bindings variants: c_stdlib: sysroot c_stdlib_version: '2.28' @@ -20911,7 +21632,7 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder -- conda_source: cuda-bindings[8b6a309f] @ ../cuda_bindings +- conda_source: cuda-bindings[c75d4d07] @ ../cuda_bindings variants: c_compiler: vs2022 cuda_version: 13.3.* @@ -20982,8 +21703,8 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - - conda_source: cuda-pathfinder[bcd0ad48] @ ../cuda_pathfinder -- conda_source: cuda-bindings[91169b48] @ ../cuda_bindings + - conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder +- conda_source: cuda-core[79948b31] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' @@ -20994,23 +21715,18 @@ packages: - python - python >=3.10 - cuda-version + - numpy + - cuda-bindings - cuda-pathfinder - - libnvjitlink - - cuda-nvrtc - - cuda-nvrtc >=13.3.33,<14.0a0 - - cuda-nvvm - - libnvfatbin - - libcufile - - libcufile >=1.18.1.6,<2.0a0 + - backports.strenum - libgcc >=15 - libgcc >=15 - libstdcxx >=15 - __glibc >=2.28,<3.0.a0 - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-cudart >=13.3.29,<14.0a0 license: Apache-2.0 - source_depends: - cuda-pathfinder: - path: ../cuda_pathfinder build_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda @@ -21034,38 +21750,53 @@ packages: host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.4.2-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-13.3.1-py314h42812f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-13.3.73-h69a702a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dlpack-1.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.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.22.2-hbde042b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-dev-1.18.1.6-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-heca4667_4.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-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-13.3.29-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hf670292_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.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.3-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_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/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda @@ -21075,18 +21806,24 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda_source: cuda-pathfinder[3890e449] @ ../cuda_pathfinder -- conda_source: cuda-core[18c68942] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda_source: cuda-core[9f8da934] @ . variants: c_compiler: vs2022 cuda_version: 12.* @@ -21122,16 +21859,24 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_win-64-12.9.86-h57928b3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_win-64-12.9.86-h57928b3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.4.2-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-12.9.7-py314h2547b3f_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-crt-tools-12.9.86-h57928b3_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-cudart-12.9.79-he0c23c2_0.conda @@ -21145,14 +21890,21 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-tools-12.9.86-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dlpack-1.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h5112557_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h719d79b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.21.0-hdb0ef4a_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libnvjitlink-12.9.86-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libnvptxcompiler-dev-12.9.86-h57928b3_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpsl-0.23.1-h9b16d47_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.52.1-h6a83c73_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.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.3-hf411b9b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda @@ -21162,7 +21914,133 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda -- conda_source: cuda-core[29d2d05a] @ . +- conda_source: cuda-core[bbcafd42] @ . + variants: + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 12.* + python: 3.14.* + target_platform: linux-64 + depends: + - python + - python >=3.10 + - cuda-version + - numpy + - cuda-bindings + - cuda-pathfinder + - backports.strenum + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 + - __glibc >=2.28,<3.0.a0 + - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-cudart >=12.9.79,<13.0a0 + license: Apache-2.0 + build_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.4.2-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-12.9.7-py314hadd79bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dlpack-1.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.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.22.2-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-heca4667_4.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-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hf670292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.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.3-h35e630c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_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/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda_source: cuda-core[bf994188] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' @@ -21208,6 +22086,8 @@ packages: host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h80f16a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-4.4.2-hc9d863e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-13.3.1-py314he6363bd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-13.3.29-h8f3c8d4_0.conda @@ -21219,30 +22099,41 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dlpack-1.3-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_1.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.22.2-h2fb54aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hf9559e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcudla-13.3.29-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.18.1.6-h42688b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.21.0-h23397ac_4.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-h80f16a2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-h36cc0f4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.3-h10b116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.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.3-h546c87b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_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/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.11.29-hbe9c82f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda @@ -21255,21 +22146,28 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-core[2b0a529b] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda_source: cuda-core[c4773ab0] @ . variants: - c_compiler: vs2022 + c_stdlib: sysroot + c_stdlib_version: '2.28' cuda_version: 13.3.* - cxx_compiler: vs2022 python: 3.14.* - target_platform: win-64 + target_platform: linux-aarch64 depends: - python - python >=3.10 @@ -21278,208 +22176,39 @@ packages: - cuda-bindings - cuda-pathfinder - backports.strenum - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - - cuda-nvrtc >=13.3.33,<14.0a0 + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 + - __glibc >=2.28,<3.0.a0 - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-cudart >=13.3.29,<14.0a0 license: Apache-2.0 build_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda - host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-13.3.1-py314hb98de8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-13.3.33-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/dlpack-1.3-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libnvfatbin-13.3.29-hac47afa_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libnvjitlink-13.3.33-hac47afa_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.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/uv-0.12.2-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda -- conda_source: cuda-core[6e9d4edb] @ . - variants: - c_stdlib: sysroot - c_stdlib_version: '2.28' - cuda_version: 12.* - python: 3.14.* - target_platform: linux-aarch64 - depends: - - python - - python >=3.10 - - cuda-version - - numpy - - cuda-bindings - - cuda-pathfinder - - backports.strenum - - libgcc >=16 - - libgcc >=16 - - libstdcxx >=16 - - __glibc >=2.28,<3.0.a0 - - python_abi 3.14.* *_cp314 - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-cudart >=12.9.79,<13.0a0 - license: Apache-2.0 - build_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - host_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-12.9.7-py314hd8c1704_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-crt-tools-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvcc-impl-12.9.86-h614329b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvcc-tools-12.9.86-h614329b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-12.9.86-h8f3c8d4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-dev-12.9.86-h8f3c8d4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-12.9.86-h7b14b0b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.9.86-h7b14b0b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-12.9.79-h16bee8c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dlpack-1.3-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.14.1.1-had8bf56_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-12.9.86-h8f3c8d4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvptxcompiler-dev-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-12.9.27-h579c4fd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.9.79-h3ae8b8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-aarch64-12.9.86-h4310d6a_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-aarch64-12.9.86-h579c4fd_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda -- conda_source: cuda-core[7b4f4a3f] @ . - variants: - c_stdlib: sysroot - c_stdlib_version: '2.28' - cuda_version: 13.3.* - python: 3.14.* - target_platform: linux-aarch64 - depends: - - python - - python >=3.10 - - cuda-version - - numpy - - cuda-bindings - - cuda-pathfinder - - backports.strenum - - libgcc >=16 - - libgcc >=16 - - libstdcxx >=16 - - __glibc >=2.28,<3.0.a0 - - cuda-cudart >=13.3.29,<14.0a0 - - cuda-nvrtc >=13.3.33,<14.0a0 - - python_abi 3.14.* *_cp314 - license: Apache-2.0 - build_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h80f16a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-4.4.2-hc9d863e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-13.3.1-py314he6363bd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-13.3.29-h8f3c8d4_0.conda @@ -21490,30 +22219,42 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-13.3.27-h16bee8c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dlpack-1.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.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.22.2-h2fb54aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcudla-13.3.29-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.18.1.6-h42688b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.21.0-h23397ac_4.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-h80f16a2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvfatbin-13.3.29-h8f3c8d4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-13.3.33-h8f3c8d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-h36cc0f4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.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.3-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_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/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda @@ -21526,113 +22267,22 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-13.3.29-h8f3c8d4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda -- conda_source: cuda-core[83c371ca] @ . - variants: - c_stdlib: sysroot - c_stdlib_version: '2.28' - cuda_version: 13.3.* - python: 3.14.* - target_platform: linux-64 - depends: - - python - - python >=3.10 - - cuda-version - - numpy - - cuda-bindings - - cuda-pathfinder - - backports.strenum - - libgcc >=15 - - libgcc >=15 - - libstdcxx >=15 - - __glibc >=2.28,<3.0.a0 - - python_abi 3.14.* *_cp314 - - cuda-nvrtc >=13.3.33,<14.0a0 - - cuda-cudart >=13.3.29,<14.0a0 - license: Apache-2.0 - build_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-he0086c7_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-hda75c37_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-hcb00b6d_27.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_119.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - host_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-13.3.1-py314h42812f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-13.3.27-h7938cbb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dlpack-1.3-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-hd0affe5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-13.3.29-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-core[adf7f1da] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda_source: cuda-core[c60a7d63] @ . variants: c_stdlib: sysroot c_stdlib_version: '2.28' @@ -21651,9 +22301,9 @@ packages: - libgcc >=16 - libstdcxx >=16 - __glibc >=2.28,<3.0.a0 - - cuda-cudart >=13.3.29,<14.0a0 - - cuda-nvrtc >=13.3.33,<14.0a0 - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=13.3.33,<14.0a0 + - cuda-cudart >=13.3.29,<14.0a0 license: Apache-2.0 build_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda @@ -21678,6 +22328,8 @@ packages: host_packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-4.4.2-hc85cc9f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-13.3.1-py314h42812f9_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda @@ -21689,29 +22341,40 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dlpack-1.3-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.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.22.2-hbde042b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-heca4667_4.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-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvfatbin-13.3.29-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hf670292_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.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.3-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_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/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda @@ -21723,121 +22386,102 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda -- conda_source: cuda-core[e53261c5] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda_source: cuda-core[d6c205a8] @ . variants: - c_stdlib: sysroot - c_stdlib_version: '2.28' - cuda_version: 12.* + c_compiler: vs2022 + cuda_version: 13.3.* + cxx_compiler: vs2022 python: 3.14.* - target_platform: linux-64 + target_platform: win-64 depends: - python - python >=3.10 - cuda-version - numpy - cuda-bindings - - cuda-pathfinder - - backports.strenum - - libgcc >=16 - - libgcc >=16 - - libstdcxx >=16 - - __glibc >=2.28,<3.0.a0 - - python_abi 3.14.* *_cp314 - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-cudart >=12.9.79,<13.0a0 - license: Apache-2.0 - build_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-16.1.0-h5fcb69b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-16.1.0-h5fd2508_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-16.1.0-he33a5f8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-16.1.0-h5525346_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-16.1.0-hf2715c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-16.1.0-h41cdd0d_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - host_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-bindings-12.9.7-py314hadd79bd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-profiler-api-12.9.79-h7938cbb_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cython-3.2.8-py314h1807b08_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/dlpack-1.3-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_101_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.2-h2112641_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda + - cuda-pathfinder + - backports.strenum + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=13.3.33,<14.0a0 + license: Apache-2.0 + build_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/vswhere-3.1.7-h40126e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2022_win-64-19.44.35207-ha74f236_41.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_win-64-13.3.3.4.1-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_win-64-13.3.73-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_win-64-13.3.29-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda -- conda_source: cuda-core[e56c61a7] @ . + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.4.2-hdcbee5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-13.3.1-py314hb98de8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/dlpack-1.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h5112557_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h719d79b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.21.0-hdb0ef4a_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnvfatbin-13.3.29-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnvjitlink-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpsl-0.23.1-h9b16d47_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.52.1-h6a83c73_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.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.3-hf411b9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.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/uv-0.12.2-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda +- conda_source: cuda-core[e9974f1b] @ . variants: c_compiler: vs2022 cuda_version: 13.3.* @@ -21870,29 +22514,44 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_win-64-13.3.29-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.5.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-4.4.2-hdcbee5b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-bindings-13.3.1-py314hb98de8c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-13.3.33-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvrtc-dev-13.3.33-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cuda-nvvm-impl-13.3.73-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cython-3.2.9-py314h344ed54_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dlpack-1.3-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h5112557_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h719d79b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.21.0-hdb0ef4a_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libnvfatbin-13.3.29-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libnvjitlink-13.3.33-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpsl-0.23.1-h9b16d47_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.52.1-h6a83c73_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_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.3-hf411b9b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda @@ -21902,6 +22561,133 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda +- conda_source: cuda-core[fe1119ad] @ . + variants: + c_stdlib: sysroot + c_stdlib_version: '2.28' + cuda_version: 12.* + python: 3.14.* + target_platform: linux-aarch64 + depends: + - python + - python >=3.10 + - cuda-version + - numpy + - cuda-bindings + - cuda-pathfinder + - backports.strenum + - libgcc >=16 + - libgcc >=16 + - libstdcxx >=16 + - __glibc >=2.28,<3.0.a0 + - python_abi 3.14.* *_cp314 + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-cudart >=12.9.79,<13.0a0 + license: Apache-2.0 + build_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.46.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-16.1.0-h04da0f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-16.1.0-hed00b63_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-16.1.0-hd5c6868_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-16.1.0-h4223dcb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-16.1.0-h2510bd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-16.1.0-h2445e1f_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h80f16a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-4.4.2-hc9d863e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-bindings-12.9.7-py314hd8c1704_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-crt-tools-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-dev-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-cudart-static-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvcc-impl-12.9.86-h614329b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvcc-tools-12.9.86-h614329b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-12.9.86-h8f3c8d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvrtc-dev-12.9.86-h8f3c8d4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-impl-12.9.86-h7b14b0b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-nvvm-tools-12.9.86-h7b14b0b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cuda-profiler-api-12.9.79-h16bee8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cython-3.2.9-py314hc6b4731_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dlpack-1.3-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.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.22.2-h2fb54aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcufile-1.14.1.1-had8bf56_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.21.0-h23397ac_4.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-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvjitlink-12.9.86-h8f3c8d4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnvptxcompiler-dev-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-h36cc0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h022381a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.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.3-h546c87b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.6-hc679e19_101_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-63.0-h1f0f388_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_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/linux-aarch64/tk-8.6.13-noxft_h5cf4473_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.2-hbe9c82f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-aarch64-12.9.27-h579c4fd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-aarch64-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-aarch64-12.9.79-h3ae8b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-aarch64-12.9.86-h4310d6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-aarch64-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-pathfinder-1.6.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cython-cmake-0.3.0-pyh215345e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-aarch64-12.9.86-h579c4fd_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda_source: cuda-pathfinder[15190cc4] @ ../cuda_pathfinder variants: target_platform: noarch @@ -21935,7 +22721,7 @@ packages: - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda -- conda_source: cuda-pathfinder[3890e449] @ ../cuda_pathfinder +- conda_source: cuda-pathfinder[169735b8] @ ../cuda_pathfinder variants: target_platform: noarch depends: @@ -21943,27 +22729,7 @@ packages: - python * license: Apache-2.0 host_packages: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda @@ -21972,7 +22738,23 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda -- conda_source: cuda-pathfinder[640a9949] @ ../cuda_pathfinder + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.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/uv-0.11.29-h7ca4a90_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda +- conda_source: cuda-pathfinder[4dfff30f] @ ../cuda_pathfinder variants: target_platform: noarch depends: @@ -22010,6 +22792,43 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda +- conda_source: cuda-pathfinder[83159de6] @ ../cuda_pathfinder + variants: + target_platform: noarch + depends: + - python >=3.10 + - python * + license: Apache-2.0 + host_packages: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.29-h2112641_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - conda_source: cuda-pathfinder[9139f4b4] @ ../cuda_pathfinder variants: target_platform: noarch @@ -22048,39 +22867,6 @@ packages: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.3-pyhcf101f3_0.conda -- conda_source: cuda-pathfinder[bcd0ad48] @ ../cuda_pathfinder - variants: - target_platform: noarch - depends: - - python >=3.10 - - python * - license: Apache-2.0 - host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-2.2.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h967ab96_3.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/uv-0.11.29-h7ca4a90_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - conda_source: cuda-pathfinder[fa19867f] @ ../cuda_pathfinder variants: target_platform: noarch diff --git a/cuda_core/pixi.toml b/cuda_core/pixi.toml index b2c6a3389c3..078bf825e73 100644 --- a/cuda_core/pixi.toml +++ b/cuda_core/pixi.toml @@ -15,6 +15,7 @@ cuda-version = ["12.*", "13.3.*"] [feature.test.dependencies] cuda-core = { path = "." } ml_dtypes = "*" +scikit-build-core = ">=1" pytest = "*" pytest-benchmark = "*" pytest-randomly = "*" @@ -212,11 +213,15 @@ CUDA_HOME = "$PREFIX/Library" [package.host-dependencies] python = "*" cuda-version = "*" -setuptools = ">=80" +cmake = ">=3.21" +ninja = "*" +scikit-build-core = ">=1" setuptools-scm = ">=8" cython = ">=3.2.5,<3.3" +cython-cmake = ">=0.2.2,<0.4" cuda-nvrtc-dev = "*" cuda-bindings = "*" +cuda-pathfinder = "*" dlpack = "*" [package.target.linux-64.host-dependencies] diff --git a/cuda_core/pyproject.toml b/cuda_core/pyproject.toml index f3afa29241d..a3cf2b84c46 100644 --- a/cuda_core/pyproject.toml +++ b/cuda_core/pyproject.toml @@ -4,9 +4,10 @@ [build-system] requires = [ - "setuptools>=80", - "setuptools-scm[simple]>=8,!=10.1", + "scikit-build-core>=1.0", + "setuptools-scm>=8,!=10.1", "Cython>=3.2.5,<3.3", + "cython-cmake>=0.2.2,<0.4", "cuda-pathfinder>=1.5" ] build-backend = "build_hooks" @@ -17,8 +18,8 @@ backend-path = ["."] name = "cuda-core" dynamic = [ "version", - "readme", ] +readme = { file = "DESCRIPTION.rst", content-type = "text/x-rst" } requires-python = '>=3.10' description = "cuda.core: pythonic CUDA module" authors = [ @@ -102,19 +103,40 @@ documentation = "https://nvidia.github.io/cuda-python/cuda-core/" repository = "https://github.com/NVIDIA/cuda-python/tree/main/cuda_core" issues = "https://github.com/NVIDIA/cuda-python/issues/" -[tool.setuptools.packages.find] -include = ["cuda.core*"] - -[tool.setuptools] -include-package-data = false +[[tool.dynamic-metadata]] +provider = "scikit_build_core.metadata.setuptools_scm" + +[tool.scikit-build] +minimum-version = "build-system.requires" +cmake.version = ">=3.21" +build-dir = "build/{wheel_tag}" +wheel.packages = [] +wheel.exclude = [ + "**/*.cpp", + "**/*.def", + "**/*.md", + "**/*.pxi", + "**/*.pyx", +] +sdist.include = ["cuda/core/_version.py"] +sdist.exclude = [ + "**/*.dll", + "**/*.dylib", + "**/*.pyd", + "**/*.so", + "cython_debug/**", +] -[tool.setuptools.package-data] -"*" = ["*.pxd", "*.pyi", "py.typed"] -"cuda.core._include" = ["*.h", "*.hpp"] -"cuda.core._cpp" = ["*.h", "*.hpp"] +[[tool.scikit-build.overrides]] +if.env.CUDA_PYTHON_COVERAGE = true +wheel.exclude = [ + "**/*.def", + "**/*.md", +] -[tool.setuptools.dynamic] -readme = { file = ["DESCRIPTION.rst"], content-type = "text/x-rst" } +[[tool.scikit-build.overrides]] +if.state = "editable" +wheel.packages = ["cuda"] [tool.setuptools_scm] root = ".." diff --git a/cuda_core/setup.py b/cuda_core/setup.py deleted file mode 100644 index e0d745b1f21..00000000000 --- a/cuda_core/setup.py +++ /dev/null @@ -1,94 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - -import os -from pathlib import Path - -import build_hooks # our build backend -from setuptools import setup -from setuptools.command.build_ext import build_ext as _build_ext -from setuptools.command.build_py import build_py as _build_py - -nthreads = int(os.environ.get("CUDA_PYTHON_PARALLEL_LEVEL", os.cpu_count() // 2)) -coverage_mode = bool(int(os.environ.get("CUDA_PYTHON_COVERAGE", "0"))) -_ROOT_DIR = Path(__file__).resolve().parent -_AOTI_SHIM_DEF_FILE = _ROOT_DIR / "cuda" / "core" / "_include" / "aoti_shim.def" -_AOTI_SHIM_LIB_FILE = _ROOT_DIR / "build" / "aoti_shim.lib" -_TENSOR_BRIDGE_EXT_NAME = "cuda.core._tensor_bridge" - - -def _ensure_compiler_initialized(compiler, plat_name): - initialize = getattr(compiler, "initialize", None) - if callable(initialize) and not getattr(compiler, "initialized", False): - if plat_name is None: - initialize() - else: - initialize(plat_name) - - -def _build_aoti_shim_lib(compiler, plat_name): - # Reuse setuptools' initialized MSVC compiler instead of rediscovering - # lib.exe separately in the build backend. - lib_exe = getattr(compiler, "lib", None) - if not lib_exe: - raise RuntimeError("MSVC compiler did not expose lib.exe after initialization.") - - _AOTI_SHIM_LIB_FILE.parent.mkdir(exist_ok=True) - machine = { - "win-amd64": "X64", - "win-arm64": "ARM64", - }.get(plat_name, "X64") - compiler.spawn( - [ - lib_exe, - f"/DEF:{_AOTI_SHIM_DEF_FILE}", - f"/OUT:{_AOTI_SHIM_LIB_FILE}", - f"/MACHINE:{machine}", - ] - ) - return str(_AOTI_SHIM_LIB_FILE) - - -class build_ext(_build_ext): # noqa: N801 - def _configure_windows_tensor_bridge(self): - if os.name != "nt" or getattr(self.compiler, "compiler_type", None) != "msvc": - return - - # _tensor_bridge imports AOTI symbols from torch_cpu.dll, which on - # Windows requires a stub import library for the MSVC linker. - for ext in self.extensions: - if ext.name != _TENSOR_BRIDGE_EXT_NAME: - continue - - _ensure_compiler_initialized(self.compiler, self.plat_name) - shim_lib = _build_aoti_shim_lib(self.compiler, self.plat_name) - link_args = list(ext.extra_link_args or []) - if shim_lib not in link_args: - ext.extra_link_args = [*link_args, shim_lib] - return - - raise RuntimeError(f"Failed to find extension {_TENSOR_BRIDGE_EXT_NAME!r} for Windows build.") - - def build_extensions(self): - self.parallel = nthreads - self._configure_windows_tensor_bridge() - super().build_extensions() - - -class build_py(_build_py): # noqa: N801 - def finalize_options(self): - super().finalize_options() - if coverage_mode: - self.package_data.setdefault("", []) - self.package_data[""] += ["*.pxi", "*.pyx", "*.cpp"] - - -setup( - ext_modules=build_hooks._extensions, - cmdclass={ - "build_ext": build_ext, - "build_py": build_py, - }, - zip_safe=False, -) diff --git a/cuda_core/tests/test_build_hooks.py b/cuda_core/tests/test_build_hooks.py index c08ad4cd3c5..5e08f4b0c5a 100644 --- a/cuda_core/tests/test_build_hooks.py +++ b/cuda_core/tests/test_build_hooks.py @@ -13,12 +13,12 @@ pytest tests/test_build_hooks.py -v --noconftest -These tests require Cython to be installed (build_hooks.py imports it). +These tests require scikit-build-core to be installed (build_hooks.py wraps it). """ -import builtins import importlib.util import os +import sys import tempfile from pathlib import Path from unittest import mock @@ -27,9 +27,8 @@ from cuda.pathfinder import get_cuda_path_or_home -# build_hooks.py imports Cython and setuptools at the top level, so skip if not available -pytest.importorskip("Cython") -pytest.importorskip("setuptools") +# build_hooks.py imports scikit-build-core at the top level, so skip if not available. +pytest.importorskip("scikit_build_core") def _load_build_hooks(): @@ -52,32 +51,76 @@ def _load_build_hooks(): @pytest.mark.agent_authored(model="gpt-5.6") -def test_cuda_path_is_resolved_before_importing_bindings(monkeypatch): - """PEP 517 namespace repair runs before cuda.bindings is imported.""" - events = [] +@pytest.mark.parametrize( + "hook_name", + ["get_requires_for_build_wheel", "get_requires_for_build_editable"], +) +def test_binary_build_requirements_include_matching_bindings(monkeypatch, hook_name): + """Binary hooks preserve backend requirements and append CUDA-matched bindings.""" + backend_hook = mock.Mock(return_value=["backend-requirement"]) + monkeypatch.setattr(build_hooks._build_backend, hook_name, backend_hook) + monkeypatch.setattr(build_hooks, "_configured_cuda_major", lambda _settings: "13") + config_settings = {"cmake.define.SENTINEL": "value"} + + requirements = getattr(build_hooks, hook_name)(config_settings) + + assert requirements == ["backend-requirement", "cuda-bindings==13.*"] + expected_settings = dict(config_settings) + if hook_name == "get_requires_for_build_editable": + expected_settings["cmake.build-type"] = "Release" if sys.platform == "win32" else "Debug" + backend_hook.assert_called_once_with(expected_settings) - class StopBuildError(Exception): - pass - def get_cuda_path(): - events.append("cuda-path") - return "/cuda" +@pytest.mark.agent_authored(model="gpt-5.6") +def test_sdist_requirements_are_delegated_directly(): + """The sdist hook is delegated directly and remains toolkit-independent.""" + assert build_hooks.get_requires_for_build_sdist is build_hooks._build_backend.get_requires_for_build_sdist + + +@pytest.mark.agent_authored(model="gpt-5.6") +@pytest.mark.parametrize( + ("debug", "expected"), + [("true", "Debug"), ("false", "Release"), (True, "Debug"), (False, "Release")], +) +def test_legacy_debug_setting_maps_to_cmake_build_type(monkeypatch, debug, expected): + monkeypatch.setattr(sys, "platform", "linux") + settings = build_hooks._translate_config_settings({"debug": debug}, editable=False) + + assert settings == {"cmake.build-type": expected} + - original_import = builtins.__import__ +@pytest.mark.agent_authored(model="gpt-5.6") +@pytest.mark.parametrize(("platform", "expected"), [("linux", "Debug"), ("win32", "Release")]) +def test_editable_build_uses_platform_default(monkeypatch, platform, expected): + monkeypatch.setattr(sys, "platform", platform) + + settings = build_hooks._translate_config_settings({}, editable=True) + + assert settings == {"cmake.build-type": expected} - def stop_at_bindings_import(name, *args, **kwargs): - if name == "cuda.bindings": - events.append("cuda-bindings") - raise StopBuildError - return original_import(name, *args, **kwargs) - monkeypatch.setattr(build_hooks, "_get_cuda_path", get_cuda_path) - monkeypatch.setattr(builtins, "__import__", stop_at_bindings_import) +@pytest.mark.agent_authored(model="gpt-5.6") +def test_debug_build_is_rejected_on_windows(monkeypatch): + monkeypatch.setattr(sys, "platform", "win32") + + with pytest.raises(RuntimeError, match="not supported on Windows"): + build_hooks._translate_config_settings({"debug": "true"}, editable=False) - with pytest.raises(StopBuildError): - build_hooks._build_cuda_core() - assert events == ["cuda-path", "cuda-bindings"] +@pytest.mark.agent_authored(model="gpt-5.6") +def test_build_config_forwards_cuda_and_coverage(monkeypatch): + monkeypatch.setattr(build_hooks, "_configured_cuda_root", lambda _settings: "/cuda") + monkeypatch.setattr(build_hooks, "_configured_cuda_major", lambda _settings: "13") + monkeypatch.setenv("CUDA_PYTHON_COVERAGE", "1") + + settings = build_hooks._build_config_settings({"debug": "false"}, editable=False) + + assert settings == { + "cmake.build-type": "Release", + "cmake.define.CUDA_CORE_CUDA_ROOT": "/cuda", + "cmake.define.CUDA_CORE_BUILD_MAJOR": "13", + "cmake.define.CUDA_PYTHON_COVERAGE": "1", + } def _check_version_detection( From 9e68642e193fbad451433eb78c39b71ecba667f8 Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Thu, 13 Aug 2026 22:09:55 -0400 Subject: [PATCH 2/8] build(cuda.core): modernize scikit-build CMake --- cuda_core/CMakeLists.txt | 208 ++++++++++++++++---------- cuda_core/_cuda_core_cython_path.py | 152 +++++++++++++++++++ cuda_core/build_hooks.py | 11 ++ cuda_core/pyproject.toml | 9 +- cuda_core/tests/cython/build_tests.py | 22 +-- cuda_core/tests/test_build_hooks.py | 182 +++++++++++++++++++++- 6 files changed, 479 insertions(+), 105 deletions(-) create mode 100644 cuda_core/_cuda_core_cython_path.py diff --git a/cuda_core/CMakeLists.txt b/cuda_core/CMakeLists.txt index 16fce0741c7..c96fa902a43 100644 --- a/cuda_core/CMakeLists.txt +++ b/cuda_core/CMakeLists.txt @@ -14,19 +14,16 @@ find_package( find_package(Cython 3.2.5...<3.3 MODULE REQUIRED) include(UseCython) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - set(CUDA_CORE_CUDA_ROOT "" CACHE PATH "CUDA Toolkit root used to compile cuda-core") set(CUDA_CORE_BUILD_MAJOR "" CACHE STRING "CUDA major version for Cython compile-time conditionals") +set(CUDA_BINDINGS_CYTHON_ROOT "" CACHE PATH "Optional physical cuda-bindings package root for Cython") set(CUDA_PYTHON_COVERAGE "$ENV{CUDA_PYTHON_COVERAGE}" CACHE STRING "Build Cython line tracing support") if(NOT CUDA_CORE_CUDA_ROOT) - if(DEFINED ENV{CUDA_HOME} AND NOT "$ENV{CUDA_HOME}" STREQUAL "") - set(CUDA_CORE_CUDA_ROOT "$ENV{CUDA_HOME}") - elseif(DEFINED ENV{CUDA_PATH} AND NOT "$ENV{CUDA_PATH}" STREQUAL "") + if(DEFINED ENV{CUDA_PATH} AND NOT "$ENV{CUDA_PATH}" STREQUAL "") set(CUDA_CORE_CUDA_ROOT "$ENV{CUDA_PATH}") + elseif(DEFINED ENV{CUDA_HOME} AND NOT "$ENV{CUDA_HOME}" STREQUAL "") + set(CUDA_CORE_CUDA_ROOT "$ENV{CUDA_HOME}") endif() endif() if(NOT CUDA_CORE_CUDA_ROOT) @@ -39,36 +36,35 @@ if(NOT EXISTS "${_cuda_header}") message(FATAL_ERROR "CUDA header not found: ${_cuda_header}") endif() -if(NOT CUDA_CORE_BUILD_MAJOR) - file(STRINGS "${_cuda_header}" _cuda_version_line REGEX "^#[ \t]*define[ \t]+CUDA_VERSION[ \t]+[0-9]+[ \t]*$") - if(NOT _cuda_version_line) - message(FATAL_ERROR "Cannot determine CUDA major version from ${_cuda_header}; set CUDA_CORE_BUILD_MAJOR") - endif() - string(REGEX MATCH "[0-9]+" _cuda_version "${_cuda_version_line}") - math(EXPR CUDA_CORE_BUILD_MAJOR "${_cuda_version} / 1000") +file(STRINGS "${_cuda_header}" _cuda_version_line REGEX "^#[ \t]*define[ \t]+CUDA_VERSION[ \t]+[0-9]+[ \t]*$") +if(NOT _cuda_version_line) + message(FATAL_ERROR "Cannot determine CUDA major version from ${_cuda_header}") endif() -if(NOT CUDA_CORE_BUILD_MAJOR MATCHES "^[0-9]+$") - message(FATAL_ERROR "CUDA_CORE_BUILD_MAJOR must be an integer, got ${CUDA_CORE_BUILD_MAJOR}") -endif() -message(STATUS "Building cuda-core for CUDA ${CUDA_CORE_BUILD_MAJOR} using ${CUDA_CORE_CUDA_ROOT}") +string(REGEX MATCH "[0-9]+" _cuda_version "${_cuda_version_line}") +math(EXPR _cuda_header_major "${_cuda_version} / 1000") -execute_process( - COMMAND - "${Python_EXECUTABLE}" -c - "from pathlib import Path; import cuda.bindings; print(Path(cuda.bindings.__file__).resolve().parents[2])" - RESULT_VARIABLE _cuda_bindings_result - OUTPUT_VARIABLE _cuda_bindings_package_root - ERROR_VARIABLE _cuda_bindings_error - OUTPUT_STRIP_TRAILING_WHITESPACE -) -if(NOT _cuda_bindings_result STREQUAL "0" OR NOT EXISTS "${_cuda_bindings_package_root}/cuda/bindings") +if("${CUDA_CORE_BUILD_MAJOR}" STREQUAL "") + set(CUDA_CORE_BUILD_MAJOR "${_cuda_header_major}") +elseif(NOT CUDA_CORE_BUILD_MAJOR MATCHES "^[0-9]+$") + message(FATAL_ERROR "CUDA_CORE_BUILD_MAJOR must be an integer, got ${CUDA_CORE_BUILD_MAJOR}") +elseif(NOT "${CUDA_CORE_BUILD_MAJOR}" STREQUAL "${_cuda_header_major}") message( FATAL_ERROR - "Could not resolve the physical cuda.bindings package root needed by Cython. " - "Ensure the CUDA-major-compatible cuda-bindings build dependency is installed.\n${_cuda_bindings_error}" + "CUDA_CORE_BUILD_MAJOR=${CUDA_CORE_BUILD_MAJOR} does not match CUDA ${_cuda_header_major} " + "reported by ${_cuda_header}" ) endif() -message(STATUS "Using cuda-bindings Cython declarations from ${_cuda_bindings_package_root}") +message(STATUS "Building cuda-core for CUDA ${CUDA_CORE_BUILD_MAJOR} using ${CUDA_CORE_CUDA_ROOT}") + +if(CUDA_BINDINGS_CYTHON_ROOT) + cmake_path(ABSOLUTE_PATH CUDA_BINDINGS_CYTHON_ROOT NORMALIZE) + if(NOT EXISTS "${CUDA_BINDINGS_CYTHON_ROOT}/cuda/bindings/cydriver.pxd") + message( + FATAL_ERROR + "CUDA_BINDINGS_CYTHON_ROOT=${CUDA_BINDINGS_CYTHON_ROOT} does not contain cuda/bindings/cydriver.pxd" + ) + endif() +endif() if(WIN32) execute_process( @@ -98,7 +94,6 @@ endif() set(_cuda_core_source_root "${CMAKE_CURRENT_SOURCE_DIR}/cuda/core") set(_cython_common_args - --cplus -3 -Werror -X embedsignature=True @@ -106,19 +101,89 @@ set(_cython_common_args -X freethreading_compatible=True -E CUDA_CORE_BUILD_MAJOR=${CUDA_CORE_BUILD_MAJOR} -I "${CMAKE_CURRENT_SOURCE_DIR}" - -I "${_cuda_bindings_package_root}" ${_coverage_directive} ) +if(CUDA_BINDINGS_CYTHON_ROOT) + list(APPEND _cython_common_args -I "${CUDA_BINDINGS_CYTHON_ROOT}") +endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT WIN32) list(APPEND _cython_common_args --gdb) endif() -file( - GLOB_RECURSE _cuda_core_pyx_files - CONFIGURE_DEPENDS - RELATIVE "${_cuda_core_source_root}" - "${_cuda_core_source_root}/*.pyx" +add_library(cuda_core_extension_settings INTERFACE) +target_include_directories( + cuda_core_extension_settings + INTERFACE + "${_cuda_core_source_root}" + "${_cuda_core_source_root}/_include" + "${CUDA_CORE_CUDA_ROOT}/include" +) +target_compile_definitions( + cuda_core_extension_settings + INTERFACE + "$<$,$,$>:_GLIBCXX_ASSERTIONS>" +) +if(CUDA_PYTHON_COVERAGE) + target_compile_definitions( + cuda_core_extension_settings + INTERFACE + CYTHON_TRACE_NOGIL=1 + CYTHON_USE_SYS_MONITORING=0 + ) +endif() +if(WIN32 AND _python_freethreaded) + # Windows shares Python headers between GIL and free-threaded builds, so + # extension builds must supply the ABI selection macro themselves. + target_compile_definitions(cuda_core_extension_settings INTERFACE Py_GIL_DISABLED=1) +endif() + +set(_cuda_core_modules + _context + _device + _device_resources + _dlpack + _event + _graphics + _kernel_arg_handler + _launch_config + _launcher + _layout + _linker + _memory/_buffer + _memory/_device_memory_resource + _memory/_graph_memory_resource + _memory/_ipc + _memory/_managed_memory_ops + _memory/_managed_memory_resource + _memory/_memory_pool + _memory/_peer_access_utils + _memory/_pinned_memory_resource + _memoryview + _module + _program + _resource_handles + _stream + _tensor_bridge + _tensor_map + _utils/_weak_handles + _utils/_wsl_locale + _utils/cuda_utils + _utils/version + graph/_adjacency_set_proxy + graph/_graph_builder + graph/_graph_definition + graph/_graph_node + graph/_host_callback + graph/_subclasses + system/_device + system/_nvml_context + system/_system + system/_system_events + texture/_array + texture/_mipmapped_array + texture/_surface + texture/_texture ) # Stage regular wheels through CMake to keep them independent of ignored, @@ -147,12 +212,19 @@ if(NOT SKBUILD_STATE STREQUAL "editable") ) endif() else() - # Cython resolves external .pxd files from physical sys.path entries, not - # PEP 660 meta-path finders. Preserve the bindings declaration path for - # downstream Cython consumers of an editable cuda-core installation. + # Resolve the declarations in the final environment rather than persisting + # a potentially temporary path from the isolated editable build environment. set(_cuda_bindings_cython_pth "${CMAKE_CURRENT_BINARY_DIR}/_cuda_core_cython_include.pth") - file(WRITE "${_cuda_bindings_cython_pth}" "${_cuda_bindings_package_root}\n") - install(FILES "${_cuda_bindings_cython_pth}" DESTINATION ".") + file( + WRITE "${_cuda_bindings_cython_pth}" + "import _cuda_core_cython_path; _cuda_core_cython_path.add_editable_cuda_bindings_path()\n" + ) + install( + FILES + "${CMAKE_CURRENT_SOURCE_DIR}/_cuda_core_cython_path.py" + "${_cuda_bindings_cython_pth}" + DESTINATION "." + ) endif() if(MSVC) @@ -205,10 +277,10 @@ function(cuda_core_add_cython_module module_path) ) set(module_sources "${generated_cpp}") - string(REGEX REPLACE "^_" "" helper_cpp_path "${module_path}") - set(extra_cpp "${_cuda_core_source_root}/_cpp/${helper_cpp_path}.cpp") - if(EXISTS "${extra_cpp}") - list(APPEND module_sources "${extra_cpp}") + if(module_path STREQUAL "_resource_handles") + list(APPEND module_sources "${_cuda_core_source_root}/_cpp/resource_handles.cpp") + elseif(module_path STREQUAL "_tensor_map") + list(APPEND module_sources "${_cuda_core_source_root}/_cpp/tensor_map.cpp") endif() python_add_library("${target_name}" MODULE WITH_SOABI ${module_sources}) @@ -216,48 +288,21 @@ function(cuda_core_add_cython_module module_path) "${target_name}" PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${module_output_directory}" + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS OFF + CXX_VISIBILITY_PRESET hidden LIBRARY_OUTPUT_DIRECTORY "${module_output_directory}" OUTPUT_NAME "${module_filename}" RUNTIME_OUTPUT_DIRECTORY "${module_output_directory}" + VISIBILITY_INLINES_HIDDEN YES ) - target_include_directories( - "${target_name}" - PRIVATE - "${_cuda_core_source_root}" - "${_cuda_core_source_root}/_include" - "${_cuda_core_source_root}/_cpp" - "${CUDA_CORE_CUDA_ROOT}/include" - ) - - if(MSVC) - target_compile_options("${target_name}" PRIVATE /std:c++17) - else() - target_compile_options( - "${target_name}" - PRIVATE - $<$:-g;-O0> - $<$>:-O2> - ) - target_compile_definitions("${target_name}" PRIVATE $<$:_GLIBCXX_ASSERTIONS>) - target_link_options("${target_name}" PRIVATE $<$>:-Wl,--strip-all>) - endif() + target_link_libraries("${target_name}" PRIVATE cuda_core_extension_settings) if(CUDA_PYTHON_COVERAGE) - target_compile_definitions( - "${target_name}" - PRIVATE - CYTHON_TRACE_NOGIL=1 - CYTHON_USE_SYS_MONITORING=0 - ) install(FILES "${generated_cpp}" DESTINATION "${install_directory}") endif() - if(WIN32 AND _python_freethreaded) - # Windows shares Python headers between GIL and free-threaded builds, so - # extension builds must supply the ABI selection macro themselves. - target_compile_definitions("${target_name}" PRIVATE Py_GIL_DISABLED=1) - endif() - if(MSVC AND module_path STREQUAL "_tensor_bridge") add_dependencies("${target_name}" cuda_core_aoti_shim) target_link_libraries("${target_name}" PRIVATE "${_aoti_shim_lib}") @@ -266,8 +311,7 @@ function(cuda_core_add_cython_module module_path) install(TARGETS "${target_name}" LIBRARY DESTINATION "${install_directory}" RUNTIME DESTINATION "${install_directory}") endfunction() -foreach(pyx_file IN LISTS _cuda_core_pyx_files) - string(REGEX REPLACE "\\.pyx$" "" module_path "${pyx_file}") +foreach(module_path IN LISTS _cuda_core_modules) if(WIN32 AND module_path STREQUAL "_utils/_wsl_locale") continue() endif() diff --git a/cuda_core/_cuda_core_cython_path.py b/cuda_core/_cuda_core_cython_path.py new file mode 100644 index 00000000000..64496bcf3f3 --- /dev/null +++ b/cuda_core/_cuda_core_cython_path.py @@ -0,0 +1,152 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Expose editable cuda-bindings declarations to filesystem-based Cython lookup.""" + +from __future__ import annotations + +import importlib.metadata +import importlib.util +import json +import os +import sys +import warnings +from pathlib import Path +from urllib.parse import urlparse +from urllib.request import url2pathname + +_CUDA_BINDINGS_DECLARATION = Path("cuda", "bindings", "cydriver.pxd") + + +def _validated_root(root: str | os.PathLike[str]) -> Path | None: + try: + root_path = Path(root).expanduser().resolve() + except (OSError, RuntimeError): + return None + return root_path if (root_path / _CUDA_BINDINGS_DECLARATION).is_file() else None + + +def _find_on_sys_path() -> Path | None: + for entry in sys.path: + if isinstance(entry, str) and (root := _validated_root(entry or os.getcwd())): + return root + return None + + +def _root_from_package_path(package_path: str | os.PathLike[str]) -> Path | None: + bindings_path = Path(package_path) + if bindings_path.name != "bindings" or bindings_path.parent.name != "cuda": + return None + return _validated_root(bindings_path.parent.parent) + + +def _find_from_spec() -> Path | None: + """Resolve a physical root without importing ``cuda.bindings`` itself.""" + try: + spec = importlib.util.find_spec("cuda.bindings") + except ModuleNotFoundError: + return None + if spec is None: + return None + + for location in spec.submodule_search_locations or (): + if root := _root_from_package_path(location): + return root + + if spec.origin and spec.origin not in {"built-in", "frozen"}: + return _root_from_package_path(Path(spec.origin).parent) + return None + + +def _distribution() -> importlib.metadata.Distribution | None: + try: + return importlib.metadata.distribution("cuda-bindings") + except importlib.metadata.PackageNotFoundError: + return None + + +def _path_from_file_url(url: str) -> Path | None: + parsed = urlparse(url) + if parsed.scheme != "file": + return None + + path = url2pathname(parsed.path) + if parsed.netloc and parsed.netloc != "localhost": + path = f"//{parsed.netloc}{path}" + return Path(path) + + +def _report_invalid_editable(message: str, *, strict: bool) -> None: + if strict: + raise RuntimeError(message) + warnings.warn(message, RuntimeWarning, stacklevel=3) + + +def _find_editable_root(*, strict: bool) -> Path | None: + distribution = _distribution() + if distribution is None: + return None + + direct_url_text = distribution.read_text("direct_url.json") + if direct_url_text is None: + return None + try: + direct_url = json.loads(direct_url_text) + except json.JSONDecodeError: + _report_invalid_editable("cuda-bindings has an invalid direct_url.json", strict=strict) + return None + if not isinstance(direct_url, dict): + _report_invalid_editable("cuda-bindings has an invalid direct_url.json", strict=strict) + return None + + dir_info = direct_url.get("dir_info") + if not isinstance(dir_info, dict) or dir_info.get("editable") is not True: + return None + + url = direct_url.get("url") + if isinstance(url, str): + source_path = _path_from_file_url(url) + if source_path is not None and (root := _validated_root(source_path)): + return root + + # PEP 660 meta finders can expose a source layout that differs from the + # project root recorded in direct_url.json. + if root := _find_from_spec(): + return root + + _report_invalid_editable( + "cuda-bindings is marked as editable, but its physical " + f"{_CUDA_BINDINGS_DECLARATION} declaration could not be found", + strict=strict, + ) + return None + + +def find_cuda_bindings_cython_root() -> str | None: + """Return a transient Cython root only when normal ``sys.path`` is insufficient.""" + if _find_on_sys_path() is not None: + return None + + root = _find_editable_root(strict=True) or _find_from_spec() + if root is None: + distribution = _distribution() + if distribution is not None: + declaration = Path(distribution.locate_file(_CUDA_BINDINGS_DECLARATION)) + if declaration.is_file(): + root = _validated_root(declaration.parents[2]) + if root is None: + raise RuntimeError(f"Could not find the physical cuda-bindings {_CUDA_BINDINGS_DECLARATION} declaration") + return os.fspath(root) + + +def add_editable_cuda_bindings_path() -> None: + """Expose editable bindings declarations in the final runtime environment.""" + if _find_on_sys_path() is not None: + return + + root = _find_editable_root(strict=False) or _find_from_spec() + if root is not None: + root_string = os.fspath(root) + if root_string not in sys.path: + sys.path.append(root_string) diff --git a/cuda_core/build_hooks.py b/cuda_core/build_hooks.py index 728fb4c2dd0..e278ce08d0f 100644 --- a/cuda_core/build_hooks.py +++ b/cuda_core/build_hooks.py @@ -19,6 +19,7 @@ from pathlib import Path from typing import Any +import _cuda_core_cython_path import scikit_build_core.build as _build_backend build_sdist = _build_backend.build_sdist @@ -195,6 +196,10 @@ def _set_cmake_define(settings: dict[str, Any], name: str, value: str) -> None: settings[keys[0]] = value +def _has_cmake_define(settings: Mapping[str, Any], name: str) -> bool: + return any(key in settings for key in (f"cmake.define.{name}", f"skbuild.cmake.define.{name}")) + + def _build_config_settings(config_settings: _ConfigSettings, *, editable: bool) -> dict[str, Any]: settings = _translate_config_settings(config_settings, editable=editable) cuda_root = _configured_cuda_root(settings) @@ -204,6 +209,12 @@ def _build_config_settings(config_settings: _ConfigSettings, *, editable: bool) _set_cmake_define(settings, "CUDA_CORE_CUDA_ROOT", cuda_root) _set_cmake_define(settings, "CUDA_CORE_BUILD_MAJOR", cuda_major) _set_cmake_define(settings, "CUDA_PYTHON_COVERAGE", "1" if coverage else "0") + + if not _has_cmake_define(settings, "CUDA_BINDINGS_CYTHON_ROOT"): + cython_root = _cuda_core_cython_path.find_cuda_bindings_cython_root() + # The build directory is persistent, so explicitly clear a root cached + # by an earlier editable build when the current environment needs none. + _set_cmake_define(settings, "CUDA_BINDINGS_CYTHON_ROOT", cython_root or "") return settings diff --git a/cuda_core/pyproject.toml b/cuda_core/pyproject.toml index a3cf2b84c46..783be434ff3 100644 --- a/cuda_core/pyproject.toml +++ b/cuda_core/pyproject.toml @@ -108,9 +108,10 @@ provider = "scikit_build_core.metadata.setuptools_scm" [tool.scikit-build] minimum-version = "build-system.requires" -cmake.version = ">=3.21" +cmake.version = "CMakeLists.txt" build-dir = "build/{wheel_tag}" wheel.packages = [] +wheel.reproducible = true wheel.exclude = [ "**/*.cpp", "**/*.def", @@ -118,7 +119,11 @@ wheel.exclude = [ "**/*.pxi", "**/*.pyx", ] -sdist.include = ["cuda/core/_version.py"] +sdist.include = [ + "_cuda_core_cython_path.py", + "cuda/core/_version.py", +] +sdist.reproducible = true sdist.exclude = [ "**/*.dll", "**/*.dylib", diff --git a/cuda_core/tests/cython/build_tests.py b/cuda_core/tests/cython/build_tests.py index 6cebb0c6ff9..4ac167b83e1 100644 --- a/cuda_core/tests/cython/build_tests.py +++ b/cuda_core/tests/cython/build_tests.py @@ -2,12 +2,9 @@ # SPDX-License-Identifier: Apache-2.0 """Build cuda_core Cython test extensions in-place. -pixi-build's editable install exposes the `cuda` namespace package via a -PEP 660 finder hook. Python's import machinery honors the hook, but -Cython's filesystem .pxd resolver only walks real directories on sys.path, -so `cimport cuda.bindings.*` fails to locate the .pxd files. We resolve -the namespace package's source root from `cuda.bindings.__file__` and pass -it via `include_path=` so cythonize finds the .pxd tree on every platform. +The build intentionally provides no explicit Cython include path. Editable +installs must expose their ``.pxd`` trees through physical ``sys.path`` entries +so downstream Cython consumers work without repository-specific setup. """ from __future__ import annotations @@ -19,18 +16,6 @@ from Cython.Build import cythonize from setuptools import setup -import cuda.bindings - - -def _bindings_source_root() -> Path: - # cuda.bindings.__file__ -> ...//cuda/bindings/__init__.py - root = Path(cuda.bindings.__file__).resolve().parents[2] - if not (root / "cuda" / "bindings").is_dir(): - raise RuntimeError( - f"cuda.bindings source tree not found at {root}; pixi-build editable install layout may have changed." - ) - return root - def main() -> None: script_dir = Path(__file__).resolve().parent @@ -41,7 +26,6 @@ def main() -> None: ext_modules = cythonize( pyx_files, language_level=3, - include_path=[str(_bindings_source_root())], compiler_directives={"freethreading_compatible": True}, ) diff --git a/cuda_core/tests/test_build_hooks.py b/cuda_core/tests/test_build_hooks.py index 5e08f4b0c5a..3ecd39b9451 100644 --- a/cuda_core/tests/test_build_hooks.py +++ b/cuda_core/tests/test_build_hooks.py @@ -17,6 +17,7 @@ """ import importlib.util +import json import os import sys import tempfile @@ -40,9 +41,23 @@ def _load_build_hooks(): that could shadow the installed package). """ build_hooks_path = Path(__file__).parent.parent / "build_hooks.py" + helper_name = "_cuda_core_cython_path" + helper_path = build_hooks_path.with_name(f"{helper_name}.py") + helper_spec = importlib.util.spec_from_file_location(helper_name, helper_path) + helper_module = importlib.util.module_from_spec(helper_spec) + previous_helper = sys.modules.get(helper_name) + sys.modules[helper_name] = helper_module + helper_spec.loader.exec_module(helper_module) + spec = importlib.util.spec_from_file_location("build_hooks", build_hooks_path) module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) + try: + spec.loader.exec_module(module) + finally: + if previous_helper is None: + del sys.modules[helper_name] + else: + sys.modules[helper_name] = previous_helper return module @@ -111,16 +126,179 @@ def test_debug_build_is_rejected_on_windows(monkeypatch): def test_build_config_forwards_cuda_and_coverage(monkeypatch): monkeypatch.setattr(build_hooks, "_configured_cuda_root", lambda _settings: "/cuda") monkeypatch.setattr(build_hooks, "_configured_cuda_major", lambda _settings: "13") + bindings_root = mock.Mock(return_value=None) + monkeypatch.setattr(build_hooks._cuda_core_cython_path, "find_cuda_bindings_cython_root", bindings_root) monkeypatch.setenv("CUDA_PYTHON_COVERAGE", "1") - settings = build_hooks._build_config_settings({"debug": "false"}, editable=False) + settings = build_hooks._build_config_settings( + { + "debug": "false", + "cmake.define.CUDA_BINDINGS_CYTHON_ROOT": "/bindings", + "cmake.define.SENTINEL": "value", + }, + editable=False, + ) assert settings == { "cmake.build-type": "Release", + "cmake.define.CUDA_BINDINGS_CYTHON_ROOT": "/bindings", + "cmake.define.SENTINEL": "value", "cmake.define.CUDA_CORE_CUDA_ROOT": "/cuda", "cmake.define.CUDA_CORE_BUILD_MAJOR": "13", "cmake.define.CUDA_PYTHON_COVERAGE": "1", } + bindings_root.assert_not_called() + + +class _DirectUrlDistribution: + def __init__(self, direct_url): + self._direct_url = direct_url + + def read_text(self, filename): + assert filename == "direct_url.json" + return self._direct_url if isinstance(self._direct_url, str) else json.dumps(self._direct_url) + + +def _write_bindings_declaration(root): + declaration = root / "cuda" / "bindings" / "cydriver.pxd" + declaration.parent.mkdir(parents=True) + declaration.touch() + + +def _mock_cuda_build_settings(monkeypatch): + monkeypatch.setattr(build_hooks, "_configured_cuda_root", lambda _settings: "/cuda") + monkeypatch.setattr(build_hooks, "_configured_cuda_major", lambda _settings: "13") + monkeypatch.setenv("CUDA_PYTHON_COVERAGE", "0") + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_physical_bindings_wheel_clears_cached_cmake_root(tmp_path, monkeypatch): + site_packages = tmp_path / "site-packages" + _write_bindings_declaration(site_packages) + monkeypatch.setattr(sys, "path", [str(site_packages)]) + _mock_cuda_build_settings(monkeypatch) + + settings = build_hooks._build_config_settings({}, editable=False) + + assert settings["cmake.define.CUDA_BINDINGS_CYTHON_ROOT"] == "" + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_editable_meta_finder_passes_verified_physical_roots(tmp_path, monkeypatch): + project_root = tmp_path / "cuda-bindings" + source_root = project_root / "src" + _write_bindings_declaration(source_root) + direct_url = { + "url": project_root.as_uri(), + "dir_info": {"editable": True}, + } + find_spec = mock.Mock( + return_value=mock.Mock( + origin=str(source_root / "cuda" / "bindings" / "__init__.py"), + submodule_search_locations=[str(source_root / "cuda" / "bindings")], + ) + ) + monkeypatch.setattr(sys, "path", [str(tmp_path / "build-site-packages")]) + monkeypatch.setattr( + build_hooks._cuda_core_cython_path.importlib.metadata, + "distribution", + lambda _name: _DirectUrlDistribution(direct_url), + ) + monkeypatch.setattr(build_hooks._cuda_core_cython_path.importlib.util, "find_spec", find_spec) + _mock_cuda_build_settings(monkeypatch) + + expected = str(source_root.resolve()) + settings = build_hooks._build_config_settings({}, editable=True) + + assert settings["cmake.define.CUDA_BINDINGS_CYTHON_ROOT"] == expected + find_spec.assert_called_once_with("cuda.bindings") + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_editable_runtime_exposes_bindings_source_root(tmp_path, monkeypatch): + source_root = tmp_path / "cuda-bindings" + _write_bindings_declaration(source_root) + direct_url = { + "url": source_root.as_uri(), + "dir_info": {"editable": True}, + } + runtime_sys_path = [str(tmp_path / "site-packages")] + monkeypatch.setattr(sys, "path", runtime_sys_path) + monkeypatch.setattr( + build_hooks._cuda_core_cython_path.importlib.metadata, + "distribution", + lambda _name: _DirectUrlDistribution(direct_url), + ) + + build_hooks._cuda_core_cython_path.add_editable_cuda_bindings_path() + + assert sys.path == [runtime_sys_path[0], str(source_root.resolve())] + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_editable_runtime_uses_spec_without_direct_url(tmp_path, monkeypatch): + source_root = tmp_path / "cuda-bindings" + _write_bindings_declaration(source_root) + runtime_sys_path = [str(tmp_path / "site-packages")] + find_spec = mock.Mock( + return_value=mock.Mock( + origin=str(source_root / "cuda" / "bindings" / "__init__.py"), + submodule_search_locations=[str(source_root / "cuda" / "bindings")], + ) + ) + distribution = mock.Mock() + distribution.read_text.return_value = None + monkeypatch.setattr(sys, "path", runtime_sys_path) + monkeypatch.setattr( + build_hooks._cuda_core_cython_path.importlib.metadata, + "distribution", + lambda _name: distribution, + ) + monkeypatch.setattr(build_hooks._cuda_core_cython_path.importlib.util, "find_spec", find_spec) + + build_hooks._cuda_core_cython_path.add_editable_cuda_bindings_path() + + assert sys.path == [runtime_sys_path[0], str(source_root.resolve())] + find_spec.assert_called_once_with("cuda.bindings") + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_editable_build_does_not_persist_regular_wheel_root(tmp_path, monkeypatch): + site_packages = tmp_path / "site-packages" + _write_bindings_declaration(site_packages) + direct_url = { + "url": site_packages.as_uri(), + "dir_info": {"editable": False}, + } + monkeypatch.setattr(sys, "path", [str(site_packages)]) + monkeypatch.setattr( + build_hooks._cuda_core_cython_path.importlib.metadata, + "distribution", + lambda _name: _DirectUrlDistribution(direct_url), + ) + _mock_cuda_build_settings(monkeypatch) + + settings = build_hooks._build_config_settings({}, editable=True) + build_hooks._cuda_core_cython_path.add_editable_cuda_bindings_path() + + assert settings["cmake.define.CUDA_BINDINGS_CYTHON_ROOT"] == "" + assert sys.path == [str(site_packages)] + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_editable_runtime_warns_on_invalid_bindings_metadata(tmp_path, monkeypatch): + runtime_sys_path = [str(tmp_path / "site-packages")] + monkeypatch.setattr(sys, "path", runtime_sys_path) + monkeypatch.setattr( + build_hooks._cuda_core_cython_path.importlib.metadata, + "distribution", + lambda _name: _DirectUrlDistribution("{"), + ) + + with pytest.warns(RuntimeWarning, match="invalid direct_url.json"): + build_hooks._cuda_core_cython_path.add_editable_cuda_bindings_path() + + assert sys.path == runtime_sys_path def _check_version_detection( From 988c88fc994ed657753c1d4ccad436f1e51b82ff Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Thu, 13 Aug 2026 23:17:06 -0400 Subject: [PATCH 3/8] build: simplify cuda-core scikit-build integration --- .github/workflows/ci-pixi-source-test.yml | 1 + cuda_bindings/pyproject.toml | 1 + cuda_bindings/tests/test_build_hooks.py | 78 +++++++ cuda_core/CMakeLists.txt | 49 ++--- cuda_core/_cuda_core_cython_path.py | 152 -------------- cuda_core/build_hooks.py | 161 +++------------ cuda_core/pyproject.toml | 19 +- cuda_core/tests/test_build_hooks.py | 239 +++------------------- 8 files changed, 166 insertions(+), 534 deletions(-) create mode 100644 cuda_bindings/tests/test_build_hooks.py delete mode 100644 cuda_core/_cuda_core_cython_path.py diff --git a/.github/workflows/ci-pixi-source-test.yml b/.github/workflows/ci-pixi-source-test.yml index cfdcb8cdfdf..adc6c67d44c 100644 --- a/.github/workflows/ci-pixi-source-test.yml +++ b/.github/workflows/ci-pixi-source-test.yml @@ -34,6 +34,7 @@ on: - "**/pixi.toml" - "**/pixi.lock" - "cuda_bindings/build_hooks.py" + - "cuda_bindings/pyproject.toml" - "cuda_core/build_hooks.py" - "cuda_core/CMakeLists.txt" - "cuda_core/pyproject.toml" diff --git a/cuda_bindings/pyproject.toml b/cuda_bindings/pyproject.toml index 3896e4527ec..4db97e904bd 100644 --- a/cuda_bindings/pyproject.toml +++ b/cuda_bindings/pyproject.toml @@ -66,6 +66,7 @@ include = ["cuda*"] [tool.setuptools] include-package-data = false +package-dir = {"" = "."} [tool.setuptools.package-data] "*" = ["*.pxd", "*.pxi"] diff --git a/cuda_bindings/tests/test_build_hooks.py b/cuda_bindings/tests/test_build_hooks.py new file mode 100644 index 00000000000..c2af51ac73d --- /dev/null +++ b/cuda_bindings/tests/test_build_hooks.py @@ -0,0 +1,78 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Tests for the cuda-bindings PEP 517 build wrapper.""" + +import base64 +import csv +import hashlib +import importlib.util +import io +import zipfile +from pathlib import Path +from unittest import mock + +import pytest + + +def _load_build_hooks(): + build_hooks_path = Path(__file__).parent.parent / "build_hooks.py" + spec = importlib.util.spec_from_file_location("_cuda_bindings_test_build_hooks", build_hooks_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +build_hooks = _load_build_hooks() + + +def _record_row(path, contents): + digest = base64.urlsafe_b64encode(hashlib.sha256(contents).digest()).rstrip(b"=").decode("ascii") + return path, f"sha256={digest}", len(contents) + + +def _assert_valid_record(wheel): + record_path = next(name for name in wheel.namelist() if name.endswith(".dist-info/RECORD")) + rows = list(csv.reader(io.StringIO(wheel.read(record_path).decode("utf-8"), newline=""))) + records = {path: (digest, size) for path, digest, size in rows} + + assert set(records) == set(wheel.namelist()) + for name in wheel.namelist(): + digest, size = records[name] + if name == record_path: + assert (digest, size) == ("", "") + else: + contents = wheel.read(name) + assert (name, digest, int(size)) == _record_row(name, contents) + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_editable_wheel_uses_data_only_source_root_pth(tmp_path, monkeypatch): + project_root = Path(build_hooks.__file__).resolve().parent + bindings_build = mock.Mock() + monkeypatch.chdir(project_root) + monkeypatch.setattr(build_hooks, "_build_cuda_bindings", bindings_build) + + wheel_name = build_hooks.build_editable(tmp_path, {"debug": False}) + + bindings_build.assert_called_once_with(debug=False) + with zipfile.ZipFile(tmp_path / wheel_name) as wheel: + pth_files = [name for name in wheel.namelist() if name.endswith(".pth")] + assert len(pth_files) == 1 + assert wheel.read(pth_files[0]).decode("utf-8") == f"{project_root}\n" + _assert_valid_record(wheel) + + +@pytest.mark.agent_authored(model="gpt-5.6") +def test_regular_wheel_does_not_include_editable_path(tmp_path, monkeypatch): + project_root = Path(build_hooks.__file__).resolve().parent + bindings_build = mock.Mock() + monkeypatch.chdir(project_root) + monkeypatch.setattr(build_hooks, "_build_cuda_bindings", bindings_build) + + wheel_name = build_hooks.build_wheel(tmp_path, {"debug": False}) + + bindings_build.assert_called_once_with(debug=False) + with zipfile.ZipFile(tmp_path / wheel_name) as wheel: + assert not any(name.endswith(".pth") for name in wheel.namelist()) + _assert_valid_record(wheel) diff --git a/cuda_core/CMakeLists.txt b/cuda_core/CMakeLists.txt index c96fa902a43..e5ac117e77f 100644 --- a/cuda_core/CMakeLists.txt +++ b/cuda_core/CMakeLists.txt @@ -16,7 +16,6 @@ include(UseCython) set(CUDA_CORE_CUDA_ROOT "" CACHE PATH "CUDA Toolkit root used to compile cuda-core") set(CUDA_CORE_BUILD_MAJOR "" CACHE STRING "CUDA major version for Cython compile-time conditionals") -set(CUDA_BINDINGS_CYTHON_ROOT "" CACHE PATH "Optional physical cuda-bindings package root for Cython") set(CUDA_PYTHON_COVERAGE "$ENV{CUDA_PYTHON_COVERAGE}" CACHE STRING "Build Cython line tracing support") if(NOT CUDA_CORE_CUDA_ROOT) @@ -30,6 +29,17 @@ if(NOT CUDA_CORE_CUDA_ROOT) message(FATAL_ERROR "CUDA_CORE_CUDA_ROOT, CUDA_HOME, or CUDA_PATH must point to a CUDA Toolkit installation") endif() +# Keep the legacy environment override per-configure. Unlike an explicit -D +# setting, it must not persist when the wheel build directory is reused for a +# different CUDA major. +if( + NOT CUDA_CORE_BUILD_MAJOR + AND DEFINED ENV{CUDA_CORE_BUILD_MAJOR} + AND NOT "$ENV{CUDA_CORE_BUILD_MAJOR}" STREQUAL "" +) + set(CUDA_CORE_BUILD_MAJOR "$ENV{CUDA_CORE_BUILD_MAJOR}") +endif() + cmake_path(ABSOLUTE_PATH CUDA_CORE_CUDA_ROOT NORMALIZE) set(_cuda_header "${CUDA_CORE_CUDA_ROOT}/include/cuda.h") if(NOT EXISTS "${_cuda_header}") @@ -56,16 +66,6 @@ elseif(NOT "${CUDA_CORE_BUILD_MAJOR}" STREQUAL "${_cuda_header_major}") endif() message(STATUS "Building cuda-core for CUDA ${CUDA_CORE_BUILD_MAJOR} using ${CUDA_CORE_CUDA_ROOT}") -if(CUDA_BINDINGS_CYTHON_ROOT) - cmake_path(ABSOLUTE_PATH CUDA_BINDINGS_CYTHON_ROOT NORMALIZE) - if(NOT EXISTS "${CUDA_BINDINGS_CYTHON_ROOT}/cuda/bindings/cydriver.pxd") - message( - FATAL_ERROR - "CUDA_BINDINGS_CYTHON_ROOT=${CUDA_BINDINGS_CYTHON_ROOT} does not contain cuda/bindings/cydriver.pxd" - ) - endif() -endif() - if(WIN32) execute_process( COMMAND @@ -103,9 +103,6 @@ set(_cython_common_args -I "${CMAKE_CURRENT_SOURCE_DIR}" ${_coverage_directive} ) -if(CUDA_BINDINGS_CYTHON_ROOT) - list(APPEND _cython_common_args -I "${CUDA_BINDINGS_CYTHON_ROOT}") -endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT WIN32) list(APPEND _cython_common_args --gdb) @@ -211,25 +208,12 @@ if(NOT SKBUILD_STATE STREQUAL "editable") PATTERN "*.pyx" ) endif() -else() - # Resolve the declarations in the final environment rather than persisting - # a potentially temporary path from the isolated editable build environment. - set(_cuda_bindings_cython_pth "${CMAKE_CURRENT_BINARY_DIR}/_cuda_core_cython_include.pth") - file( - WRITE "${_cuda_bindings_cython_pth}" - "import _cuda_core_cython_path; _cuda_core_cython_path.add_editable_cuda_bindings_path()\n" - ) - install( - FILES - "${CMAKE_CURRENT_SOURCE_DIR}/_cuda_core_cython_path.py" - "${_cuda_bindings_cython_pth}" - DESTINATION "." - ) endif() if(MSVC) set(_aoti_shim_def "${_cuda_core_source_root}/_include/aoti_shim.def") set(_aoti_shim_lib "${CMAKE_CURRENT_BINARY_DIR}/aoti_shim.lib") + set(_aoti_shim_exp "${CMAKE_CURRENT_BINARY_DIR}/aoti_shim.exp") if(CMAKE_GENERATOR_PLATFORM MATCHES "^(ARM64|arm64)$" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$") set(_aoti_machine ARM64) else() @@ -237,6 +221,7 @@ if(MSVC) endif() add_custom_command( OUTPUT "${_aoti_shim_lib}" + BYPRODUCTS "${_aoti_shim_exp}" COMMAND "${CMAKE_AR}" "/DEF:${_aoti_shim_def}" @@ -246,7 +231,10 @@ if(MSVC) COMMENT "Generating the AOTI shim import library" VERBATIM ) - add_custom_target(cuda_core_aoti_shim DEPENDS "${_aoti_shim_lib}") + add_custom_target(cuda_core_aoti_shim_generation DEPENDS "${_aoti_shim_lib}") + add_library(cuda_core_aoti_shim SHARED IMPORTED) + set_target_properties(cuda_core_aoti_shim PROPERTIES IMPORTED_IMPLIB "${_aoti_shim_lib}") + add_dependencies(cuda_core_aoti_shim cuda_core_aoti_shim_generation) endif() function(cuda_core_add_cython_module module_path) @@ -304,8 +292,7 @@ function(cuda_core_add_cython_module module_path) endif() if(MSVC AND module_path STREQUAL "_tensor_bridge") - add_dependencies("${target_name}" cuda_core_aoti_shim) - target_link_libraries("${target_name}" PRIVATE "${_aoti_shim_lib}") + target_link_libraries("${target_name}" PRIVATE cuda_core_aoti_shim) endif() install(TARGETS "${target_name}" LIBRARY DESTINATION "${install_directory}" RUNTIME DESTINATION "${install_directory}") diff --git a/cuda_core/_cuda_core_cython_path.py b/cuda_core/_cuda_core_cython_path.py deleted file mode 100644 index 64496bcf3f3..00000000000 --- a/cuda_core/_cuda_core_cython_path.py +++ /dev/null @@ -1,152 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - -"""Expose editable cuda-bindings declarations to filesystem-based Cython lookup.""" - -from __future__ import annotations - -import importlib.metadata -import importlib.util -import json -import os -import sys -import warnings -from pathlib import Path -from urllib.parse import urlparse -from urllib.request import url2pathname - -_CUDA_BINDINGS_DECLARATION = Path("cuda", "bindings", "cydriver.pxd") - - -def _validated_root(root: str | os.PathLike[str]) -> Path | None: - try: - root_path = Path(root).expanduser().resolve() - except (OSError, RuntimeError): - return None - return root_path if (root_path / _CUDA_BINDINGS_DECLARATION).is_file() else None - - -def _find_on_sys_path() -> Path | None: - for entry in sys.path: - if isinstance(entry, str) and (root := _validated_root(entry or os.getcwd())): - return root - return None - - -def _root_from_package_path(package_path: str | os.PathLike[str]) -> Path | None: - bindings_path = Path(package_path) - if bindings_path.name != "bindings" or bindings_path.parent.name != "cuda": - return None - return _validated_root(bindings_path.parent.parent) - - -def _find_from_spec() -> Path | None: - """Resolve a physical root without importing ``cuda.bindings`` itself.""" - try: - spec = importlib.util.find_spec("cuda.bindings") - except ModuleNotFoundError: - return None - if spec is None: - return None - - for location in spec.submodule_search_locations or (): - if root := _root_from_package_path(location): - return root - - if spec.origin and spec.origin not in {"built-in", "frozen"}: - return _root_from_package_path(Path(spec.origin).parent) - return None - - -def _distribution() -> importlib.metadata.Distribution | None: - try: - return importlib.metadata.distribution("cuda-bindings") - except importlib.metadata.PackageNotFoundError: - return None - - -def _path_from_file_url(url: str) -> Path | None: - parsed = urlparse(url) - if parsed.scheme != "file": - return None - - path = url2pathname(parsed.path) - if parsed.netloc and parsed.netloc != "localhost": - path = f"//{parsed.netloc}{path}" - return Path(path) - - -def _report_invalid_editable(message: str, *, strict: bool) -> None: - if strict: - raise RuntimeError(message) - warnings.warn(message, RuntimeWarning, stacklevel=3) - - -def _find_editable_root(*, strict: bool) -> Path | None: - distribution = _distribution() - if distribution is None: - return None - - direct_url_text = distribution.read_text("direct_url.json") - if direct_url_text is None: - return None - try: - direct_url = json.loads(direct_url_text) - except json.JSONDecodeError: - _report_invalid_editable("cuda-bindings has an invalid direct_url.json", strict=strict) - return None - if not isinstance(direct_url, dict): - _report_invalid_editable("cuda-bindings has an invalid direct_url.json", strict=strict) - return None - - dir_info = direct_url.get("dir_info") - if not isinstance(dir_info, dict) or dir_info.get("editable") is not True: - return None - - url = direct_url.get("url") - if isinstance(url, str): - source_path = _path_from_file_url(url) - if source_path is not None and (root := _validated_root(source_path)): - return root - - # PEP 660 meta finders can expose a source layout that differs from the - # project root recorded in direct_url.json. - if root := _find_from_spec(): - return root - - _report_invalid_editable( - "cuda-bindings is marked as editable, but its physical " - f"{_CUDA_BINDINGS_DECLARATION} declaration could not be found", - strict=strict, - ) - return None - - -def find_cuda_bindings_cython_root() -> str | None: - """Return a transient Cython root only when normal ``sys.path`` is insufficient.""" - if _find_on_sys_path() is not None: - return None - - root = _find_editable_root(strict=True) or _find_from_spec() - if root is None: - distribution = _distribution() - if distribution is not None: - declaration = Path(distribution.locate_file(_CUDA_BINDINGS_DECLARATION)) - if declaration.is_file(): - root = _validated_root(declaration.parents[2]) - if root is None: - raise RuntimeError(f"Could not find the physical cuda-bindings {_CUDA_BINDINGS_DECLARATION} declaration") - return os.fspath(root) - - -def add_editable_cuda_bindings_path() -> None: - """Expose editable bindings declarations in the final runtime environment.""" - if _find_on_sys_path() is not None: - return - - root = _find_editable_root(strict=False) or _find_from_spec() - if root is not None: - root_string = os.fspath(root) - if root_string not in sys.path: - sys.path.append(root_string) diff --git a/cuda_core/build_hooks.py b/cuda_core/build_hooks.py index e278ce08d0f..d985616d0b3 100644 --- a/cuda_core/build_hooks.py +++ b/cuda_core/build_hooks.py @@ -11,15 +11,12 @@ from __future__ import annotations -import functools import os import re import sys -from collections.abc import Callable, Mapping -from pathlib import Path +from collections.abc import Mapping from typing import Any -import _cuda_core_cython_path import scikit_build_core.build as _build_backend build_sdist = _build_backend.build_sdist @@ -27,56 +24,18 @@ _ConfigSettings = Mapping[str, str | list[str] | bool] | None _MISSING = object() +_CUDA_ROOT_SETTING = "cmake.define.CUDA_CORE_CUDA_ROOT" +_CUDA_ROOT_SETTING_ALIAS = "skbuild.cmake.define.CUDA_CORE_CUDA_ROOT" +_CUDA_MAJOR_SETTING = "cmake.define.CUDA_CORE_BUILD_MAJOR" +_CUDA_MAJOR_SETTING_ALIAS = "skbuild.cmake.define.CUDA_CORE_BUILD_MAJOR" +_BUILD_TYPE_SETTINGS = ("cmake.build-type", "skbuild.cmake.build-type") -# Please keep in sync with the copy in cuda_bindings/build_hooks.py. -def _import_get_cuda_path_or_home(): - """Import get_cuda_path_or_home, working around PEP 517 namespace shadowing. - - See https://github.com/NVIDIA/cuda-python/issues/1824 for why this helper is needed. - """ - try: - import cuda.pathfinder - except ModuleNotFoundError as exc: - if exc.name not in ("cuda", "cuda.pathfinder"): - raise - try: - import cuda - except ModuleNotFoundError: - cuda = None - - for p in sys.path: - sp_cuda = Path(p) / "cuda" - if (sp_cuda / "pathfinder").is_dir(): - if cuda is None: - raise ModuleNotFoundError( - "The cuda namespace package is unavailable even though cuda-pathfinder was found." - ) from exc - cuda.__path__ = list(cuda.__path__) + [str(sp_cuda)] - break - else: - raise ModuleNotFoundError( - "cuda-pathfinder is not installed in the build environment. " - "Ensure 'cuda-pathfinder>=1.5' is in build-system.requires." - ) from exc - import cuda.pathfinder - - pathfinder_dir = Path(cuda.pathfinder.__file__).parent - print( - f"Using cuda-pathfinder {cuda.pathfinder.__version__} from {pathfinder_dir}", - file=sys.stderr, - ) - return cuda.pathfinder.get_cuda_path_or_home - - -@functools.cache def _get_cuda_path() -> str: - get_cuda_path_or_home = _import_get_cuda_path_or_home() - cuda_path = get_cuda_path_or_home() - if not cuda_path: - raise RuntimeError("Environment variable CUDA_PATH or CUDA_HOME is not set") - print("CUDA path:", cuda_path) - return os.fspath(cuda_path) + cuda_path = os.environ.get("CUDA_PATH") or os.environ.get("CUDA_HOME") + if cuda_path: + return cuda_path + raise RuntimeError("Environment variable CUDA_PATH or CUDA_HOME is not set") def _cuda_major_from_headers(cuda_path: str) -> str: @@ -98,7 +57,6 @@ def _cuda_major_from_headers(cuda_path: str) -> str: ) -@functools.cache def _determine_cuda_major_version(cuda_path: str | None = None) -> str: """Determine the CUDA major used for build requirements and Cython.""" cuda_major = os.environ.get("CUDA_CORE_BUILD_MAJOR") @@ -119,34 +77,19 @@ def _setting_value(config_settings: _ConfigSettings, *names: str) -> str | bool value = config_settings.get(name) if isinstance(value, list): if not value: - return None + continue value = value[-1] if value is not None: return value return None -def _configured_cuda_root(config_settings: _ConfigSettings) -> str: - cuda_root = _setting_value( - config_settings, - "cmake.define.CUDA_CORE_CUDA_ROOT", - "skbuild.cmake.define.CUDA_CORE_CUDA_ROOT", - ) - return os.fspath(cuda_root) if cuda_root is not None else _get_cuda_path() - - def _configured_cuda_major(config_settings: _ConfigSettings) -> str: - cuda_major = _setting_value( - config_settings, - "cmake.define.CUDA_CORE_BUILD_MAJOR", - "skbuild.cmake.define.CUDA_CORE_BUILD_MAJOR", - ) + # Match scikit-build-core's precedence when both accepted spellings are + # supplied: the explicitly prefixed spelling wins. + cuda_major = _setting_value(config_settings, _CUDA_MAJOR_SETTING_ALIAS, _CUDA_MAJOR_SETTING) if cuda_major is None: - configured_root = _setting_value( - config_settings, - "cmake.define.CUDA_CORE_CUDA_ROOT", - "skbuild.cmake.define.CUDA_CORE_CUDA_ROOT", - ) + configured_root = _setting_value(config_settings, _CUDA_ROOT_SETTING_ALIAS, _CUDA_ROOT_SETTING) return _determine_cuda_major_version(os.fspath(configured_root) if configured_root is not None else None) cuda_major = str(cuda_major) @@ -166,12 +109,11 @@ def _parse_bool(value: str | bool, *, setting: str) -> bool: raise ValueError(f"{setting} must be a boolean value, got {value!r}") -def _translate_config_settings(config_settings: _ConfigSettings, *, editable: bool) -> dict[str, Any]: +def _translate_config_settings(config_settings: _ConfigSettings) -> dict[str, Any]: settings = dict(config_settings or {}) debug = settings.pop("debug", _MISSING) - build_type_keys = ("cmake.build-type", "skbuild.cmake.build-type") - if debug is not _MISSING and any(key in settings for key in build_type_keys): + if debug is not _MISSING and any(key in settings for key in _BUILD_TYPE_SETTINGS): raise ValueError("debug and cmake.build-type cannot both be specified") if debug is not _MISSING: @@ -183,81 +125,28 @@ def _translate_config_settings(config_settings: _ConfigSettings, *, editable: bo if debug_enabled and sys.platform == "win32": raise RuntimeError("Debuggable builds are not supported on Windows.") settings["cmake.build-type"] = "Debug" if debug_enabled else "Release" - elif editable and not any(key in settings for key in build_type_keys): - # Preserve the setuptools backend's developer-friendly editable default. - settings["cmake.build-type"] = "Release" if sys.platform == "win32" else "Debug" return settings -def _set_cmake_define(settings: dict[str, Any], name: str, value: str) -> None: - keys = (f"cmake.define.{name}", f"skbuild.cmake.define.{name}") - if not any(key in settings for key in keys): - settings[keys[0]] = value - - -def _has_cmake_define(settings: Mapping[str, Any], name: str) -> bool: - return any(key in settings for key in (f"cmake.define.{name}", f"skbuild.cmake.define.{name}")) - - -def _build_config_settings(config_settings: _ConfigSettings, *, editable: bool) -> dict[str, Any]: - settings = _translate_config_settings(config_settings, editable=editable) - cuda_root = _configured_cuda_root(settings) - cuda_major = _configured_cuda_major(settings) - coverage = _parse_bool(os.environ.get("CUDA_PYTHON_COVERAGE", "0"), setting="CUDA_PYTHON_COVERAGE") - - _set_cmake_define(settings, "CUDA_CORE_CUDA_ROOT", cuda_root) - _set_cmake_define(settings, "CUDA_CORE_BUILD_MAJOR", cuda_major) - _set_cmake_define(settings, "CUDA_PYTHON_COVERAGE", "1" if coverage else "0") - - if not _has_cmake_define(settings, "CUDA_BINDINGS_CYTHON_ROOT"): - cython_root = _cuda_core_cython_path.find_cuda_bindings_cython_root() - # The build directory is persistent, so explicitly clear a root cached - # by an earlier editable build when the current environment needs none. - _set_cmake_define(settings, "CUDA_BINDINGS_CYTHON_ROOT", cython_root or "") - return settings - - -def _call_build_hook(hook: Callable[..., str], *args: Any, **kwargs: Any) -> str: - parallel_level = os.environ.get("CUDA_PYTHON_PARALLEL_LEVEL") - old_parallel_level = os.environ.get("CMAKE_BUILD_PARALLEL_LEVEL", _MISSING) - if parallel_level is not None and old_parallel_level is _MISSING: - os.environ["CMAKE_BUILD_PARALLEL_LEVEL"] = parallel_level - try: - return hook(*args, **kwargs) - finally: - if parallel_level is not None and old_parallel_level is _MISSING: - os.environ.pop("CMAKE_BUILD_PARALLEL_LEVEL", None) - - def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): - settings = _translate_config_settings(config_settings, editable=False) + settings = _translate_config_settings(config_settings) return _build_backend.prepare_metadata_for_build_wheel(metadata_directory, settings) def prepare_metadata_for_build_editable(metadata_directory, config_settings=None): - settings = _translate_config_settings(config_settings, editable=True) + settings = _translate_config_settings(config_settings) return _build_backend.prepare_metadata_for_build_editable(metadata_directory, settings) def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): - settings = _build_config_settings(config_settings, editable=False) - return _call_build_hook( - _build_backend.build_wheel, - wheel_directory, - settings, - metadata_directory, - ) + settings = _translate_config_settings(config_settings) + return _build_backend.build_wheel(wheel_directory, settings, metadata_directory) def build_editable(wheel_directory, config_settings=None, metadata_directory=None): - settings = _build_config_settings(config_settings, editable=True) - return _call_build_hook( - _build_backend.build_editable, - wheel_directory, - settings, - metadata_directory, - ) + settings = _translate_config_settings(config_settings) + return _build_backend.build_editable(wheel_directory, settings, metadata_directory) def _get_cuda_bindings_require(config_settings: _ConfigSettings = None) -> list[str]: @@ -266,10 +155,10 @@ def _get_cuda_bindings_require(config_settings: _ConfigSettings = None) -> list[ def get_requires_for_build_wheel(config_settings=None): - settings = _translate_config_settings(config_settings, editable=False) + settings = _translate_config_settings(config_settings) return _build_backend.get_requires_for_build_wheel(settings) + _get_cuda_bindings_require(settings) def get_requires_for_build_editable(config_settings=None): - settings = _translate_config_settings(config_settings, editable=True) + settings = _translate_config_settings(config_settings) return _build_backend.get_requires_for_build_editable(settings) + _get_cuda_bindings_require(settings) diff --git a/cuda_core/pyproject.toml b/cuda_core/pyproject.toml index 783be434ff3..6838ca054ca 100644 --- a/cuda_core/pyproject.toml +++ b/cuda_core/pyproject.toml @@ -8,7 +8,6 @@ requires = [ "setuptools-scm>=8,!=10.1", "Cython>=3.2.5,<3.3", "cython-cmake>=0.2.2,<0.4", - "cuda-pathfinder>=1.5" ] build-backend = "build_hooks" backend-path = ["."] @@ -120,18 +119,28 @@ wheel.exclude = [ "**/*.pyx", ] sdist.include = [ - "_cuda_core_cython_path.py", "cuda/core/_version.py", ] sdist.reproducible = true sdist.exclude = [ + "**/__pycache__/**", "**/*.dll", "**/*.dylib", + "**/*.o", + "**/*.pyc", "**/*.pyd", "**/*.so", "cython_debug/**", + "tests/cython/*.cpp", + "tests/cython/build/**", ] +[tool.scikit-build.cmake.define] +CUDA_PYTHON_COVERAGE = { env = "CUDA_PYTHON_COVERAGE", default = "0" } + +[tool.scikit-build.env] +CMAKE_BUILD_PARALLEL_LEVEL = { env = "CUDA_PYTHON_PARALLEL_LEVEL" } + [[tool.scikit-build.overrides]] if.env.CUDA_PYTHON_COVERAGE = true wheel.exclude = [ @@ -142,6 +151,12 @@ wheel.exclude = [ [[tool.scikit-build.overrides]] if.state = "editable" wheel.packages = ["cuda"] +cmake.build-type = "Debug" + +[[tool.scikit-build.overrides]] +if.state = "editable" +if.platform-system = "^win32" +cmake.build-type = "Release" [tool.setuptools_scm] root = ".." diff --git a/cuda_core/tests/test_build_hooks.py b/cuda_core/tests/test_build_hooks.py index 3ecd39b9451..2557c0331a2 100644 --- a/cuda_core/tests/test_build_hooks.py +++ b/cuda_core/tests/test_build_hooks.py @@ -17,7 +17,6 @@ """ import importlib.util -import json import os import sys import tempfile @@ -26,8 +25,6 @@ import pytest -from cuda.pathfinder import get_cuda_path_or_home - # build_hooks.py imports scikit-build-core at the top level, so skip if not available. pytest.importorskip("scikit_build_core") @@ -41,23 +38,9 @@ def _load_build_hooks(): that could shadow the installed package). """ build_hooks_path = Path(__file__).parent.parent / "build_hooks.py" - helper_name = "_cuda_core_cython_path" - helper_path = build_hooks_path.with_name(f"{helper_name}.py") - helper_spec = importlib.util.spec_from_file_location(helper_name, helper_path) - helper_module = importlib.util.module_from_spec(helper_spec) - previous_helper = sys.modules.get(helper_name) - sys.modules[helper_name] = helper_module - helper_spec.loader.exec_module(helper_module) - spec = importlib.util.spec_from_file_location("build_hooks", build_hooks_path) module = importlib.util.module_from_spec(spec) - try: - spec.loader.exec_module(module) - finally: - if previous_helper is None: - del sys.modules[helper_name] - else: - sys.modules[helper_name] = previous_helper + spec.loader.exec_module(module) return module @@ -80,10 +63,7 @@ def test_binary_build_requirements_include_matching_bindings(monkeypatch, hook_n requirements = getattr(build_hooks, hook_name)(config_settings) assert requirements == ["backend-requirement", "cuda-bindings==13.*"] - expected_settings = dict(config_settings) - if hook_name == "get_requires_for_build_editable": - expected_settings["cmake.build-type"] = "Release" if sys.platform == "win32" else "Debug" - backend_hook.assert_called_once_with(expected_settings) + backend_hook.assert_called_once_with(config_settings) @pytest.mark.agent_authored(model="gpt-5.6") @@ -99,17 +79,7 @@ def test_sdist_requirements_are_delegated_directly(): ) def test_legacy_debug_setting_maps_to_cmake_build_type(monkeypatch, debug, expected): monkeypatch.setattr(sys, "platform", "linux") - settings = build_hooks._translate_config_settings({"debug": debug}, editable=False) - - assert settings == {"cmake.build-type": expected} - - -@pytest.mark.agent_authored(model="gpt-5.6") -@pytest.mark.parametrize(("platform", "expected"), [("linux", "Debug"), ("win32", "Release")]) -def test_editable_build_uses_platform_default(monkeypatch, platform, expected): - monkeypatch.setattr(sys, "platform", platform) - - settings = build_hooks._translate_config_settings({}, editable=True) + settings = build_hooks._translate_config_settings({"debug": debug}) assert settings == {"cmake.build-type": expected} @@ -119,186 +89,39 @@ def test_debug_build_is_rejected_on_windows(monkeypatch): monkeypatch.setattr(sys, "platform", "win32") with pytest.raises(RuntimeError, match="not supported on Windows"): - build_hooks._translate_config_settings({"debug": "true"}, editable=False) - - -@pytest.mark.agent_authored(model="gpt-5.6") -def test_build_config_forwards_cuda_and_coverage(monkeypatch): - monkeypatch.setattr(build_hooks, "_configured_cuda_root", lambda _settings: "/cuda") - monkeypatch.setattr(build_hooks, "_configured_cuda_major", lambda _settings: "13") - bindings_root = mock.Mock(return_value=None) - monkeypatch.setattr(build_hooks._cuda_core_cython_path, "find_cuda_bindings_cython_root", bindings_root) - monkeypatch.setenv("CUDA_PYTHON_COVERAGE", "1") - - settings = build_hooks._build_config_settings( - { - "debug": "false", - "cmake.define.CUDA_BINDINGS_CYTHON_ROOT": "/bindings", - "cmake.define.SENTINEL": "value", - }, - editable=False, - ) - - assert settings == { - "cmake.build-type": "Release", - "cmake.define.CUDA_BINDINGS_CYTHON_ROOT": "/bindings", - "cmake.define.SENTINEL": "value", - "cmake.define.CUDA_CORE_CUDA_ROOT": "/cuda", - "cmake.define.CUDA_CORE_BUILD_MAJOR": "13", - "cmake.define.CUDA_PYTHON_COVERAGE": "1", - } - bindings_root.assert_not_called() - - -class _DirectUrlDistribution: - def __init__(self, direct_url): - self._direct_url = direct_url - - def read_text(self, filename): - assert filename == "direct_url.json" - return self._direct_url if isinstance(self._direct_url, str) else json.dumps(self._direct_url) - - -def _write_bindings_declaration(root): - declaration = root / "cuda" / "bindings" / "cydriver.pxd" - declaration.parent.mkdir(parents=True) - declaration.touch() - - -def _mock_cuda_build_settings(monkeypatch): - monkeypatch.setattr(build_hooks, "_configured_cuda_root", lambda _settings: "/cuda") - monkeypatch.setattr(build_hooks, "_configured_cuda_major", lambda _settings: "13") - monkeypatch.setenv("CUDA_PYTHON_COVERAGE", "0") - - -@pytest.mark.agent_authored(model="gpt-5.6") -def test_physical_bindings_wheel_clears_cached_cmake_root(tmp_path, monkeypatch): - site_packages = tmp_path / "site-packages" - _write_bindings_declaration(site_packages) - monkeypatch.setattr(sys, "path", [str(site_packages)]) - _mock_cuda_build_settings(monkeypatch) - - settings = build_hooks._build_config_settings({}, editable=False) - - assert settings["cmake.define.CUDA_BINDINGS_CYTHON_ROOT"] == "" + build_hooks._translate_config_settings({"debug": "true"}) @pytest.mark.agent_authored(model="gpt-5.6") -def test_editable_meta_finder_passes_verified_physical_roots(tmp_path, monkeypatch): - project_root = tmp_path / "cuda-bindings" - source_root = project_root / "src" - _write_bindings_declaration(source_root) - direct_url = { - "url": project_root.as_uri(), - "dir_info": {"editable": True}, +@pytest.mark.parametrize("prefix", ["cmake.define.", "skbuild.cmake.define."]) +def test_build_hooks_preserve_explicit_cuda_settings(monkeypatch, prefix): + config_settings = { + f"{prefix}CUDA_CORE_CUDA_ROOT": "/configured-cuda", + f"{prefix}CUDA_CORE_BUILD_MAJOR": "12", } - find_spec = mock.Mock( - return_value=mock.Mock( - origin=str(source_root / "cuda" / "bindings" / "__init__.py"), - submodule_search_locations=[str(source_root / "cuda" / "bindings")], - ) - ) - monkeypatch.setattr(sys, "path", [str(tmp_path / "build-site-packages")]) - monkeypatch.setattr( - build_hooks._cuda_core_cython_path.importlib.metadata, - "distribution", - lambda _name: _DirectUrlDistribution(direct_url), - ) - monkeypatch.setattr(build_hooks._cuda_core_cython_path.importlib.util, "find_spec", find_spec) - _mock_cuda_build_settings(monkeypatch) - - expected = str(source_root.resolve()) - settings = build_hooks._build_config_settings({}, editable=True) + backend_hook = mock.Mock(return_value="wheel.whl") + monkeypatch.setattr(build_hooks._build_backend, "build_wheel", backend_hook) - assert settings["cmake.define.CUDA_BINDINGS_CYTHON_ROOT"] == expected - find_spec.assert_called_once_with("cuda.bindings") + assert build_hooks.build_wheel("dist", config_settings, "metadata") == "wheel.whl" + backend_hook.assert_called_once_with("dist", config_settings, "metadata") @pytest.mark.agent_authored(model="gpt-5.6") -def test_editable_runtime_exposes_bindings_source_root(tmp_path, monkeypatch): - source_root = tmp_path / "cuda-bindings" - _write_bindings_declaration(source_root) - direct_url = { - "url": source_root.as_uri(), - "dir_info": {"editable": True}, +def test_prefixed_cuda_settings_follow_backend_precedence(tmp_path, monkeypatch): + monkeypatch.delenv("CUDA_CORE_BUILD_MAJOR", raising=False) + unprefixed_root = tmp_path / "unprefixed" + prefixed_root = tmp_path / "prefixed" + for root, version in ((unprefixed_root, 12000), (prefixed_root, 13000)): + include = root / "include" + include.mkdir(parents=True) + (include / "cuda.h").write_text(f"#define CUDA_VERSION {version}\n") + + config_settings = { + "cmake.define.CUDA_CORE_CUDA_ROOT": str(unprefixed_root), + "skbuild.cmake.define.CUDA_CORE_CUDA_ROOT": str(prefixed_root), } - runtime_sys_path = [str(tmp_path / "site-packages")] - monkeypatch.setattr(sys, "path", runtime_sys_path) - monkeypatch.setattr( - build_hooks._cuda_core_cython_path.importlib.metadata, - "distribution", - lambda _name: _DirectUrlDistribution(direct_url), - ) - - build_hooks._cuda_core_cython_path.add_editable_cuda_bindings_path() - - assert sys.path == [runtime_sys_path[0], str(source_root.resolve())] - -@pytest.mark.agent_authored(model="gpt-5.6") -def test_editable_runtime_uses_spec_without_direct_url(tmp_path, monkeypatch): - source_root = tmp_path / "cuda-bindings" - _write_bindings_declaration(source_root) - runtime_sys_path = [str(tmp_path / "site-packages")] - find_spec = mock.Mock( - return_value=mock.Mock( - origin=str(source_root / "cuda" / "bindings" / "__init__.py"), - submodule_search_locations=[str(source_root / "cuda" / "bindings")], - ) - ) - distribution = mock.Mock() - distribution.read_text.return_value = None - monkeypatch.setattr(sys, "path", runtime_sys_path) - monkeypatch.setattr( - build_hooks._cuda_core_cython_path.importlib.metadata, - "distribution", - lambda _name: distribution, - ) - monkeypatch.setattr(build_hooks._cuda_core_cython_path.importlib.util, "find_spec", find_spec) - - build_hooks._cuda_core_cython_path.add_editable_cuda_bindings_path() - - assert sys.path == [runtime_sys_path[0], str(source_root.resolve())] - find_spec.assert_called_once_with("cuda.bindings") - - -@pytest.mark.agent_authored(model="gpt-5.6") -def test_editable_build_does_not_persist_regular_wheel_root(tmp_path, monkeypatch): - site_packages = tmp_path / "site-packages" - _write_bindings_declaration(site_packages) - direct_url = { - "url": site_packages.as_uri(), - "dir_info": {"editable": False}, - } - monkeypatch.setattr(sys, "path", [str(site_packages)]) - monkeypatch.setattr( - build_hooks._cuda_core_cython_path.importlib.metadata, - "distribution", - lambda _name: _DirectUrlDistribution(direct_url), - ) - _mock_cuda_build_settings(monkeypatch) - - settings = build_hooks._build_config_settings({}, editable=True) - build_hooks._cuda_core_cython_path.add_editable_cuda_bindings_path() - - assert settings["cmake.define.CUDA_BINDINGS_CYTHON_ROOT"] == "" - assert sys.path == [str(site_packages)] - - -@pytest.mark.agent_authored(model="gpt-5.6") -def test_editable_runtime_warns_on_invalid_bindings_metadata(tmp_path, monkeypatch): - runtime_sys_path = [str(tmp_path / "site-packages")] - monkeypatch.setattr(sys, "path", runtime_sys_path) - monkeypatch.setattr( - build_hooks._cuda_core_cython_path.importlib.metadata, - "distribution", - lambda _name: _DirectUrlDistribution("{"), - ) - - with pytest.warns(RuntimeWarning, match="invalid direct_url.json"): - build_hooks._cuda_core_cython_path.add_editable_cuda_bindings_path() - - assert sys.path == runtime_sys_path + assert build_hooks._configured_cuda_major(config_settings) == "13" def _check_version_detection( @@ -319,10 +142,6 @@ def _check_version_detection( cuda_h = include_dir / "cuda.h" cuda_h.write_text(f"#define CUDA_VERSION {cuda_version}\n") - build_hooks._get_cuda_path.cache_clear() - build_hooks._determine_cuda_major_version.cache_clear() - get_cuda_path_or_home.cache_clear() - mock_env = { k: v for k, v in { @@ -344,9 +163,6 @@ class TestGetCudaMajorVersion: @pytest.mark.parametrize("version", ["11", "12", "13", "14"]) def test_env_var_override(self, version): """CUDA_CORE_BUILD_MAJOR env var override works with various versions.""" - build_hooks._get_cuda_path.cache_clear() - build_hooks._determine_cuda_major_version.cache_clear() - get_cuda_path_or_home.cache_clear() with mock.patch.dict(os.environ, {"CUDA_CORE_BUILD_MAJOR": version}, clear=False): result = build_hooks._determine_cuda_major_version() assert result == version @@ -378,9 +194,6 @@ def test_env_var_takes_priority_over_headers(self): def test_missing_cuda_path_raises_error(self): """RuntimeError is raised when CUDA_PATH/CUDA_HOME not set and no env var override.""" - build_hooks._get_cuda_path.cache_clear() - build_hooks._determine_cuda_major_version.cache_clear() - get_cuda_path_or_home.cache_clear() with ( mock.patch.dict(os.environ, {}, clear=True), pytest.raises(RuntimeError, match="CUDA_PATH or CUDA_HOME"), From b78f7e8653e43696b1031127dbf77a5e341d736c Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Fri, 14 Aug 2026 00:15:11 -0400 Subject: [PATCH 4/8] build(cuda.core): use native scikit-build settings --- cuda_core/AGENTS.md | 2 +- cuda_core/CMakeLists.txt | 49 +++----- cuda_core/README.md | 4 +- cuda_core/build_hooks.py | 112 ++---------------- cuda_core/docs/source/install.rst | 10 ++ cuda_core/docs/source/release/1.2.0-notes.rst | 5 + cuda_core/pyproject.toml | 1 + cuda_core/tests/test_build_hooks.py | 105 ++++++++-------- 8 files changed, 99 insertions(+), 189 deletions(-) diff --git a/cuda_core/AGENTS.md b/cuda_core/AGENTS.md index 55699b75aaf..30adce80800 100644 --- a/cuda_core/AGENTS.md +++ b/cuda_core/AGENTS.md @@ -23,7 +23,7 @@ This file describes `cuda_core`, the high-level Pythonic CUDA subpackage in the `cuda/core/_cpp/`. - **Build backend**: `CMakeLists.txt` defines the Cython extension build; `build_hooks.py` wraps scikit-build-core to provide CUDA-major-specific build - dependency wiring and compatibility build settings. + dependency wiring. ## Build and version coupling diff --git a/cuda_core/CMakeLists.txt b/cuda_core/CMakeLists.txt index e5ac117e77f..929bfdc6b1c 100644 --- a/cuda_core/CMakeLists.txt +++ b/cuda_core/CMakeLists.txt @@ -14,34 +14,23 @@ find_package( find_package(Cython 3.2.5...<3.3 MODULE REQUIRED) include(UseCython) -set(CUDA_CORE_CUDA_ROOT "" CACHE PATH "CUDA Toolkit root used to compile cuda-core") -set(CUDA_CORE_BUILD_MAJOR "" CACHE STRING "CUDA major version for Cython compile-time conditionals") set(CUDA_PYTHON_COVERAGE "$ENV{CUDA_PYTHON_COVERAGE}" CACHE STRING "Build Cython line tracing support") -if(NOT CUDA_CORE_CUDA_ROOT) - if(DEFINED ENV{CUDA_PATH} AND NOT "$ENV{CUDA_PATH}" STREQUAL "") - set(CUDA_CORE_CUDA_ROOT "$ENV{CUDA_PATH}") - elseif(DEFINED ENV{CUDA_HOME} AND NOT "$ENV{CUDA_HOME}" STREQUAL "") - set(CUDA_CORE_CUDA_ROOT "$ENV{CUDA_HOME}") - endif() +if(DEFINED ENV{CUDA_PATH} AND NOT "$ENV{CUDA_PATH}" STREQUAL "") + set(_cuda_core_cuda_root "$ENV{CUDA_PATH}") +elseif(DEFINED ENV{CUDA_HOME} AND NOT "$ENV{CUDA_HOME}" STREQUAL "") + set(_cuda_core_cuda_root "$ENV{CUDA_HOME}") endif() -if(NOT CUDA_CORE_CUDA_ROOT) - message(FATAL_ERROR "CUDA_CORE_CUDA_ROOT, CUDA_HOME, or CUDA_PATH must point to a CUDA Toolkit installation") +if(NOT _cuda_core_cuda_root) + message(FATAL_ERROR "CUDA_PATH or CUDA_HOME must point to a CUDA Toolkit installation") endif() -# Keep the legacy environment override per-configure. Unlike an explicit -D -# setting, it must not persist when the wheel build directory is reused for a -# different CUDA major. -if( - NOT CUDA_CORE_BUILD_MAJOR - AND DEFINED ENV{CUDA_CORE_BUILD_MAJOR} - AND NOT "$ENV{CUDA_CORE_BUILD_MAJOR}" STREQUAL "" -) - set(CUDA_CORE_BUILD_MAJOR "$ENV{CUDA_CORE_BUILD_MAJOR}") +if(DEFINED ENV{CUDA_CORE_BUILD_MAJOR} AND NOT "$ENV{CUDA_CORE_BUILD_MAJOR}" STREQUAL "") + set(_cuda_core_build_major "$ENV{CUDA_CORE_BUILD_MAJOR}") endif() -cmake_path(ABSOLUTE_PATH CUDA_CORE_CUDA_ROOT NORMALIZE) -set(_cuda_header "${CUDA_CORE_CUDA_ROOT}/include/cuda.h") +cmake_path(ABSOLUTE_PATH _cuda_core_cuda_root NORMALIZE) +set(_cuda_header "${_cuda_core_cuda_root}/include/cuda.h") if(NOT EXISTS "${_cuda_header}") message(FATAL_ERROR "CUDA header not found: ${_cuda_header}") endif() @@ -53,18 +42,18 @@ endif() string(REGEX MATCH "[0-9]+" _cuda_version "${_cuda_version_line}") math(EXPR _cuda_header_major "${_cuda_version} / 1000") -if("${CUDA_CORE_BUILD_MAJOR}" STREQUAL "") - set(CUDA_CORE_BUILD_MAJOR "${_cuda_header_major}") -elseif(NOT CUDA_CORE_BUILD_MAJOR MATCHES "^[0-9]+$") - message(FATAL_ERROR "CUDA_CORE_BUILD_MAJOR must be an integer, got ${CUDA_CORE_BUILD_MAJOR}") -elseif(NOT "${CUDA_CORE_BUILD_MAJOR}" STREQUAL "${_cuda_header_major}") +if("${_cuda_core_build_major}" STREQUAL "") + set(_cuda_core_build_major "${_cuda_header_major}") +elseif(NOT _cuda_core_build_major MATCHES "^[0-9]+$") + message(FATAL_ERROR "CUDA_CORE_BUILD_MAJOR must be an integer, got ${_cuda_core_build_major}") +elseif(NOT "${_cuda_core_build_major}" STREQUAL "${_cuda_header_major}") message( FATAL_ERROR - "CUDA_CORE_BUILD_MAJOR=${CUDA_CORE_BUILD_MAJOR} does not match CUDA ${_cuda_header_major} " + "CUDA_CORE_BUILD_MAJOR=${_cuda_core_build_major} does not match CUDA ${_cuda_header_major} " "reported by ${_cuda_header}" ) endif() -message(STATUS "Building cuda-core for CUDA ${CUDA_CORE_BUILD_MAJOR} using ${CUDA_CORE_CUDA_ROOT}") +message(STATUS "Building cuda-core for CUDA ${_cuda_core_build_major} using ${_cuda_core_cuda_root}") if(WIN32) execute_process( @@ -99,7 +88,7 @@ set(_cython_common_args -X embedsignature=True -X warn.deprecated.IF=False -X freethreading_compatible=True - -E CUDA_CORE_BUILD_MAJOR=${CUDA_CORE_BUILD_MAJOR} + -E CUDA_CORE_BUILD_MAJOR=${_cuda_core_build_major} -I "${CMAKE_CURRENT_SOURCE_DIR}" ${_coverage_directive} ) @@ -114,7 +103,7 @@ target_include_directories( INTERFACE "${_cuda_core_source_root}" "${_cuda_core_source_root}/_include" - "${CUDA_CORE_CUDA_ROOT}/include" + "${_cuda_core_cuda_root}/include" ) target_compile_definitions( cuda_core_extension_settings diff --git a/cuda_core/README.md b/cuda_core/README.md index 74b2b6638f7..4978128ae76 100644 --- a/cuda_core/README.md +++ b/cuda_core/README.md @@ -12,8 +12,8 @@ This subpackage adheres to the developing practices described in the parent meta ## Debugging -Pass the `pip` / `uv` configuration option `-C="debug=True"` or -`--config-settings="debug=True"` to explicitly to build debuggable binaries. +Pass the scikit-build-core configuration option `-Ccmake.build-type=Debug` to +build debuggable binaries explicitly. Debuggable binaries are built by default for editable builds. Debuggable builds are not supported on Windows. diff --git a/cuda_core/build_hooks.py b/cuda_core/build_hooks.py index d985616d0b3..81e3c40fed6 100644 --- a/cuda_core/build_hooks.py +++ b/cuda_core/build_hooks.py @@ -13,23 +13,16 @@ import os import re -import sys -from collections.abc import Mapping -from typing import Any import scikit_build_core.build as _build_backend +build_wheel = _build_backend.build_wheel +build_editable = _build_backend.build_editable build_sdist = _build_backend.build_sdist +prepare_metadata_for_build_wheel = _build_backend.prepare_metadata_for_build_wheel +prepare_metadata_for_build_editable = _build_backend.prepare_metadata_for_build_editable get_requires_for_build_sdist = _build_backend.get_requires_for_build_sdist -_ConfigSettings = Mapping[str, str | list[str] | bool] | None -_MISSING = object() -_CUDA_ROOT_SETTING = "cmake.define.CUDA_CORE_CUDA_ROOT" -_CUDA_ROOT_SETTING_ALIAS = "skbuild.cmake.define.CUDA_CORE_CUDA_ROOT" -_CUDA_MAJOR_SETTING = "cmake.define.CUDA_CORE_BUILD_MAJOR" -_CUDA_MAJOR_SETTING_ALIAS = "skbuild.cmake.define.CUDA_CORE_BUILD_MAJOR" -_BUILD_TYPE_SETTINGS = ("cmake.build-type", "skbuild.cmake.build-type") - def _get_cuda_path() -> str: cuda_path = os.environ.get("CUDA_PATH") or os.environ.get("CUDA_HOME") @@ -57,11 +50,11 @@ def _cuda_major_from_headers(cuda_path: str) -> str: ) -def _determine_cuda_major_version(cuda_path: str | None = None) -> str: - """Determine the CUDA major used for build requirements and Cython.""" - cuda_major = os.environ.get("CUDA_CORE_BUILD_MAJOR") +def _determine_cuda_major_version() -> str: + """Determine the CUDA major used for build requirements.""" + cuda_major = os.environ.get("CUDA_CORE_BUILD_MAJOR") or None if cuda_major is None: - cuda_major = _cuda_major_from_headers(cuda_path or _get_cuda_path()) + cuda_major = _cuda_major_from_headers(_get_cuda_path()) if not re.fullmatch(r"\d+", cuda_major): raise RuntimeError(f"CUDA_CORE_BUILD_MAJOR must be an integer, got {cuda_major!r}") @@ -70,95 +63,14 @@ def _determine_cuda_major_version(cuda_path: str | None = None) -> str: return cuda_major -def _setting_value(config_settings: _ConfigSettings, *names: str) -> str | bool | None: - if config_settings is None: - return None - for name in names: - value = config_settings.get(name) - if isinstance(value, list): - if not value: - continue - value = value[-1] - if value is not None: - return value - return None - - -def _configured_cuda_major(config_settings: _ConfigSettings) -> str: - # Match scikit-build-core's precedence when both accepted spellings are - # supplied: the explicitly prefixed spelling wins. - cuda_major = _setting_value(config_settings, _CUDA_MAJOR_SETTING_ALIAS, _CUDA_MAJOR_SETTING) - if cuda_major is None: - configured_root = _setting_value(config_settings, _CUDA_ROOT_SETTING_ALIAS, _CUDA_ROOT_SETTING) - return _determine_cuda_major_version(os.fspath(configured_root) if configured_root is not None else None) - - cuda_major = str(cuda_major) - if not re.fullmatch(r"\d+", cuda_major): - raise RuntimeError(f"CUDA_CORE_BUILD_MAJOR must be an integer, got {cuda_major!r}") - return cuda_major - - -def _parse_bool(value: str | bool, *, setting: str) -> bool: - if isinstance(value, bool): - return value - normalized = value.strip().lower() - if normalized in {"1", "true", "on", "yes", "y"}: - return True - if normalized in {"0", "false", "off", "no", "n"}: - return False - raise ValueError(f"{setting} must be a boolean value, got {value!r}") - - -def _translate_config_settings(config_settings: _ConfigSettings) -> dict[str, Any]: - settings = dict(config_settings or {}) - debug = settings.pop("debug", _MISSING) - - if debug is not _MISSING and any(key in settings for key in _BUILD_TYPE_SETTINGS): - raise ValueError("debug and cmake.build-type cannot both be specified") - - if debug is not _MISSING: - if isinstance(debug, list): - if not debug: - raise ValueError("debug must have a value") - debug = debug[-1] - debug_enabled = _parse_bool(debug, setting="debug") - if debug_enabled and sys.platform == "win32": - raise RuntimeError("Debuggable builds are not supported on Windows.") - settings["cmake.build-type"] = "Debug" if debug_enabled else "Release" - - return settings - - -def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): - settings = _translate_config_settings(config_settings) - return _build_backend.prepare_metadata_for_build_wheel(metadata_directory, settings) - - -def prepare_metadata_for_build_editable(metadata_directory, config_settings=None): - settings = _translate_config_settings(config_settings) - return _build_backend.prepare_metadata_for_build_editable(metadata_directory, settings) - - -def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): - settings = _translate_config_settings(config_settings) - return _build_backend.build_wheel(wheel_directory, settings, metadata_directory) - - -def build_editable(wheel_directory, config_settings=None, metadata_directory=None): - settings = _translate_config_settings(config_settings) - return _build_backend.build_editable(wheel_directory, settings, metadata_directory) - - -def _get_cuda_bindings_require(config_settings: _ConfigSettings = None) -> list[str]: - cuda_major = _configured_cuda_major(config_settings) +def _get_cuda_bindings_require() -> list[str]: + cuda_major = _determine_cuda_major_version() return [f"cuda-bindings=={cuda_major}.*"] def get_requires_for_build_wheel(config_settings=None): - settings = _translate_config_settings(config_settings) - return _build_backend.get_requires_for_build_wheel(settings) + _get_cuda_bindings_require(settings) + return _build_backend.get_requires_for_build_wheel(config_settings) + _get_cuda_bindings_require() def get_requires_for_build_editable(config_settings=None): - settings = _translate_config_settings(config_settings) - return _build_backend.get_requires_for_build_editable(settings) + _get_cuda_bindings_require(settings) + return _build_backend.get_requires_for_build_editable(config_settings) + _get_cuda_bindings_require() diff --git a/cuda_core/docs/source/install.rst b/cuda_core/docs/source/install.rst index c048cfb2a2c..fa7584fb063 100644 --- a/cuda_core/docs/source/install.rst +++ b/cuda_core/docs/source/install.rst @@ -108,12 +108,21 @@ Development with uv `uv`_ is a fast Python package and project manager. For example, to work on ``cuda-core`` against CUDA 13: +.. important:: + + Source and editable builds require ``CUDA_PATH`` or ``CUDA_HOME`` to point + to a CUDA Toolkit root containing ``include/cuda.h``. Set the variable + before invoking ``uv`` or ``pip``. If both are set, ``CUDA_PATH`` takes + precedence. On Windows, use ``set CUDA_PATH=C:\path\to\cuda`` in Command + Prompt or ``$env:CUDA_PATH = "C:\path\to\cuda"`` in PowerShell. + .. code-block:: console $ git clone https://github.com/NVIDIA/cuda-python.git $ cd cuda-python/cuda_core $ uv venv $ source .venv/bin/activate # On Windows: .venv\Scripts\activate + $ export CUDA_PATH=/path/to/cuda $ uv pip install -e .[cu13] --group test Run tests: @@ -153,6 +162,7 @@ Installing from Source $ git clone https://github.com/NVIDIA/cuda-python.git $ cd cuda-python/cuda_core + $ export CUDA_PATH=/path/to/cuda $ pip install . ``cuda-bindings`` 12.x or 13.x is a required dependency. diff --git a/cuda_core/docs/source/release/1.2.0-notes.rst b/cuda_core/docs/source/release/1.2.0-notes.rst index ef28e7931e4..adbc08f04c9 100644 --- a/cuda_core/docs/source/release/1.2.0-notes.rst +++ b/cuda_core/docs/source/release/1.2.0-notes.rst @@ -9,6 +9,11 @@ Fixes and enhancements ---------------------- +- Debuggable source builds now use scikit-build-core's standard + ``-Ccmake.build-type=Debug`` configuration setting. The legacy + ``--config-settings=debug=true`` alias has been removed. + (`#2607 `__) + - Graph node resources are now retained independently across graph clones, executable graphs, updates, node deletion, and in-flight launches. Previously, modifying a graph definition could release resources still used by an diff --git a/cuda_core/pyproject.toml b/cuda_core/pyproject.toml index 6838ca054ca..2f7d2636202 100644 --- a/cuda_core/pyproject.toml +++ b/cuda_core/pyproject.toml @@ -60,6 +60,7 @@ cu13 = ["cuda-bindings[all]==13.*", "cuda-toolkit==13.*"] [dependency-groups] test = [ "cython>=3.2.5,<3.3", + "scikit-build-core>=1.0", "setuptools>=80", "pytest==9.1.0", "pytest-benchmark==5.2.3", diff --git a/cuda_core/tests/test_build_hooks.py b/cuda_core/tests/test_build_hooks.py index 2557c0331a2..66a927a90fd 100644 --- a/cuda_core/tests/test_build_hooks.py +++ b/cuda_core/tests/test_build_hooks.py @@ -18,7 +18,6 @@ import importlib.util import os -import sys import tempfile from pathlib import Path from unittest import mock @@ -57,7 +56,7 @@ def test_binary_build_requirements_include_matching_bindings(monkeypatch, hook_n """Binary hooks preserve backend requirements and append CUDA-matched bindings.""" backend_hook = mock.Mock(return_value=["backend-requirement"]) monkeypatch.setattr(build_hooks._build_backend, hook_name, backend_hook) - monkeypatch.setattr(build_hooks, "_configured_cuda_major", lambda _settings: "13") + monkeypatch.setattr(build_hooks, "_determine_cuda_major_version", lambda: "13") config_settings = {"cmake.define.SENTINEL": "value"} requirements = getattr(build_hooks, hook_name)(config_settings) @@ -66,62 +65,20 @@ def test_binary_build_requirements_include_matching_bindings(monkeypatch, hook_n backend_hook.assert_called_once_with(config_settings) -@pytest.mark.agent_authored(model="gpt-5.6") -def test_sdist_requirements_are_delegated_directly(): - """The sdist hook is delegated directly and remains toolkit-independent.""" - assert build_hooks.get_requires_for_build_sdist is build_hooks._build_backend.get_requires_for_build_sdist - - @pytest.mark.agent_authored(model="gpt-5.6") @pytest.mark.parametrize( - ("debug", "expected"), - [("true", "Debug"), ("false", "Release"), (True, "Debug"), (False, "Release")], + "hook_name", + [ + "build_wheel", + "build_editable", + "build_sdist", + "prepare_metadata_for_build_wheel", + "prepare_metadata_for_build_editable", + "get_requires_for_build_sdist", + ], ) -def test_legacy_debug_setting_maps_to_cmake_build_type(monkeypatch, debug, expected): - monkeypatch.setattr(sys, "platform", "linux") - settings = build_hooks._translate_config_settings({"debug": debug}) - - assert settings == {"cmake.build-type": expected} - - -@pytest.mark.agent_authored(model="gpt-5.6") -def test_debug_build_is_rejected_on_windows(monkeypatch): - monkeypatch.setattr(sys, "platform", "win32") - - with pytest.raises(RuntimeError, match="not supported on Windows"): - build_hooks._translate_config_settings({"debug": "true"}) - - -@pytest.mark.agent_authored(model="gpt-5.6") -@pytest.mark.parametrize("prefix", ["cmake.define.", "skbuild.cmake.define."]) -def test_build_hooks_preserve_explicit_cuda_settings(monkeypatch, prefix): - config_settings = { - f"{prefix}CUDA_CORE_CUDA_ROOT": "/configured-cuda", - f"{prefix}CUDA_CORE_BUILD_MAJOR": "12", - } - backend_hook = mock.Mock(return_value="wheel.whl") - monkeypatch.setattr(build_hooks._build_backend, "build_wheel", backend_hook) - - assert build_hooks.build_wheel("dist", config_settings, "metadata") == "wheel.whl" - backend_hook.assert_called_once_with("dist", config_settings, "metadata") - - -@pytest.mark.agent_authored(model="gpt-5.6") -def test_prefixed_cuda_settings_follow_backend_precedence(tmp_path, monkeypatch): - monkeypatch.delenv("CUDA_CORE_BUILD_MAJOR", raising=False) - unprefixed_root = tmp_path / "unprefixed" - prefixed_root = tmp_path / "prefixed" - for root, version in ((unprefixed_root, 12000), (prefixed_root, 13000)): - include = root / "include" - include.mkdir(parents=True) - (include / "cuda.h").write_text(f"#define CUDA_VERSION {version}\n") - - config_settings = { - "cmake.define.CUDA_CORE_CUDA_ROOT": str(unprefixed_root), - "skbuild.cmake.define.CUDA_CORE_CUDA_ROOT": str(prefixed_root), - } - - assert build_hooks._configured_cuda_major(config_settings) == "13" +def test_non_requirement_hooks_are_delegated_directly(hook_name): + assert getattr(build_hooks, hook_name) is getattr(build_hooks._build_backend, hook_name) def _check_version_detection( @@ -163,7 +120,7 @@ class TestGetCudaMajorVersion: @pytest.mark.parametrize("version", ["11", "12", "13", "14"]) def test_env_var_override(self, version): """CUDA_CORE_BUILD_MAJOR env var override works with various versions.""" - with mock.patch.dict(os.environ, {"CUDA_CORE_BUILD_MAJOR": version}, clear=False): + with mock.patch.dict(os.environ, {"CUDA_CORE_BUILD_MAJOR": version}, clear=True): result = build_hooks._determine_cuda_major_version() assert result == version @@ -188,10 +145,46 @@ def test_cuda_home_fallback(self): """CUDA_HOME is used if CUDA_PATH is not set.""" _check_version_detection(12050, "12", use_cuda_path=False, use_cuda_home=True) + @pytest.mark.agent_authored(model="gpt-5.6") + def test_cuda_path_precedes_cuda_home(self, tmp_path): + cuda_path = tmp_path / "cuda-path" + cuda_home = tmp_path / "cuda-home" + for root, version in ((cuda_path, 12080), (cuda_home, 13010)): + include = root / "include" + include.mkdir(parents=True) + (include / "cuda.h").write_text(f"#define CUDA_VERSION {version}\n") + + with mock.patch.dict( + os.environ, + {"CUDA_PATH": str(cuda_path), "CUDA_HOME": str(cuda_home)}, + clear=True, + ): + assert build_hooks._determine_cuda_major_version() == "12" + def test_env_var_takes_priority_over_headers(self): """Env var override takes priority even when headers exist.""" _check_version_detection(12080, "11", cuda_core_build_major="11") + @pytest.mark.agent_authored(model="gpt-5.6") + def test_empty_env_var_falls_back_to_headers(self): + _check_version_detection(13010, "13", cuda_core_build_major="") + + @pytest.mark.agent_authored(model="gpt-5.6") + def test_invalid_env_var_raises_error(self): + with ( + mock.patch.dict(os.environ, {"CUDA_CORE_BUILD_MAJOR": "thirteen"}, clear=True), + pytest.raises(RuntimeError, match="must be an integer"), + ): + build_hooks._determine_cuda_major_version() + + @pytest.mark.agent_authored(model="gpt-5.6") + def test_missing_cuda_header_raises_error(self, tmp_path): + with ( + mock.patch.dict(os.environ, {"CUDA_PATH": str(tmp_path)}, clear=True), + pytest.raises(RuntimeError, match="valid CUDA installation with include/cuda.h"), + ): + build_hooks._determine_cuda_major_version() + def test_missing_cuda_path_raises_error(self): """RuntimeError is raised when CUDA_PATH/CUDA_HOME not set and no env var override.""" with ( From 092d24978970a8b87303432f3c07aa23a9f0a29e Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Fri, 14 Aug 2026 00:22:19 -0400 Subject: [PATCH 5/8] build(cuda.core): add current Cython targets --- cuda_core/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cuda_core/CMakeLists.txt b/cuda_core/CMakeLists.txt index 929bfdc6b1c..d2d4dd0e5dc 100644 --- a/cuda_core/CMakeLists.txt +++ b/cuda_core/CMakeLists.txt @@ -137,6 +137,8 @@ set(_cuda_core_modules _layout _linker _memory/_buffer + _memory/_copy_attributes + _memory/_copy_ops _memory/_device_memory_resource _memory/_graph_memory_resource _memory/_ipc From 6d08f4dd8e57b157da25be66d58cd8e1f111741e Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Fri, 14 Aug 2026 00:27:11 -0400 Subject: [PATCH 6/8] build(cuda.core): validate Cython target inventory --- cuda_core/CMakeLists.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cuda_core/CMakeLists.txt b/cuda_core/CMakeLists.txt index d2d4dd0e5dc..ad5913d6140 100644 --- a/cuda_core/CMakeLists.txt +++ b/cuda_core/CMakeLists.txt @@ -174,6 +174,20 @@ set(_cuda_core_modules texture/_texture ) +file( + GLOB_RECURSE _cuda_core_module_sources + CONFIGURE_DEPENDS + RELATIVE "${_cuda_core_source_root}" + "${_cuda_core_source_root}/*.pyx" +) +list(TRANSFORM _cuda_core_module_sources REPLACE "\\.pyx$" "") +set(_cuda_core_listed_modules ${_cuda_core_modules}) +list(SORT _cuda_core_module_sources) +list(SORT _cuda_core_listed_modules) +if(NOT "${_cuda_core_module_sources}" STREQUAL "${_cuda_core_listed_modules}") + message(FATAL_ERROR "Update _cuda_core_modules to match the cuda.core .pyx files") +endif() + # Stage regular wheels through CMake to keep them independent of ignored, # in-place extension artifacts. Editable builds map these files to the live # source tree instead. From 32926e2a97f92bea89902979c2a5696ffe162b69 Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Fri, 14 Aug 2026 01:17:20 -0400 Subject: [PATCH 7/8] build(cuda.core): preserve legacy debug setting --- cuda_core/README.md | 4 + cuda_core/build_hooks.py | 83 ++++++++++++++++-- cuda_core/docs/source/release/1.2.0-notes.rst | 3 +- cuda_core/tests/test_build_hooks.py | 87 +++++++++++++++++-- 4 files changed, 159 insertions(+), 18 deletions(-) diff --git a/cuda_core/README.md b/cuda_core/README.md index 4978128ae76..77f3dcc7743 100644 --- a/cuda_core/README.md +++ b/cuda_core/README.md @@ -16,6 +16,10 @@ Pass the scikit-build-core configuration option `-Ccmake.build-type=Debug` to build debuggable binaries explicitly. Debuggable binaries are built by default for editable builds. +The legacy `-Cdebug=True` option remains supported for compatibility throughout +the 1.x release series, but emits a deprecation warning and will be removed in +cuda.core 2.0. + Debuggable builds are not supported on Windows. ## Testing diff --git a/cuda_core/build_hooks.py b/cuda_core/build_hooks.py index 81e3c40fed6..3cfb99f1725 100644 --- a/cuda_core/build_hooks.py +++ b/cuda_core/build_hooks.py @@ -13,15 +13,13 @@ import os import re +import warnings +from collections.abc import Mapping import scikit_build_core.build as _build_backend -build_wheel = _build_backend.build_wheel -build_editable = _build_backend.build_editable -build_sdist = _build_backend.build_sdist -prepare_metadata_for_build_wheel = _build_backend.prepare_metadata_for_build_wheel -prepare_metadata_for_build_editable = _build_backend.prepare_metadata_for_build_editable -get_requires_for_build_sdist = _build_backend.get_requires_for_build_sdist +_ConfigSettings = Mapping[str, str | list[str] | bool] | None +_BUILD_TYPE_SETTINGS = ("cmake.build-type", "skbuild.cmake.build-type") def _get_cuda_path() -> str: @@ -68,9 +66,78 @@ def _get_cuda_bindings_require() -> list[str]: return [f"cuda-bindings=={cuda_major}.*"] +def _translate_legacy_debug(config_settings: _ConfigSettings, *, warn: bool = False) -> _ConfigSettings: + if config_settings is None or "debug" not in config_settings: + return config_settings + + settings = dict(config_settings) + debug = settings.pop("debug") + if warn: + warnings.warn( + "The 'debug' build config setting is deprecated and will be removed in " + "cuda.core 2.0; use 'cmake.build-type=Debug' or " + "'cmake.build-type=Release' instead.", + FutureWarning, + stacklevel=3, + ) + + if any(key in settings for key in _BUILD_TYPE_SETTINGS): + return settings + + if isinstance(debug, list): + if not debug: + raise ValueError("debug must have a value") + debug = debug[-1] + if isinstance(debug, bool): + debug_enabled = debug + else: + normalized = debug.strip().lower() + if normalized in {"1", "true", "on", "yes", "y"}: + debug_enabled = True + elif normalized in {"0", "false", "off", "no", "n"}: + debug_enabled = False + else: + raise ValueError(f"debug must be a boolean value, got {debug!r}") + + settings["cmake.build-type"] = "Debug" if debug_enabled else "Release" + return settings + + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): + settings = _translate_legacy_debug(config_settings) + return _build_backend.prepare_metadata_for_build_wheel(metadata_directory, settings) + + +def prepare_metadata_for_build_editable(metadata_directory, config_settings=None): + settings = _translate_legacy_debug(config_settings) + return _build_backend.prepare_metadata_for_build_editable(metadata_directory, settings) + + +def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): + settings = _translate_legacy_debug(config_settings, warn=True) + return _build_backend.build_wheel(wheel_directory, settings, metadata_directory) + + +def build_editable(wheel_directory, config_settings=None, metadata_directory=None): + settings = _translate_legacy_debug(config_settings, warn=True) + return _build_backend.build_editable(wheel_directory, settings, metadata_directory) + + +def build_sdist(sdist_directory, config_settings=None): + settings = _translate_legacy_debug(config_settings) + return _build_backend.build_sdist(sdist_directory, settings) + + def get_requires_for_build_wheel(config_settings=None): - return _build_backend.get_requires_for_build_wheel(config_settings) + _get_cuda_bindings_require() + settings = _translate_legacy_debug(config_settings) + return _build_backend.get_requires_for_build_wheel(settings) + _get_cuda_bindings_require() def get_requires_for_build_editable(config_settings=None): - return _build_backend.get_requires_for_build_editable(config_settings) + _get_cuda_bindings_require() + settings = _translate_legacy_debug(config_settings) + return _build_backend.get_requires_for_build_editable(settings) + _get_cuda_bindings_require() + + +def get_requires_for_build_sdist(config_settings=None): + settings = _translate_legacy_debug(config_settings) + return _build_backend.get_requires_for_build_sdist(settings) diff --git a/cuda_core/docs/source/release/1.2.0-notes.rst b/cuda_core/docs/source/release/1.2.0-notes.rst index 19809500aee..65c9627b2c8 100644 --- a/cuda_core/docs/source/release/1.2.0-notes.rst +++ b/cuda_core/docs/source/release/1.2.0-notes.rst @@ -23,7 +23,8 @@ Fixes and enhancements - Debuggable source builds now use scikit-build-core's standard ``-Ccmake.build-type=Debug`` configuration setting. The legacy - ``--config-settings=debug=true`` alias has been removed. + ``--config-settings=debug=true`` alias remains supported for compatibility, + but emits a deprecation warning and will be removed in ``cuda.core`` 2.0. (`#2607 `__) - A :class:`Buffer` is now freed correctly even when the CUDA context current diff --git a/cuda_core/tests/test_build_hooks.py b/cuda_core/tests/test_build_hooks.py index 66a927a90fd..cfb7c3af2f3 100644 --- a/cuda_core/tests/test_build_hooks.py +++ b/cuda_core/tests/test_build_hooks.py @@ -19,6 +19,7 @@ import importlib.util import os import tempfile +import warnings from pathlib import Path from unittest import mock @@ -63,22 +64,90 @@ def test_binary_build_requirements_include_matching_bindings(monkeypatch, hook_n assert requirements == ["backend-requirement", "cuda-bindings==13.*"] backend_hook.assert_called_once_with(config_settings) + assert backend_hook.call_args.args[0] is config_settings @pytest.mark.agent_authored(model="gpt-5.6") @pytest.mark.parametrize( - "hook_name", + ("hook_name", "args", "config_index"), [ - "build_wheel", - "build_editable", - "build_sdist", - "prepare_metadata_for_build_wheel", - "prepare_metadata_for_build_editable", - "get_requires_for_build_sdist", + pytest.param("get_requires_for_build_wheel", (), 0, id="wheel-requirements"), + pytest.param("get_requires_for_build_editable", (), 0, id="editable-requirements"), + pytest.param("get_requires_for_build_sdist", (), 0, id="sdist-requirements"), + pytest.param("prepare_metadata_for_build_wheel", ("metadata",), 1, id="wheel-metadata"), + pytest.param("prepare_metadata_for_build_editable", ("metadata",), 1, id="editable-metadata"), + pytest.param("build_wheel", ("dist", "metadata"), 1, id="wheel-build"), + pytest.param("build_editable", ("dist", "metadata"), 1, id="editable-build"), + pytest.param("build_sdist", ("dist",), 1, id="sdist-build"), ], ) -def test_non_requirement_hooks_are_delegated_directly(hook_name): - assert getattr(build_hooks, hook_name) is getattr(build_hooks._build_backend, hook_name) +def test_legacy_debug_is_translated_for_pep517_hooks(monkeypatch, hook_name, args, config_index): + is_requirements_hook = hook_name.startswith("get_requires") + backend_result = ["backend-requirement"] if is_requirements_hook else "artifact" + backend_hook = mock.Mock(return_value=backend_result) + monkeypatch.setattr(build_hooks._build_backend, hook_name, backend_hook) + determine_cuda_major = mock.Mock(return_value="13") + monkeypatch.setattr(build_hooks, "_determine_cuda_major_version", determine_cuda_major) + config_settings = {"debug": "true", "cmake.define.SENTINEL": "value"} + call_args = list(args) + call_args.insert(config_index, config_settings) + + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + result = getattr(build_hooks, hook_name)(*call_args) + + expected_args = list(args) + expected_args.insert( + config_index, + {"cmake.build-type": "Debug", "cmake.define.SENTINEL": "value"}, + ) + backend_hook.assert_called_once_with(*expected_args) + adds_cuda_requirement = hook_name in { + "get_requires_for_build_wheel", + "get_requires_for_build_editable", + } + expected_result = ["backend-requirement", "cuda-bindings==13.*"] if adds_cuda_requirement else backend_result + assert result == expected_result + assert config_settings == {"debug": "true", "cmake.define.SENTINEL": "value"} + assert determine_cuda_major.call_count == int(adds_cuda_requirement) + + if hook_name in {"build_wheel", "build_editable"}: + assert len(caught) == 1 + assert caught[0].category is FutureWarning + assert "removed in cuda.core 2.0" in str(caught[0].message) + else: + assert caught == [] + + +@pytest.mark.agent_authored(model="gpt-5.6") +@pytest.mark.parametrize( + ("debug", "expected"), + [ + pytest.param(True, "Debug", id="bool-true"), + pytest.param(False, "Release", id="bool-false"), + pytest.param("TRUE", "Debug", id="string-true"), + pytest.param("off", "Release", id="string-false"), + pytest.param(["false", "yes"], "Debug", id="repeated-last-value"), + ], +) +def test_legacy_debug_values(debug, expected): + assert build_hooks._translate_legacy_debug({"debug": debug}) == {"cmake.build-type": expected} + + +@pytest.mark.agent_authored(model="gpt-5.6") +@pytest.mark.parametrize("native_setting", ["cmake.build-type", "skbuild.cmake.build-type"]) +def test_native_build_type_precedes_legacy_debug(native_setting): + config_settings = {"debug": "not-a-boolean", native_setting: "RelWithDebInfo"} + + assert build_hooks._translate_legacy_debug(config_settings) == {native_setting: "RelWithDebInfo"} + assert config_settings == {"debug": "not-a-boolean", native_setting: "RelWithDebInfo"} + + +@pytest.mark.agent_authored(model="gpt-5.6") +@pytest.mark.parametrize("debug", ["maybe", []]) +def test_invalid_legacy_debug_value_is_rejected(debug): + with pytest.raises(ValueError, match="debug must"): + build_hooks._translate_legacy_debug({"debug": debug}) def _check_version_detection( From edc3138b0c3b7d98d5dbc7879e7368921d208c00 Mon Sep 17 00:00:00 2001 From: Keith Kraus Date: Fri, 14 Aug 2026 10:54:05 -0400 Subject: [PATCH 8/8] docs(cuda.core): trim legacy debug note --- cuda_core/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cuda_core/README.md b/cuda_core/README.md index 77f3dcc7743..4978128ae76 100644 --- a/cuda_core/README.md +++ b/cuda_core/README.md @@ -16,10 +16,6 @@ Pass the scikit-build-core configuration option `-Ccmake.build-type=Debug` to build debuggable binaries explicitly. Debuggable binaries are built by default for editable builds. -The legacy `-Cdebug=True` option remains supported for compatibility throughout -the 1.x release series, but emits a deprecation warning and will be removed in -cuda.core 2.0. - Debuggable builds are not supported on Windows. ## Testing