From 29465ef07a88c37ab71cf771462d7aa064bea7c2 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 19:12:31 -0600 Subject: [PATCH 001/103] e2e for cross sdist build --- e2e/cases/uv-deps-650/crossbuild/BUILD.bazel | 25 +++++++++++++++++++ .../uv-deps-650/crossbuild/geohash_main.py | 5 ++++ .../uv-deps-650/crossbuild/pyproject.toml | 2 ++ .../crossbuild/require_cxx_driver.patch | 25 +++++++++++++++++++ e2e/cases/uv-deps-650/crossbuild/uv.lock | 8 ++++++ e2e/cases/uv-deps-650/setup.MODULE.bazel | 11 ++++++++ 6 files changed, 76 insertions(+) create mode 100644 e2e/cases/uv-deps-650/crossbuild/geohash_main.py create mode 100644 e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch diff --git a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel index 21314bc9a..17bce79c7 100644 --- a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel +++ b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel @@ -6,6 +6,8 @@ load("@rules_shell//shell:sh_test.bzl", "sh_test") load("//tools:asserts.bzl", "assert_tar_listing") load(":toolchain_test.bzl", "exec_python_path") +exports_files(["require_cxx_driver.patch"]) + platform( name = "arm64_linux", constraint_values = [ @@ -160,3 +162,26 @@ build_test( ":arm64_layers", ], ) + +py_binary( + name = "geohash_bin", + srcs = ["geohash_main.py"], + dep_group = "crossbuild", + main = "geohash_main.py", + python_version = "3.12", + deps = [ + "@pypi_uv_deps_650//python_geohash", + ], +) + +platform_transition_filegroup( + name = "geohash_amd64_linux", + srcs = [":geohash_bin"], + target_platform = ":amd64_linux", +) + +platform_transition_filegroup( + name = "geohash_arm64_linux", + srcs = [":geohash_bin"], + target_platform = ":arm64_linux", +) diff --git a/e2e/cases/uv-deps-650/crossbuild/geohash_main.py b/e2e/cases/uv-deps-650/crossbuild/geohash_main.py new file mode 100644 index 000000000..4e3f98f27 --- /dev/null +++ b/e2e/cases/uv-deps-650/crossbuild/geohash_main.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 + +import geohash + +print(geohash.encode(37.7749, -122.4194)) diff --git a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml b/e2e/cases/uv-deps-650/crossbuild/pyproject.toml index 7310d14c8..f110fdf36 100644 --- a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml +++ b/e2e/cases/uv-deps-650/crossbuild/pyproject.toml @@ -1,9 +1,11 @@ [project] name = "crossbuild" version = "0.0.0" +requires-python = ">=3.11" authors = [] dependencies = [ "psycopg2-binary", + "python-geohash==0.8.5", "setuptools", "build", ] diff --git a/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch b/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch new file mode 100644 index 000000000..87e257707 --- /dev/null +++ b/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch @@ -0,0 +1,25 @@ +diff --git a/src/geohash.cpp b/src/geohash.cpp +--- a/src/geohash.cpp ++++ b/src/geohash.cpp +@@ -0,0 +1,21 @@ ++#include ++ ++class RulesPyBase { ++public: ++ virtual ~RulesPyBase() {} ++}; ++ ++class RulesPyValue : public RulesPyBase { ++public: ++ std::string value; ++ ++ RulesPyValue(const char *value) : value(value) {} ++}; ++ ++extern "C" const char *rules_py_cxx_runtime_probe(void) { ++ static RulesPyValue value("rules_py_cxx_runtime_probe"); ++ RulesPyBase *base = &value; ++ RulesPyValue *derived = dynamic_cast(base); ++ return derived ? derived->value.c_str() : "dynamic_cast failed"; ++} ++ diff --git a/e2e/cases/uv-deps-650/crossbuild/uv.lock b/e2e/cases/uv-deps-650/crossbuild/uv.lock index d1847b175..4ac42a4fe 100644 --- a/e2e/cases/uv-deps-650/crossbuild/uv.lock +++ b/e2e/cases/uv-deps-650/crossbuild/uv.lock @@ -32,6 +32,7 @@ source = { virtual = "." } dependencies = [ { name = "build" }, { name = "psycopg2-binary" }, + { name = "python-geohash" }, { name = "setuptools" }, ] @@ -39,6 +40,7 @@ dependencies = [ requires-dist = [ { name = "build" }, { name = "psycopg2-binary" }, + { name = "python-geohash", specifier = "==0.8.5" }, { name = "setuptools" }, ] @@ -112,6 +114,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, ] +[[package]] +name = "python-geohash" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/e2/1a3507af7c8f91f8a4975d651d4aeb6a846dfdf74713954186ade4205850/python-geohash-0.8.5.tar.gz", hash = "sha256:05a21fcf4eda1a5eddbd291890ade23fc5ddaa6bb98f2ee23d2d384ed14f086d", size = 17636, upload-time = "2014-08-13T07:09:57.318Z" } + [[package]] name = "setuptools" version = "80.10.2" diff --git a/e2e/cases/uv-deps-650/setup.MODULE.bazel b/e2e/cases/uv-deps-650/setup.MODULE.bazel index b81de8b41..1cab41c3c 100644 --- a/e2e/cases/uv-deps-650/setup.MODULE.bazel +++ b/e2e/cases/uv-deps-650/setup.MODULE.bazel @@ -17,10 +17,21 @@ uv.project( pyproject = "//uv-deps-650/airflow:pyproject.toml", ) uv.project( + default_build_dependencies = [ + "build", + "setuptools", + ], hub_name = "pypi_uv_deps_650", lock = "//uv-deps-650/crossbuild:uv.lock", pyproject = "//uv-deps-650/crossbuild:pyproject.toml", ) +uv.override_package( + name = "python-geohash", + lock = "//uv-deps-650/crossbuild:uv.lock", + pre_build_patch_strip = 1, + pre_build_patches = ["//uv-deps-650/crossbuild:require_cxx_driver.patch"], + resource_set = "mem_4g", +) uv.project( hub_name = "pypi_uv_deps_650", lock = "//uv-deps-650/extras:uv.lock", From bd4944f23bf52df03ea581509bc9fb4d6750f48d Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 19:33:52 -0600 Subject: [PATCH 002/103] enable cross compile mode --- uv/private/pep517_whl/build_helper.py | 1 + uv/private/pep517_whl/rule.bzl | 60 ++++++++++++++++++--------- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index 9d1cd8cab..e42e63f52 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -278,6 +278,7 @@ def _legacy_metadata_conflicts_with_pyproject(worktree: str) -> bool: PARSER.add_argument("--patch-strip", type=int, default=0, help="Strip count for patch (-p)") PARSER.add_argument("--patch", action="append", default=[], dest="patches", help="Patch file to apply (repeatable)") PARSER.add_argument("--execroot-marker", help="Token in env values to replace with the absolute execroot") +PARSER.add_argument("--cross", action="store_true", help="Cross-compilation mode: target platform != exec platform") opts, _ = PARSER.parse_known_args() tmp_root = path.abspath(opts.outdir) + ".tmp" diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index e24b99d60..bc189ff53 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -190,6 +190,28 @@ def _pep517_native_whl(ctx): wheel_dir = ctx.actions.declare_directory("whl") patch_args, patch_inputs = _patch_args_and_inputs(ctx) + eg_toolchains = ctx.exec_groups[_TARGET_EXEC_GROUP].toolchains + cross = eg_toolchains[NATIVE_BUILD_TOOLCHAIN] == None + cc_toolchain = eg_toolchains[_CC_TOOLCHAIN_TYPE] + + if cc_toolchain == None: + if cross: + fail( + "Cross-compilation of sdist '{}' requires a CC toolchain " + + "registered for the target platform. No toolchain of type {} " + + "resolved against the current exec/target platform combination.\n" + + "Register a cross CC toolchain (e.g., toolchains_llvm with " + + "matching target_compatible_with) via register_toolchains.".format( + ctx.attr.src.label, + _CC_TOOLCHAIN_TYPE, + ), + ) + fail( + "sdist '{}' requires a CC toolchain but none resolved. " + + "Register a CC toolchain (e.g., rules_cc, toolchains_llvm) " + + "via register_toolchains.".format(ctx.attr.src.label), + ) + env = _common_env(ctx) extra_inputs, known_variables = _collect_toolchain_inputs_and_vars(ctx) @@ -213,12 +235,20 @@ def _pep517_native_whl(ctx): if "CXX" not in ctx.attr.env and cc_tools.get("CXX") and infer_cxx: env[_INFER_CXX_COMPANION] = "1" + if cross: + env["RULES_PY_CROSS_COMPILE"] = "1" + ctx.actions.run( - mnemonic = "PySdistNativeBuild", - progress_message = "Native source compiling {} to a whl".format(archive.basename), + mnemonic = "PySdistCrossBuild" if cross else "PySdistNativeBuild", + progress_message = "{} source compiling {} to a whl".format( + "Cross" if cross else "Native", + archive.basename, + ), executable = ctx.executable.tool, toolchain = None, - arguments = ctx.attr.args + patch_args + _memory_args(ctx) + [ + arguments = ctx.attr.args + patch_args + _memory_args(ctx) + ( + ["--cross"] if cross else [] + ) + [ "--execroot-marker", _EXECROOT_MARKER, archive.path, @@ -299,8 +329,11 @@ attribute maps environment variable names to strings that may reference `$(VAR)` make-variables sourced from those toolchains. This mirrors the pattern used by `rules_rust`'s `cargo_build_script`. -The build is guaranteed to occur on an execution platform matching the -constraints of the target platform. +In native mode (exec platform == target platform) the build uses the host +CC toolchain. When the target platform differs, the build enters cross mode: +the CC toolchain of the "target" exec group resolves against a user-registered +cross CC toolchain (e.g., toolchains_llvm). If no cross CC toolchain is found, +analysis fails with a diagnostic naming the required toolchain type. """, attrs = _pep517_whl_attrs | { @@ -318,24 +351,11 @@ constraints of the target platform. }, fragments = ["cpp"], exec_groups = { - # Create an exec group which depends on a toolchain which can only be - # resolved to exec_compatible_with constraints equal to the target. This - # allows us to discover what those constraints need to be. - # - # NATIVE_BUILD_TOOLCHAIN has matching exec_compatible_with and - # target_compatible_with, so this exec group only resolves when the exec - # and target platforms match. Cross-compilation of sdists is intentionally - # unsupported: PEP 517 build backends (setuptools, meson-python, etc.) - # have no standard mechanism for cross-compilation, Python headers for - # the target platform are not readily available, and output wheel tags - # would need to encode the target platform with no upstream tooling - # support. Packages that need cross-compiled native extensions should - # publish pre-built wheels for their target platforms instead. _TARGET_EXEC_GROUP: exec_group( toolchains = [ PY_TOOLCHAIN, - NATIVE_BUILD_TOOLCHAIN, - _CC_TOOLCHAIN_TYPE, + config_common.toolchain_type(NATIVE_BUILD_TOOLCHAIN, mandatory = False), + config_common.toolchain_type(_CC_TOOLCHAIN_TYPE, mandatory = False), ], ), }, From b911ca4f32bcdcbbf5b32d451ad76e21f70b4f38 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 21:36:27 -0600 Subject: [PATCH 003/103] check so arch in e2e --- e2e/cases/uv-deps-650/crossbuild/BUILD.bazel | 53 +++++++++++++++++++ .../uv-deps-650/crossbuild/check_so_arch.sh | 37 +++++++++++++ 2 files changed, 90 insertions(+) create mode 100755 e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh diff --git a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel index 17bce79c7..aacabdf2a 100644 --- a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel +++ b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel @@ -185,3 +185,56 @@ platform_transition_filegroup( srcs = [":geohash_bin"], target_platform = ":arm64_linux", ) + +# ── Verify .so architecture ── + +py_image_layer( + name = "geohash_layers", + binary = ":geohash_bin", +) + +platform_transition_filegroup( + name = "geohash_amd64_layers", + srcs = [":geohash_layers"], + target_platform = ":amd64_linux", +) + +platform_transition_filegroup( + name = "geohash_arm64_layers", + srcs = [":geohash_layers"], + target_platform = ":arm64_linux", +) + +genrule( + name = "_geohash_amd64_so_arch_check", + srcs = [":geohash_amd64_layers"], + outs = ["_geohash_amd64_so_arch.ok"], + cmd = """ +tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep 'geohash_layers.*\\.tar' | head -1) +$(location check_so_arch.sh) $$tar_file 3e00 +touch $@ +""", + tools = [":check_so_arch.sh"], +) + +genrule( + name = "_geohash_arm64_so_arch_check", + srcs = [":geohash_arm64_layers"], + outs = ["_geohash_arm64_so_arch.ok"], + cmd = """ +tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep 'geohash_layers.*\\.tar' | head -1) +$(location check_so_arch.sh) $$tar_file b700 +touch $@ +""", + tools = [":check_so_arch.sh"], +) + +build_test( + name = "geohash_so_arch_amd64_test", + targets = [":_geohash_amd64_so_arch_check"], +) + +build_test( + name = "geohash_so_arch_arm64_test", + targets = [":_geohash_arm64_so_arch_check"], +) diff --git a/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh b/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh new file mode 100755 index 000000000..6b1569373 --- /dev/null +++ b/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# Check that _geohash.so inside a py_image_layer tar is ELF for the expected arch. +# +# Uses only POSIX utilities (tar, od, find) — no Python dependency. +# +# Usage: check_so_arch.sh +# expected_machine_le_hex: ELF e_machine as little-endian hex bytes +# x86_64 (EM_X86_64 = 62 = 0x3e) → "3e00" +# aarch64 (EM_AARCH64 = 183 = 0xb7) → "b700" +set -euo pipefail + +tar_file="${1:?usage: check_so_arch.sh }" +expected="${2:?expected ELF machine as little-endian hex}" + +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT +tar xf "$tar_file" -C "$tmp" 2>/dev/null || true + +so="$(find "$tmp" -name '_geohash*.so' -type f | head -1)" +if [ -z "$so" ]; then + echo "FAIL: no _geohash*.so found in $tar_file" + exit 1 +fi + +magic="$(od -A n -t x1 -N 4 "$so" | tr -d ' ')" +if [ "$magic" != "7f454c46" ]; then + echo "FAIL: $(basename "$so") is not ELF (magic=0x${magic})" + exit 1 +fi + +machine="$(od -A n -t x1 -j 18 -N 2 "$so" | tr -d ' ')" +if [ "$machine" != "$expected" ]; then + echo "FAIL: $(basename "$so") ELF machine=0x${machine} expected=0x${expected}" + exit 1 +fi + +echo "PASS: $(basename "$so") is ELF machine=0x${machine}" From 2e1e751740bb9e5c5f08fc0d99635367fb39c659 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 21:41:36 -0600 Subject: [PATCH 004/103] extract the compiler flags --- uv/private/pep517_whl/BUILD.bazel | 11 ++ uv/private/pep517_whl/build_helper.py | 152 +++++++++++++++++++- uv/private/pep517_whl/cc_layer.bzl | 193 ++++++++++++++++++++++++++ uv/private/pep517_whl/rule.bzl | 38 ++++- 4 files changed, 382 insertions(+), 12 deletions(-) create mode 100644 uv/private/pep517_whl/cc_layer.bzl diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index cf1b9b412..0799ecf67 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -14,6 +14,7 @@ bzl_library( name = "rule", srcs = ["rule.bzl"], deps = [ + ":cc_layer", "//py/private/toolchain:types", "//uv/private:source_built_wheel", "@bazel_lib//lib:resource_sets", @@ -22,6 +23,16 @@ bzl_library( ], ) +bzl_library( + name = "cc_layer", + srcs = ["cc_layer.bzl"], + visibility = ["//uv/private:__subpackages__"], + deps = [ + "@rules_cc//cc:action_names_bzl", + "@rules_cc//cc/common", + ], +) + py_library( name = "memory_monitor", srcs = ["memory_monitor.py"], diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index e42e63f52..245664a52 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -48,6 +48,73 @@ os.execv("{compiler_path}", ["{compiler_path}"] + filtered_args) """ +_IDENTITY_FLAG_PREFIXES = ( + "-target", + "--target", + "--sysroot", + "-isysroot", + "-mmacosx-version-min", +) + +_DROP_LINKER_FLAGS = frozenset({ + "-Wl,--start-group", + "-Wl,--end-group", + "-Wl,--as-needed", + "-Wl,--allow-shlib-undefined", + "-Wl,-O1", + "-Wl,-start_group", + "-Wl,-end_group", + "-bundle", +}) + +_DROP_LINKER_PAIRS = frozenset({ + "-arch", + "-undefined", + "-current_version", + "-compatibility_version", + "-install_name", +}) + +_DROP_LINKER_PREFIXES = ( + "-mmacosx-version-min", +) + +_CROSS_COMPILER_WRAPPER = """#!/usr/bin/env python3 +import os +import sys + +args = sys.argv[1:] +wrapper_flags = {wrapper_flags!r} +drop_exact = {drop_exact!r} +drop_pairs = {drop_pairs!r} +drop_prefixes = {drop_prefixes!r} +lld_path = {lld_path!r} +debug_flag = {debug_flag!r} + +is_link = "-c" not in args +filtered = [] +i = 0 +while i < len(args): + a = args[i] + if a == debug_flag or a in drop_exact or any(a.startswith(p) for p in drop_prefixes): + i += 1 + continue + if a in drop_pairs and i + 1 < len(args): + i += 2 + continue + filtered.append(a) + i += 1 + +if is_link and lld_path: + os.environ.setdefault("PATH", "") + os.environ["PATH"] = os.path.dirname(lld_path) + os.pathsep + os.environ["PATH"] + if "-fuse-ld=lld" not in filtered: + filtered.insert(0, "-fuse-ld=lld") + +real = {compiler_path!r} +os.execv(real, [os.path.basename(real)] + wrapper_flags + filtered) +""" + def _darwin_sysroot() -> Optional[str]: """Return the macOS SDK path, or None if unavailable.""" @@ -127,6 +194,63 @@ def _make_compiler_wrapper( return wrapper +def _get_wrapper_flags(cflags: str) -> list: + """Extract identity flags (-target, --sysroot, -isysroot, ...) from CFLAGS. + + The PEP 517 backend (setuptools, meson-python) may strip these when + constructing its own compile commands. The cross wrapper re-injects + them on every invocation to guarantee the real compiler targets the + correct platform. + """ + parts = shlex.split(cflags) + result = [] + i = 0 + while i < len(parts): + p = parts[i] + if any(p == prefix or p.startswith(prefix + "=") for prefix in _IDENTITY_FLAG_PREFIXES): + result.append(p) + if "=" not in p and i + 1 < len(parts) and not parts[i + 1].startswith("-"): + result.append(parts[i + 1]) + i += 1 + i += 1 + return result + + +def _find_lld(compiler_path: str) -> Optional[str]: + """Locate ld.lld or ld64.lld next to the compiler, if present.""" + d = path.dirname(compiler_path) + if not d: + return None + for name in ("ld.lld", "ld64.lld", "lld"): + candidate = path.join(d, name) + if path.isfile(candidate) and os.access(candidate, os.X_OK): + return candidate + return None + + +def _make_cross_compiler_wrapper( + tmpdir: str, + name: str, + compiler_path: str, + wrapper_flags: list, + lld_path: Optional[str] = None, +) -> str: + wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) + makedirs(path.dirname(wrapper), exist_ok=True) + with open(wrapper, "w") as f: + f.write(_CROSS_COMPILER_WRAPPER.format( + compiler_path=compiler_path, + wrapper_flags=wrapper_flags, + drop_exact=sorted(_DROP_LINKER_FLAGS), + drop_pairs=sorted(_DROP_LINKER_PAIRS), + drop_prefixes=list(_DROP_LINKER_PREFIXES), + lld_path=lld_path, + debug_flag=_DEBUG_FLAG, + )) + chmod(wrapper, 0o755) + return wrapper + + def _override_tool(env: Dict[str, str], key: str, wrapper: str) -> None: current = env.get(key) if not current: @@ -154,7 +278,11 @@ def _absolutize_tool_paths(env: Dict[str, str]) -> None: env[key] = shlex.join(parts) -def _compiler_env(tmpdir: str, execroot_marker: Optional[str] = None) -> Dict[str, str]: +def _compiler_env( + tmpdir: str, + execroot_marker: Optional[str] = None, + cross: bool = False, +) -> Dict[str, str]: env = dict(os.environ) if execroot_marker: execroot = os.getcwd() @@ -190,14 +318,24 @@ def _compiler_env(tmpdir: str, execroot_marker: Optional[str] = None) -> Dict[st if env.pop("ASPECT_RULES_PY_INFER_CXX_COMPANION", None) == "1": cxx_path = _local_cxx_companion(env.get("CXX"), cxx_path) - sysroot = _darwin_sysroot() - - cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot) - cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot) + if cross: + wrapper_flags = _get_wrapper_flags(env.get("CFLAGS", "")) + lld_path = _find_lld(cc_path) + cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path) + cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path) + else: + sysroot = _darwin_sysroot() + cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot) + cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot) env.setdefault("CC", cc) env.setdefault("CXX", cxx) + if cross: + ldshared_flags = env.get("LDSHAREDFLAGS", "") + env["LDSHARED"] = cc + (" " + ldshared_flags if ldshared_flags else "") + env["LDCXXSHARED"] = cxx + (" " + ldshared_flags if ldshared_flags else "") + # MPI builds (e.g. mpi4py) consult $MPICC before searching PATH, so a # plain C compiler here would shadow the real mpicc. Only set it when # a system mpicc exists, wrapped to keep the debug-flag stripping. @@ -279,6 +417,8 @@ def _legacy_metadata_conflicts_with_pyproject(worktree: str) -> bool: PARSER.add_argument("--patch", action="append", default=[], dest="patches", help="Patch file to apply (repeatable)") PARSER.add_argument("--execroot-marker", help="Token in env values to replace with the absolute execroot") PARSER.add_argument("--cross", action="store_true", help="Cross-compilation mode: target platform != exec platform") +PARSER.add_argument("--target-os", default="", help="Target platform OS (linux, darwin, windows)") +PARSER.add_argument("--target-cpu", default="", help="Target platform CPU (x86_64, aarch64, ...)") opts, _ = PARSER.parse_known_args() tmp_root = path.abspath(opts.outdir) + ".tmp" @@ -323,7 +463,7 @@ def _legacy_metadata_conflicts_with_pyproject(worktree: str) -> bool: # and re-point CC/CXX/etc. through wrapper scripts in tmp_root so the # Bazel-supplied workspace-relative compiler paths survive the cwd # change into the worktree. -build_env = _compiler_env(tmp_root, opts.execroot_marker) +build_env = _compiler_env(tmp_root, opts.execroot_marker, cross=opts.cross) if _legacy_metadata_conflicts_with_pyproject(t): print( diff --git a/uv/private/pep517_whl/cc_layer.bzl b/uv/private/pep517_whl/cc_layer.bzl new file mode 100644 index 000000000..74a0da98d --- /dev/null +++ b/uv/private/pep517_whl/cc_layer.bzl @@ -0,0 +1,193 @@ +load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES") +load("@rules_cc//cc/common:cc_common.bzl", "cc_common") + +_EXECROOT_MARKER = "__ASPECT_RULES_PY_EXECROOT__" + +_CC_DISABLED_FEATURES = [ + "thin_lto", + "module_maps", + "fdo_instrument", + "fdo_optimize", + "layering_check", +] + +_PATH_FLAG_PREFIXES = ("-I", "-L", "-isysroot", "-iwithsysroot", "-B") + +CC_LAYER_ATTRS = { + "_os_linux": attr.label(default = "@platforms//os:linux"), + "_os_macos": attr.label(default = "@platforms//os:macos"), + "_os_windows": attr.label(default = "@platforms//os:windows"), + "_cpu_x86_64": attr.label(default = "@platforms//cpu:x86_64"), + "_cpu_aarch64": attr.label(default = "@platforms//cpu:aarch64"), + "_cpu_arm": attr.label(default = "@platforms//cpu:arm"), + "_cpu_x86_32": attr.label(default = "@platforms//cpu:x86_32"), +} + +def _absolutize_flag(flag): + """Prefix execroot-relative paths with the EXECROOT marker. + + The marker is replaced with os.getcwd() at execution time by + build_helper.py's _compiler_env, so paths survive the backend's + chdir into the unpacked sdist worktree. + """ + if not flag: + return flag + if not flag.startswith("-"): + if "/" in flag: + return _EXECROOT_MARKER + "/" + flag + return flag + for pfx in _PATH_FLAG_PREFIXES: + if flag.startswith(pfx) and len(flag) > len(pfx): + rest = flag[len(pfx):] + if rest and not rest.startswith("/") and "/" in rest: + return pfx + _EXECROOT_MARKER + "/" + rest + return flag + +def get_target_platform(ctx): + """Determine target OS and CPU from platform constraints. + + Returns Python-sysconfig-style names: (target_os, target_cpu). + Each may be None if the target platform lacks a recognized constraint. + """ + target_os = None + target_cpu = None + + if ctx.target_platform_has_constraint(ctx.attr._os_linux[platform_common.ConstraintValueInfo]): + target_os = "linux" + elif ctx.target_platform_has_constraint(ctx.attr._os_macos[platform_common.ConstraintValueInfo]): + target_os = "darwin" + elif ctx.target_platform_has_constraint(ctx.attr._os_windows[platform_common.ConstraintValueInfo]): + target_os = "windows" + + if ctx.target_platform_has_constraint(ctx.attr._cpu_x86_64[platform_common.ConstraintValueInfo]): + target_cpu = "x86_64" + elif ctx.target_platform_has_constraint(ctx.attr._cpu_aarch64[platform_common.ConstraintValueInfo]): + target_cpu = "aarch64" + elif ctx.target_platform_has_constraint(ctx.attr._cpu_arm[platform_common.ConstraintValueInfo]): + target_cpu = "arm" + elif ctx.target_platform_has_constraint(ctx.attr._cpu_x86_32[platform_common.ConstraintValueInfo]): + target_cpu = "x86" + + return target_os, target_cpu + +def extract_cc_layer(ctx, cc_toolchain): + """Extract CC toolchain tools, flags, and target platform info. + + Called only in cross-compilation mode. The native path relies on the + existing _cc_toolchain_inputs_and_tools + backend self-discovery. + + Args: + ctx: The rule context. Must include CC_LAYER_ATTRS and + fragments = ["cpp"]. + cc_toolchain: The resolved CcToolchainInfo-like object from + ctx.exec_groups[_TARGET_EXEC_GROUP].toolchains[_CC_TOOLCHAIN_TYPE]. + + Returns: + struct( + cc, cxx, ar — tool execpaths, + cflags, cxxflags — joined compile flags (absolutized), + ldflags — joined executable linker flags (absolutized), + ldshared_flags — joined shared-lib linker flags (absolutized), + ccshared — "-fPIC" or "", + target_os — "linux" | "darwin" | "windows" | None, + target_cpu — "x86_64" | "aarch64" | "arm" | "x86" | None, + ) + """ + feature_configuration = cc_common.configure_features( + ctx = ctx, + cc_toolchain = cc_toolchain, + requested_features = ctx.features, + unsupported_features = ctx.disabled_features + _CC_DISABLED_FEATURES, + ) + + action_map = { + "cc": ACTION_NAMES.c_compile, + "cxx": ACTION_NAMES.cpp_compile, + "ldshared": ACTION_NAMES.cpp_link_dynamic_library, + "ld": ACTION_NAMES.cpp_link_executable, + "ar": ACTION_NAMES.cpp_link_static_library, + } + + tools = {} + for key, action_name in action_map.items(): + if cc_common.action_is_enabled( + feature_configuration = feature_configuration, + action_name = action_name, + ): + tools[key] = cc_common.get_tool_for_action( + feature_configuration = feature_configuration, + action_name = action_name, + ) + + compile_vars = cc_common.create_compile_variables( + feature_configuration = feature_configuration, + cc_toolchain = cc_toolchain, + ) + cxx_vars = cc_common.create_compile_variables( + feature_configuration = feature_configuration, + cc_toolchain = cc_toolchain, + add_legacy_cxx_options = True, + ) + link_shared_vars = cc_common.create_link_variables( + cc_toolchain = cc_toolchain, + feature_configuration = feature_configuration, + is_using_linker = True, + is_linking_dynamic_library = True, + must_keep_debug = False, + ) + link_exe_vars = cc_common.create_link_variables( + cc_toolchain = cc_toolchain, + feature_configuration = feature_configuration, + is_using_linker = True, + is_linking_dynamic_library = False, + must_keep_debug = False, + ) + link_static_vars = cc_common.create_link_variables( + cc_toolchain = cc_toolchain, + feature_configuration = feature_configuration, + is_using_linker = False, + is_linking_dynamic_library = False, + must_keep_debug = False, + ) + + vars_map = { + "cc": compile_vars, + "cxx": cxx_vars, + "ldshared": link_shared_vars, + "ld": link_exe_vars, + "ar": link_static_vars, + } + + flags = {} + for key, action_name in action_map.items(): + if not cc_common.action_is_enabled( + feature_configuration = feature_configuration, + action_name = action_name, + ): + continue + raw = cc_common.get_memory_inefficient_command_line( + feature_configuration = feature_configuration, + action_name = action_name, + variables = vars_map[key], + ) + flags[key] = " ".join([_absolutize_flag(f) for f in raw]) + + needs_pic = cc_common.action_is_enabled( + feature_configuration = feature_configuration, + action_name = ACTION_NAMES.cpp_link_dynamic_library, + ) + + target_os, target_cpu = get_target_platform(ctx) + + return struct( + cc = tools.get("cc"), + cxx = tools.get("cxx"), + ar = tools.get("ar"), + cflags = flags.get("cc", ""), + cxxflags = flags.get("cxx", ""), + ldflags = flags.get("ld", ""), + ldshared_flags = flags.get("ldshared", ""), + ccshared = "-fPIC" if needs_pic else "", + target_os = target_os, + target_cpu = target_cpu, + ) diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index bc189ff53..8af445365 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -10,6 +10,7 @@ load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES") load("@rules_cc//cc/common:cc_common.bzl", "cc_common") load("//py/private/toolchain:types.bzl", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") load("//uv/private:source_built_wheel.bzl", "SourceBuiltWheelInfo") +load(":cc_layer.bzl", "CC_LAYER_ATTRS", "extract_cc_layer") _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") _TARGET_EXEC_GROUP = "target" @@ -192,9 +193,9 @@ def _pep517_native_whl(ctx): eg_toolchains = ctx.exec_groups[_TARGET_EXEC_GROUP].toolchains cross = eg_toolchains[NATIVE_BUILD_TOOLCHAIN] == None - cc_toolchain = eg_toolchains[_CC_TOOLCHAIN_TYPE] + cc_toolchain_raw = eg_toolchains[_CC_TOOLCHAIN_TYPE] - if cc_toolchain == None: + if cc_toolchain_raw == None: if cross: fail( "Cross-compilation of sdist '{}' requires a CC toolchain " + @@ -212,6 +213,10 @@ def _pep517_native_whl(ctx): "via register_toolchains.".format(ctx.attr.src.label), ) + cc_toolchain = cc_toolchain_raw + if hasattr(cc_toolchain, "cc_provider_in_toolchain") and hasattr(cc_toolchain, "cc"): + cc_toolchain = cc_toolchain.cc + env = _common_env(ctx) extra_inputs, known_variables = _collect_toolchain_inputs_and_vars(ctx) @@ -236,7 +241,30 @@ def _pep517_native_whl(ctx): env[_INFER_CXX_COMPANION] = "1" if cross: + cc_layer = extract_cc_layer(ctx, cc_toolchain) env["RULES_PY_CROSS_COMPILE"] = "1" + env["RULES_PY_TARGET_OS"] = cc_layer.target_os or "" + env["RULES_PY_TARGET_CPU"] = cc_layer.target_cpu or "" + if cc_layer.cflags: + env["CFLAGS"] = cc_layer.cflags + if cc_layer.cxxflags: + env["CXXFLAGS"] = cc_layer.cxxflags + if cc_layer.ldflags: + env["LDFLAGS"] = cc_layer.ldflags + if cc_layer.ldshared_flags: + env["LDSHAREDFLAGS"] = cc_layer.ldshared_flags + if cc_layer.ccshared: + env["CFLAGS"] = (env.get("CFLAGS", "") + " " + cc_layer.ccshared).strip() + env["CXXFLAGS"] = (env.get("CXXFLAGS", "") + " " + cc_layer.ccshared).strip() + cross_args = [ + "--cross", + "--target-os", + cc_layer.target_os or "", + "--target-cpu", + cc_layer.target_cpu or "", + ] + else: + cross_args = [] ctx.actions.run( mnemonic = "PySdistCrossBuild" if cross else "PySdistNativeBuild", @@ -246,9 +274,7 @@ def _pep517_native_whl(ctx): ), executable = ctx.executable.tool, toolchain = None, - arguments = ctx.attr.args + patch_args + _memory_args(ctx) + ( - ["--cross"] if cross else [] - ) + [ + arguments = ctx.attr.args + patch_args + _memory_args(ctx) + cross_args + [ "--execroot-marker", _EXECROOT_MARKER, archive.path, @@ -348,7 +374,7 @@ analysis fails with a diagnostic naming the required toolchain type. "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + "configured C++ action tools.", ), - }, + } | CC_LAYER_ATTRS, fragments = ["cpp"], exec_groups = { _TARGET_EXEC_GROUP: exec_group( From 34a96422894595e094c01de73f057dbc5323a135 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 22:18:09 -0600 Subject: [PATCH 005/103] check EXT_SUFFIX and SOABI --- e2e/cases/uv-deps-650/crossbuild/BUILD.bazel | 36 +++++++++++++++++++ .../uv-deps-650/crossbuild/check_so_suffix.sh | 25 +++++++++++++ 2 files changed, 61 insertions(+) create mode 100755 e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh diff --git a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel index aacabdf2a..acaacca7a 100644 --- a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel +++ b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel @@ -238,3 +238,39 @@ build_test( name = "geohash_so_arch_arm64_test", targets = [":_geohash_arm64_so_arch_check"], ) + +# ── Verify .so filename suffix (EXT_SUFFIX / SOABI) ── + +genrule( + name = "_geohash_amd64_so_suffix_check", + srcs = [":geohash_amd64_layers"], + outs = ["_geohash_amd64_so_suffix.ok"], + cmd = """ +tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep 'geohash_layers.*\\.tar' | head -1) +$(location check_so_suffix.sh) $$tar_file cpython-312-x86_64-linux-gnu +touch $@ +""", + tools = [":check_so_suffix.sh"], +) + +genrule( + name = "_geohash_arm64_so_suffix_check", + srcs = [":geohash_arm64_layers"], + outs = ["_geohash_arm64_so_suffix.ok"], + cmd = """ +tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep 'geohash_layers.*\\.tar' | head -1) +$(location check_so_suffix.sh) $$tar_file cpython-312-aarch64-linux-gnu +touch $@ +""", + tools = [":check_so_suffix.sh"], +) + +build_test( + name = "geohash_so_suffix_amd64_test", + targets = [":_geohash_amd64_so_suffix_check"], +) + +build_test( + name = "geohash_so_suffix_arm64_test", + targets = [":_geohash_arm64_so_suffix_check"], +) diff --git a/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh b/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh new file mode 100755 index 000000000..d3df61ed3 --- /dev/null +++ b/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Check that _geohash.so inside a py_image_layer tar has the correct platform +# suffix in its filename — i.e. EXT_SUFFIX and SOABI reflect the target +# platform, not the exec host. +# +# Usage: check_so_suffix.sh +set -euo pipefail + +tar_file="${1:?usage: check_so_suffix.sh }" +expected="${2:?expected suffix substring, e.g. cpython-312-x86_64-linux-gnu}" + +so_name=$(tar tf "$tar_file" | grep '_geohash.*\.so$' | head -1) +if [ -z "$so_name" ]; then + echo "FAIL: no _geohash*.so in tar $tar_file" + exit 1 +fi + +echo ".so: $so_name" + +if ! echo "$so_name" | grep -q "$expected"; then + echo "FAIL: expected suffix '$expected' not found in filename" + exit 1 +fi + +echo "PASS: $so_name contains '$expected'" From 0f6d1fc5b3079a4ada71e7739468242c621ade06 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 22:32:04 -0600 Subject: [PATCH 006/103] modify EXT_SUFFIX and SOABI --- uv/private/pep517_whl/build_helper.py | 12 ++++++- uv/private/pep517_whl/rule.bzl | 47 +++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index 245664a52..ab0962e6a 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -318,13 +318,14 @@ def _compiler_env( if env.pop("ASPECT_RULES_PY_INFER_CXX_COMPANION", None) == "1": cxx_path = _local_cxx_companion(env.get("CXX"), cxx_path) + sysroot = _darwin_sysroot() + if cross: wrapper_flags = _get_wrapper_flags(env.get("CFLAGS", "")) lld_path = _find_lld(cc_path) cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path) cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path) else: - sysroot = _darwin_sysroot() cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot) cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot) @@ -336,6 +337,15 @@ def _compiler_env( env["LDSHARED"] = cc + (" " + ldshared_flags if ldshared_flags else "") env["LDCXXSHARED"] = cxx + (" " + ldshared_flags if ldshared_flags else "") + target_sysconfig = env.get("RULES_PY_TARGET_SYSCONFIGDATA") + if target_sysconfig and path.exists(target_sysconfig): + sysconfig_dir = path.join(tmpdir, ".target_sysconfig") + makedirs(sysconfig_dir, exist_ok=True) + shutil.copy(target_sysconfig, sysconfig_dir) + module_name = path.basename(target_sysconfig)[:-3] + env["_PYTHON_SYSCONFIGDATA_NAME"] = module_name + env["PYTHONPATH"] = sysconfig_dir + pathsep + env.get("PYTHONPATH", "") + # MPI builds (e.g. mpi4py) consult $MPICC before searching PATH, so a # plain C compiler here would shadow the real mpicc. Only set it when # a system mpicc exists, wrapped to keep the debug-flag stripping. diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index 8af445365..afe3be2e6 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -157,6 +157,37 @@ def _cc_toolchain_inputs_and_tools(ctx): infer_cxx = infer_cxx or tools.get("CXX") == tools.get("CC") return files, {key: value for key, value in tools.items() if value}, infer_cxx +_PYTHON_CPU_MAP = { + "x86_64": "x86_64", + "aarch64": "aarch64", + "x86": "i686", + "arm": "arm", +} + +def _find_sysconfigdata(runtime): + """Locate _sysconfigdata*.py inside the target interpreter's file tree.""" + if not runtime or not hasattr(runtime, "interpreter_version_info"): + return None + info = runtime.interpreter_version_info + prefix = "lib/python{}.{}".format(info.major, info.minor) + for f in runtime.files.to_list(): + if f.basename.startswith("_sysconfigdata") and f.basename.endswith(".py") and prefix in f.path: + return f + return None + +def _derive_python_host_platform(target_os, target_cpu): + """Derive _PYTHON_HOST_PLATFORM from target platform constraints. + + Linux: libc does not affect the platform string — always linux-{cpu}. + macOS: uses arm64 (not aarch64) and requires a version component. + """ + if target_os == "linux": + return "linux-" + _PYTHON_CPU_MAP.get(target_cpu, target_cpu) + if target_os == "darwin": + cpu = "arm64" if target_cpu == "aarch64" else target_cpu + return "macosx-11.0-" + cpu + return None + def _pep517_whl(ctx): archive = ctx.file.src wheel_dir = ctx.actions.declare_directory("whl") @@ -263,6 +294,19 @@ def _pep517_native_whl(ctx): "--target-cpu", cc_layer.target_cpu or "", ] + + py_toolchain = ctx.toolchains[PY_TOOLCHAIN] + if py_toolchain != None: + runtime = getattr(py_toolchain, "py3_runtime", None) + if runtime: + sysconfig_file = _find_sysconfigdata(runtime) + if sysconfig_file: + extra_inputs.append(depset([sysconfig_file])) + env["RULES_PY_TARGET_SYSCONFIGDATA"] = sysconfig_file.path + + host_platform = _derive_python_host_platform(cc_layer.target_os, cc_layer.target_cpu) + if host_platform: + env["_PYTHON_HOST_PLATFORM"] = host_platform else: cross_args = [] @@ -376,6 +420,9 @@ analysis fails with a diagnostic naming the required toolchain type. ), } | CC_LAYER_ATTRS, fragments = ["cpp"], + toolchains = [ + config_common.toolchain_type(PY_TOOLCHAIN, mandatory = False), + ], exec_groups = { _TARGET_EXEC_GROUP: exec_group( toolchains = [ From a776291919b378ec55e0e158874540e9a29c7ea1 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 23:19:13 -0600 Subject: [PATCH 007/103] adding cffi as default build dependency to break the build, since this package do not have py3-none-any --- e2e/cases/uv-deps-650/crossbuild/BUILD.bazel | 2 + .../uv-deps-650/crossbuild/pyproject.toml | 1 + e2e/cases/uv-deps-650/crossbuild/uv.lock | 109 ++++++++++++++++++ e2e/cases/uv-deps-650/setup.MODULE.bazel | 1 + 4 files changed, 113 insertions(+) diff --git a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel index acaacca7a..e68e771c2 100644 --- a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel +++ b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel @@ -160,6 +160,8 @@ build_test( targets = [ ":amd64_layers", ":arm64_layers", + ":geohash_amd64_layers", + ":geohash_arm64_layers", ], ) diff --git a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml b/e2e/cases/uv-deps-650/crossbuild/pyproject.toml index f110fdf36..d6e6ed0c0 100644 --- a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml +++ b/e2e/cases/uv-deps-650/crossbuild/pyproject.toml @@ -4,6 +4,7 @@ version = "0.0.0" requires-python = ">=3.11" authors = [] dependencies = [ + "cffi", "psycopg2-binary", "python-geohash==0.8.5", "setuptools", diff --git a/e2e/cases/uv-deps-650/crossbuild/uv.lock b/e2e/cases/uv-deps-650/crossbuild/uv.lock index 4ac42a4fe..85263a4e5 100644 --- a/e2e/cases/uv-deps-650/crossbuild/uv.lock +++ b/e2e/cases/uv-deps-650/crossbuild/uv.lock @@ -16,6 +16,104 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl", hash = "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596", size = 24141, upload-time = "2026-01-08T16:41:46.453Z" }, ] +[[package]] +name = "cffi" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/67/85c89a59ba36a671e79638f44d466749f08179266a57e4f2ffdf92174072/cffi-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc", size = 183845, upload-time = "2026-07-06T21:32:26.32Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dd/e3b0baa2d3d6a857ac72b7efbf18e32e487c9cdafcc13049ad765495b15e/cffi-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7", size = 184186, upload-time = "2026-07-06T21:32:28.025Z" }, + { url = "https://files.pythonhosted.org/packages/65/68/9f3ef890cf3c6ab97bd531c5677f67613d302165d16f8142b2811782a614/cffi-2.1.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93", size = 211892, upload-time = "2026-07-06T21:32:29.565Z" }, + { url = "https://files.pythonhosted.org/packages/22/d7/1a74539db16d8bfd839ff1515948948efbb162e574650fd3d846896eea95/cffi-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2", size = 218793, upload-time = "2026-07-06T21:32:30.951Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d1/9a5b7169499e8e8d8e636de70b97ac7c9447104d2ff1a2cd94790cea5162/cffi-2.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c", size = 205737, upload-time = "2026-07-06T21:32:32.216Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b0/e131a9c41f10607926278453d9596163594fe1c4ebc46efe3b5e5b34eb84/cffi-2.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f", size = 204909, upload-time = "2026-07-06T21:32:33.655Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d2/4398416cd699b35167947c6e22aca52c47e69ad5695073c9f1f2c52e04aa/cffi-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565", size = 217883, upload-time = "2026-07-06T21:32:35.173Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a5/d4fe77b589e5e82d43ebc809bf2e6474afe8e48e32ea050b9357645b6471/cffi-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c", size = 221251, upload-time = "2026-07-06T21:32:36.527Z" }, + { url = "https://files.pythonhosted.org/packages/22/f0/a2fc43084c0433caf7f461bccc013e28f848d04ee1c5ed7fce71423cf4d9/cffi-2.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02", size = 214250, upload-time = "2026-07-06T21:32:37.852Z" }, + { url = "https://files.pythonhosted.org/packages/04/8c/b925975448cf20634a9fbd5efceb807219db452653648d2897c0989cab2d/cffi-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e", size = 219441, upload-time = "2026-07-06T21:32:39.146Z" }, + { url = "https://files.pythonhosted.org/packages/eb/da/5c4918a2d61d86fa927d716cb3d8e4626ef8dc8f605a599d32f33897f59a/cffi-2.1.0-cp311-cp311-win32.whl", hash = "sha256:64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479", size = 174496, upload-time = "2026-07-06T21:32:40.467Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c8/6c2de1d55cf35ef8b92885d5ef280790f0fb9634d87ea1cc315176aecd61/cffi-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458", size = 185113, upload-time = "2026-07-06T21:32:41.761Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4e/e8d7cb5783f1841a3c8fb3a7735838d7484d08ec08c9f984b14cac1ac0e9/cffi-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d", size = 179927, upload-time = "2026-07-06T21:32:42.961Z" }, + { url = "https://files.pythonhosted.org/packages/1e/85/990925db5df586ec90beb97529c853497e7f85ba0234830447faf41c3057/cffi-2.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f", size = 184829, upload-time = "2026-07-06T21:32:44.324Z" }, + { url = "https://files.pythonhosted.org/packages/4b/92/e7bb136ad6b5352603732cf907ef862ca103f20f2031c1735a46300c20c9/cffi-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde", size = 184728, upload-time = "2026-07-06T21:32:45.683Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d", size = 214815, upload-time = "2026-07-06T21:32:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7", size = 222429, upload-time = "2026-07-06T21:32:49.848Z" }, + { url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b", size = 210315, upload-time = "2026-07-06T21:32:51.221Z" }, + { url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7", size = 208859, upload-time = "2026-07-06T21:32:52.512Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66", size = 221844, upload-time = "2026-07-06T21:32:53.704Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe", size = 225287, upload-time = "2026-07-06T21:32:54.907Z" }, + { url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b", size = 223681, upload-time = "2026-07-06T21:32:56.329Z" }, + { url = "https://files.pythonhosted.org/packages/b0/80/c138990aa2a70b1a269f6e06348729836d733d6f970867943f61d367f8cc/cffi-2.1.0-cp312-cp312-win32.whl", hash = "sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a", size = 175269, upload-time = "2026-07-06T21:32:57.777Z" }, + { url = "https://files.pythonhosted.org/packages/a8/eb/f636456ff21a83fc13c032b58cc5dde061691546ac79efa284b2989b7982/cffi-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384", size = 185881, upload-time = "2026-07-06T21:32:59.253Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/400ea43e721727dca8a65c4521390e9196757caba4a45643acb2b63271b8/cffi-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6", size = 180088, upload-time = "2026-07-06T21:33:02.278Z" }, + { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, + { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795, upload-time = "2026-07-06T21:33:06.699Z" }, + { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746, upload-time = "2026-07-06T21:33:08.071Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, + { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, + { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, + { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, + { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248, upload-time = "2026-07-06T21:33:19.799Z" }, + { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717, upload-time = "2026-07-06T21:33:21.47Z" }, + { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114, upload-time = "2026-07-06T21:33:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a", size = 194142, upload-time = "2026-07-06T21:33:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3", size = 196819, upload-time = "2026-07-06T21:33:25.007Z" }, + { url = "https://files.pythonhosted.org/packages/20/71/7c8372d30e42415602ed9f268f7cfd66f1b855fed881ecd168bcb45dbc0b/cffi-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d", size = 184965, upload-time = "2026-07-06T21:33:26.605Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5c/584e626835f0375c928176c04137c96927165cb8733cdb3150ec04e5ee5e/cffi-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac", size = 184952, upload-time = "2026-07-06T21:33:27.823Z" }, + { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6", size = 222353, upload-time = "2026-07-06T21:33:29.178Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913", size = 210051, upload-time = "2026-07-06T21:33:30.534Z" }, + { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d", size = 208630, upload-time = "2026-07-06T21:33:31.753Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5", size = 221593, upload-time = "2026-07-06T21:33:33.044Z" }, + { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce", size = 225146, upload-time = "2026-07-06T21:33:34.224Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326", size = 223240, upload-time = "2026-07-06T21:33:35.57Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/ade5ce9863a57992a6ea3d0d10d7e29b8749fc127204b3d493d667b2815f/cffi-2.1.0-cp314-cp314-win32.whl", hash = "sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd", size = 177723, upload-time = "2026-07-06T21:33:51.626Z" }, + { url = "https://files.pythonhosted.org/packages/41/de/92b9eeed4ae4a21d6fd9b2a2c8505cbed573299902ea73981cc13f7ff62c/cffi-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb", size = 187937, upload-time = "2026-07-06T21:33:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/cc6ae6c2913a03aab8898eee57963cf1035b8df5872ed8b9115fcc7e2be8/cffi-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804", size = 183001, upload-time = "2026-07-06T21:33:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/14/f0/134c00ce0779ec86dea2aa1aac69339c2741a8045072676763512363a2ea/cffi-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714", size = 188538, upload-time = "2026-07-06T21:33:36.792Z" }, + { url = "https://files.pythonhosted.org/packages/50/d8/3b86aba791cb610d24e8a3e1b2cd529e71fa15096b04e4d4e360049d4a4c/cffi-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376", size = 188230, upload-time = "2026-07-06T21:33:38.011Z" }, + { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98", size = 223899, upload-time = "2026-07-06T21:33:39.514Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13", size = 211652, upload-time = "2026-07-06T21:33:40.851Z" }, + { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d", size = 210755, upload-time = "2026-07-06T21:33:42.183Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056", size = 223933, upload-time = "2026-07-06T21:33:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4", size = 226749, upload-time = "2026-07-06T21:33:45.046Z" }, + { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94", size = 225703, upload-time = "2026-07-06T21:33:46.374Z" }, + { url = "https://files.pythonhosted.org/packages/dc/78/aa01ac599a8a4322533d45a1f9bc93b338276d2d59dabbe7c6d92a775c81/cffi-2.1.0-cp314-cp314t-win32.whl", hash = "sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76", size = 182857, upload-time = "2026-07-06T21:33:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/d00496b22de4d4228f32dde94ad996f350c8aad676d63bcca0743c8dea4d/cffi-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5", size = 194065, upload-time = "2026-07-06T21:33:48.953Z" }, + { url = "https://files.pythonhosted.org/packages/d5/dd/0c7dbf815a579ff005008a2d815a55d6bb047c349eef536d9dc53d3f0a8d/cffi-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8", size = 186404, upload-time = "2026-07-06T21:33:50.309Z" }, + { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c", size = 194121, upload-time = "2026-07-06T21:33:56.109Z" }, + { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001", size = 196820, upload-time = "2026-07-06T21:33:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/ed/da/4bbe583a3b3a5c8c60892124fe17f3fa3656523faf0d3484eae90f091853/cffi-2.1.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3", size = 184936, upload-time = "2026-07-06T21:33:58.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4b/1f4c36ab273980d7aa75bb126ea4f8971f24a96108acad3a0a084028c57b/cffi-2.1.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc", size = 185045, upload-time = "2026-07-06T21:34:00.085Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699", size = 222342, upload-time = "2026-07-06T21:34:01.814Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022", size = 210073, upload-time = "2026-07-06T21:34:03.255Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0", size = 208551, upload-time = "2026-07-06T21:34:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1", size = 221649, upload-time = "2026-07-06T21:34:06.157Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28", size = 225203, upload-time = "2026-07-06T21:34:07.489Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629", size = 223263, upload-time = "2026-07-06T21:34:08.712Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d8/772b8259bf75749adffb1c546828978381fb516f60cf701f6c83daf60c85/cffi-2.1.0-cp315-cp315-win32.whl", hash = "sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6", size = 177696, upload-time = "2026-07-06T21:34:26.355Z" }, + { url = "https://files.pythonhosted.org/packages/2f/dd/afa2191fc6d57fedd26e5844a2fe2fcc0bbfa00961bbaa5a41e4921e7cca/cffi-2.1.0-cp315-cp315-win_amd64.whl", hash = "sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853", size = 187914, upload-time = "2026-07-06T21:34:27.58Z" }, + { url = "https://files.pythonhosted.org/packages/05/ef/6cd4f8c671517162379dc79cfae5aea9106bc38abb89628d5c16adf6a838/cffi-2.1.0-cp315-cp315-win_arm64.whl", hash = "sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda", size = 183004, upload-time = "2026-07-06T21:34:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/11/b6/12fc55092817a5faa26fb8c40c7f9d662e11a46ee248c137aafc42517d92/cffi-2.1.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc", size = 188378, upload-time = "2026-07-06T21:34:09.926Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2e/cdac88979f295fde5daa69622c7d2111e56e7ceb94f211357fbe452339e4/cffi-2.1.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca", size = 188319, upload-time = "2026-07-06T21:34:11.101Z" }, + { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d", size = 223904, upload-time = "2026-07-06T21:34:12.606Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8", size = 211554, upload-time = "2026-07-06T21:34:13.987Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd", size = 210795, upload-time = "2026-07-06T21:34:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f", size = 223843, upload-time = "2026-07-06T21:34:17.509Z" }, + { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc", size = 226773, upload-time = "2026-07-06T21:34:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9", size = 225719, upload-time = "2026-07-06T21:34:20.576Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/e536c528bc8057496c360c0978559a2dc45653f89dd6151078aa7d8fca1a/cffi-2.1.0-cp315-cp315t-win32.whl", hash = "sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b", size = 182760, upload-time = "2026-07-06T21:34:22.059Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0b/0ffe8b82d3875bced5fa1e7986a7a46b748262a40ab7f60b475eb9fb1bb3/cffi-2.1.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5", size = 193769, upload-time = "2026-07-06T21:34:23.589Z" }, + { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", hash = "sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210", size = 186405, upload-time = "2026-07-06T21:34:24.857Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -31,6 +129,7 @@ version = "0.0.0" source = { virtual = "." } dependencies = [ { name = "build" }, + { name = "cffi" }, { name = "psycopg2-binary" }, { name = "python-geohash" }, { name = "setuptools" }, @@ -39,6 +138,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "build" }, + { name = "cffi" }, { name = "psycopg2-binary" }, { name = "python-geohash", specifier = "==0.8.5" }, { name = "setuptools" }, @@ -105,6 +205,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/36/9c0c326fe3a4227953dfb29f5d0c8ae3b8eb8c1cd2967aa569f50cb3c61f/psycopg2_binary-2.9.11-cp314-cp314-win_amd64.whl", hash = "sha256:4012c9c954dfaccd28f94e84ab9f94e12df76b4afb22331b1f0d3154893a6316", size = 2803913, upload-time = "2025-10-10T11:13:57.058Z" }, ] +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + [[package]] name = "pyproject-hooks" version = "1.2.0" diff --git a/e2e/cases/uv-deps-650/setup.MODULE.bazel b/e2e/cases/uv-deps-650/setup.MODULE.bazel index 1cab41c3c..6326b4590 100644 --- a/e2e/cases/uv-deps-650/setup.MODULE.bazel +++ b/e2e/cases/uv-deps-650/setup.MODULE.bazel @@ -19,6 +19,7 @@ uv.project( uv.project( default_build_dependencies = [ "build", + "cffi", "setuptools", ], hub_name = "pypi_uv_deps_650", From 8fe1b2ae956a2763e6f8ce525beb18d0a7bf93e5 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 23:49:58 -0600 Subject: [PATCH 008/103] improve selection wheel with exec_transition --- uv/private/pep517_whl/BUILD.bazel | 7 +++ uv/private/pep517_whl/exec_transition.bzl | 53 +++++++++++++++++++++++ uv/private/pep517_whl/rule.bzl | 11 ++++- 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 uv/private/pep517_whl/exec_transition.bzl diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 0799ecf67..564cf7374 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -15,6 +15,7 @@ bzl_library( srcs = ["rule.bzl"], deps = [ ":cc_layer", + ":exec_transition", "//py/private/toolchain:types", "//uv/private:source_built_wheel", "@bazel_lib//lib:resource_sets", @@ -33,6 +34,12 @@ bzl_library( ], ) +bzl_library( + name = "exec_transition", + srcs = ["exec_transition.bzl"], + visibility = ["//uv/private:__subpackages__"], +) + py_library( name = "memory_monitor", srcs = ["memory_monitor.py"], diff --git a/uv/private/pep517_whl/exec_transition.bzl b/uv/private/pep517_whl/exec_transition.bzl new file mode 100644 index 000000000..f6658814b --- /dev/null +++ b/uv/private/pep517_whl/exec_transition.bzl @@ -0,0 +1,53 @@ +load("@aspect_rules_py_uv_host//:defs.bzl", "CURRENT_PLATFORM_LIBC", "CURRENT_PLATFORM_VERSION") + +_PLATFORM_LIBC_FLAG = str(Label("@aspect_rules_py//uv/private/constraints/platform:platform_libc")) +_PLATFORM_VERSION_FLAG = str(Label("@aspect_rules_py//uv/private/constraints/platform:platform_version")) + +_HOST_OPTION_INPUTS = [ + "//command_line_option:platforms", + "//command_line_option:host_platform", + "//command_line_option:host_cpu", + "//command_line_option:host_compilation_mode", + "//command_line_option:host_copt", + "//command_line_option:host_cxxopt", + "//command_line_option:host_linkopt", + "//command_line_option:host_action_env", + "//command_line_option:host_features", +] + +_HOST_OPTION_OUTPUTS = [ + "//command_line_option:platforms", + "//command_line_option:cpu", + "//command_line_option:compilation_mode", + "//command_line_option:copt", + "//command_line_option:cxxopt", + "//command_line_option:linkopt", + "//command_line_option:action_env", + "//command_line_option:features", +] + +def _exec_transition_impl(settings, _attr): + if settings["//command_line_option:platforms"] == [settings["//command_line_option:host_platform"]]: + return {} + + return { + "//command_line_option:platforms": [settings["//command_line_option:host_platform"]], + "//command_line_option:cpu": settings["//command_line_option:host_cpu"], + "//command_line_option:compilation_mode": settings["//command_line_option:host_compilation_mode"], + "//command_line_option:copt": settings["//command_line_option:host_copt"], + "//command_line_option:cxxopt": settings["//command_line_option:host_cxxopt"], + "//command_line_option:linkopt": settings["//command_line_option:host_linkopt"], + "//command_line_option:action_env": settings["//command_line_option:host_action_env"], + "//command_line_option:features": settings["//command_line_option:host_features"], + _PLATFORM_LIBC_FLAG: CURRENT_PLATFORM_LIBC, + _PLATFORM_VERSION_FLAG: CURRENT_PLATFORM_VERSION, + } + +exec_transition = transition( + implementation = _exec_transition_impl, + inputs = _HOST_OPTION_INPUTS, + outputs = _HOST_OPTION_OUTPUTS + [ + _PLATFORM_LIBC_FLAG, + _PLATFORM_VERSION_FLAG, + ], +) diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index afe3be2e6..94c578057 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -11,6 +11,7 @@ load("@rules_cc//cc/common:cc_common.bzl", "cc_common") load("//py/private/toolchain:types.bzl", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") load("//uv/private:source_built_wheel.bzl", "SourceBuiltWheelInfo") load(":cc_layer.bzl", "CC_LAYER_ATTRS", "extract_cc_layer") +load(":exec_transition.bzl", "exec_transition") _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") _TARGET_EXEC_GROUP = "target" @@ -310,6 +311,10 @@ def _pep517_native_whl(ctx): else: cross_args = [] + _tool = ctx.attr.tool + if type(_tool) == "list": + _tool = _tool[0] + ctx.actions.run( mnemonic = "PySdistCrossBuild" if cross else "PySdistNativeBuild", progress_message = "{} source compiling {} to a whl".format( @@ -328,7 +333,7 @@ def _pep517_native_whl(ctx): [archive] + patch_inputs, transitive = extra_inputs, ), - tools = [ctx.attr.tool[DefaultInfo].files_to_run], + tools = [_tool[DefaultInfo].files_to_run], outputs = [wheel_dir], env = env, exec_group = _TARGET_EXEC_GROUP, @@ -418,6 +423,10 @@ analysis fails with a diagnostic naming the required toolchain type. "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + "configured C++ action tools.", ), + "tool": attr.label(executable = True, cfg = exec_transition), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), } | CC_LAYER_ATTRS, fragments = ["cpp"], toolchains = [ From d41150eafbf90e201b80b59a80b519b8e3895b67 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 23 Jul 2026 00:07:23 -0600 Subject: [PATCH 009/103] validate wheel platform --- uv/private/pep517_whl/build_helper.py | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index ab0962e6a..a1b5894fb 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -418,6 +418,58 @@ def _legacy_metadata_conflicts_with_pyproject(worktree: str) -> bool: ) ) +_WHEEL_OS_MAP = {"linux": "linux", "darwin": "macosx", "windows": "win"} + + +def _expected_cpu_in_tag(target_os: str, target_cpu: str) -> str: + if target_os == "darwin": + return {"aarch64": "arm64", "x86_64": "x86_64"}.get(target_cpu, target_cpu) + return {"x86_64": "x86_64", "aarch64": "aarch64", "x86": "i686", "arm": "armv7l"}.get(target_cpu, target_cpu) + + +def _validate_wheel_platform(wheel_filename: str) -> None: + target_os = os.environ.get("RULES_PY_TARGET_OS", "") + target_cpu = os.environ.get("RULES_PY_TARGET_CPU", "") + if not target_os or not target_cpu: + return + + platform_tag = wheel_filename.rsplit("-", 1)[-1].rsplit(".", 1)[0].lower() + + expected_os = _WHEEL_OS_MAP.get(target_os, target_os) + expected_cpu = _expected_cpu_in_tag(target_os, target_cpu) + + host_os = _platform.system().lower() + host_wheel_os = _WHEEL_OS_MAP.get(host_os, host_os) + + if target_os != host_os and host_wheel_os in platform_tag: + print( + "Error: wheel platform tag '{}' contains exec host OS '{}' instead of " + "target OS '{}'. The target sysconfig override may have failed.".format( + platform_tag, host_wheel_os, expected_os, + ), + file=sys.stderr, + ) + exit(1) + + if expected_os not in platform_tag: + print( + "Error: wheel platform tag '{}' does not contain target OS '{}'.".format( + platform_tag, expected_os, + ), + file=sys.stderr, + ) + exit(1) + + if expected_cpu not in platform_tag: + print( + "Error: wheel platform tag '{}' does not contain target CPU '{}'.".format( + platform_tag, expected_cpu, + ), + file=sys.stderr, + ) + exit(1) + + PARSER = ArgumentParser() PARSER.add_argument("srcarchive") PARSER.add_argument("outdir") @@ -551,3 +603,6 @@ def _legacy_metadata_conflicts_with_pyproject(worktree: str) -> bool: if opts.validate_anyarch and not inventory[0].endswith("-none-any.whl"): print("Error: Target was anyarch but built a none-any wheel!\nSee {} for the sandbox".format(t), file=sys.stderr) exit(1) + +if opts.cross and not inventory[0].endswith("-none-any.whl"): + _validate_wheel_platform(inventory[0]) From 73cf6a340ebe92fe4f368157062e0aff05c41214 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 23 Jul 2026 00:10:25 -0600 Subject: [PATCH 010/103] linter errors --- uv/private/pep517_whl/build_helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index a1b5894fb..afc641e99 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -194,7 +194,7 @@ def _make_compiler_wrapper( return wrapper -def _get_wrapper_flags(cflags: str) -> list: +def _get_wrapper_flags(cflags: str) -> list[str]: """Extract identity flags (-target, --sysroot, -isysroot, ...) from CFLAGS. The PEP 517 backend (setuptools, meson-python) may strip these when @@ -232,7 +232,7 @@ def _make_cross_compiler_wrapper( tmpdir: str, name: str, compiler_path: str, - wrapper_flags: list, + wrapper_flags: list[str], lld_path: Optional[str] = None, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) From 17d7552f797b3601722acb10333b4785f4d5f1fb Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 23 Jul 2026 00:24:55 -0600 Subject: [PATCH 011/103] revert exec transition --- .../uv-deps-650/crossbuild/pyproject.toml | 1 - e2e/cases/uv-deps-650/crossbuild/uv.lock | 109 ------------------ e2e/cases/uv-deps-650/setup.MODULE.bazel | 1 - uv/private/pep517_whl/BUILD.bazel | 7 -- uv/private/pep517_whl/exec_transition.bzl | 53 --------- uv/private/pep517_whl/rule.bzl | 8 +- 6 files changed, 1 insertion(+), 178 deletions(-) delete mode 100644 uv/private/pep517_whl/exec_transition.bzl diff --git a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml b/e2e/cases/uv-deps-650/crossbuild/pyproject.toml index d6e6ed0c0..f110fdf36 100644 --- a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml +++ b/e2e/cases/uv-deps-650/crossbuild/pyproject.toml @@ -4,7 +4,6 @@ version = "0.0.0" requires-python = ">=3.11" authors = [] dependencies = [ - "cffi", "psycopg2-binary", "python-geohash==0.8.5", "setuptools", diff --git a/e2e/cases/uv-deps-650/crossbuild/uv.lock b/e2e/cases/uv-deps-650/crossbuild/uv.lock index 85263a4e5..4ac42a4fe 100644 --- a/e2e/cases/uv-deps-650/crossbuild/uv.lock +++ b/e2e/cases/uv-deps-650/crossbuild/uv.lock @@ -16,104 +16,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl", hash = "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596", size = 24141, upload-time = "2026-01-08T16:41:46.453Z" }, ] -[[package]] -name = "cffi" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/67/85c89a59ba36a671e79638f44d466749f08179266a57e4f2ffdf92174072/cffi-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc", size = 183845, upload-time = "2026-07-06T21:32:26.32Z" }, - { url = "https://files.pythonhosted.org/packages/ea/dd/e3b0baa2d3d6a857ac72b7efbf18e32e487c9cdafcc13049ad765495b15e/cffi-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7", size = 184186, upload-time = "2026-07-06T21:32:28.025Z" }, - { url = "https://files.pythonhosted.org/packages/65/68/9f3ef890cf3c6ab97bd531c5677f67613d302165d16f8142b2811782a614/cffi-2.1.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93", size = 211892, upload-time = "2026-07-06T21:32:29.565Z" }, - { url = "https://files.pythonhosted.org/packages/22/d7/1a74539db16d8bfd839ff1515948948efbb162e574650fd3d846896eea95/cffi-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2", size = 218793, upload-time = "2026-07-06T21:32:30.951Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d1/9a5b7169499e8e8d8e636de70b97ac7c9447104d2ff1a2cd94790cea5162/cffi-2.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c", size = 205737, upload-time = "2026-07-06T21:32:32.216Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b0/e131a9c41f10607926278453d9596163594fe1c4ebc46efe3b5e5b34eb84/cffi-2.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f", size = 204909, upload-time = "2026-07-06T21:32:33.655Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d2/4398416cd699b35167947c6e22aca52c47e69ad5695073c9f1f2c52e04aa/cffi-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565", size = 217883, upload-time = "2026-07-06T21:32:35.173Z" }, - { url = "https://files.pythonhosted.org/packages/a2/a5/d4fe77b589e5e82d43ebc809bf2e6474afe8e48e32ea050b9357645b6471/cffi-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c", size = 221251, upload-time = "2026-07-06T21:32:36.527Z" }, - { url = "https://files.pythonhosted.org/packages/22/f0/a2fc43084c0433caf7f461bccc013e28f848d04ee1c5ed7fce71423cf4d9/cffi-2.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02", size = 214250, upload-time = "2026-07-06T21:32:37.852Z" }, - { url = "https://files.pythonhosted.org/packages/04/8c/b925975448cf20634a9fbd5efceb807219db452653648d2897c0989cab2d/cffi-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e", size = 219441, upload-time = "2026-07-06T21:32:39.146Z" }, - { url = "https://files.pythonhosted.org/packages/eb/da/5c4918a2d61d86fa927d716cb3d8e4626ef8dc8f605a599d32f33897f59a/cffi-2.1.0-cp311-cp311-win32.whl", hash = "sha256:64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479", size = 174496, upload-time = "2026-07-06T21:32:40.467Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c8/6c2de1d55cf35ef8b92885d5ef280790f0fb9634d87ea1cc315176aecd61/cffi-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458", size = 185113, upload-time = "2026-07-06T21:32:41.761Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4e/e8d7cb5783f1841a3c8fb3a7735838d7484d08ec08c9f984b14cac1ac0e9/cffi-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d", size = 179927, upload-time = "2026-07-06T21:32:42.961Z" }, - { url = "https://files.pythonhosted.org/packages/1e/85/990925db5df586ec90beb97529c853497e7f85ba0234830447faf41c3057/cffi-2.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f", size = 184829, upload-time = "2026-07-06T21:32:44.324Z" }, - { url = "https://files.pythonhosted.org/packages/4b/92/e7bb136ad6b5352603732cf907ef862ca103f20f2031c1735a46300c20c9/cffi-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde", size = 184728, upload-time = "2026-07-06T21:32:45.683Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d", size = 214815, upload-time = "2026-07-06T21:32:48.557Z" }, - { url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7", size = 222429, upload-time = "2026-07-06T21:32:49.848Z" }, - { url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b", size = 210315, upload-time = "2026-07-06T21:32:51.221Z" }, - { url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7", size = 208859, upload-time = "2026-07-06T21:32:52.512Z" }, - { url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66", size = 221844, upload-time = "2026-07-06T21:32:53.704Z" }, - { url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe", size = 225287, upload-time = "2026-07-06T21:32:54.907Z" }, - { url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b", size = 223681, upload-time = "2026-07-06T21:32:56.329Z" }, - { url = "https://files.pythonhosted.org/packages/b0/80/c138990aa2a70b1a269f6e06348729836d733d6f970867943f61d367f8cc/cffi-2.1.0-cp312-cp312-win32.whl", hash = "sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a", size = 175269, upload-time = "2026-07-06T21:32:57.777Z" }, - { url = "https://files.pythonhosted.org/packages/a8/eb/f636456ff21a83fc13c032b58cc5dde061691546ac79efa284b2989b7982/cffi-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384", size = 185881, upload-time = "2026-07-06T21:32:59.253Z" }, - { url = "https://files.pythonhosted.org/packages/dd/2c/400ea43e721727dca8a65c4521390e9196757caba4a45643acb2b63271b8/cffi-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6", size = 180088, upload-time = "2026-07-06T21:33:02.278Z" }, - { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, - { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795, upload-time = "2026-07-06T21:33:06.699Z" }, - { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746, upload-time = "2026-07-06T21:33:08.071Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, - { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, - { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, - { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, - { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, - { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, - { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248, upload-time = "2026-07-06T21:33:19.799Z" }, - { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717, upload-time = "2026-07-06T21:33:21.47Z" }, - { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114, upload-time = "2026-07-06T21:33:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a", size = 194142, upload-time = "2026-07-06T21:33:23.657Z" }, - { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3", size = 196819, upload-time = "2026-07-06T21:33:25.007Z" }, - { url = "https://files.pythonhosted.org/packages/20/71/7c8372d30e42415602ed9f268f7cfd66f1b855fed881ecd168bcb45dbc0b/cffi-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d", size = 184965, upload-time = "2026-07-06T21:33:26.605Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5c/584e626835f0375c928176c04137c96927165cb8733cdb3150ec04e5ee5e/cffi-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac", size = 184952, upload-time = "2026-07-06T21:33:27.823Z" }, - { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6", size = 222353, upload-time = "2026-07-06T21:33:29.178Z" }, - { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913", size = 210051, upload-time = "2026-07-06T21:33:30.534Z" }, - { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d", size = 208630, upload-time = "2026-07-06T21:33:31.753Z" }, - { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5", size = 221593, upload-time = "2026-07-06T21:33:33.044Z" }, - { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce", size = 225146, upload-time = "2026-07-06T21:33:34.224Z" }, - { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326", size = 223240, upload-time = "2026-07-06T21:33:35.57Z" }, - { url = "https://files.pythonhosted.org/packages/0f/6f/ade5ce9863a57992a6ea3d0d10d7e29b8749fc127204b3d493d667b2815f/cffi-2.1.0-cp314-cp314-win32.whl", hash = "sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd", size = 177723, upload-time = "2026-07-06T21:33:51.626Z" }, - { url = "https://files.pythonhosted.org/packages/41/de/92b9eeed4ae4a21d6fd9b2a2c8505cbed573299902ea73981cc13f7ff62c/cffi-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb", size = 187937, upload-time = "2026-07-06T21:33:53.403Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1a/cc6ae6c2913a03aab8898eee57963cf1035b8df5872ed8b9115fcc7e2be8/cffi-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804", size = 183001, upload-time = "2026-07-06T21:33:54.74Z" }, - { url = "https://files.pythonhosted.org/packages/14/f0/134c00ce0779ec86dea2aa1aac69339c2741a8045072676763512363a2ea/cffi-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714", size = 188538, upload-time = "2026-07-06T21:33:36.792Z" }, - { url = "https://files.pythonhosted.org/packages/50/d8/3b86aba791cb610d24e8a3e1b2cd529e71fa15096b04e4d4e360049d4a4c/cffi-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376", size = 188230, upload-time = "2026-07-06T21:33:38.011Z" }, - { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98", size = 223899, upload-time = "2026-07-06T21:33:39.514Z" }, - { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13", size = 211652, upload-time = "2026-07-06T21:33:40.851Z" }, - { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d", size = 210755, upload-time = "2026-07-06T21:33:42.183Z" }, - { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056", size = 223933, upload-time = "2026-07-06T21:33:43.603Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4", size = 226749, upload-time = "2026-07-06T21:33:45.046Z" }, - { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94", size = 225703, upload-time = "2026-07-06T21:33:46.374Z" }, - { url = "https://files.pythonhosted.org/packages/dc/78/aa01ac599a8a4322533d45a1f9bc93b338276d2d59dabbe7c6d92a775c81/cffi-2.1.0-cp314-cp314t-win32.whl", hash = "sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76", size = 182857, upload-time = "2026-07-06T21:33:47.696Z" }, - { url = "https://files.pythonhosted.org/packages/b9/26/d00496b22de4d4228f32dde94ad996f350c8aad676d63bcca0743c8dea4d/cffi-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5", size = 194065, upload-time = "2026-07-06T21:33:48.953Z" }, - { url = "https://files.pythonhosted.org/packages/d5/dd/0c7dbf815a579ff005008a2d815a55d6bb047c349eef536d9dc53d3f0a8d/cffi-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8", size = 186404, upload-time = "2026-07-06T21:33:50.309Z" }, - { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c", size = 194121, upload-time = "2026-07-06T21:33:56.109Z" }, - { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001", size = 196820, upload-time = "2026-07-06T21:33:57.288Z" }, - { url = "https://files.pythonhosted.org/packages/ed/da/4bbe583a3b3a5c8c60892124fe17f3fa3656523faf0d3484eae90f091853/cffi-2.1.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3", size = 184936, upload-time = "2026-07-06T21:33:58.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/4b/1f4c36ab273980d7aa75bb126ea4f8971f24a96108acad3a0a084028c57b/cffi-2.1.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc", size = 185045, upload-time = "2026-07-06T21:34:00.085Z" }, - { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699", size = 222342, upload-time = "2026-07-06T21:34:01.814Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022", size = 210073, upload-time = "2026-07-06T21:34:03.255Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0", size = 208551, upload-time = "2026-07-06T21:34:04.433Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1", size = 221649, upload-time = "2026-07-06T21:34:06.157Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28", size = 225203, upload-time = "2026-07-06T21:34:07.489Z" }, - { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629", size = 223263, upload-time = "2026-07-06T21:34:08.712Z" }, - { url = "https://files.pythonhosted.org/packages/2c/d8/772b8259bf75749adffb1c546828978381fb516f60cf701f6c83daf60c85/cffi-2.1.0-cp315-cp315-win32.whl", hash = "sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6", size = 177696, upload-time = "2026-07-06T21:34:26.355Z" }, - { url = "https://files.pythonhosted.org/packages/2f/dd/afa2191fc6d57fedd26e5844a2fe2fcc0bbfa00961bbaa5a41e4921e7cca/cffi-2.1.0-cp315-cp315-win_amd64.whl", hash = "sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853", size = 187914, upload-time = "2026-07-06T21:34:27.58Z" }, - { url = "https://files.pythonhosted.org/packages/05/ef/6cd4f8c671517162379dc79cfae5aea9106bc38abb89628d5c16adf6a838/cffi-2.1.0-cp315-cp315-win_arm64.whl", hash = "sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda", size = 183004, upload-time = "2026-07-06T21:34:28.905Z" }, - { url = "https://files.pythonhosted.org/packages/11/b6/12fc55092817a5faa26fb8c40c7f9d662e11a46ee248c137aafc42517d92/cffi-2.1.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc", size = 188378, upload-time = "2026-07-06T21:34:09.926Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2e/cdac88979f295fde5daa69622c7d2111e56e7ceb94f211357fbe452339e4/cffi-2.1.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca", size = 188319, upload-time = "2026-07-06T21:34:11.101Z" }, - { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d", size = 223904, upload-time = "2026-07-06T21:34:12.606Z" }, - { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8", size = 211554, upload-time = "2026-07-06T21:34:13.987Z" }, - { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd", size = 210795, upload-time = "2026-07-06T21:34:15.972Z" }, - { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f", size = 223843, upload-time = "2026-07-06T21:34:17.509Z" }, - { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc", size = 226773, upload-time = "2026-07-06T21:34:19.05Z" }, - { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9", size = 225719, upload-time = "2026-07-06T21:34:20.576Z" }, - { url = "https://files.pythonhosted.org/packages/68/5a/e536c528bc8057496c360c0978559a2dc45653f89dd6151078aa7d8fca1a/cffi-2.1.0-cp315-cp315t-win32.whl", hash = "sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b", size = 182760, upload-time = "2026-07-06T21:34:22.059Z" }, - { url = "https://files.pythonhosted.org/packages/d3/0b/0ffe8b82d3875bced5fa1e7986a7a46b748262a40ab7f60b475eb9fb1bb3/cffi-2.1.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5", size = 193769, upload-time = "2026-07-06T21:34:23.589Z" }, - { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", hash = "sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210", size = 186405, upload-time = "2026-07-06T21:34:24.857Z" }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -129,7 +31,6 @@ version = "0.0.0" source = { virtual = "." } dependencies = [ { name = "build" }, - { name = "cffi" }, { name = "psycopg2-binary" }, { name = "python-geohash" }, { name = "setuptools" }, @@ -138,7 +39,6 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "build" }, - { name = "cffi" }, { name = "psycopg2-binary" }, { name = "python-geohash", specifier = "==0.8.5" }, { name = "setuptools" }, @@ -205,15 +105,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/36/9c0c326fe3a4227953dfb29f5d0c8ae3b8eb8c1cd2967aa569f50cb3c61f/psycopg2_binary-2.9.11-cp314-cp314-win_amd64.whl", hash = "sha256:4012c9c954dfaccd28f94e84ab9f94e12df76b4afb22331b1f0d3154893a6316", size = 2803913, upload-time = "2025-10-10T11:13:57.058Z" }, ] -[[package]] -name = "pycparser" -version = "3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, -] - [[package]] name = "pyproject-hooks" version = "1.2.0" diff --git a/e2e/cases/uv-deps-650/setup.MODULE.bazel b/e2e/cases/uv-deps-650/setup.MODULE.bazel index 6326b4590..1cab41c3c 100644 --- a/e2e/cases/uv-deps-650/setup.MODULE.bazel +++ b/e2e/cases/uv-deps-650/setup.MODULE.bazel @@ -19,7 +19,6 @@ uv.project( uv.project( default_build_dependencies = [ "build", - "cffi", "setuptools", ], hub_name = "pypi_uv_deps_650", diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 564cf7374..0799ecf67 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -15,7 +15,6 @@ bzl_library( srcs = ["rule.bzl"], deps = [ ":cc_layer", - ":exec_transition", "//py/private/toolchain:types", "//uv/private:source_built_wheel", "@bazel_lib//lib:resource_sets", @@ -34,12 +33,6 @@ bzl_library( ], ) -bzl_library( - name = "exec_transition", - srcs = ["exec_transition.bzl"], - visibility = ["//uv/private:__subpackages__"], -) - py_library( name = "memory_monitor", srcs = ["memory_monitor.py"], diff --git a/uv/private/pep517_whl/exec_transition.bzl b/uv/private/pep517_whl/exec_transition.bzl deleted file mode 100644 index f6658814b..000000000 --- a/uv/private/pep517_whl/exec_transition.bzl +++ /dev/null @@ -1,53 +0,0 @@ -load("@aspect_rules_py_uv_host//:defs.bzl", "CURRENT_PLATFORM_LIBC", "CURRENT_PLATFORM_VERSION") - -_PLATFORM_LIBC_FLAG = str(Label("@aspect_rules_py//uv/private/constraints/platform:platform_libc")) -_PLATFORM_VERSION_FLAG = str(Label("@aspect_rules_py//uv/private/constraints/platform:platform_version")) - -_HOST_OPTION_INPUTS = [ - "//command_line_option:platforms", - "//command_line_option:host_platform", - "//command_line_option:host_cpu", - "//command_line_option:host_compilation_mode", - "//command_line_option:host_copt", - "//command_line_option:host_cxxopt", - "//command_line_option:host_linkopt", - "//command_line_option:host_action_env", - "//command_line_option:host_features", -] - -_HOST_OPTION_OUTPUTS = [ - "//command_line_option:platforms", - "//command_line_option:cpu", - "//command_line_option:compilation_mode", - "//command_line_option:copt", - "//command_line_option:cxxopt", - "//command_line_option:linkopt", - "//command_line_option:action_env", - "//command_line_option:features", -] - -def _exec_transition_impl(settings, _attr): - if settings["//command_line_option:platforms"] == [settings["//command_line_option:host_platform"]]: - return {} - - return { - "//command_line_option:platforms": [settings["//command_line_option:host_platform"]], - "//command_line_option:cpu": settings["//command_line_option:host_cpu"], - "//command_line_option:compilation_mode": settings["//command_line_option:host_compilation_mode"], - "//command_line_option:copt": settings["//command_line_option:host_copt"], - "//command_line_option:cxxopt": settings["//command_line_option:host_cxxopt"], - "//command_line_option:linkopt": settings["//command_line_option:host_linkopt"], - "//command_line_option:action_env": settings["//command_line_option:host_action_env"], - "//command_line_option:features": settings["//command_line_option:host_features"], - _PLATFORM_LIBC_FLAG: CURRENT_PLATFORM_LIBC, - _PLATFORM_VERSION_FLAG: CURRENT_PLATFORM_VERSION, - } - -exec_transition = transition( - implementation = _exec_transition_impl, - inputs = _HOST_OPTION_INPUTS, - outputs = _HOST_OPTION_OUTPUTS + [ - _PLATFORM_LIBC_FLAG, - _PLATFORM_VERSION_FLAG, - ], -) diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index 94c578057..c363d02b8 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -11,7 +11,6 @@ load("@rules_cc//cc/common:cc_common.bzl", "cc_common") load("//py/private/toolchain:types.bzl", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") load("//uv/private:source_built_wheel.bzl", "SourceBuiltWheelInfo") load(":cc_layer.bzl", "CC_LAYER_ATTRS", "extract_cc_layer") -load(":exec_transition.bzl", "exec_transition") _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") _TARGET_EXEC_GROUP = "target" @@ -312,8 +311,6 @@ def _pep517_native_whl(ctx): cross_args = [] _tool = ctx.attr.tool - if type(_tool) == "list": - _tool = _tool[0] ctx.actions.run( mnemonic = "PySdistCrossBuild" if cross else "PySdistNativeBuild", @@ -423,10 +420,7 @@ analysis fails with a diagnostic naming the required toolchain type. "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + "configured C++ action tools.", ), - "tool": attr.label(executable = True, cfg = exec_transition), - "_allowlist_function_transition": attr.label( - default = "@bazel_tools//tools/allowlists/function_transition_allowlist", - ), + "tool": attr.label(executable = True, cfg = config.exec(_TARGET_EXEC_GROUP)), } | CC_LAYER_ATTRS, fragments = ["cpp"], toolchains = [ From 88e08264e16d8ead6cd6d9a96b320ba37cb96955 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 23 Jul 2026 11:20:13 -0600 Subject: [PATCH 012/103] exec transition --- .../pep517-frontend-exec-group/BUILD.bazel | 22 ++-- .../uv-deps-650/crossbuild/pyproject.toml | 1 + e2e/cases/uv-deps-650/crossbuild/uv.lock | 109 ++++++++++++++++++ e2e/cases/uv-deps-650/setup.MODULE.bazel | 1 + uv/private/pep517_whl/BUILD.bazel | 7 ++ uv/private/pep517_whl/exec_transition.bzl | 34 ++++++ uv/private/pep517_whl/rule.bzl | 34 ++++-- 7 files changed, 189 insertions(+), 19 deletions(-) create mode 100644 uv/private/pep517_whl/exec_transition.bzl diff --git a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel index 5ccb88e15..a5900813c 100644 --- a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel +++ b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel @@ -479,16 +479,15 @@ write_file( content = [ "#!/usr/bin/env bash", "set -euo pipefail", - ] + select({ - ":linux_aarch64_config": ["actual=aarch64"], - ":linux_x86_64_config": ["actual=x86_64"], - "//conditions:default": ["actual=default"], - }) + [ + # The build tool is configured for the HOST platform (see + # uv/private/pep517_whl/exec_transition.bzl) so that its Python build + # dependencies resolve against host-compatible wheels. Its own + # platform identity therefore varies with the host (on a darwin host + # the select above would take its default branch; on a linux x86_64 + # host it takes :linux_x86_64_config), so there is no stable value to + # assert here. What remains meaningful — and host-independent — is + # that the CC toolchain comes from the "target" exec group: "expected=\"$1\"", - "if [[ \"${actual}\" != \"${expected}\" ]]; then", - " echo \"frontend used ${actual}; expected ${expected}\" >&2", - " exit 1", - "fi", "compiler_actual=\"$(\"${CC}\")\"", "if [[ \"${compiler_actual}\" != \"${expected}\" ]]; then", " echo \"compiler ${CC} reported ${compiler_actual}; expected ${expected}\" >&2", @@ -735,6 +734,11 @@ build_test( ], ) +# NOTE: the frontend tool itself is configured for the host platform (see +# exec_transition.bzl); this test verifies the CC toolchain of the "target" +# exec group is exposed to the build, not that the tool runs in the exec +# group's platform configuration. + build_test( name = "configured_compiler_tools_test", targets = [":wheel_linux_configured"], diff --git a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml b/e2e/cases/uv-deps-650/crossbuild/pyproject.toml index f110fdf36..d6e6ed0c0 100644 --- a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml +++ b/e2e/cases/uv-deps-650/crossbuild/pyproject.toml @@ -4,6 +4,7 @@ version = "0.0.0" requires-python = ">=3.11" authors = [] dependencies = [ + "cffi", "psycopg2-binary", "python-geohash==0.8.5", "setuptools", diff --git a/e2e/cases/uv-deps-650/crossbuild/uv.lock b/e2e/cases/uv-deps-650/crossbuild/uv.lock index 4ac42a4fe..85263a4e5 100644 --- a/e2e/cases/uv-deps-650/crossbuild/uv.lock +++ b/e2e/cases/uv-deps-650/crossbuild/uv.lock @@ -16,6 +16,104 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl", hash = "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596", size = 24141, upload-time = "2026-01-08T16:41:46.453Z" }, ] +[[package]] +name = "cffi" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/67/85c89a59ba36a671e79638f44d466749f08179266a57e4f2ffdf92174072/cffi-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc", size = 183845, upload-time = "2026-07-06T21:32:26.32Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dd/e3b0baa2d3d6a857ac72b7efbf18e32e487c9cdafcc13049ad765495b15e/cffi-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7", size = 184186, upload-time = "2026-07-06T21:32:28.025Z" }, + { url = "https://files.pythonhosted.org/packages/65/68/9f3ef890cf3c6ab97bd531c5677f67613d302165d16f8142b2811782a614/cffi-2.1.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93", size = 211892, upload-time = "2026-07-06T21:32:29.565Z" }, + { url = "https://files.pythonhosted.org/packages/22/d7/1a74539db16d8bfd839ff1515948948efbb162e574650fd3d846896eea95/cffi-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2", size = 218793, upload-time = "2026-07-06T21:32:30.951Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d1/9a5b7169499e8e8d8e636de70b97ac7c9447104d2ff1a2cd94790cea5162/cffi-2.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c", size = 205737, upload-time = "2026-07-06T21:32:32.216Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b0/e131a9c41f10607926278453d9596163594fe1c4ebc46efe3b5e5b34eb84/cffi-2.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f", size = 204909, upload-time = "2026-07-06T21:32:33.655Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d2/4398416cd699b35167947c6e22aca52c47e69ad5695073c9f1f2c52e04aa/cffi-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565", size = 217883, upload-time = "2026-07-06T21:32:35.173Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a5/d4fe77b589e5e82d43ebc809bf2e6474afe8e48e32ea050b9357645b6471/cffi-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c", size = 221251, upload-time = "2026-07-06T21:32:36.527Z" }, + { url = "https://files.pythonhosted.org/packages/22/f0/a2fc43084c0433caf7f461bccc013e28f848d04ee1c5ed7fce71423cf4d9/cffi-2.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02", size = 214250, upload-time = "2026-07-06T21:32:37.852Z" }, + { url = "https://files.pythonhosted.org/packages/04/8c/b925975448cf20634a9fbd5efceb807219db452653648d2897c0989cab2d/cffi-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e", size = 219441, upload-time = "2026-07-06T21:32:39.146Z" }, + { url = "https://files.pythonhosted.org/packages/eb/da/5c4918a2d61d86fa927d716cb3d8e4626ef8dc8f605a599d32f33897f59a/cffi-2.1.0-cp311-cp311-win32.whl", hash = "sha256:64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479", size = 174496, upload-time = "2026-07-06T21:32:40.467Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c8/6c2de1d55cf35ef8b92885d5ef280790f0fb9634d87ea1cc315176aecd61/cffi-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458", size = 185113, upload-time = "2026-07-06T21:32:41.761Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4e/e8d7cb5783f1841a3c8fb3a7735838d7484d08ec08c9f984b14cac1ac0e9/cffi-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d", size = 179927, upload-time = "2026-07-06T21:32:42.961Z" }, + { url = "https://files.pythonhosted.org/packages/1e/85/990925db5df586ec90beb97529c853497e7f85ba0234830447faf41c3057/cffi-2.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f", size = 184829, upload-time = "2026-07-06T21:32:44.324Z" }, + { url = "https://files.pythonhosted.org/packages/4b/92/e7bb136ad6b5352603732cf907ef862ca103f20f2031c1735a46300c20c9/cffi-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde", size = 184728, upload-time = "2026-07-06T21:32:45.683Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d", size = 214815, upload-time = "2026-07-06T21:32:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7", size = 222429, upload-time = "2026-07-06T21:32:49.848Z" }, + { url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b", size = 210315, upload-time = "2026-07-06T21:32:51.221Z" }, + { url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7", size = 208859, upload-time = "2026-07-06T21:32:52.512Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66", size = 221844, upload-time = "2026-07-06T21:32:53.704Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe", size = 225287, upload-time = "2026-07-06T21:32:54.907Z" }, + { url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b", size = 223681, upload-time = "2026-07-06T21:32:56.329Z" }, + { url = "https://files.pythonhosted.org/packages/b0/80/c138990aa2a70b1a269f6e06348729836d733d6f970867943f61d367f8cc/cffi-2.1.0-cp312-cp312-win32.whl", hash = "sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a", size = 175269, upload-time = "2026-07-06T21:32:57.777Z" }, + { url = "https://files.pythonhosted.org/packages/a8/eb/f636456ff21a83fc13c032b58cc5dde061691546ac79efa284b2989b7982/cffi-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384", size = 185881, upload-time = "2026-07-06T21:32:59.253Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/400ea43e721727dca8a65c4521390e9196757caba4a45643acb2b63271b8/cffi-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6", size = 180088, upload-time = "2026-07-06T21:33:02.278Z" }, + { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, + { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795, upload-time = "2026-07-06T21:33:06.699Z" }, + { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746, upload-time = "2026-07-06T21:33:08.071Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, + { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, + { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, + { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, + { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248, upload-time = "2026-07-06T21:33:19.799Z" }, + { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717, upload-time = "2026-07-06T21:33:21.47Z" }, + { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114, upload-time = "2026-07-06T21:33:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a", size = 194142, upload-time = "2026-07-06T21:33:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3", size = 196819, upload-time = "2026-07-06T21:33:25.007Z" }, + { url = "https://files.pythonhosted.org/packages/20/71/7c8372d30e42415602ed9f268f7cfd66f1b855fed881ecd168bcb45dbc0b/cffi-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d", size = 184965, upload-time = "2026-07-06T21:33:26.605Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5c/584e626835f0375c928176c04137c96927165cb8733cdb3150ec04e5ee5e/cffi-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac", size = 184952, upload-time = "2026-07-06T21:33:27.823Z" }, + { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6", size = 222353, upload-time = "2026-07-06T21:33:29.178Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913", size = 210051, upload-time = "2026-07-06T21:33:30.534Z" }, + { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d", size = 208630, upload-time = "2026-07-06T21:33:31.753Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5", size = 221593, upload-time = "2026-07-06T21:33:33.044Z" }, + { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce", size = 225146, upload-time = "2026-07-06T21:33:34.224Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326", size = 223240, upload-time = "2026-07-06T21:33:35.57Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/ade5ce9863a57992a6ea3d0d10d7e29b8749fc127204b3d493d667b2815f/cffi-2.1.0-cp314-cp314-win32.whl", hash = "sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd", size = 177723, upload-time = "2026-07-06T21:33:51.626Z" }, + { url = "https://files.pythonhosted.org/packages/41/de/92b9eeed4ae4a21d6fd9b2a2c8505cbed573299902ea73981cc13f7ff62c/cffi-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb", size = 187937, upload-time = "2026-07-06T21:33:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/cc6ae6c2913a03aab8898eee57963cf1035b8df5872ed8b9115fcc7e2be8/cffi-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804", size = 183001, upload-time = "2026-07-06T21:33:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/14/f0/134c00ce0779ec86dea2aa1aac69339c2741a8045072676763512363a2ea/cffi-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714", size = 188538, upload-time = "2026-07-06T21:33:36.792Z" }, + { url = "https://files.pythonhosted.org/packages/50/d8/3b86aba791cb610d24e8a3e1b2cd529e71fa15096b04e4d4e360049d4a4c/cffi-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376", size = 188230, upload-time = "2026-07-06T21:33:38.011Z" }, + { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98", size = 223899, upload-time = "2026-07-06T21:33:39.514Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13", size = 211652, upload-time = "2026-07-06T21:33:40.851Z" }, + { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d", size = 210755, upload-time = "2026-07-06T21:33:42.183Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056", size = 223933, upload-time = "2026-07-06T21:33:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4", size = 226749, upload-time = "2026-07-06T21:33:45.046Z" }, + { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94", size = 225703, upload-time = "2026-07-06T21:33:46.374Z" }, + { url = "https://files.pythonhosted.org/packages/dc/78/aa01ac599a8a4322533d45a1f9bc93b338276d2d59dabbe7c6d92a775c81/cffi-2.1.0-cp314-cp314t-win32.whl", hash = "sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76", size = 182857, upload-time = "2026-07-06T21:33:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/d00496b22de4d4228f32dde94ad996f350c8aad676d63bcca0743c8dea4d/cffi-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5", size = 194065, upload-time = "2026-07-06T21:33:48.953Z" }, + { url = "https://files.pythonhosted.org/packages/d5/dd/0c7dbf815a579ff005008a2d815a55d6bb047c349eef536d9dc53d3f0a8d/cffi-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8", size = 186404, upload-time = "2026-07-06T21:33:50.309Z" }, + { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c", size = 194121, upload-time = "2026-07-06T21:33:56.109Z" }, + { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001", size = 196820, upload-time = "2026-07-06T21:33:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/ed/da/4bbe583a3b3a5c8c60892124fe17f3fa3656523faf0d3484eae90f091853/cffi-2.1.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3", size = 184936, upload-time = "2026-07-06T21:33:58.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4b/1f4c36ab273980d7aa75bb126ea4f8971f24a96108acad3a0a084028c57b/cffi-2.1.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc", size = 185045, upload-time = "2026-07-06T21:34:00.085Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699", size = 222342, upload-time = "2026-07-06T21:34:01.814Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022", size = 210073, upload-time = "2026-07-06T21:34:03.255Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0", size = 208551, upload-time = "2026-07-06T21:34:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1", size = 221649, upload-time = "2026-07-06T21:34:06.157Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28", size = 225203, upload-time = "2026-07-06T21:34:07.489Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629", size = 223263, upload-time = "2026-07-06T21:34:08.712Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d8/772b8259bf75749adffb1c546828978381fb516f60cf701f6c83daf60c85/cffi-2.1.0-cp315-cp315-win32.whl", hash = "sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6", size = 177696, upload-time = "2026-07-06T21:34:26.355Z" }, + { url = "https://files.pythonhosted.org/packages/2f/dd/afa2191fc6d57fedd26e5844a2fe2fcc0bbfa00961bbaa5a41e4921e7cca/cffi-2.1.0-cp315-cp315-win_amd64.whl", hash = "sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853", size = 187914, upload-time = "2026-07-06T21:34:27.58Z" }, + { url = "https://files.pythonhosted.org/packages/05/ef/6cd4f8c671517162379dc79cfae5aea9106bc38abb89628d5c16adf6a838/cffi-2.1.0-cp315-cp315-win_arm64.whl", hash = "sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda", size = 183004, upload-time = "2026-07-06T21:34:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/11/b6/12fc55092817a5faa26fb8c40c7f9d662e11a46ee248c137aafc42517d92/cffi-2.1.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc", size = 188378, upload-time = "2026-07-06T21:34:09.926Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2e/cdac88979f295fde5daa69622c7d2111e56e7ceb94f211357fbe452339e4/cffi-2.1.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca", size = 188319, upload-time = "2026-07-06T21:34:11.101Z" }, + { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d", size = 223904, upload-time = "2026-07-06T21:34:12.606Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8", size = 211554, upload-time = "2026-07-06T21:34:13.987Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd", size = 210795, upload-time = "2026-07-06T21:34:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f", size = 223843, upload-time = "2026-07-06T21:34:17.509Z" }, + { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc", size = 226773, upload-time = "2026-07-06T21:34:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9", size = 225719, upload-time = "2026-07-06T21:34:20.576Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/e536c528bc8057496c360c0978559a2dc45653f89dd6151078aa7d8fca1a/cffi-2.1.0-cp315-cp315t-win32.whl", hash = "sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b", size = 182760, upload-time = "2026-07-06T21:34:22.059Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0b/0ffe8b82d3875bced5fa1e7986a7a46b748262a40ab7f60b475eb9fb1bb3/cffi-2.1.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5", size = 193769, upload-time = "2026-07-06T21:34:23.589Z" }, + { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", hash = "sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210", size = 186405, upload-time = "2026-07-06T21:34:24.857Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -31,6 +129,7 @@ version = "0.0.0" source = { virtual = "." } dependencies = [ { name = "build" }, + { name = "cffi" }, { name = "psycopg2-binary" }, { name = "python-geohash" }, { name = "setuptools" }, @@ -39,6 +138,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "build" }, + { name = "cffi" }, { name = "psycopg2-binary" }, { name = "python-geohash", specifier = "==0.8.5" }, { name = "setuptools" }, @@ -105,6 +205,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/36/9c0c326fe3a4227953dfb29f5d0c8ae3b8eb8c1cd2967aa569f50cb3c61f/psycopg2_binary-2.9.11-cp314-cp314-win_amd64.whl", hash = "sha256:4012c9c954dfaccd28f94e84ab9f94e12df76b4afb22331b1f0d3154893a6316", size = 2803913, upload-time = "2025-10-10T11:13:57.058Z" }, ] +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + [[package]] name = "pyproject-hooks" version = "1.2.0" diff --git a/e2e/cases/uv-deps-650/setup.MODULE.bazel b/e2e/cases/uv-deps-650/setup.MODULE.bazel index 1cab41c3c..6326b4590 100644 --- a/e2e/cases/uv-deps-650/setup.MODULE.bazel +++ b/e2e/cases/uv-deps-650/setup.MODULE.bazel @@ -19,6 +19,7 @@ uv.project( uv.project( default_build_dependencies = [ "build", + "cffi", "setuptools", ], hub_name = "pypi_uv_deps_650", diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 0799ecf67..80f78ba82 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -15,6 +15,7 @@ bzl_library( srcs = ["rule.bzl"], deps = [ ":cc_layer", + ":exec_transition", "//py/private/toolchain:types", "//uv/private:source_built_wheel", "@bazel_lib//lib:resource_sets", @@ -38,3 +39,9 @@ py_library( srcs = ["memory_monitor.py"], visibility = ["//visibility:public"], ) + +bzl_library( + name = "exec_transition", + srcs = ["exec_transition.bzl"], + deps = ["@aspect_rules_py_uv_host//:defs"], +) diff --git a/uv/private/pep517_whl/exec_transition.bzl b/uv/private/pep517_whl/exec_transition.bzl new file mode 100644 index 000000000..610710c3f --- /dev/null +++ b/uv/private/pep517_whl/exec_transition.bzl @@ -0,0 +1,34 @@ +load("@aspect_rules_py_uv_host//:defs.bzl", "CURRENT_PLATFORM_LIBC", "CURRENT_PLATFORM_VERSION") + +_PLATFORM_LIBC_FLAG = str(Label("@aspect_rules_py//uv/private/constraints/platform:platform_libc")) +_PLATFORM_VERSION_FLAG = str(Label("@aspect_rules_py//uv/private/constraints/platform:platform_version")) + +_INPUTS = [ + "//command_line_option:platforms", + "//command_line_option:host_platform", + _PLATFORM_LIBC_FLAG, + _PLATFORM_VERSION_FLAG, +] + +_OUTPUTS = [ + "//command_line_option:platforms", + _PLATFORM_LIBC_FLAG, + _PLATFORM_VERSION_FLAG, +] + +def _exec_transition_impl(settings, _attr): + if settings["//command_line_option:platforms"] == [settings["//command_line_option:host_platform"]] and \ + settings[_PLATFORM_LIBC_FLAG] == CURRENT_PLATFORM_LIBC and \ + settings[_PLATFORM_VERSION_FLAG] == CURRENT_PLATFORM_VERSION: + return {} + return { + "//command_line_option:platforms": [settings["//command_line_option:host_platform"]], + _PLATFORM_LIBC_FLAG: CURRENT_PLATFORM_LIBC, + _PLATFORM_VERSION_FLAG: CURRENT_PLATFORM_VERSION, + } + +exec_transition = transition( + implementation = _exec_transition_impl, + inputs = _INPUTS, + outputs = _OUTPUTS, +) diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index c363d02b8..92f134529 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -11,6 +11,7 @@ load("@rules_cc//cc/common:cc_common.bzl", "cc_common") load("//py/private/toolchain:types.bzl", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") load("//uv/private:source_built_wheel.bzl", "SourceBuiltWheelInfo") load(":cc_layer.bzl", "CC_LAYER_ATTRS", "extract_cc_layer") +load(":exec_transition.bzl", "exec_transition") _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") _TARGET_EXEC_GROUP = "target" @@ -29,6 +30,12 @@ def _wheel_providers(wheel_dir, console_scripts): SourceBuiltWheelInfo(console_scripts = tuple(console_scripts)), ] +def _tool_files_to_run(ctx): + tool = ctx.attr.tool + if type(tool) == "list": + tool = tool[0] + return tool[DefaultInfo].files_to_run + def _common_env(ctx): # pyproject_hooks copies the build process environment and launches its # Python executable without -I: @@ -198,17 +205,18 @@ def _pep517_whl(ctx): # the action sandbox, which means the venv shim can find the interpreter # via the standard runfiles mechanism regardless of whether the interpreter # comes from an external repo or the main workspace. + tool_files_to_run = _tool_files_to_run(ctx) ctx.actions.run( mnemonic = "PySdistBuild", progress_message = "Source compiling {} to a whl".format(archive.basename), - executable = ctx.executable.tool, + executable = tool_files_to_run, toolchain = None, arguments = ctx.attr.args + patch_args + _memory_args(ctx) + [ archive.path, wheel_dir.path, ], inputs = [archive] + patch_inputs, - tools = [ctx.attr.tool[DefaultInfo].files_to_run], + tools = [tool_files_to_run], outputs = [wheel_dir], env = _common_env(ctx), exec_group = _TARGET_EXEC_GROUP, @@ -310,7 +318,7 @@ def _pep517_native_whl(ctx): else: cross_args = [] - _tool = ctx.attr.tool + _tool = _tool_files_to_run(ctx) ctx.actions.run( mnemonic = "PySdistCrossBuild" if cross else "PySdistNativeBuild", @@ -318,7 +326,7 @@ def _pep517_native_whl(ctx): "Cross" if cross else "Native", archive.basename, ), - executable = ctx.executable.tool, + executable = _tool, toolchain = None, arguments = ctx.attr.args + patch_args + _memory_args(ctx) + cross_args + [ "--execroot-marker", @@ -330,7 +338,7 @@ def _pep517_native_whl(ctx): [archive] + patch_inputs, transitive = extra_inputs, ), - tools = [_tool[DefaultInfo].files_to_run], + tools = [_tool], outputs = [wheel_dir], env = env, exec_group = _TARGET_EXEC_GROUP, @@ -353,10 +361,16 @@ _PATCH_ATTRS = { _pep517_whl_attrs = { "src": attr.label(allow_single_file = True), - # The wheel action uses the named group below, so its frontend must use the - # same execution platform: - # https://bazel.build/extending/exec-groups#defining-exec-groups - "tool": attr.label(executable = True, cfg = config.exec(_TARGET_EXEC_GROUP)), + # The wheel action runs in the "target" exec group; its frontend must run + # on the exec (host) platform but resolve its Python build dependencies + # for the *target* Python version. exec_transition pins --platforms to the + # host and resets the platform_libc/platform_version flags to host values + # (Starlark flags otherwise leak from the target configuration and break + # wheel selection for build deps). See exec_transition.bzl. + "tool": attr.label(executable = True, cfg = exec_transition), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), "version": attr.string(), "console_scripts": attr.string_list( doc = "Console scripts discovered from the source distribution's entry-point metadata.", @@ -420,7 +434,7 @@ analysis fails with a diagnostic naming the required toolchain type. "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + "configured C++ action tools.", ), - "tool": attr.label(executable = True, cfg = config.exec(_TARGET_EXEC_GROUP)), + "tool": attr.label(executable = True, cfg = exec_transition), } | CC_LAYER_ATTRS, fragments = ["cpp"], toolchains = [ From 1571655ef3c01c1ad4ab3656347b0832c19cef75 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 23 Jul 2026 12:15:26 -0600 Subject: [PATCH 013/103] documenting --- docs/uv.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/uv.md b/docs/uv.md index ac8b14f27..70a8d47d4 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -271,6 +271,59 @@ platform_transition_filegroup( ) ``` +## Example: Cross-compiling sdists + +Wheels are selected for the target platform, but when a package only ships a +source distribution — or no published wheel matches the target — uv builds the +sdist as part of the build. Two modes exist: + +- **Pure-Python sdists** produce a `-none-any` wheel and build identically in + any configuration, cross or not. +- **Native sdists** (C/C++ extensions) build in *native mode* when the exec and + target platforms coincide. When they differ, the build enters *cross mode*. + +Cross mode requires a **cross-capable C++ toolchain** registered with +`register_toolchains` — one whose compiler can target the destination platform +from the exec platform (for example `toolchains_llvm`, whose clang is +multi-target). If none resolves, analysis fails with an explicit error naming +the missing toolchain type rather than an obscure toolchain-resolution +failure. No per-package opt-in is needed: cross mode activates automatically +from the platform configuration. + +Under cross mode the build action: + +1. Extracts the C++ toolchain selected for the target platform (compiler, + compile/link flags, sysroot) and re-materializes it as compiler wrapper + scripts, so flags such as `-target` / `--sysroot` survive the PEP 517 + backend's own command construction. +2. Overrides the target interpreter's sysconfig for the build + (`_PYTHON_SYSCONFIGDATA_NAME` pointing at the target runtime's + `_sysconfigdata_*.py`, `_PYTHON_HOST_PLATFORM`, and the target's + `EXT_SUFFIX`/`SOABI`), so the produced `.so` and wheel are tagged for the + destination platform. +3. Resolves the sdist's *build* dependencies (`uv.project`'s + `default_build_dependencies`, e.g. `build`, `setuptools`, `cffi`) for the + **exec platform** but the **target Python version** — the interpreter that + runs the build is the host one; the wheels it imports match the host. +4. Validates the produced wheel's platform tag against the target OS/CPU and + fails the action if the backend leaked the exec platform into the tag. + +A working end-to-end example (Darwin → Linux arm64/amd64, `python-geohash` +built from sdist, with architecture and `EXT_SUFFIX` assertions) lives in +`e2e/cases/uv-deps-650/crossbuild/`. + +Current limitations: + +- Only setuptools-style PEP 517 backends are exercised in cross mode. meson / + meson-python, cmake, and maturin/PyO3 packages may build but are not yet + covered; CPU-feature detection that runs compiled binaries cannot work in + cross mode and needs per-package baselines. +- No shared-library "repair" (auditwheel/delocate style bundling) is performed + yet; wheels linking against Bazel-provided native libraries need care. +- Windows targets and MSVC are not supported. +- Remote execution with an exec platform different from the host is untested; + the build-dependency resolution assumes exec == host. + ## Example: Constraining library compatibility By default uv hubs let you write `py_library` and other targets which are From 0b06775a0c05336394bf0f531aa1a9976e7b09cb Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 23 Jul 2026 12:44:43 -0600 Subject: [PATCH 014/103] deriving from the exec/target interpreter platform identities --- uv/private/pep517_whl/BUILD.bazel | 1 + uv/private/pep517_whl/rule.bzl | 56 +++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 80f78ba82..46ca89705 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -16,6 +16,7 @@ bzl_library( deps = [ ":cc_layer", ":exec_transition", + "//py/private/interpreter:versions", "//py/private/toolchain:types", "//uv/private:source_built_wheel", "@bazel_lib//lib:resource_sets", diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index 92f134529..d27c857fe 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -8,7 +8,8 @@ build backend the sdist declares in its `[build-system]` table. load("@bazel_lib//lib:resource_sets.bzl", "resource_set", "resource_set_attr") load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES") load("@rules_cc//cc/common:cc_common.bzl", "cc_common") -load("//py/private/toolchain:types.bzl", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") +load("//py/private/interpreter:versions.bzl", "PLATFORMS") +load("//py/private/toolchain:types.bzl", "EXEC_TOOLS_TOOLCHAIN", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") load("//uv/private:source_built_wheel.bzl", "SourceBuiltWheelInfo") load(":cc_layer.bzl", "CC_LAYER_ATTRS", "extract_cc_layer") load(":exec_transition.bzl", "exec_transition") @@ -225,13 +226,51 @@ def _pep517_whl(ctx): return _wheel_providers(wheel_dir, ctx.attr.console_scripts) +def _interpreter_platform_triple(runtime): + """Best-effort platform triple of the repo a PyRuntimeInfo comes from. + + Interpreter repositories encode the PBS platform triple in their name + (`python_3_12_aarch64-apple-darwin`, sanitized variants with underscores, + and rules_python's hyphenated `python_3_11_aarch64-apple-darwin`). + Returns the matching PLATFORMS key, or None when the interpreter's origin + is not recognizable (custom or non-hermetic toolchains). + """ + if runtime == None or runtime.interpreter == None: + return None + short_path = runtime.interpreter.short_path + repo = short_path.split("/")[1] if short_path.startswith("../") else short_path.split("/")[0] + for triple in PLATFORMS: + if triple in repo or triple.replace("-", "_") in repo: + return triple + return None + +def _cross_compile(ctx, eg_toolchains): + """Decide cross mode from exec/target interpreter platform identities. + + The exec interpreter (EXEC_TOOLS_TOOLCHAIN, selected by exec platform) + and the target interpreter (PY_TOOLCHAIN, selected by target platform) + carry their origin repo's platform triple. Identical triples prove + exec == target, so a native build stays native even when the optional + NATIVE_BUILD_TOOLCHAIN sentinel is not registered for the platform. + + When either identity is unrecognizable (custom interpreters), fall back + to the sentinel's absence as the cross signal — the previous behavior. + """ + exec_tc = eg_toolchains[EXEC_TOOLS_TOOLCHAIN] + py_tc = ctx.toolchains[PY_TOOLCHAIN] + exec_triple = _interpreter_platform_triple(getattr(exec_tc, "exec_runtime", None) if exec_tc != None else None) + target_triple = _interpreter_platform_triple(getattr(py_tc, "py3_runtime", None) if py_tc != None else None) + if exec_triple and target_triple: + return exec_triple != target_triple + return eg_toolchains[NATIVE_BUILD_TOOLCHAIN] == None + def _pep517_native_whl(ctx): archive = ctx.file.src wheel_dir = ctx.actions.declare_directory("whl") patch_args, patch_inputs = _patch_args_and_inputs(ctx) eg_toolchains = ctx.exec_groups[_TARGET_EXEC_GROUP].toolchains - cross = eg_toolchains[NATIVE_BUILD_TOOLCHAIN] == None + cross = _cross_compile(ctx, eg_toolchains) cc_toolchain_raw = eg_toolchains[_CC_TOOLCHAIN_TYPE] if cc_toolchain_raw == None: @@ -416,10 +455,14 @@ attribute maps environment variable names to strings that may reference pattern used by `rules_rust`'s `cargo_build_script`. In native mode (exec platform == target platform) the build uses the host -CC toolchain. When the target platform differs, the build enters cross mode: -the CC toolchain of the "target" exec group resolves against a user-registered -cross CC toolchain (e.g., toolchains_llvm). If no cross CC toolchain is found, -analysis fails with a diagnostic naming the required toolchain type. +CC toolchain. Cross mode is decided by comparing the platform triples of the +exec interpreter (exec-tools toolchain) and the target interpreter (Python +toolchain): differing triples enter cross mode, where the CC toolchain of +the "target" exec group resolves against a user-registered cross CC toolchain +(e.g., toolchains_llvm). If no cross CC toolchain is found, analysis fails +with a diagnostic naming the required toolchain type. When the interpreter +origins are unrecognizable, the optional NATIVE_BUILD_TOOLCHAIN sentinel's +absence is used as the cross signal. """, attrs = _pep517_whl_attrs | { @@ -444,6 +487,7 @@ analysis fails with a diagnostic naming the required toolchain type. _TARGET_EXEC_GROUP: exec_group( toolchains = [ PY_TOOLCHAIN, + config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN, mandatory = False), config_common.toolchain_type(NATIVE_BUILD_TOOLCHAIN, mandatory = False), config_common.toolchain_type(_CC_TOOLCHAIN_TYPE, mandatory = False), ], From bf1385f0079b7871d200b9445a40ca0c2f822e8f Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Sun, 26 Jul 2026 11:34:40 -0700 Subject: [PATCH 015/103] add pycross tests (cherry picked from commit 4869b33a259c864285491e116fd0938a9508462c) --- e2e/crossbuild/pycross-setuptools/BUILD.bazel | 74 ++++++++++++++- .../pycross-setuptools/setup.MODULE.bazel | 6 +- e2e/crossbuild/tools/BUILD.bazel | 1 + e2e/crossbuild/tools/check_wheel_native.py | 92 +++++++++++++++++++ 4 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 e2e/crossbuild/tools/check_wheel_native.py diff --git a/e2e/crossbuild/pycross-setuptools/BUILD.bazel b/e2e/crossbuild/pycross-setuptools/BUILD.bazel index e2c54e19c..db8890bb6 100644 --- a/e2e/crossbuild/pycross-setuptools/BUILD.bazel +++ b/e2e/crossbuild/pycross-setuptools/BUILD.bazel @@ -1,9 +1,11 @@ # Ported from rules_pycross tests/e2e/build_setuptools. # -# Three setuptools C-extension sdists built by `pep517_native_whl` and -# imported at runtime for the host. +# Three setuptools C-extension sdists built by `pep517_native_whl`, imported at +# runtime for the host, then rebuilt through rules_pycross's `collect_wheels` +# matrix for two non-host Linux platforms — the cross path this branch adds. load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") exports_files(["require_extension.patch"]) @@ -11,6 +13,36 @@ _PY = "3.12" _DEP_GROUP = "pycross_setuptools" +# The libc/version flags are what the wheel resolver keys platform-specific +# wheel selection off; a bare constraint_values platform would leave build +# dependencies unresolvable. Same shape as the e2e/crossbuild workspace. The +# dep_group flag rides along because the wheel targets under `collect_wheels` +# are reached through a platform transition, not through a py_venv. +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + py_test( name = "test_setproctitle", srcs = ["test_setproctitle.py"], @@ -37,3 +69,41 @@ py_test( python_version = _PY, deps = ["@pypi_pycross_setuptools//pyyaml"], ) + +# rules_pycross's cross matrix, restricted to zstandard. +# +# pyyaml is excluded because `PYYAML_FORCE_LIBYAML=0` makes it anyarch — there +# is nothing platform-specific left to assert. +# +# setproctitle is excluded because it cannot cross-build here at all: its +# setup.py picks sources and macros off `sys.platform`, which reports the +# *exec* interpreter's platform. Cross mode overrides `_PYTHON_HOST_PLATFORM` +# and `_PYTHON_SYSCONFIGDATA_NAME`, neither of which moves `sys.platform`, so a +# darwin exec host compiles `src/darwin_set_process_name.c` with +# `-D__darwin__=1` against a linux target and fails on +# `CoreFoundation/CoreFoundation.h`. rules_pycross handles this with a real +# crossenv (`pycross/private/build/tools/crossenv/`) that patches `sys.platform` +# in the build interpreter. `require_extension.patch` keeps that failure loud +# rather than letting setproctitle fall back to an anyarch wheel. +collect_wheels( + name = "native_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = ["@sdist_build__pycross_setuptools__zstandard__0_22_0//:whl"], +) + +py_test( + name = "native_wheels_elf_test", + srcs = ["//tools:check_wheel_native.py"], + args = ["$(rootpath :native_wheels)"], + data = [":native_wheels"], + dep_group = _DEP_GROUP, + main = "//tools:check_wheel_native.py", + python_version = _PY, +) diff --git a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel index 6a4ba7ee6..2270925ae 100644 --- a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel @@ -67,4 +67,8 @@ uv.override_package( lock = "//pycross-setuptools:uv.lock", resource_set = "mem_4g", ) -use_repo(uv, "pypi_pycross_setuptools") +use_repo( + uv, + "pypi_pycross_setuptools", + "sdist_build__pycross_setuptools__zstandard__0_22_0", +) diff --git a/e2e/crossbuild/tools/BUILD.bazel b/e2e/crossbuild/tools/BUILD.bazel index 2fc7add18..987e249f0 100644 --- a/e2e/crossbuild/tools/BUILD.bazel +++ b/e2e/crossbuild/tools/BUILD.bazel @@ -5,6 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_binary") # Consumed cross-package by the `collect_wheels` macro (//tools:collect_wheels.bzl), # which declares a py_test with this script as `main` in the caller's package. exports_files([ + "check_wheel_native.py", "check_wheel_tags.py", ]) diff --git a/e2e/crossbuild/tools/check_wheel_native.py b/e2e/crossbuild/tools/check_wheel_native.py new file mode 100644 index 000000000..0bc1211d5 --- /dev/null +++ b/e2e/crossbuild/tools/check_wheel_native.py @@ -0,0 +1,92 @@ +"""Assert cross-built wheels really contain extensions for the tagged platform. + +Usage: check_wheel_native.py + +For every Linux-tagged wheel in the directory, every extension module inside it +must be an ELF object whose `e_machine` matches the wheel's architecture tag, +and whose filename ABI tag names the same architecture. A cross build that +fell back to the exec platform's compiler or sysconfig produces a correctly +named wheel holding host-architecture objects — which the wheel-tag check +alone cannot see. + +rules_pycross's cross coverage stops at "the wheel builds for both platforms" +(tests/e2e/shared/collect_wheels.bzl feeding a build target); this is the +assertion that makes that matrix meaningful. +""" + +import os +import struct +import sys +import zipfile + +# ELF e_machine values, from elf.h. +_EM_X86_64 = 0x3E +_EM_AARCH64 = 0xB7 + +_ARCH_TAGS = { + "x86_64": _EM_X86_64, + "aarch64": _EM_AARCH64, +} + + +def _wheel_arch(name: str) -> str: + for arch in _ARCH_TAGS: + if arch in name: + return arch + raise AssertionError("cannot determine architecture from wheel name {}".format(name)) + + +def _elf_machine(data: bytes) -> int: + assert data[:4] == b"\x7fELF", "not an ELF object" + little_endian = data[5] == 1 + return struct.unpack_from("H", data, 18)[0] + + +def _check(wheel_path: str) -> int: + name = os.path.basename(wheel_path) + arch = _wheel_arch(name) + expected_machine = _ARCH_TAGS[arch] + checked = 0 + + with zipfile.ZipFile(wheel_path) as zf: + for entry in zf.namelist(): + if not entry.endswith(".so"): + continue + machine = _elf_machine(zf.read(entry)) + if machine != expected_machine: + raise AssertionError( + "{}: {} is ELF machine {:#x}, expected {:#x} for '{}'".format( + name, entry, machine, expected_machine, arch + ) + ) + base = os.path.basename(entry) + if "." in base[:-3] and arch not in base: + raise AssertionError( + "{}: extension filename '{}' does not name architecture '{}'".format( + name, base, arch + ) + ) + print(" {} -> {} (ELF {:#x})".format(name, base, machine)) + checked += 1 + + return checked + + +def main() -> None: + wheel_dir = sys.argv[1] + wheels = sorted( + f + for f in os.listdir(wheel_dir) + if f.endswith(".whl") and "linux" in f and not f.endswith("-none-any.whl") + ) + assert wheels, "no Linux-tagged native wheels collected under {}".format(wheel_dir) + + total = 0 + for wheel in wheels: + total += _check(os.path.join(wheel_dir, wheel)) + + assert total, "collected native wheels contain no extension modules: {}".format(wheels) + + +if __name__ == "__main__": + main() From a8ca49952d8536a87119e869861055370c1c5b5f Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 6 Aug 2026 11:57:46 -0600 Subject: [PATCH 016/103] crossbuild test cases --- .github/workflows/ci-workflows.yaml | 5 + .../pep517-frontend-exec-group/BUILD.bazel | 8 - .../uv-deps-650/crossbuild/geohash_main.py | 5 - e2e/crossbuild/.bazelrc | 16 +- e2e/crossbuild/.bazelversion | 2 +- e2e/crossbuild/BUILD.bazel | 58 ++ e2e/crossbuild/MODULE.bazel | 457 +++++++++++- e2e/crossbuild/MODULE.bazel.lock | 686 +++++++++++++----- e2e/crossbuild/awkward_cpp/BUILD.bazel | 15 + .../awkward_cpp_image_command_test.yaml | 9 + .../awkward_cpp/awkward_cpp_main.py | 24 + e2e/crossbuild/awkward_cpp/pyproject.toml | 15 + e2e/crossbuild/awkward_cpp/uv.lock | 349 +++++++++ e2e/crossbuild/bcrypt/BUILD.bazel | 16 + .../bcrypt/bcrypt_image_command_test.yaml | 9 + e2e/crossbuild/bcrypt/bcrypt_main.py | 17 + e2e/crossbuild/bcrypt/pyproject.toml | 14 + e2e/crossbuild/bcrypt/uv.lock | 178 +++++ e2e/crossbuild/contourpy/BUILD.bazel | 12 + .../contourpy_image_command_test.yaml | 9 + e2e/crossbuild/contourpy/contourpy_main.py | 30 + e2e/crossbuild/contourpy/pyproject.toml | 15 + e2e/crossbuild/contourpy/uv.lock | 364 ++++++++++ e2e/crossbuild/geohash/BUILD.bazel | 158 ++++ .../geohash/check_geohash_output.sh | 16 + .../geohash/geohash_image_command_test.yaml | 9 + e2e/crossbuild/geohash/geohash_main.py | 13 + .../geohash}/require_cxx_driver.patch | 0 e2e/crossbuild/jpype1/BUILD.bazel | 17 + .../jpype1/jpype1_image_command_test.yaml | 9 + e2e/crossbuild/jpype1/jpype1_main.py | 16 + e2e/crossbuild/jpype1/pyproject.toml | 14 + e2e/crossbuild/jpype1/uv.lock | 149 ++++ e2e/crossbuild/msgpack/BUILD.bazel | 16 + .../msgpack/msgpack_image_command_test.yaml | 9 + e2e/crossbuild/msgpack/msgpack_main.py | 16 + e2e/crossbuild/msgpack/pyproject.toml | 12 + e2e/crossbuild/msgpack/uv.lock | 133 ++++ e2e/crossbuild/numpy/BUILD.bazel | 16 + .../numpy/numpy_image_command_test.yaml | 9 + e2e/crossbuild/numpy/numpy_main.py | 28 + e2e/crossbuild/numpy/pyproject.toml | 14 + e2e/crossbuild/numpy/uv.lock | 211 ++++++ e2e/crossbuild/psutil/BUILD.bazel | 14 + .../psutil/psutil_image_command_test.yaml | 9 + e2e/crossbuild/psutil/psutil_main.py | 17 + e2e/crossbuild/psutil/pyproject.toml | 13 + e2e/crossbuild/psutil/uv.lock | 112 +++ e2e/crossbuild/pydantic_core/BUILD.bazel | 14 + .../pydantic_core_image_command_test.yaml | 9 + .../pydantic_core/pydantic_core_main.py | 14 + e2e/crossbuild/pydantic_core/pyproject.toml | 12 + e2e/crossbuild/pydantic_core/uv.lock | 194 +++++ .../crossbuild/pyproject.toml | 1 - e2e/crossbuild/rpds_py/BUILD.bazel | 16 + e2e/crossbuild/rpds_py/pyproject.toml | 12 + .../rpds_py/rpds_py_image_command_test.yaml | 9 + e2e/crossbuild/rpds_py/rpds_py_main.py | 13 + e2e/crossbuild/rpds_py/uv.lock | 205 ++++++ e2e/crossbuild/test.sh | 13 + e2e/crossbuild/tiktoken/BUILD.bazel | 16 + e2e/crossbuild/tiktoken/pyproject.toml | 14 + .../tiktoken/tiktoken_image_command_test.yaml | 10 + e2e/crossbuild/tiktoken/tiktoken_main.py | 27 + e2e/crossbuild/tiktoken/uv.lock | 382 ++++++++++ e2e/crossbuild/tools/BUILD.bazel | 65 +- e2e/crossbuild/tools/ant_layer.bzl | 33 + e2e/crossbuild/tools/assert_absent.py | 49 ++ e2e/crossbuild/tools/asserts.bzl | 107 +++ .../tools}/check_so_arch.sh | 17 +- e2e/crossbuild/tools/check_so_suffix.sh | 29 + e2e/crossbuild/tools/checks.bzl | 49 ++ e2e/crossbuild/tools/cross_case.bzl | 143 ++++ e2e/crossbuild/tools/rust_layer.bzl | 31 + e2e/crossbuild/tools/test_exec_toolchain.sh | 44 ++ .../tools}/toolchain_test.bzl | 0 .../uv-deps-650 => }/crossbuild/uv.lock | 54 -- e2e/crossbuild/zstandard/BUILD.bazel | 117 +++ e2e/crossbuild/zstandard/compare_backend.py | 52 ++ e2e/crossbuild/zstandard/pyproject.toml | 14 + e2e/crossbuild/zstandard/uv.lock | 222 ++++++ .../zstandard/zstandard_diff_test.yaml | 7 + 82 files changed, 5056 insertions(+), 281 deletions(-) delete mode 100644 e2e/cases/uv-deps-650/crossbuild/geohash_main.py create mode 100644 e2e/crossbuild/BUILD.bazel create mode 100644 e2e/crossbuild/awkward_cpp/BUILD.bazel create mode 100644 e2e/crossbuild/awkward_cpp/awkward_cpp_image_command_test.yaml create mode 100644 e2e/crossbuild/awkward_cpp/awkward_cpp_main.py create mode 100644 e2e/crossbuild/awkward_cpp/pyproject.toml create mode 100644 e2e/crossbuild/awkward_cpp/uv.lock create mode 100644 e2e/crossbuild/bcrypt/BUILD.bazel create mode 100644 e2e/crossbuild/bcrypt/bcrypt_image_command_test.yaml create mode 100644 e2e/crossbuild/bcrypt/bcrypt_main.py create mode 100644 e2e/crossbuild/bcrypt/pyproject.toml create mode 100644 e2e/crossbuild/bcrypt/uv.lock create mode 100644 e2e/crossbuild/contourpy/BUILD.bazel create mode 100644 e2e/crossbuild/contourpy/contourpy_image_command_test.yaml create mode 100644 e2e/crossbuild/contourpy/contourpy_main.py create mode 100644 e2e/crossbuild/contourpy/pyproject.toml create mode 100644 e2e/crossbuild/contourpy/uv.lock create mode 100644 e2e/crossbuild/geohash/BUILD.bazel create mode 100755 e2e/crossbuild/geohash/check_geohash_output.sh create mode 100644 e2e/crossbuild/geohash/geohash_image_command_test.yaml create mode 100644 e2e/crossbuild/geohash/geohash_main.py rename e2e/{cases/uv-deps-650/crossbuild => crossbuild/geohash}/require_cxx_driver.patch (100%) create mode 100644 e2e/crossbuild/jpype1/BUILD.bazel create mode 100644 e2e/crossbuild/jpype1/jpype1_image_command_test.yaml create mode 100644 e2e/crossbuild/jpype1/jpype1_main.py create mode 100644 e2e/crossbuild/jpype1/pyproject.toml create mode 100644 e2e/crossbuild/jpype1/uv.lock create mode 100644 e2e/crossbuild/msgpack/BUILD.bazel create mode 100644 e2e/crossbuild/msgpack/msgpack_image_command_test.yaml create mode 100644 e2e/crossbuild/msgpack/msgpack_main.py create mode 100644 e2e/crossbuild/msgpack/pyproject.toml create mode 100644 e2e/crossbuild/msgpack/uv.lock create mode 100644 e2e/crossbuild/numpy/BUILD.bazel create mode 100644 e2e/crossbuild/numpy/numpy_image_command_test.yaml create mode 100644 e2e/crossbuild/numpy/numpy_main.py create mode 100644 e2e/crossbuild/numpy/pyproject.toml create mode 100644 e2e/crossbuild/numpy/uv.lock create mode 100644 e2e/crossbuild/psutil/BUILD.bazel create mode 100644 e2e/crossbuild/psutil/psutil_image_command_test.yaml create mode 100644 e2e/crossbuild/psutil/psutil_main.py create mode 100644 e2e/crossbuild/psutil/pyproject.toml create mode 100644 e2e/crossbuild/psutil/uv.lock create mode 100644 e2e/crossbuild/pydantic_core/BUILD.bazel create mode 100644 e2e/crossbuild/pydantic_core/pydantic_core_image_command_test.yaml create mode 100644 e2e/crossbuild/pydantic_core/pydantic_core_main.py create mode 100644 e2e/crossbuild/pydantic_core/pyproject.toml create mode 100644 e2e/crossbuild/pydantic_core/uv.lock rename e2e/{cases/uv-deps-650 => }/crossbuild/pyproject.toml (88%) create mode 100644 e2e/crossbuild/rpds_py/BUILD.bazel create mode 100644 e2e/crossbuild/rpds_py/pyproject.toml create mode 100644 e2e/crossbuild/rpds_py/rpds_py_image_command_test.yaml create mode 100644 e2e/crossbuild/rpds_py/rpds_py_main.py create mode 100644 e2e/crossbuild/rpds_py/uv.lock create mode 100755 e2e/crossbuild/test.sh create mode 100644 e2e/crossbuild/tiktoken/BUILD.bazel create mode 100644 e2e/crossbuild/tiktoken/pyproject.toml create mode 100644 e2e/crossbuild/tiktoken/tiktoken_image_command_test.yaml create mode 100644 e2e/crossbuild/tiktoken/tiktoken_main.py create mode 100644 e2e/crossbuild/tiktoken/uv.lock create mode 100644 e2e/crossbuild/tools/ant_layer.bzl create mode 100644 e2e/crossbuild/tools/assert_absent.py create mode 100644 e2e/crossbuild/tools/asserts.bzl rename e2e/{cases/uv-deps-650/crossbuild => crossbuild/tools}/check_so_arch.sh (52%) create mode 100755 e2e/crossbuild/tools/check_so_suffix.sh create mode 100644 e2e/crossbuild/tools/checks.bzl create mode 100644 e2e/crossbuild/tools/cross_case.bzl create mode 100644 e2e/crossbuild/tools/rust_layer.bzl create mode 100755 e2e/crossbuild/tools/test_exec_toolchain.sh rename e2e/{cases/uv-deps-650/crossbuild => crossbuild/tools}/toolchain_test.bzl (100%) rename e2e/{cases/uv-deps-650 => }/crossbuild/uv.lock (68%) create mode 100644 e2e/crossbuild/zstandard/BUILD.bazel create mode 100644 e2e/crossbuild/zstandard/compare_backend.py create mode 100644 e2e/crossbuild/zstandard/pyproject.toml create mode 100644 e2e/crossbuild/zstandard/uv.lock create mode 100644 e2e/crossbuild/zstandard/zstandard_diff_test.yaml diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 65686c658..e6c7732d6 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -107,6 +107,11 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + # e2e/crossbuild runs an arm64 container from this amd64 runner + - if: matrix.workspace.slug == 'e2e-crossbuild' + uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 + with: + platforms: arm64 # Run `test //...`, then the workspace's test.sh if it has one - name: Test working-directory: ${{ matrix.workspace.path }} diff --git a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel index a5900813c..cf7fa314c 100644 --- a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel +++ b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel @@ -479,14 +479,6 @@ write_file( content = [ "#!/usr/bin/env bash", "set -euo pipefail", - # The build tool is configured for the HOST platform (see - # uv/private/pep517_whl/exec_transition.bzl) so that its Python build - # dependencies resolve against host-compatible wheels. Its own - # platform identity therefore varies with the host (on a darwin host - # the select above would take its default branch; on a linux x86_64 - # host it takes :linux_x86_64_config), so there is no stable value to - # assert here. What remains meaningful — and host-independent — is - # that the CC toolchain comes from the "target" exec group: "expected=\"$1\"", "compiler_actual=\"$(\"${CC}\")\"", "if [[ \"${compiler_actual}\" != \"${expected}\" ]]; then", diff --git a/e2e/cases/uv-deps-650/crossbuild/geohash_main.py b/e2e/cases/uv-deps-650/crossbuild/geohash_main.py deleted file mode 100644 index 4e3f98f27..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/geohash_main.py +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env python3 - -import geohash - -print(geohash.encode(37.7749, -122.4194)) diff --git a/e2e/crossbuild/.bazelrc b/e2e/crossbuild/.bazelrc index 6cb312c68..f8b70ea56 100644 --- a/e2e/crossbuild/.bazelrc +++ b/e2e/crossbuild/.bazelrc @@ -1,15 +1,3 @@ -# Match Bazel 9's default. Without this, PySdistNativeBuild actions on -# Bazel 8 run without a default PATH, and clang's compiled-in default -# linker (`ld`, not bundled with the hermetic LLVM toolchain) can't be -# located. With it on, Bazel injects a static PATH=/bin:/usr/bin:/usr/local/bin -# so clang's PATH search hits the runner's /usr/bin/ld. +# Without this, sdist build actions run with no PATH and clang can't find +# `ld` (not bundled with the hermetic LLVM toolchain). common --incompatible_strict_action_env - -# Enable path mapping so WhlInstall actions are exercised with -# supports-path-mapping. Actions that declare the execution requirement get -# configuration-stripped cache keys; those that don't still work normally. -build --experimental_output_paths=strip - -# Build without the bytes -common:ci --remote_download_outputs=minimal -common:ci --nobuild_runfile_links diff --git a/e2e/crossbuild/.bazelversion b/e2e/crossbuild/.bazelversion index 074c37b76..6adf95a25 100644 --- a/e2e/crossbuild/.bazelversion +++ b/e2e/crossbuild/.bazelversion @@ -1,4 +1,4 @@ -8.6.0 +8.5.1 # The first line of this file is used by Bazelisk and Bazel to be sure # the right version of Bazel is used to build and test this repo. # This also defines which version is used on CI. diff --git a/e2e/crossbuild/BUILD.bazel b/e2e/crossbuild/BUILD.bazel new file mode 100644 index 000000000..530464c4f --- /dev/null +++ b/e2e/crossbuild/BUILD.bazel @@ -0,0 +1,58 @@ +package(default_visibility = [ + "//awkward_cpp:__pkg__", + "//bcrypt:__pkg__", + "//contourpy:__pkg__", + "//geohash:__pkg__", + "//jpype1:__pkg__", + "//msgpack:__pkg__", + "//numpy:__pkg__", + "//psutil:__pkg__", + "//pydantic_core:__pkg__", + "//rpds_py:__pkg__", + "//tiktoken:__pkg__", + "//tools:__pkg__", + "//zstandard:__pkg__", +]) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--stripopt=--strip-all", + ], +) + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--stripopt=--strip-all", + ], +) + +# Used only from a macOS host — see test.sh. +platform( + name = "arm64_macos", + constraint_values = [ + "@platforms//os:macos", + "@platforms//cpu:aarch64", + ], +) + +platform( + name = "amd64_macos", + constraint_values = [ + "@platforms//os:macos", + "@platforms//cpu:x86_64", + ], +) diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 04afffa9d..bbac0109a 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -1,37 +1,139 @@ -"""Isolated workspace for cross-platform source-build (crossbuild) suites. - -Hosts the rules_pycross ports: every case here forces packages to build from -their sdists and asserts properties of the resulting wheels across target -platforms. They live apart from `e2e/cases` because this workspace is where -the cross-compilation test matrix grows; keeping the sdist-build hubs out of -the shared `cases/` module also keeps their package-specific overrides -(`default_build_dependencies`, patches, `resource_set`) from leaking onto -unrelated cases sharing that workspace. +"""Cross-compiled sdist e2e coverage — isolated from `e2e/cases`. + +`python-geohash` (a real C++ extension) is built for linux/amd64 and +linux/arm64 from the same amd64 exec host, exercising `pep517_native_whl`'s +cross path end to end. Isolated from `e2e/cases` because +`default_build_dependencies`, the pre-build patch, and +`resource_set = "mem_4g"` are specific to `python-geohash` and would +otherwise leak onto unrelated packages sharing the hub. + +The Linux cross toolchain is `gcc_toolchain` (real GCC, hermetic sysroots), +not LLVM: clang is a native cross-compiler and papers over missing +sysroot/flag propagation in ways a stricter GCC cross toolchain won't — for +instance gcc_toolchain does not auto-link libstdc++, so a C++ build here +only succeeds if `cc_layer.bzl` actually forwards the link flags it should. + +On a macOS host, BUILD.bazel's geohash_macos_* targets also build for +arm64/amd64 macOS via the Xcode SDK; see test.sh for why those are `manual` +rather than plain `platform_transition_filegroup` targets. gcc_toolchain is +Linux-only, so geohash_macos_amd64_cross_test has no registered toolchain +for its target/exec combination and will fail analysis with a clear +diagnostic if ever run — this path was already unverified (no CI runs it), +so failing loudly here is a wash, not a regression. + +`//zstandard` cross-compiles a package that also ships official prebuilt +wheels, and diffs our build's compressed output against theirs — a stronger +check than `//geohash`'s fixed expected value, since it validates against an +independent reference build rather than a hardcoded string. + +`//contourpy` (meson-python) and `//awkward_cpp` (scikit-build-core/CMake) +exercise cross support for those two backends, on top of `//geohash` and +`//zstandard`'s setuptools/distutils coverage — `build_helper.py` generates a +meson cross file / CMake toolchain file per build, since neither backend's +own cross auto-detection covers a plain Linux-arch cross build (both only +special-case macOS ARCHFLAGS, plus Android/iOS for meson-python). + +`//rpds_py` (maturin/PyO3, real Rust) needs its own Cargo toolchain: `rust` +registers x86_64 (exec) and arm64 (target) rust_toolchains, and +build_helper.py sets CARGO_BUILD_TARGET / CARGO_TARGET__LINKER since +Cargo has no cross auto-detection at all — every build needs an explicit +--target and a linker for it, or it silently falls back to $CC (the host +driver) and fails at the link step. The arm64-*targeting* rust_toolchain's +sysroot only bundles LLVM's own runtime libs for the exec platform, not its +rust-std (needed to compile build scripts/proc-macros, always host +artifacts) — `//tools:rust_host_sysroot` pins the plain x86_64 toolchain by +label (bypassing toolchain resolution, which under this cross transition +would otherwise hand back the arm64-targeting one again) so +build_helper.py can merge the two sysroots into one Cargo can actually use. + +`//pydantic_core` (maturin/PyO3, ~100 transitive crates vs. //rpds_py's ~20) +and `//bcrypt` (setuptools-rust — a build-backend of plain +"setuptools.build_meta" with "setuptools-rust" only visible in +build-system.requires, and no --target flag of its own either — it shells +out to a bare `cargo rustc` and relies on the same $CARGO_BUILD_TARGET) each +add a second, widely-used real-world package per Rust code path, so neither +is validated by one lucky package alone. setuptools-rust also needed +PYO3_CROSS_PYTHON_VERSION: maturin auto-generates a PYO3_CONFIG_FILE for +pyo3-ffi's build script, but setuptools-rust gives it no cross help at all. +`//psutil` is a second, far more widely-used plain setuptools/distutils +C-extension package alongside `//geohash` and `//zstandard`, for the same +"one lucky package" reason. + +`//jpype1` (scikit-build-core/CMake, same backend as `//awkward_cpp`) needs +a JDK and Apache Ant on top of that — but both are always exec-platform +tools regardless of what CPU `_jpype.so` targets: it only links against +libdl (see its CMakeLists.txt), never libjvm/libjawt, and the JAR Ant +produces is portable JVM bytecode, so unlike Rust's rust-std there's no +host/target split to solve here. `@bazel_tools//tools/jdk:current_java_runtime` +(used by e.g. `e2e/cases/uv-sdist-jdk-build`) resolves to rules_java's +default remotejdk, which is actually Azul Zulu, not genuine Eclipse +Temurin — `@temurin11_linux_x86_64` fetches a real Temurin 11 build instead +(see its `http_archive` for the exact Adoptium release metadata). Ant ships +no Bazel toolchain at all upstream, hermetic or otherwise, so +`@apache_ant` + `//tools:ant_home` vendor and expose it the same way. + +`//msgpack` is a third setuptools/distutils C-extension package, distinct +from `//geohash` (hand-written C++) and `//psutil`/`//zstandard` (hand-written +C/CFFI): its extension is Cython-generated, committed as pre-Cythonized .c +in the sdist, exercising that code-generation path's symbol/link pattern +rather than a fourth hand-written one. + +`//tiktoken` is a second setuptools-rust package alongside `//bcrypt` (same +build-backend shape, same $CARGO_BUILD_TARGET-driven cross path) — not a +maturin package despite superficially resembling `//rpds_py`/ +`//pydantic_core`; verified against its real sdist pyproject.toml before +wiring it in. Its own encodings download BPE vocab files over the network on +first use, which a sandboxed cross build/QEMU container can't do, so +tiktoken_main.py builds a minimal `tiktoken.Encoding` directly instead — +still a real round-trip through the compiled Rust core, just without the +network dependency. + +`//numpy` is the only other widely-used meson-python package besides +`//contourpy` — its build has no cross auto-detection for a missing system +BLAS/LAPACK either (meson-python only special-cases the macOS ARCHFLAGS/ +Android/iOS cases build_helper.py already works around), so it needs its +own `-Dblas=none -Dlapack=none` (numpy's own documented no-BLAS recipe, see +its emscripten cibuildwheel config) passed via a new, backend-generic +RULES_PY_MESON_SETUP_ARGS env var — needed for the *native* build here too, +since this sandbox has no system BLAS/LAPACK either, not just the cross one. """ bazel_dep(name = "aspect_rules_py") +bazel_dep(name = "bazel_features", version = "1.38.0") +bazel_dep(name = "bazel_skylib", version = "1.4.2") bazel_dep(name = "bazel_lib", version = "3.0.0") +bazel_dep(name = "rules_cc", version = "0.2.16") +bazel_dep(name = "tar.bzl", version = "0.10.1") bazel_dep(name = "platforms", version = "1.0.0") -bazel_dep(name = "llvm", version = "0.8.3") +bazel_dep(name = "gcc_toolchain", version = "0.11.0") +bazel_dep(name = "rules_oci", version = "2.2.7") +bazel_dep(name = "rules_shell", version = "0.4.1") +bazel_dep(name = "container_structure_test", version = "1.22.1") +bazel_dep(name = "rules_rust", version = "0.68.0") +bazel_dep(name = "rules_java", version = "8.14.0") local_path_override( module_name = "aspect_rules_py", path = "../..", ) +# Ensure any transitive "aspect_bazel_lib" is latest to be forward compatible with bazel_lib 3+ +single_version_override( + module_name = "aspect_bazel_lib", + version = "2.22.5", +) + interpreters = use_extension("@aspect_rules_py//py:extensions.bzl", "python_interpreters") interpreters.configure( releases = [ "20260303", "20251031", + "20241002", ], ) interpreters.toolchain( python_version = "3.12", ) -interpreters.toolchain( - python_version = "3.13", -) use_repo(interpreters, "python_interpreters") register_toolchains("@python_interpreters//:all") @@ -42,13 +144,330 @@ use_repo(tools, "rules_py_tools") register_toolchains("@rules_py_tools//:all") -register_toolchains("@llvm//toolchain:all") +gcc_toolchains = use_extension("@gcc_toolchain//toolchain:module_extensions.bzl", "gcc_toolchains") +gcc_toolchains.toolchain( + name = "gcc_toolchain_x86_64", + target_arch = "x86_64", +) +gcc_toolchains.toolchain( + name = "gcc_toolchain_aarch64", + target_arch = "aarch64", +) +use_repo(gcc_toolchains, "gcc_toolchain_aarch64", "gcc_toolchain_x86_64") + +register_toolchains( + "@gcc_toolchain_x86_64//:cc_toolchain", + "@gcc_toolchain_aarch64//:cc_toolchain", +) + +rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") +rust.toolchain( + edition = "2021", + extra_target_triples = ["aarch64-unknown-linux-gnu"], + versions = ["1.90.0"], +) +use_repo(rust, "rust_toolchains") + +register_toolchains("@rust_toolchains//:all") + +oci = use_extension("@rules_oci//oci:extensions.bzl", "oci") +oci.pull( + name = "ubuntu", + digest = "sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54", + image = "public.ecr.aws/docker/library/ubuntu", + platforms = [ + "linux/arm64/v8", + "linux/amd64", + ], + tag = "latest", +) +use_repo(oci, "ubuntu", "ubuntu_linux_amd64", "ubuntu_linux_arm64_v8") + +# Used by assert_tar_listing (tools/asserts.bzl). +bazel_lib_toolchains = use_extension("@tar.bzl//tar:extensions.bzl", "toolchains", dev_dependency = True) +use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") uv_bin = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv_bin") -uv_bin.toolchain(version = "0.11.21") +uv_bin.toolchain(version = "0.11.6") use_repo(uv_bin, "uv") -include("//pycross-distutils-probe:setup.MODULE.bazel") -include("//pycross-patches:setup.MODULE.bazel") -include("//pycross-pure-python:setup.MODULE.bazel") -include("//pycross-setuptools:setup.MODULE.bazel") +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild") +uv.project( + default_build_dependencies = [ + "build", + "cffi", + "setuptools", + ], + hub_name = "pypi_crossbuild", + lock = "//:uv.lock", + pyproject = "//:pyproject.toml", +) +uv.override_package( + name = "python-geohash", + lock = "//:uv.lock", + pre_build_patch_strip = 1, + pre_build_patches = ["//geohash:require_cxx_driver.patch"], + resource_set = "mem_4g", +) +use_repo(uv, "pypi_crossbuild") + +# Plain setuptools/meson-python/scikit-build-core hubs: no rust/jdk toolchain +# wiring, so each is fully described by (hub dir, its build deps). +_SIMPLE_CROSSBUILD_PACKAGES = [ + { + "deps": [ + "build", + "cffi", + "setuptools", + "wheel", + ], + "hub": "zstandard", + }, + { + "deps": [ + "build", + "meson", + "meson-python", + "ninja", + "pybind11", + ], + "hub": "contourpy", + }, + { + "deps": [ + "build", + "cmake", + "ninja", + "pybind11", + "scikit-build-core", + ], + "hub": "awkward_cpp", + }, + { + "deps": [ + "build", + "setuptools", + "wheel", + ], + "hub": "psutil", + }, + { + "deps": [ + "build", + "setuptools", + ], + "hub": "msgpack", + }, +] + +[uv.declare_hub(hub_name = "pypi_crossbuild_" + pkg["hub"]) for pkg in _SIMPLE_CROSSBUILD_PACKAGES] + +[ + uv.project( + default_build_dependencies = pkg["deps"], + hub_name = "pypi_crossbuild_" + pkg["hub"], + lock = "//{}:uv.lock".format(pkg["hub"]), + pyproject = "//{}:pyproject.toml".format(pkg["hub"]), + ) + for pkg in _SIMPLE_CROSSBUILD_PACKAGES +] + +[use_repo(uv, "pypi_crossbuild_" + pkg["hub"]) for pkg in _SIMPLE_CROSSBUILD_PACKAGES] + +# maturin/PyO3 + setuptools-rust hubs: all three need the identical Cargo +# cross env/toolchains wiring (see //tools:rust_host_sysroot); a shared block +# also makes that identical-ness visually obvious instead of relying on the +# reader to diff three near-copies. "pypi_name" differs from "hub" for +# rpds_py/pydantic_core since PyPI hyphenates what the hub dir underscores. +_RUST_CROSSBUILD_PACKAGES = [ + { + "deps": [ + "build", + "maturin", + ], + "hub": "rpds_py", + "pypi_name": "rpds-py", + }, + { + "deps": [ + "build", + "setuptools", + "setuptools-rust", + "wheel", + ], + "hub": "bcrypt", + "pypi_name": "bcrypt", + }, + { + "deps": [ + "build", + "maturin", + ], + "hub": "pydantic_core", + "pypi_name": "pydantic-core", + }, + { + "deps": [ + "build", + "setuptools", + "setuptools-rust", + "wheel", + ], + "hub": "tiktoken", + "pypi_name": "tiktoken", + }, +] + +[uv.declare_hub(hub_name = "pypi_crossbuild_" + pkg["hub"]) for pkg in _RUST_CROSSBUILD_PACKAGES] + +[ + uv.project( + default_build_dependencies = pkg["deps"], + hub_name = "pypi_crossbuild_" + pkg["hub"], + lock = "//{}:uv.lock".format(pkg["hub"]), + pyproject = "//{}:pyproject.toml".format(pkg["hub"]), + ) + for pkg in _RUST_CROSSBUILD_PACKAGES +] + +[ + uv.override_package( + name = pkg["pypi_name"], + env = { + "CARGO": "$(CARGO)", + "RUSTC": "$(RUSTC)", + "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", + }, + lock = "//{}:uv.lock".format(pkg["hub"]), + toolchains = [ + "@rules_rust//rust/toolchain:current_rust_toolchain", + "//tools:rust_host_sysroot", + ], + ) + for pkg in _RUST_CROSSBUILD_PACKAGES +] + +[use_repo(uv, "pypi_crossbuild_" + pkg["hub"]) for pkg in _RUST_CROSSBUILD_PACKAGES] + +uv.declare_hub(hub_name = "pypi_crossbuild_numpy") +uv.project( + default_build_dependencies = [ + "build", + "cython", + "meson-python", + "ninja", + ], + hub_name = "pypi_crossbuild_numpy", + lock = "//numpy:uv.lock", + pyproject = "//numpy:pyproject.toml", +) +uv.override_package( + # numpy has no system BLAS/LAPACK in this sandbox (native build) or in + # the cross toolchain (cross build) — no toolchain needed, just a + # literal extra meson setup-args value, same as numpy's own documented + # no-BLAS cross recipe (see its emscripten cibuildwheel config). + name = "numpy", + env = { + "RULES_PY_MESON_SETUP_ARGS": "-Dblas=none -Dlapack=none", + }, + lock = "//numpy:uv.lock", +) +use_repo(uv, "pypi_crossbuild_numpy") + +uv.declare_hub(hub_name = "pypi_crossbuild_jpype1") +uv.project( + default_build_dependencies = [ + "build", + "scikit-build-core", + "setuptools", + "wheel", + ], + hub_name = "pypi_crossbuild_jpype1", + lock = "//jpype1:uv.lock", + pyproject = "//jpype1:pyproject.toml", +) +uv.override_package( + name = "jpype1", + env = { + "JAVA": "$(JAVA)", + "JAVA_HOME": "$(JAVABASE)", + "RULES_PY_ANT_BIN_DIR": "$(ANT_BIN_DIR)", + }, + lock = "//jpype1:uv.lock", + toolchains = [ + "@temurin11_linux_x86_64//:jdk", + "//tools:ant_home", + ], +) +use_repo(uv, "pypi_crossbuild_jpype1") + +# Official prebuilt wheels to diff our cross-compiled build against. +http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "official_zstandard_amd64_linux", + build_file_content = """filegroup(name = "backend_c", srcs = ["zstandard/backend_c.cpython-312-x86_64-linux-gnu.so"], visibility = ["//visibility:public"])""", + sha256 = "466e6ad8caefb589ed281c076deb6f0cd330e8bc13c5035854ffb9c2014b118c", + type = "zip", + url = "https://files.pythonhosted.org/packages/e5/01/080939755ca12ebbb7fc38b6f4ddecd5e8c416d571d4927ece1360baba2c/zstandard-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", +) + +http_archive( + name = "official_zstandard_arm64_linux", + build_file_content = """filegroup(name = "backend_c", srcs = ["zstandard/backend_c.cpython-312-aarch64-linux-gnu.so"], visibility = ["//visibility:public"])""", + sha256 = "a88b7df61a292603e7cd662d92565d915796b094ffb3d206579aaebac6b85d5f", + type = "zip", + url = "https://files.pythonhosted.org/packages/47/44/be2d67304ba9bf4694ffcaa99d146814d70c4cb0bfc00e0e86fdfae66a31/zstandard-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", +) + +# jpype1 only ever runs Ant/javac at build time to produce a JAR (portable +# Java bytecode) — always a host-executed step regardless of what CPU the +# compiled _jpype.so targets, so a single exec-platform (x86_64) JDK and a +# single (architecture-independent) Ant install cover both the native and +# cross builds. Genuine Eclipse Temurin, not rules_java's default remotejdk +# (which resolves to Azul Zulu builds) — see fetched release metadata at +# https://api.adoptium.net/v3/assets/latest/11/hotspot?image_type=jdk&os=linux&architecture=x64. +http_archive( + name = "temurin11_linux_x86_64", + build_file_content = """load("@rules_java//java/toolchains:java_runtime.bzl", "java_runtime") + +package(default_visibility = ["//visibility:public"]) + +filegroup(name = "jdk-bin", srcs = glob(["bin/**"])) + +filegroup(name = "jdk-conf", srcs = glob(["conf/**"], allow_empty = True)) + +filegroup(name = "jdk-include", srcs = glob(["include/**"], allow_empty = True)) + +filegroup(name = "jdk-lib", srcs = glob(["lib/**", "release"], allow_empty = True)) + +java_runtime( + name = "jdk", + srcs = [":jdk-bin", ":jdk-conf", ":jdk-include", ":jdk-lib"], + java = "bin/java", + version = 11, +) +""", + sha256 = "5906e0339e9322a688b2375eaf40666e00a16e008b0067b0a9f9e4b6c5033720", + strip_prefix = "jdk-11.0.32+9", + url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.32%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.32_9.tar.gz", +) + +# Apache Ant: plain Java bytecode plus shell/bat launchers — no architecture +# variants needed. +http_archive( + name = "apache_ant", + build_file_content = """package(default_visibility = ["//visibility:public"]) + +exports_files(["bin/ant"]) + +filegroup( + name = "all_files", + srcs = glob(["**"], allow_empty = True), +) +""", + sha256 = "71334d7e5d98cfe53d6c429a648a5021137a967378667306c5f613dff5180506", + strip_prefix = "apache-ant-1.10.15", + url = "https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.15-bin.tar.gz", +) diff --git a/e2e/crossbuild/MODULE.bazel.lock b/e2e/crossbuild/MODULE.bazel.lock index 60f5caa49..e93959739 100644 --- a/e2e/crossbuild/MODULE.bazel.lock +++ b/e2e/crossbuild/MODULE.bazel.lock @@ -10,9 +10,15 @@ "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", + "https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442", + "https://bcr.bazel.build/modules/apple_support/1.24.1/MODULE.bazel": "f46e8ddad60aef170ee92b2f3d00ef66c147ceafea68b6877cb45bd91737f5f8", + "https://bcr.bazel.build/modules/apple_support/1.24.1/source.json": "cf725267cbacc5f028ef13bb77e7f2c2e0066923a4dab1025e4a0511b1ed258a", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.5/MODULE.bazel": "004ba890363d05372a97248c37205ae64b6fa31047629cd2c0895a9d0c7779e8", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.5/source.json": "ac2c3213df8f985785f1d0aeb7f0f73d5324e6e67d593d9b9470fb74a25d4a9b", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", @@ -20,18 +26,20 @@ "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", "https://bcr.bazel.build/modules/bazel_features/1.24.0/MODULE.bazel": "4796b4c25b47053e9bbffa792b3792d07e228ff66cd0405faef56a978708acd4", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", + "https://bcr.bazel.build/modules/bazel_features/1.32.0/MODULE.bazel": "095d67022a58cb20f7e20e1aefecfa65257a222c18a938e2914fd257b5f1ccdc", "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", + "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "https://bcr.bazel.build/modules/bazel_features/1.42.0/MODULE.bazel": "e8ca15cb2639c5f12183db6dcb678735555d0cdd739b32a0418b6532b5e565f8", "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", - "https://bcr.bazel.build/modules/bazel_lib/3.2.2/MODULE.bazel": "e2c890c8a515d6bca9c66d47718aa9e44b458fde64ec7204b8030bf2d349058c", - "https://bcr.bazel.build/modules/bazel_lib/3.2.2/source.json": "9e84e115c20e14652c5c21401ae85ff4daa8702e265b5c0b3bf89353f17aa212", + "https://bcr.bazel.build/modules/bazel_lib/3.3.1/MODULE.bazel": "732a0d516cf6400d9b3136e4356258aef1bf91de8d5240f87f0112f098920c1d", + "https://bcr.bazel.build/modules/bazel_lib/3.3.1/source.json": "8e5175d7b4125a39b8941d01e38039934d058e03804f46a2b8fd7ae6316b1ce2", "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", @@ -50,9 +58,14 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/container_structure_test/1.22.1/MODULE.bazel": "da58a98f9f6d47e702532fdfec0431bd60e417d3f004471f409a4543cae0e61e", + "https://bcr.bazel.build/modules/container_structure_test/1.22.1/source.json": "75873f230014ff7a6f30e9f81b9e31ee4593c71353ffa8d5f8fe4ad4aba21160", + "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", + "https://bcr.bazel.build/modules/gcc_toolchain/0.11.0/MODULE.bazel": "aaa5a4209a1a7cd1284413c10c81d980d3d51805d86e0e1e5691d044bcd5d917", + "https://bcr.bazel.build/modules/gcc_toolchain/0.11.0/source.json": "66a3cbd9b068123fae2c3b63bb35f180f218ce09987e9a7a5e5c2d2393dcc761", "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", @@ -60,11 +73,12 @@ "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/MODULE.bazel": "67ff71bbfb482e58510451c4c8b8cd303c757f7ff79a2aff7cf381277be96f9f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/source.json": "475aa00426677e643e327b4b031d8816a3bc0a134c94d0d0d510cfd67b2cfd2c", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/MODULE.bazel": "2ce69b1af49952cd4121a9c3055faa679e748ce774c7f1fda9657f936cae902f", + "https://bcr.bazel.build/modules/jq.bzl/0.1.0/source.json": "746bf13cac0860f091df5e4911d0c593971cd8796b5ad4e809b2f8e133eee3d5", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/llvm/0.8.3/MODULE.bazel": "dbc1bc13171f8f9980a75524883abef1c491613e8d8d805cd4ffa3767ba9708e", - "https://bcr.bazel.build/modules/llvm/0.8.3/source.json": "4b11874c26a9de53c03a25a517ebc36dee6b458c920fe9ed65e3ca279ff19775", + "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92", "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", @@ -74,6 +88,7 @@ "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", @@ -105,9 +120,11 @@ "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", + "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", @@ -140,9 +157,12 @@ "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_oci/2.2.7/MODULE.bazel": "f6150e4b224d459f7f6523ef65967464ca4efdd266c7fbf2f5a2a51011957e0c", + "https://bcr.bazel.build/modules/rules_oci/2.2.7/source.json": "b099f02af330f47f19dc67fc9300ef6e1937a8c86882690db0e7a2fcea8c7f6b", "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", + "https://bcr.bazel.build/modules/rules_pkg/1.1.0/source.json": "fef768df13a92ce6067e1cd0cdc47560dace01354f1d921cfb1d632511f7d608", "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", @@ -155,9 +175,11 @@ "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", - "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_rust/0.68.0/MODULE.bazel": "dcb4fe4396b49d3b2d72bccf634d27499dd2a58dcdfccfe8e17ba15c4bd150ae", + "https://bcr.bazel.build/modules/rules_rust/0.68.0/source.json": "e5d5f37874c4af13dbdfbf1220889607d9b3cc51f2831e10c2035b6638442f07", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", @@ -170,11 +192,13 @@ "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", - "https://bcr.bazel.build/modules/tar.bzl/0.10.4/MODULE.bazel": "e8f9ff79199e8d9eaad7f1b0a77ad74b30bb82d794b87d8ca942bead5de83ae9", - "https://bcr.bazel.build/modules/tar.bzl/0.10.4/source.json": "20143442376c03426f6135292ba02d825cb75308aa47e6bf42dd4cc5a435c2ff", + "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", + "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/MODULE.bazel": "b573395fe63aef4299ba095173e2f62ccfee5ad9bbf7acaa95dba73af9fc2b38", - "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/source.json": "3f3fbaeafecaf629877ad152a2c9def21f8d330d91aa94c5dc75bbb98c10b8b8", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/MODULE.bazel": "6b6c543e415d2a502954766e50c6a6144a131687f2751b62157a9250e2b04982", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/source.json": "12363ac76d821f6c7dabfebbd673615391da06e2e33f576402d31a96a7b56532", + "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", + "https://bcr.bazel.build/modules/yq.bzl/0.1.1/source.json": "2d2bad780a9f2b9195a4a370314d2c17ae95eaa745cefc2e12fbc49759b15aa3", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", @@ -214,200 +238,120 @@ ] } }, - "@@llvm+//3rd_party/gcc/extension:gcc.bzl%gcc": { + "@@container_structure_test+//:repositories.bzl%extension": { "general": { - "bzlTransitiveDigest": "XUWTels9SzO7xhmQBqYtaFYFMTjrFMSDFi/Q7hv4f34=", - "usagesDigest": "9IP/e++b81Ga1zICxzXu+yqfe5i4DX5F/SsrgV5a568=", + "bzlTransitiveDigest": "jyF1qaqe3SV7GOwa1PtIiJk04CPKLgKbWZoD1aX28NU=", + "usagesDigest": "uXk1ym4ketE3OMAHoR5fUuuv8pOmi0aSyCe28koTwfA=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { - "gcc": { - "repoRuleId": "@@llvm+//:http_bsdtar_archive.bzl%http_bsdtar_archive", + "jq_darwin_amd64": { + "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", "attributes": { - "build_file": "@@llvm+//3rd_party/gcc:gcc.BUILD.bazel", - "includes": [ - "gcc/BASE-VER", - "gcc/DATESTAMP", - "gcc/ginclude/unwind-arm-common.h", - "config/acx.m4", - "config/cet.m4", - "config/futex.m4", - "config/gc++filt.m4", - "config/gthr.m4", - "config/hwcaps.m4", - "config/iconv.m4", - "config/lthostflags.m4", - "config/multi.m4", - "config/no-executables.m4", - "config/tls.m4", - "config/toolexeclibdir.m4", - "config/unwind_ipinfo.m4", - "include/ansidecl.h", - "include/demangle.h", - "include/dyn-string.h", - "include/getopt.h", - "include/libiberty.h", - "libgcc/gthr-posix.h", - "libgcc/gthr-single.h", - "libgcc/gthr.h", - "libgcc/config/arm/unwind-arm.h", - "libgcc/unwind-generic.h", - "libgcc/unwind-pe.h", - "libiberty/cp-demangle.c", - "libiberty/cp-demangle.h", - "libstdc++-v3/acinclude.m4", - "libstdc++-v3/config/**", - "libstdc++-v3/configure.ac", - "libstdc++-v3/configure.host", - "libstdc++-v3/crossconfig.m4", - "libstdc++-v3/linkage.m4", - "libstdc++-v3/include/**", - "libstdc++-v3/libsupc++/**", - "libstdc++-v3/src/**" - ], - "sha256": "dc033fdfd79caf199113446af6d082004534437b6ebd276f9732815d86cbe723", - "strip_prefix": "gcc-2bfd402f8569511901ec8fe7628f57471e6d240a", - "urls": [ - "https://github.com/gcc-mirror/gcc/archive/2bfd402f8569511901ec8fe7628f57471e6d240a.tar.gz" - ] + "platform": "darwin_amd64", + "version": "1.7" } - } - }, - "recordedRepoMappingEntries": [ - [ - "llvm+", - "bazel_lib", - "bazel_lib+" - ], - [ - "llvm+", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@pybind11_bazel+//:python_configure.bzl%extension": { - "general": { - "bzlTransitiveDigest": "D2/qWHU6yQFwRG7Bb+caqrYMha5avsASao2vERrxK24=", - "usagesDigest": "fycyB39YnXIJkfWCIXLUKJMZzANcuLy9ZE73hRucjFk=", - "recordedFileInputs": { - "@@pybind11_bazel+//MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" - }, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_python": { - "repoRuleId": "@@pybind11_bazel+//:python_configure.bzl%python_configure", - "attributes": {} }, - "pybind11": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "jq_darwin_arm64": { + "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", "attributes": { - "build_file": "@@pybind11_bazel+//:pybind11.BUILD", - "strip_prefix": "pybind11-2.11.1", - "urls": [ - "https://github.com/pybind/pybind11/archive/v2.11.1.zip" - ] + "platform": "darwin_arm64", + "version": "1.7" } - } - }, - "recordedRepoMappingEntries": [ - [ - "pybind11_bazel+", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_fuzzing+//fuzzing/private:extensions.bzl%non_module_dependencies": { - "general": { - "bzlTransitiveDigest": "4LouzhF/yT117s7peGnNs9ROomiJXC6Zl5R0oI21jho=", - "usagesDigest": "wy6ISK6UOcBEjj/mvJ/S3WeXoO67X+1llb9yPyFtPgc=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "platforms": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + }, + "jq_linux_amd64": { + "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", - "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz" - ], - "sha256": "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74" + "platform": "linux_amd64", + "version": "1.7" } }, - "rules_python": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "jq_linux_arm64": { + "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", "attributes": { - "sha256": "d70cd72a7a4880f0000a6346253414825c19cdd40a28289bdf67b8e6480edff8", - "strip_prefix": "rules_python-0.28.0", - "url": "https://github.com/bazelbuild/rules_python/releases/download/0.28.0/rules_python-0.28.0.tar.gz" + "platform": "linux_arm64", + "version": "1.7" } }, - "bazel_skylib": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "jq_windows_amd64": { + "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", "attributes": { - "sha256": "cd55a062e763b9349921f0f5db8c3933288dc8ba4f76dd9416aac68acee3cb94", - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz" - ] + "platform": "windows_amd64", + "version": "1.7" } }, - "com_google_absl": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "jq": { + "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_host_alias_repo", + "attributes": {} + }, + "jq_toolchains": { + "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_toolchains_repo", "attributes": { - "urls": [ - "https://github.com/abseil/abseil-cpp/archive/refs/tags/20240116.1.zip" - ], - "strip_prefix": "abseil-cpp-20240116.1", - "integrity": "sha256-7capMWOvWyoYbUaHF/b+I2U6XLMaHmky8KugWvfXYuk=" + "user_repository_name": "jq" } }, - "rules_fuzzing_oss_fuzz": { - "repoRuleId": "@@rules_fuzzing+//fuzzing/private/oss_fuzz:repository.bzl%oss_fuzz_repository", - "attributes": {} + "structure_test_st_darwin_amd64": { + "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", + "attributes": { + "platform": "darwin_amd64" + } }, - "honggfuzz": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "structure_test_st_darwin_arm64": { + "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", "attributes": { - "build_file": "@@rules_fuzzing+//:honggfuzz.BUILD", - "sha256": "6b18ba13bc1f36b7b950c72d80f19ea67fbadc0ac0bb297ec89ad91f2eaa423e", - "url": "https://github.com/google/honggfuzz/archive/2.5.zip", - "strip_prefix": "honggfuzz-2.5" + "platform": "darwin_arm64" } }, - "rules_fuzzing_jazzer": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar", + "structure_test_st_linux_arm64": { + "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", "attributes": { - "sha256": "ee6feb569d88962d59cb59e8a31eb9d007c82683f3ebc64955fd5b96f277eec2", - "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer/0.20.1/jazzer-0.20.1.jar" + "platform": "linux_arm64" } }, - "rules_fuzzing_jazzer_api": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar", + "structure_test_st_linux_s390x": { + "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", "attributes": { - "sha256": "f5a60242bc408f7fa20fccf10d6c5c5ea1fcb3c6f44642fec5af88373ae7aa1b", - "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer-api/0.20.1/jazzer-api-0.20.1.jar" + "platform": "linux_s390x" + } + }, + "structure_test_st_linux_amd64": { + "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", + "attributes": { + "platform": "linux_amd64" + } + }, + "structure_test_st_windows_amd64": { + "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", + "attributes": { + "platform": "windows_amd64" + } + }, + "structure_test_toolchains": { + "repoRuleId": "@@container_structure_test+//bazel:toolchains_repo.bzl%toolchains_repo", + "attributes": { + "toolchain_type": "@container_structure_test//bazel:structure_test_toolchain_type", + "toolchain": "@structure_test_st_{platform}//:structure_test_toolchain" } } }, "recordedRepoMappingEntries": [ [ - "rules_fuzzing+", + "aspect_bazel_lib+", "bazel_tools", "bazel_tools" + ], + [ + "container_structure_test+", + "aspect_bazel_lib", + "aspect_bazel_lib+" ] ] } }, "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { - "bzlTransitiveDigest": "nvW/NrBXlAmiQw99EMGKkLaD2KbNp2mQDlxdfpr+0Ls=", + "bzlTransitiveDigest": "rL/34P1aFDq2GqVC2zCFgQ8nTuOC6ziogocpvG50Qz8=", "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -469,9 +413,213 @@ ] } }, + "@@rules_oci+//oci:extensions.bzl%oci": { + "general": { + "bzlTransitiveDigest": "btafL5urts9jH0gR3UVdsG7OprxGfLk14aFXX/G5FdU=", + "usagesDigest": "9ABtbohz+3s6dpNBjutox5VF5aRBXAiiB40cBGEQvYM=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "ubuntu_linux_arm64_v8": { + "repoRuleId": "@@rules_oci+//oci/private:pull.bzl%oci_pull", + "attributes": { + "www_authenticate_challenges": {}, + "scheme": "https", + "registry": "public.ecr.aws", + "repository": "docker/library/ubuntu", + "identifier": "sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54", + "platform": "linux/arm64/v8", + "target_name": "ubuntu_linux_arm64_v8", + "bazel_tags": [] + } + }, + "ubuntu_linux_amd64": { + "repoRuleId": "@@rules_oci+//oci/private:pull.bzl%oci_pull", + "attributes": { + "www_authenticate_challenges": {}, + "scheme": "https", + "registry": "public.ecr.aws", + "repository": "docker/library/ubuntu", + "identifier": "sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54", + "platform": "linux/amd64", + "target_name": "ubuntu_linux_amd64", + "bazel_tags": [] + } + }, + "ubuntu": { + "repoRuleId": "@@rules_oci+//oci/private:pull.bzl%oci_alias", + "attributes": { + "target_name": "ubuntu", + "www_authenticate_challenges": {}, + "scheme": "https", + "registry": "public.ecr.aws", + "repository": "docker/library/ubuntu", + "identifier": "sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54", + "platforms": { + "@@platforms//cpu:arm64": "@ubuntu_linux_arm64_v8", + "@@platforms//cpu:x86_64": "@ubuntu_linux_amd64" + }, + "bzlmod_repository": "ubuntu", + "reproducible": true + } + }, + "oci_crane_darwin_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "darwin_amd64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_darwin_arm64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "darwin_arm64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_arm64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_arm64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_armv6": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_armv6", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_i386": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_i386", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_s390x": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_s390x", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "linux_amd64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_windows_armv6": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "windows_armv6", + "crane_version": "v0.18.0" + } + }, + "oci_crane_windows_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%crane_repositories", + "attributes": { + "platform": "windows_amd64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_toolchains": { + "repoRuleId": "@@rules_oci+//oci/private:toolchains_repo.bzl%toolchains_repo", + "attributes": { + "toolchain_type": "@rules_oci//oci:crane_toolchain_type", + "toolchain": "@oci_crane_{platform}//:crane_toolchain" + } + }, + "oci_regctl_darwin_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "darwin_amd64" + } + }, + "oci_regctl_darwin_arm64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "darwin_arm64" + } + }, + "oci_regctl_linux_arm64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "linux_arm64" + } + }, + "oci_regctl_linux_s390x": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "linux_s390x" + } + }, + "oci_regctl_linux_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "linux_amd64" + } + }, + "oci_regctl_windows_amd64": { + "repoRuleId": "@@rules_oci+//oci:repositories.bzl%regctl_repositories", + "attributes": { + "platform": "windows_amd64" + } + }, + "oci_regctl_toolchains": { + "repoRuleId": "@@rules_oci+//oci/private:toolchains_repo.bzl%toolchains_repo", + "attributes": { + "toolchain_type": "@rules_oci//oci:regctl_toolchain_type", + "toolchain": "@oci_regctl_{platform}//:regctl_toolchain" + } + } + }, + "moduleExtensionMetadata": { + "explicitRootModuleDirectDeps": [ + "ubuntu", + "ubuntu_linux_arm64_v8", + "ubuntu_linux_amd64" + ], + "explicitRootModuleDirectDevDeps": [], + "useAllRepos": "NO", + "reproducible": false + }, + "recordedRepoMappingEntries": [ + [ + "aspect_bazel_lib+", + "bazel_tools", + "bazel_tools" + ], + [ + "bazel_features+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_oci+", + "aspect_bazel_lib", + "aspect_bazel_lib+" + ], + [ + "rules_oci+", + "bazel_features", + "bazel_features+" + ], + [ + "rules_oci+", + "bazel_skylib", + "bazel_skylib+" + ] + ] + } + }, "@@rules_python+//python/uv:uv.bzl%uv": { "general": { - "bzlTransitiveDigest": "yG9F6L2IZXKRbD/aIUa6sU7uITLUTBKOMWPbIvl1VdM=", + "bzlTransitiveDigest": "xMgnVVV6SeyGCaYQT+4rYddx63q6+JXtyCrlLeA8OLM=", "usagesDigest": "6MjoD3H+netDdhklgMWks3NARpHVXxy8kfsMe9XXPa8=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -513,6 +661,218 @@ }, "facts": { "@@aspect_rules_py+//py:extensions.bzl%python_interpreters": { + "release_index_v2_20241002_https://github.com/astral-sh/python-build-standalone/releases/download_install_only": { + "3.10/aarch64-apple-darwin/default": { + "filename": "cpython-3.10.15+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "bcfdf8235cd4f84ca280f33a17030e65ba23e7905e70a8ed2ed2c83229ad136f" + }, + "3.10/aarch64-unknown-linux-gnu/default": { + "filename": "cpython-3.10.15+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "2e364a47cdbfcfaf56122b7656a3e8a7163babbda4f6bb6165aa644cbc65bd57" + }, + "3.10/i686-pc-windows-msvc/default": { + "filename": "cpython-3.10.15+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "814561a8addee5f56a19223ecdd879a22b82d631bd5704eac7b2e98287e797a8" + }, + "3.10/x86_64-apple-darwin/default": { + "filename": "cpython-3.10.15+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "35678c2ba6d7aff56ca96f06ca735fe4bd09e4a5d3d40f552d76a1653c80a123" + }, + "3.10/x86_64-pc-windows-msvc/default": { + "filename": "cpython-3.10.15+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "422fb92c310f030b05ca8e59a256c72ffde38f03382a006284d9e5e2a7b646f5" + }, + "3.10/x86_64-unknown-linux-gnu/default": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "f17cba68a55dcd386be4cbb0002cf3037718019fc1585b2ff9a32efd3283557d" + }, + "3.10/x86_64-unknown-linux-musl/default": { + "filename": "cpython-3.10.15+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.10.15", + "sha256": "7b2baf761282600359d43e6f14b01437a8d0e517ba3a28f50688806dd8897b11" + }, + "3.11/aarch64-apple-darwin/default": { + "filename": "cpython-3.11.10+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "540225743ca9ca04d7e0de520e211ecafb379677c49fba4b89334e7248219cb2" + }, + "3.11/aarch64-unknown-linux-gnu/default": { + "filename": "cpython-3.11.10+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "047e687b561f8e38740819cc3e112e83ae349927cca846921a1c301e5d9cc873" + }, + "3.11/i686-pc-windows-msvc/default": { + "filename": "cpython-3.11.10+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d9e75d5028c8975c158f4b9c01ef820480249b3401dbde755c0f344e15feebf5" + }, + "3.11/x86_64-apple-darwin/default": { + "filename": "cpython-3.11.10+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "f498693f03fd672a4dc581ef0e1101102d33964352c35ecff21686a8d00744c9" + }, + "3.11/x86_64-pc-windows-msvc/default": { + "filename": "cpython-3.11.10+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "d71cde066b614903e9f243c4babd179e7e978fcfa95702355566463e623abe6c" + }, + "3.11/x86_64-unknown-linux-gnu/default": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "9c0197e72b2dd1ebf56eb562cb7a078052b4ab71d5666cd3be3b6e75db42c79e" + }, + "3.11/x86_64-unknown-linux-musl/default": { + "filename": "cpython-3.11.10+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.11.10", + "sha256": "fb86dce628d2008eefd3550193839fb9f283f5f6c25a09c8b676713ff4757156" + }, + "3.12/aarch64-apple-darwin/default": { + "filename": "cpython-3.12.7+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5a9cdbb8536839a83edae3e41eb44161b640d78181fec083e07c668ba796a875" + }, + "3.12/aarch64-unknown-linux-gnu/default": { + "filename": "cpython-3.12.7+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "5481ca52e7ac8685c1e9d4e804a66e5c928879e0f44799aa6934735f66266643" + }, + "3.12/i686-pc-windows-msvc/default": { + "filename": "cpython-3.12.7+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "8c62920e2fef022fc49d58cc999c77ea45318f96a5a5c0ba3bb155d33732d7f3" + }, + "3.12/x86_64-apple-darwin/default": { + "filename": "cpython-3.12.7+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "60eaf2c9a63926f5edfe7a0ecf4b2fbb37de6764f0c0100be245d098e3995da7" + }, + "3.12/x86_64-pc-windows-msvc/default": { + "filename": "cpython-3.12.7+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "1c74dd0499ef7d993d8942ebe6692c90c50d09719e0335f8e210b91277f8e7c0" + }, + "3.12/x86_64-unknown-linux-gnu/default": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "04ffccbbb1beedd0bc80347c061fe527833001681ee543c3ba85dac5134ed500" + }, + "3.12/x86_64-unknown-linux-musl/default": { + "filename": "cpython-3.12.7+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.12.7", + "sha256": "d4a8f2b3e422089475bcd6f2b855c9ed0e666af2de4f19df7c764362eb8c4aca" + }, + "3.13/aarch64-apple-darwin/default": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "577e846eaf0a27342b3f80b5f292eb292b0eb6a9df3a0fa0c5925e86cfe046a3" + }, + "3.13/aarch64-unknown-linux-gnu/default": { + "filename": "cpython-3.13.0rc3+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "48974ab9b4a6990b17e6740393492fc5557e6acc4ab02be9d9543e0e506e48a6" + }, + "3.13/i686-pc-windows-msvc/default": { + "filename": "cpython-3.13.0rc3+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "fa5e8195fa7a6b6d4df0bc92b36d38836b72c4f5fb41978d495abe5a454fed67" + }, + "3.13/x86_64-apple-darwin/default": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "81a01923b25a4b2b68f517b07a4a4a9186d873e6518f060e4a004e77d7094687" + }, + "3.13/x86_64-pc-windows-msvc/default": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "319ecb727317868c4f3bfecd480f216b38275f5373f72c022d255318b650ebe2" + }, + "3.13/x86_64-unknown-linux-gnu/default": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "a4b4e0a79b53938db050daf7f78dd09faf49d1e29dbba6cac87cf857c0a51fb4" + }, + "3.13/x86_64-unknown-linux-musl/default": { + "filename": "cpython-3.13.0rc3+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.13.0rc3", + "sha256": "56fac98fb5ed39f67cd7c0ce6e503a1e551ce727dc46796a0f16c09d26e845aa" + }, + "3.8/aarch64-apple-darwin/default": { + "filename": "cpython-3.8.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "2ddfc04bdb3e240f30fb782fa1deec6323799d0e857e0b63fa299218658fd3d4" + }, + "3.8/aarch64-unknown-linux-gnu/default": { + "filename": "cpython-3.8.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "9d8798f9e79e0fc0f36fcb95bfa28a1023407d51a8ea5944b4da711f1f75f1ed" + }, + "3.8/i686-pc-windows-msvc/default": { + "filename": "cpython-3.8.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "06988218600fe3e2c02c3182d5629a1d4e596b3771ab32a9e99756c5904b5fac" + }, + "3.8/x86_64-apple-darwin/default": { + "filename": "cpython-3.8.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "68d060cd373255d2ca5b8b3441363d5aa7cc45b0c11bbccf52b1717c2b5aa8bb" + }, + "3.8/x86_64-pc-windows-msvc/default": { + "filename": "cpython-3.8.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "41b6709fec9c56419b7de1940d1f87fa62045aff81734480672dcb807eedc47e" + }, + "3.8/x86_64-unknown-linux-gnu/default": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "285e141c36f88b2e9357654c5f77d1f8fb29cc25132698fe35bb30d787f38e87" + }, + "3.8/x86_64-unknown-linux-musl/default": { + "filename": "cpython-3.8.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.8.20", + "sha256": "ea8d7f9dd35815cf88f5ed257b5d0206d97df5a9500f719b6a6031b8c7071db8" + }, + "3.9/aarch64-apple-darwin/default": { + "filename": "cpython-3.9.20+20241002-aarch64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "dc5f3b4c54deea7a42479b3f81b1c1b3a330f721aea3aff7df9833567bbfa8ea" + }, + "3.9/aarch64-unknown-linux-gnu/default": { + "filename": "cpython-3.9.20+20241002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "0d84fa0884e843828312a1fcbfd8756abe3d6cf3c27086f79cd7352bad13ac4c" + }, + "3.9/i686-pc-windows-msvc/default": { + "filename": "cpython-3.9.20+20241002-i686-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "bd2c7cf4d7eba224ada44dfbccf5248d313ba5072462c71aa753c824354704f3" + }, + "3.9/x86_64-apple-darwin/default": { + "filename": "cpython-3.9.20+20241002-x86_64-apple-darwin-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "a07be8fddd5f6f6a0db7abd16f2b2a8a94a891e54091e4f45b64e822597e4d7d" + }, + "3.9/x86_64-pc-windows-msvc/default": { + "filename": "cpython-3.9.20+20241002-x86_64-pc-windows-msvc-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "94000af8e9d9f5aba6d2325963a6b3403afbf310f6790edff3dfe8becd8197de" + }, + "3.9/x86_64-unknown-linux-gnu/default": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "fec849569158e5e46610621d7da91b02dca2cc5f66dd49cc0f85d7469c8f5a84" + }, + "3.9/x86_64-unknown-linux-musl/default": { + "filename": "cpython-3.9.20+20241002-x86_64-unknown-linux-musl-install_only.tar.gz", + "full_version": "3.9.20", + "sha256": "31f5e329f14ac8b79527712c4265edfea1cb6dff4bb04cf8c51cd809290e136c" + } + }, "release_index_v2_20251031_https://github.com/astral-sh/python-build-standalone/releases/download_install_only": { "3.10/aarch64-apple-darwin/default": { "filename": "cpython-3.10.19+20251031-aarch64-apple-darwin-install_only.tar.gz", diff --git a/e2e/crossbuild/awkward_cpp/BUILD.bazel b/e2e/crossbuild/awkward_cpp/BUILD.bazel new file mode 100644 index 000000000..727d55038 --- /dev/null +++ b/e2e/crossbuild/awkward_cpp/BUILD.bazel @@ -0,0 +1,15 @@ +# awkward-cpp ships official prebuilt wheels for linux/amd64 and +# linux/arm64, but [tool.uv] no-binary-package forces it to build from +# sdist here. scikit-build-core (CMake) backend — pep517_native_whl doesn't +# support it yet. Its compiled libraries (libawkward*.so) are loaded via +# ctypes at runtime, not imported as CPython extension modules, so unlike +# //contourpy there's no EXT_SUFFIX/SOABI to check — only ELF arch. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "awkward_cpp", + check_so_suffix = False, + deps = ["@pypi_crossbuild_awkward_cpp//awkward_cpp"], + so_pattern = "whl_install__crossbuild_awkward_cpp.*awkward_cpp/lib/libawkward-cpu-kernels\\.so$$", +) diff --git a/e2e/crossbuild/awkward_cpp/awkward_cpp_image_command_test.yaml b/e2e/crossbuild/awkward_cpp/awkward_cpp_image_command_test.yaml new file mode 100644 index 000000000..02721d4ed --- /dev/null +++ b/e2e/crossbuild/awkward_cpp/awkward_cpp_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# awkward_cpp_main.py asserts the exact null count itself and only prints +# "OK" on success. +commandTests: + - name: awkward_IndexedArray_numnull counts correctly + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/awkward_cpp/awkward_cpp_main.py b/e2e/crossbuild/awkward_cpp/awkward_cpp_main.py new file mode 100644 index 000000000..c4df3aef4 --- /dev/null +++ b/e2e/crossbuild/awkward_cpp/awkward_cpp_main.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +"""Calls a single compiled kernel directly via ctypes. + +awkward_IndexedArray64_numnull counts negative ("null") entries in an +IndexedArray's index buffer. fromindex=[0,-1,2,-1,4] has 2 nulls. +""" +import ctypes +from numpy import int64 +from awkward_cpp.cpu_kernels import kernel + + +def main() -> None: + fromindex = (ctypes.c_int64 * 5)(0, -1, 2, -1, 4) + numnull = ctypes.c_int64(0) + func = kernel[("awkward_IndexedArray_numnull", int64, int64)] + err = func(ctypes.pointer(numnull), fromindex, 5) + if err.str: + raise RuntimeError("kernel error: {}".format(err.str)) + assert numnull.value == 2, "expected 2 nulls, got {}".format(numnull.value) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/awkward_cpp/pyproject.toml b/e2e/crossbuild/awkward_cpp/pyproject.toml new file mode 100644 index 000000000..cbcdcfd6a --- /dev/null +++ b/e2e/crossbuild/awkward_cpp/pyproject.toml @@ -0,0 +1,15 @@ +[project] +name = "crossbuild_awkward_cpp" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "awkward-cpp==55", + "build", + "cmake", + "ninja", + "pybind11", + "scikit-build-core", +] + +[tool.uv] +no-binary-package = ["awkward-cpp"] diff --git a/e2e/crossbuild/awkward_cpp/uv.lock b/e2e/crossbuild/awkward_cpp/uv.lock new file mode 100644 index 000000000..741316801 --- /dev/null +++ b/e2e/crossbuild/awkward_cpp/uv.lock @@ -0,0 +1,349 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version < '3.12'", +] + +[[package]] +name = "awkward-cpp" +version = "55" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/e1/24cfd2d5c8f6fdee31897c10efd20ad9ff52be629d71fafd1814d73a56d0/awkward_cpp-55.tar.gz", hash = "sha256:e2c8be3e6a353d6d2a93d65be1900ba997765b160ea7668f9ab221de5fb8a373", size = 1503409, upload-time = "2026-07-28T18:23:19.913Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/7d/1f070fc5d32f3c9f034eb0a27e1561a1ec5af6475db5d6676c39b1c2e2ed/awkward_cpp-55-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44a2df3ab7074c3b7bcdcff18c3c330d9e3dc459443d4c93f1c4e852c509e18d", size = 623619, upload-time = "2026-07-28T18:22:11.184Z" }, + { url = "https://files.pythonhosted.org/packages/0e/53/4015b1853702fa3cae59295e7810188657b5b174451ecaae548eae2fc5ef/awkward_cpp-55-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:04af2ded4f51768801cb81f9565c40589a0e1b1a1d15929082edeb81abb9c7c8", size = 576185, upload-time = "2026-07-28T18:22:12.554Z" }, + { url = "https://files.pythonhosted.org/packages/1c/19/44c4239f5f12929a1dbdfec991714a53f62d376985d204029a83b8cbcb5f/awkward_cpp-55-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0221731ffed79da9111043defa90563906d3251221758afce4177298b1ecbc7b", size = 619562, upload-time = "2026-07-28T18:22:13.92Z" }, + { url = "https://files.pythonhosted.org/packages/5d/18/7862e4a29d305b792cfb3aba4f3ea5f33610924aef3dc5870db5ef48f8ce/awkward_cpp-55-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be9875e50dabdabbcae52a7ffd4f9dda2696a12ee98cb0ac7cce144c99fbed9e", size = 692019, upload-time = "2026-07-28T18:22:15.159Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4f/986dd5ce1150a3ed2725d3f110bf0912b0416e392100b52a8ce3bbc7437d/awkward_cpp-55-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5e42f724e98efa1a0b3eeb9488fa07becbc0fddb192a77722241a4e1735beb90", size = 1619158, upload-time = "2026-07-28T18:22:16.574Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0e/f3a2acca6e652d19bec0e8dd55ec90edbe7a503e9974efe17a606538cdc6/awkward_cpp-55-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c12ec7456981a48dde5a71a5ae848ab8631e97513edb02d8de58c5ccb36604f3", size = 1734142, upload-time = "2026-07-28T18:22:18.298Z" }, + { url = "https://files.pythonhosted.org/packages/60/5a/41d2c9ce8b0eedc8ee0d579ef26daaa545ffb2df5af7a10f41b58a7b242d/awkward_cpp-55-cp311-cp311-win32.whl", hash = "sha256:7bd732e01ea08ef714fd989a2d5a9f0f894fd44b9fa15b3d55f338c93b046316", size = 707007, upload-time = "2026-07-28T18:22:19.67Z" }, + { url = "https://files.pythonhosted.org/packages/e8/09/13cb41c16841f96067f30ee3415a4182e4ec48f5d3c3b7a44c8fbc6e955d/awkward_cpp-55-cp311-cp311-win_amd64.whl", hash = "sha256:defd65395334fd04fa2b9c01549e40c7c857006be6c65784dfd627c18aaec829", size = 739518, upload-time = "2026-07-28T18:22:21.005Z" }, + { url = "https://files.pythonhosted.org/packages/d6/9f/e1049b40a06d870a8189978874e9aaceac6973fb119371c772d5b601a9ea/awkward_cpp-55-cp311-cp311-win_arm64.whl", hash = "sha256:cf808ad4befe8622b26b25c4699645afb935727d8fae8e873810fc465fbe1e81", size = 876103, upload-time = "2026-07-28T18:22:22.683Z" }, + { url = "https://files.pythonhosted.org/packages/98/8e/a860951951aefd968e378bd52d21e9b11437441cbda8d3c9dcb7730bf319/awkward_cpp-55-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4e5b20f5bb811688cad6b36d50b827fbeb0b7cb398844ea76e68a7d0da5d4265", size = 623048, upload-time = "2026-07-28T18:22:24.362Z" }, + { url = "https://files.pythonhosted.org/packages/a2/26/a08b58becfa07a0b6341787119f6d37d4c1aa5f01a598d37aa14732552eb/awkward_cpp-55-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:162141db862afa99e9524a99dd4b93bb8b47d780709ec308be0156e9f9338d65", size = 576965, upload-time = "2026-07-28T18:22:25.757Z" }, + { url = "https://files.pythonhosted.org/packages/09/22/373ff09eaa3ae6fcc789f49f92af8d0893022ac791a6ed9908dc1a62cc1b/awkward_cpp-55-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40ce7361ba9f5f3256b06a89e918ead4f8bf4f6e13981da36c5839029a785652", size = 620360, upload-time = "2026-07-28T18:22:26.984Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/ced3284f7f9559ba0ef835c5afde032ee07aa59b901346f5e202634b70b6/awkward_cpp-55-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:40bfb8305ac51d26a4d57fcb86e94c7fb4ecbcec5693d021a9d5cebc8979f9b2", size = 692499, upload-time = "2026-07-28T18:22:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ef/8c1d716d91a6960ccf964cfad64cc3d2cdededc255150f09f2a9d38cf95d/awkward_cpp-55-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34629ae8067fad78577a1dec72a3c65ff1b8f7a704287d2c060c354300a80d66", size = 1621196, upload-time = "2026-07-28T18:22:30.083Z" }, + { url = "https://files.pythonhosted.org/packages/d8/a8/c06c2cc4db66a95e370326ca432300dcb316c3673a59e2308ba5dcafda3c/awkward_cpp-55-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e6e64a4448f4b172b4cde1f18a338690660e2c7526cd1a3877d8ee454120c7e4", size = 1735731, upload-time = "2026-07-28T18:22:31.771Z" }, + { url = "https://files.pythonhosted.org/packages/1b/7a/bf7ea7ac59a0dae79e00b50e54d4b2445e0bcd94a761d5e0ba124b4c7e3a/awkward_cpp-55-cp312-cp312-win32.whl", hash = "sha256:3dd8064bbf051620cfb850e9f771392fb2bd2dbec300f4a663bdeb4cd3750b0e", size = 706667, upload-time = "2026-07-28T18:22:33.287Z" }, + { url = "https://files.pythonhosted.org/packages/42/8a/1f9650b73a933cd32fa02387b0e78ab35504743456e2b48cc016139a7ea7/awkward_cpp-55-cp312-cp312-win_amd64.whl", hash = "sha256:64814032a629b09638dff1ef30151429118bba76cad5beb9bf7257b5d2fe3151", size = 743881, upload-time = "2026-07-28T18:22:34.911Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/935feee4997a83481c3260823d98dcfb95181621a5b598f571796f3a6ad7/awkward_cpp-55-cp312-cp312-win_arm64.whl", hash = "sha256:0461ea93f9d8e53b1d55afb0fa60068aca1005cd609a842890af6b0aa9ffc44b", size = 874679, upload-time = "2026-07-28T18:22:36.399Z" }, + { url = "https://files.pythonhosted.org/packages/d8/13/12b9625bef7a4ef07ff92c0a1d414883720b7b73db0cc534605b8cbdc9f8/awkward_cpp-55-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6216a8e7c228fe00a7e3b27566fc55be0ed299bf9c23b84ddbadd343ed8937b5", size = 623091, upload-time = "2026-07-28T18:22:37.927Z" }, + { url = "https://files.pythonhosted.org/packages/6e/86/46d9d13e75734e1d960e2af7ae664807ba2ffd86fe0db66d2d118375e61b/awkward_cpp-55-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d6eb0a4e1f04fe2e6502c827bd5a4cf30bd43becf7914a652e92297e8ba6a38", size = 576970, upload-time = "2026-07-28T18:22:39.254Z" }, + { url = "https://files.pythonhosted.org/packages/76/88/ef9304c34716a87e9ea3f4902c9cf60d075132b0d4be547321c4d3940b41/awkward_cpp-55-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfa81da556a07d01924f1bc9c499be12e40988a2cd5869ac280da67c2d5a89ff", size = 620452, upload-time = "2026-07-28T18:22:40.652Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c1/43934c3a0bf743823ac1812fbdd59bd69343b6adb61ca04012394a6201a3/awkward_cpp-55-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:145672b9ef352f811f7d1e971574af21d9c70f615456969bd5073a7da53900e1", size = 692557, upload-time = "2026-07-28T18:22:42.167Z" }, + { url = "https://files.pythonhosted.org/packages/31/0f/bf248189e8d7eb0f3aaf6db6ffab82e8af83e18fdd1da1fc47655d81f228/awkward_cpp-55-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f03ba5aa767cbf2f22509491d416e2fc07db2f641496f65d13cecdd7bc5f519e", size = 1621216, upload-time = "2026-07-28T18:22:43.597Z" }, + { url = "https://files.pythonhosted.org/packages/68/9e/7439f1b0eb7d9b0aa7f764348fb70e46d3550250680af8268c5848123fac/awkward_cpp-55-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f2404d53ade95efd3b2539e346f05ee579c4aa37b394f1bfd40b6148d2315016", size = 1735735, upload-time = "2026-07-28T18:22:45.224Z" }, + { url = "https://files.pythonhosted.org/packages/25/d4/b87e11e21df23c1baf451c13e852398a8bd6dd6924283f73ad41c4a92c70/awkward_cpp-55-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:6281cc536ba7473f605b92c9ad72cd3ddebd69871f474ec44e5368a81ab1d9c0", size = 233240, upload-time = "2026-07-28T18:22:46.745Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f3/e36d1d7265e1e3a18852aec20d77937577f6c601fa58125b92c363169dcd/awkward_cpp-55-cp313-cp313-win32.whl", hash = "sha256:34895e9049319ae1f345110404816925c96b02b6e00d3b8680bb5c30f7edaba0", size = 706696, upload-time = "2026-07-28T18:22:47.987Z" }, + { url = "https://files.pythonhosted.org/packages/83/96/25847d3bc9e5d0f3bdfec5da6a09cef8a2c792b6926a5ed4b13930565283/awkward_cpp-55-cp313-cp313-win_amd64.whl", hash = "sha256:b73e1cefb6b8c2405c63441c02caff18fea36c39149861ada6e3e779760f3435", size = 743928, upload-time = "2026-07-28T18:22:49.437Z" }, + { url = "https://files.pythonhosted.org/packages/41/f2/7ce97bcd5528285372f4c355e33b98483ddc51f325659684c9eec47218cd/awkward_cpp-55-cp313-cp313-win_arm64.whl", hash = "sha256:c7a06bb033d8be282977427f65745feebb25353ea8a9fcb4cda8ad5c38593560", size = 874740, upload-time = "2026-07-28T18:22:50.936Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/847cb55dc27a4fc9db68c003a3ce091e995cd521f9e719ea2fdd0081bede/awkward_cpp-55-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ec7f1581e8ac77c9868d267f0f52619bcf10f55dde49d9e7e74d11b78bbafe76", size = 623606, upload-time = "2026-07-28T18:22:52.363Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b1/6e5a85f923421eb2f7a0b26bc5b7b6cac7e3d24ee428b023307116262a9b/awkward_cpp-55-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:519730063b9243a92fcae6f38edd4a563ddb70ddf58b4b76c0ce936836639989", size = 577511, upload-time = "2026-07-28T18:22:53.67Z" }, + { url = "https://files.pythonhosted.org/packages/77/00/ef40720720d21d107ade1859d582067463c5ce702a4c4c0389ef4607a882/awkward_cpp-55-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eadc5442a82d5d1eb36b1d1ee2a7b60484dce68d4da4b1e80e71aada6fcb03bd", size = 620784, upload-time = "2026-07-28T18:22:55.055Z" }, + { url = "https://files.pythonhosted.org/packages/7b/9d/612d3d06d9da9dc5fac3b4d758859966c8522a0024485be37fc655993f7a/awkward_cpp-55-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:640f2db9803debbfa671abd93d3ba2aedebfbdcd794be1a868e8e5954e6aae98", size = 693407, upload-time = "2026-07-28T18:22:56.505Z" }, + { url = "https://files.pythonhosted.org/packages/04/30/1458274d6ab8bf3fd061efc46f58f090e341e3b2b8e0d743b0d946b5a886/awkward_cpp-55-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7ebc50d9c2d6854741b28ce9ad7921977f1ff0752033b782657fbe9bfce7ed53", size = 1622112, upload-time = "2026-07-28T18:22:58.031Z" }, + { url = "https://files.pythonhosted.org/packages/f1/73/2ceee3817615f76ff5d5e5df2461ee8643c23aee8c8f6fbb34dff66966e7/awkward_cpp-55-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a819fa853e2e9f7c627dac13bd3e0122db45957f31705b219cc64747f6c740e2", size = 1736062, upload-time = "2026-07-28T18:22:59.509Z" }, + { url = "https://files.pythonhosted.org/packages/f8/65/b8a193becd6e6402b13f5c5d99a3210ae5768cf64ffb4ed6f313bdd94766/awkward_cpp-55-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:7fea8ddfc741f250f16482f5f3fe709a54f76ef5fc04e69bec3f0a792ecaf749", size = 234618, upload-time = "2026-07-28T18:23:00.838Z" }, + { url = "https://files.pythonhosted.org/packages/63/18/f6698e7d569bc84617292477839ce5405ff0d08da35aac76a93dbe5f4287/awkward_cpp-55-cp314-cp314-win32.whl", hash = "sha256:a52d8fa60e738a94798cecb1e8ab32a078003c89f0bd3554b15d0db8dfacc36e", size = 721993, upload-time = "2026-07-28T18:23:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/b8/59/8fe9fa01fa79b49f45d64308f3de418497b3a2d8d1321828af983c07551b/awkward_cpp-55-cp314-cp314-win_amd64.whl", hash = "sha256:f66a0c5e746c01e11df4ce5fbeec558abba76b7331306706e29a98c64394aaaa", size = 763380, upload-time = "2026-07-28T18:23:03.641Z" }, + { url = "https://files.pythonhosted.org/packages/3b/36/e75309bef10836d3457b8a7bb0339449ce5a9257fca28a750e3c553bab9d/awkward_cpp-55-cp314-cp314-win_arm64.whl", hash = "sha256:b621ed5779c7e3da5fa269c66e217dc0b6c9b8300e65fdd110473308e0095043", size = 900263, upload-time = "2026-07-28T18:23:04.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/23/fb123beb39add0dc87fb67964cd87744a8e8abd9bd6dbda3df7289d89d2c/awkward_cpp-55-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:12f5721ff2fd90797798ea220753b9d1fdb24bef6597b2c3b6e60a8682406e4e", size = 636411, upload-time = "2026-07-28T18:23:06.528Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e3/1c74e3b408db21f43268e3d5898453546d610e3406b30df83c755056cb34/awkward_cpp-55-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c4944008057fdf670a3875a795e9e7a669016d37a8c0051c7710b818c1761a40", size = 591861, upload-time = "2026-07-28T18:23:07.959Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bd/5f2baae25acd3ffecf4e04e1f4416f7cf5e4a2872acaf8cdb2777946cff4/awkward_cpp-55-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3db72b63a9d27b2b85b90ceb9c00d8f9f975f41bebc70b671897574371d56823", size = 627287, upload-time = "2026-07-28T18:23:09.37Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3c/6b1fcae55c5464c26a944b5c6563535063fa9fb60ca8f5dc3bd45bd9905b/awkward_cpp-55-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7999d8378ce0d86f269660d0405ddeabd9a1a4d4d1920cdca91c19954e27a07d", size = 699825, upload-time = "2026-07-28T18:23:10.937Z" }, + { url = "https://files.pythonhosted.org/packages/a3/a8/571cf407542afae57590662a5ea5d7444b52c859e9db154f1097926aa6d8/awkward_cpp-55-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb5d7e24fcddc6433bbf925e259f1a70c57f0c72c720f5f6b7761e7b446be4a", size = 1626806, upload-time = "2026-07-28T18:23:12.316Z" }, + { url = "https://files.pythonhosted.org/packages/00/da/51bb342e2c9720571c7d5df89b6b1823603294541cb1de1612cb2120d759/awkward_cpp-55-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e4b3120f389aabeec73af0dd58839feb0ce32bb94ad3c3c7677ca996d23b240e", size = 1742018, upload-time = "2026-07-28T18:23:13.787Z" }, + { url = "https://files.pythonhosted.org/packages/87/13/d97148ca915d11a6d0b3eec2fa4ce7c6622aac645db37b9dd5d83830bc9d/awkward_cpp-55-cp314-cp314t-win32.whl", hash = "sha256:012750bf3b6fd3589216f9a058c20bd36ba2183a151c710795545f8645550a33", size = 728215, upload-time = "2026-07-28T18:23:15.309Z" }, + { url = "https://files.pythonhosted.org/packages/66/de/7978303ce84dedb642e9d34481947ee54e891d42f1f307051ee5fc0aff92/awkward_cpp-55-cp314-cp314t-win_amd64.whl", hash = "sha256:a6d274e526e6e1c247d80d7bd1e1172c663167d9df13dc2614579afc11fe82c9", size = 772816, upload-time = "2026-07-28T18:23:16.716Z" }, + { url = "https://files.pythonhosted.org/packages/45/d5/c2c0242a813e8b8f283c943e52ab2331545b63e90c0b833f45a0e86e7abc/awkward_cpp-55-cp314-cp314t-win_arm64.whl", hash = "sha256:a3ccb6d47cfc3c365a64128b0ae58fa314c432ffa1f48155c1a477e33f1e5f5e", size = 909757, upload-time = "2026-07-28T18:23:18.21Z" }, +] + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "cmake" +version = "4.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/ea/206baf6fd51a47790f766a24fa4514cd39c31b26ab934376f29a4aa458e5/cmake-4.4.2.tar.gz", hash = "sha256:6af2e0585239627f85f49a8f90761ce4560c671daae1d5e8d2b5f059dc7d22de", size = 34953, upload-time = "2026-08-04T06:14:49.786Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/5a/578888a6713994abfd97db756c937ce5ced44fa6280e7b7d452eebb8aa83/cmake-4.4.2-py3-none-macosx_10_10_universal2.whl", hash = "sha256:7a0279d3006c961ba1d62fe4383919ebcb7b770fb3357f6ae1309ca89210183b", size = 54414035, upload-time = "2026-08-04T06:13:31.175Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4f/925a2a60ae544791599e2fb14d3619d979511a56518e512081e7ef4b5f8d/cmake-4.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc9d9f95dc9a542db99ca96cba1c275adeeb497ff2e134c780a9677b8578bd05", size = 30288280, upload-time = "2026-08-04T06:13:35.675Z" }, + { url = "https://files.pythonhosted.org/packages/2a/76/6f4327771875666f95c4f4c56a53fc25eaac8e027e3144b37ec827ed3818/cmake-4.4.2-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b0a9bb2fa889773c3ff719130064de28edd36fd3e916b46e576243a6f16f033f", size = 31466224, upload-time = "2026-08-04T06:13:39.268Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8f/f5a8bb6e7e86947b6810d2b2685710ed8332c2ab8766c6e3121d17cee59e/cmake-4.4.2-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:93b06166210e478783e3078612144700d44e0492fe7efd6fcd00e4061bc709a6", size = 31225510, upload-time = "2026-08-04T06:13:43.367Z" }, + { url = "https://files.pythonhosted.org/packages/a0/57/ebd7a6f429a6d5b9cf87a8fe16f17851aa9b3ce78af5b58af3c5e41ac939/cmake-4.4.2-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ea5c206308f8eefc0be7cbeeee93b8b192b6af7338741b6d12fe387234bb7920", size = 29098755, upload-time = "2026-08-04T06:13:47.102Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/b8d0b15f57b37ac5b9e374169471f045da3a715b7f0f3af681011415d972/cmake-4.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:27b024e903ef985b37183d754a5c61230b56b41fe0971cd44b71b80c787ec594", size = 30230879, upload-time = "2026-08-04T06:13:50.678Z" }, + { url = "https://files.pythonhosted.org/packages/3b/91/1d72e960d27edbcc3f02bedd3890c4096bbaaf9dbcb7d86f678d2082fe90/cmake-4.4.2-py3-none-manylinux_2_31_armv7l.whl", hash = "sha256:a3580e0c30755c36b48edbbf471aaeb5d07858de0281e58a4a598dfa52a0f05d", size = 27319760, upload-time = "2026-08-04T06:13:54.468Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f7/dc27806fdee158ca3f30d043ef1c1b18b5f846266d5adf4989d97cc571cc/cmake-4.4.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e58296c6e0c04dec37fc28cbf56ca7150646c948dddab2b0d6f8a0a466e7f1ca", size = 27432198, upload-time = "2026-08-04T06:13:58.614Z" }, + { url = "https://files.pythonhosted.org/packages/97/ff/b3f135c8a28a2ee2b57c2f671342a0c0f3cb1b78ea62a633815483eb4acd/cmake-4.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:00a0a207efc83019b55f617b93b2592c2616aebd9c4eeab83ec076dc2a9b84a4", size = 39474065, upload-time = "2026-08-04T06:14:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b5/463afc4ec6ae535661d6a50918efff9e165ef4793ae6c14c376f0660d756/cmake-4.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0220135cceb78530e79e2b5cd0392672e4c524178db768a5f940ea24520e1359", size = 36109755, upload-time = "2026-08-04T06:14:08.512Z" }, + { url = "https://files.pythonhosted.org/packages/c4/e8/052a01a2c3362d04cb545c456ab26a8776c683f9a97f4082508c6d8cc506/cmake-4.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4eb0e17af8344d3063ce0c1a38a156eb7bbe3447f984ad12629a40f5c967fedd", size = 42239493, upload-time = "2026-08-04T06:14:14.295Z" }, + { url = "https://files.pythonhosted.org/packages/0e/30/c9b5bcd20411793c26838191a73e0e820da64d8f872ecba5364ebc2a3538/cmake-4.4.2-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:00195668e40e5dd0d51244e31d15fabb79b97c5e154f9f78b4240f152198c2eb", size = 41399147, upload-time = "2026-08-04T06:14:19.396Z" }, + { url = "https://files.pythonhosted.org/packages/31/d4/56f18d34b11981031f7bdb0215f05e8e43982d7848dc39a8a96b141d4e6a/cmake-4.4.2-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:41e2a04663685304222ba03fb5bed8db52480854aa873cbae1478eedf3a8ec1a", size = 36322600, upload-time = "2026-08-04T06:14:24.013Z" }, + { url = "https://files.pythonhosted.org/packages/34/4a/582268f8468d0f49b4b73423364af7ee82dba28eef63886e9c32f34761a2/cmake-4.4.2-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:269f84ede6543c5d65249dd685db6125a962e5928b7eafd0ed3acdd2b600aa9e", size = 38668384, upload-time = "2026-08-04T06:14:28.633Z" }, + { url = "https://files.pythonhosted.org/packages/45/24/620930e1ddf0832ac688e00aad2568dd876d71f3637fa98f917dfec25df0/cmake-4.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5b51faffe02ca78ed4f6b9afbe6dee8d25ab36e9a9365f510e890a16db76013", size = 39444623, upload-time = "2026-08-04T06:14:33.525Z" }, + { url = "https://files.pythonhosted.org/packages/70/a4/2f2af96afacfb0f4e5fc02f6f491d4cde4ce8e51d914311f2492e22ed8d9/cmake-4.4.2-py3-none-win32.whl", hash = "sha256:109af09f308fd53ddc44bbc23536b6ecb72db53f0218f611efccd9871b19f39f", size = 38774551, upload-time = "2026-08-04T06:14:38.493Z" }, + { url = "https://files.pythonhosted.org/packages/06/9e/3e572a9a8966eec43b6d75b8b8d9543ca2182ec4006a538fb239e004a3cf/cmake-4.4.2-py3-none-win_amd64.whl", hash = "sha256:c28388fe95298486169c45c0ec8bdf067aabcb59273b98a4cdae8be5cd9c74f3", size = 42325289, upload-time = "2026-08-04T06:14:42.919Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b9/2f0b9b355a5293d73db62cefab46a7d0f3b151962d58fb284f340e3685c4/cmake-4.4.2-py3-none-win_arm64.whl", hash = "sha256:1358f355578d19397f87955d4204f737bb399ba36cce59be5853976912836b32", size = 40497534, upload-time = "2026-08-04T06:14:47.366Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-awkward-cpp" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "awkward-cpp" }, + { name = "build" }, + { name = "cmake" }, + { name = "ninja" }, + { name = "pybind11" }, + { name = "scikit-build-core" }, +] + +[package.metadata] +requires-dist = [ + { name = "awkward-cpp", specifier = "==55" }, + { name = "build" }, + { name = "cmake" }, + { name = "ninja" }, + { name = "pybind11" }, + { name = "scikit-build-core" }, +] + +[[package]] +name = "ninja" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/73/79a0b22fc731989c708068427579e840a6cf4e937fe7ae5c5d0b7356ac22/ninja-1.13.0.tar.gz", hash = "sha256:4a40ce995ded54d9dc24f8ea37ff3bf62ad192b547f6c7126e7e25045e76f978", size = 242558, upload-time = "2025-08-11T15:10:19.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/74/d02409ed2aa865e051b7edda22ad416a39d81a84980f544f8de717cab133/ninja-1.13.0-py3-none-macosx_10_9_universal2.whl", hash = "sha256:fa2a8bfc62e31b08f83127d1613d10821775a0eb334197154c4d6067b7068ff1", size = 310125, upload-time = "2025-08-11T15:09:50.971Z" }, + { url = "https://files.pythonhosted.org/packages/8e/de/6e1cd6b84b412ac1ef327b76f0641aeb5dcc01e9d3f9eee0286d0c34fd93/ninja-1.13.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3d00c692fb717fd511abeb44b8c5d00340c36938c12d6538ba989fe764e79630", size = 177467, upload-time = "2025-08-11T15:09:52.767Z" }, + { url = "https://files.pythonhosted.org/packages/c8/83/49320fb6e58ae3c079381e333575fdbcf1cca3506ee160a2dcce775046fa/ninja-1.13.0-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:be7f478ff9f96a128b599a964fc60a6a87b9fa332ee1bd44fa243ac88d50291c", size = 187834, upload-time = "2025-08-11T15:09:54.115Z" }, + { url = "https://files.pythonhosted.org/packages/56/c7/ba22748fb59f7f896b609cd3e568d28a0a367a6d953c24c461fe04fc4433/ninja-1.13.0-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:60056592cf495e9a6a4bea3cd178903056ecb0943e4de45a2ea825edb6dc8d3e", size = 202736, upload-time = "2025-08-11T15:09:55.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/22/d1de07632b78ac8e6b785f41fa9aad7a978ec8c0a1bf15772def36d77aac/ninja-1.13.0-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1c97223cdda0417f414bf864cfb73b72d8777e57ebb279c5f6de368de0062988", size = 179034, upload-time = "2025-08-11T15:09:57.394Z" }, + { url = "https://files.pythonhosted.org/packages/ed/de/0e6edf44d6a04dabd0318a519125ed0415ce437ad5a1ec9b9be03d9048cf/ninja-1.13.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa", size = 180716, upload-time = "2025-08-11T15:09:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/938b562f9057aaa4d6bfbeaa05e81899a47aebb3ba6751e36c027a7f5ff7/ninja-1.13.0-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4be9c1b082d244b1ad7ef41eb8ab088aae8c109a9f3f0b3e56a252d3e00f42c1", size = 146843, upload-time = "2025-08-11T15:10:00.046Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fb/d06a3838de4f8ab866e44ee52a797b5491df823901c54943b2adb0389fbb/ninja-1.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6739d3352073341ad284246f81339a384eec091d9851a886dfa5b00a6d48b3e2", size = 154402, upload-time = "2025-08-11T15:10:01.657Z" }, + { url = "https://files.pythonhosted.org/packages/31/bf/0d7808af695ceddc763cf251b84a9892cd7f51622dc8b4c89d5012779f06/ninja-1.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11be2d22027bde06f14c343f01d31446747dbb51e72d00decca2eb99be911e2f", size = 552388, upload-time = "2025-08-11T15:10:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/9d/70/c99d0c2c809f992752453cce312848abb3b1607e56d4cd1b6cded317351a/ninja-1.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aa45b4037b313c2f698bc13306239b8b93b4680eb47e287773156ac9e9304714", size = 472501, upload-time = "2025-08-11T15:10:04.735Z" }, + { url = "https://files.pythonhosted.org/packages/9f/43/c217b1153f0e499652f5e0766da8523ce3480f0a951039c7af115e224d55/ninja-1.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f8e1e8a1a30835eeb51db05cf5a67151ad37542f5a4af2a438e9490915e5b72", size = 638280, upload-time = "2025-08-11T15:10:06.512Z" }, + { url = "https://files.pythonhosted.org/packages/8c/45/9151bba2c8d0ae2b6260f71696330590de5850e5574b7b5694dce6023e20/ninja-1.13.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:3d7d7779d12cb20c6d054c61b702139fd23a7a964ec8f2c823f1ab1b084150db", size = 642420, upload-time = "2025-08-11T15:10:08.35Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/95752eb635bb8ad27d101d71bef15bc63049de23f299e312878fc21cb2da/ninja-1.13.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:d741a5e6754e0bda767e3274a0f0deeef4807f1fec6c0d7921a0244018926ae5", size = 585106, upload-time = "2025-08-11T15:10:09.818Z" }, + { url = "https://files.pythonhosted.org/packages/c1/31/aa56a1a286703800c0cbe39fb4e82811c277772dc8cd084f442dd8e2938a/ninja-1.13.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:e8bad11f8a00b64137e9b315b137d8bb6cbf3086fbdc43bf1f90fd33324d2e96", size = 707138, upload-time = "2025-08-11T15:10:11.366Z" }, + { url = "https://files.pythonhosted.org/packages/34/6f/5f5a54a1041af945130abdb2b8529cbef0cdcbbf9bcf3f4195378319d29a/ninja-1.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4f2a072db3c0f944c32793e91532d8948d20d9ab83da9c0c7c15b5768072200", size = 581758, upload-time = "2025-08-11T15:10:13.295Z" }, + { url = "https://files.pythonhosted.org/packages/95/97/51359c77527d45943fe7a94d00a3843b81162e6c4244b3579fe8fc54cb9c/ninja-1.13.0-py3-none-win32.whl", hash = "sha256:8cfbb80b4a53456ae8a39f90ae3d7a2129f45ea164f43fadfa15dc38c4aef1c9", size = 267201, upload-time = "2025-08-11T15:10:15.158Z" }, + { url = "https://files.pythonhosted.org/packages/29/45/c0adfbfb0b5895aa18cec400c535b4f7ff3e52536e0403602fc1a23f7de9/ninja-1.13.0-py3-none-win_amd64.whl", hash = "sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e", size = 309975, upload-time = "2025-08-11T15:10:16.697Z" }, + { url = "https://files.pythonhosted.org/packages/df/93/a7b983643d1253bb223234b5b226e69de6cda02b76cdca7770f684b795f5/ninja-1.13.0-py3-none-win_arm64.whl", hash = "sha256:3c0b40b1f0bba764644385319028650087b4c1b18cdfa6f45cb39a3669b81aa9", size = 290806, upload-time = "2025-08-11T15:10:18.018Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", +] +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, + { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, + { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, + { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, + { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, + { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" }, + { url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" }, + { url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" }, + { url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" }, + { url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" }, + { url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + +[[package]] +name = "pybind11" +version = "3.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/f0/35145a3c3baffeef55d4b8324caa33abaa8fa56ab345ecd4b2211d09163e/pybind11-3.0.4.tar.gz", hash = "sha256:3286b59c8a774b9ee650169302dd5a4eedc30a8617905a0560dd8ee44775130c", size = 589533, upload-time = "2026-04-19T03:08:15.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/06/c3a23c9a0263b136c519f033a58d4641e73065fefc7754e9667ec206d992/pybind11-3.0.4-py3-none-any.whl", hash = "sha256:961720ee652da51d531b7b2451a6bd2bc042b0106e6d9baa48ecb7d58034ce63", size = 314166, upload-time = "2026-04-19T03:08:14.091Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "scikit-build-core" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "pathspec" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/7c/0f69b0c7150ce4bcee78c199fe3b7e03a6e01578451bd5d5d1a58beb32f9/scikit_build_core-1.0.3.tar.gz", hash = "sha256:a4d7a05978ee37975c37743510c8991e2debce7ef83afb0a07c0c576fd4f16e8", size = 477539, upload-time = "2026-07-12T05:08:30.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b0/7ad8fa9aebb0835b2e20afebf1483cbe175d1612fe01e85042ce9ced8755/scikit_build_core-1.0.3-py3-none-any.whl", hash = "sha256:ae95427b7d3c14a6cf8bbfd4d901f6138ab64c99e20cbe8ea7d75cd26093f085", size = 278294, upload-time = "2026-07-12T05:08:28.725Z" }, +] diff --git a/e2e/crossbuild/bcrypt/BUILD.bazel b/e2e/crossbuild/bcrypt/BUILD.bazel new file mode 100644 index 000000000..2df8ac7c3 --- /dev/null +++ b/e2e/crossbuild/bcrypt/BUILD.bazel @@ -0,0 +1,16 @@ +# bcrypt ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# [tool.uv] no-binary-package forces it to build from sdist here. Unlike +# //rpds_py (maturin), this is setuptools + setuptools-rust — a build-backend +# value of plain "setuptools.build_meta" with setuptools-rust only visible in +# build-system.requires, exercising the OTHER real-world Rust-in-Python +# integration path (also used by cryptography, pydantic-core's sibling +# ecosystem) rather than a second maturin package. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "bcrypt", + check_so_suffix = False, + deps = ["@pypi_crossbuild_bcrypt//bcrypt"], + so_pattern = "whl_install__crossbuild_bcrypt.*_bcrypt.*\\.so$$", +) diff --git a/e2e/crossbuild/bcrypt/bcrypt_image_command_test.yaml b/e2e/crossbuild/bcrypt/bcrypt_image_command_test.yaml new file mode 100644 index 000000000..eb9fa7ad5 --- /dev/null +++ b/e2e/crossbuild/bcrypt/bcrypt_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# bcrypt_main.py asserts the hashpw/checkpw round-trip itself and only +# prints "OK" on success. +commandTests: + - name: bcrypt hashpw/checkpw round-trips correctly + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/bcrypt/bcrypt_main.py b/e2e/crossbuild/bcrypt/bcrypt_main.py new file mode 100644 index 000000000..d9b098299 --- /dev/null +++ b/e2e/crossbuild/bcrypt/bcrypt_main.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +import bcrypt + + +def main() -> None: + password = b"correct horse battery staple" + hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=4)) + # A hash must verify against the password it was made from, and reject a + # different one — deterministic regardless of the random salt gensalt() + # picks. + assert bcrypt.checkpw(password, hashed) is True, "checkpw rejected the password that produced this hash" + assert bcrypt.checkpw(b"wrong password", hashed) is False, "checkpw accepted the wrong password" + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/bcrypt/pyproject.toml b/e2e/crossbuild/bcrypt/pyproject.toml new file mode 100644 index 000000000..820d6ce4d --- /dev/null +++ b/e2e/crossbuild/bcrypt/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "crossbuild_bcrypt" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "bcrypt==5.0.0", + "build", + "setuptools", + "setuptools-rust", + "wheel", +] + +[tool.uv] +no-binary-package = ["bcrypt"] diff --git a/e2e/crossbuild/bcrypt/uv.lock b/e2e/crossbuild/bcrypt/uv.lock new file mode 100644 index 000000000..5b67b0eff --- /dev/null +++ b/e2e/crossbuild/bcrypt/uv.lock @@ -0,0 +1,178 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "bcrypt" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/36/3329e2518d70ad8e2e5817d5a4cac6bba05a47767ec416c7d020a965f408/bcrypt-5.0.0.tar.gz", hash = "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", size = 25386, upload-time = "2025-09-25T19:50:47.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/85/3e65e01985fddf25b64ca67275bb5bdb4040bd1a53b66d355c6c37c8a680/bcrypt-5.0.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f3c08197f3039bec79cee59a606d62b96b16669cff3949f21e74796b6e3cd2be", size = 481806, upload-time = "2025-09-25T19:49:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/44/dc/01eb79f12b177017a726cbf78330eb0eb442fae0e7b3dfd84ea2849552f3/bcrypt-5.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:200af71bc25f22006f4069060c88ed36f8aa4ff7f53e67ff04d2ab3f1e79a5b2", size = 268626, upload-time = "2025-09-25T19:49:06.723Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/e82388ad5959c40d6afd94fb4743cc077129d45b952d46bdc3180310e2df/bcrypt-5.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:baade0a5657654c2984468efb7d6c110db87ea63ef5a4b54732e7e337253e44f", size = 271853, upload-time = "2025-09-25T19:49:08.028Z" }, + { url = "https://files.pythonhosted.org/packages/ec/86/7134b9dae7cf0efa85671651341f6afa695857fae172615e960fb6a466fa/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c58b56cdfb03202b3bcc9fd8daee8e8e9b6d7e3163aa97c631dfcfcc24d36c86", size = 269793, upload-time = "2025-09-25T19:49:09.727Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/6296688ac1b9e503d034e7d0614d56e80c5d1a08402ff856a4549cb59207/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bfd2a34de661f34d0bda43c3e4e79df586e4716ef401fe31ea39d69d581ef23", size = 289930, upload-time = "2025-09-25T19:49:11.204Z" }, + { url = "https://files.pythonhosted.org/packages/d1/18/884a44aa47f2a3b88dd09bc05a1e40b57878ecd111d17e5bba6f09f8bb77/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ed2e1365e31fc73f1825fa830f1c8f8917ca1b3ca6185773b349c20fd606cec2", size = 272194, upload-time = "2025-09-25T19:49:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/0e/8f/371a3ab33c6982070b674f1788e05b656cfbf5685894acbfef0c65483a59/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:83e787d7a84dbbfba6f250dd7a5efd689e935f03dd83b0f919d39349e1f23f83", size = 269381, upload-time = "2025-09-25T19:49:14.308Z" }, + { url = "https://files.pythonhosted.org/packages/b1/34/7e4e6abb7a8778db6422e88b1f06eb07c47682313997ee8a8f9352e5a6f1/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:137c5156524328a24b9fac1cb5db0ba618bc97d11970b39184c1d87dc4bf1746", size = 271750, upload-time = "2025-09-25T19:49:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/54f416be2499bd72123c70d98d36c6cd61a4e33d9b89562c22481c81bb30/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:38cac74101777a6a7d3b3e3cfefa57089b5ada650dce2baf0cbdd9d65db22a9e", size = 303757, upload-time = "2025-09-25T19:49:17.244Z" }, + { url = "https://files.pythonhosted.org/packages/13/62/062c24c7bcf9d2826a1a843d0d605c65a755bc98002923d01fd61270705a/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d8d65b564ec849643d9f7ea05c6d9f0cd7ca23bdd4ac0c2dbef1104ab504543d", size = 306740, upload-time = "2025-09-25T19:49:18.693Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/1fdbfc8c0f20875b6b4020f3c7dc447b8de60aa0be5faaf009d24242aec9/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:741449132f64b3524e95cd30e5cd3343006ce146088f074f31ab26b94e6c75ba", size = 334197, upload-time = "2025-09-25T19:49:20.523Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c1/8b84545382d75bef226fbc6588af0f7b7d095f7cd6a670b42a86243183cd/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:212139484ab3207b1f0c00633d3be92fef3c5f0af17cad155679d03ff2ee1e41", size = 352974, upload-time = "2025-09-25T19:49:22.254Z" }, + { url = "https://files.pythonhosted.org/packages/10/a6/ffb49d4254ed085e62e3e5dd05982b4393e32fe1e49bb1130186617c29cd/bcrypt-5.0.0-cp313-cp313t-win32.whl", hash = "sha256:9d52ed507c2488eddd6a95bccee4e808d3234fa78dd370e24bac65a21212b861", size = 148498, upload-time = "2025-09-25T19:49:24.134Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/259559edc85258b6d5fc5471a62a3299a6aa37a6611a169756bf4689323c/bcrypt-5.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f6984a24db30548fd39a44360532898c33528b74aedf81c26cf29c51ee47057e", size = 145853, upload-time = "2025-09-25T19:49:25.702Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/9714173403c7e8b245acf8e4be8876aac64a209d1b392af457c79e60492e/bcrypt-5.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9fffdb387abe6aa775af36ef16f55e318dcda4194ddbf82007a6f21da29de8f5", size = 139626, upload-time = "2025-09-25T19:49:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/f8/14/c18006f91816606a4abe294ccc5d1e6f0e42304df5a33710e9e8e95416e1/bcrypt-5.0.0-cp314-cp314t-macosx_10_12_universal2.whl", hash = "sha256:4870a52610537037adb382444fefd3706d96d663ac44cbb2f37e3919dca3d7ef", size = 481862, upload-time = "2025-09-25T19:49:28.365Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/dd074d831f00e589537e07a0725cf0e220d1f0d5d8e85ad5bbff251c45aa/bcrypt-5.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48f753100931605686f74e27a7b49238122aa761a9aefe9373265b8b7aa43ea4", size = 268544, upload-time = "2025-09-25T19:49:30.39Z" }, + { url = "https://files.pythonhosted.org/packages/f5/91/50ccba088b8c474545b034a1424d05195d9fcbaaf802ab8bfe2be5a4e0d7/bcrypt-5.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70aadb7a809305226daedf75d90379c397b094755a710d7014b8b117df1ebbf", size = 271787, upload-time = "2025-09-25T19:49:32.144Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e7/d7dba133e02abcda3b52087a7eea8c0d4f64d3e593b4fffc10c31b7061f3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:744d3c6b164caa658adcb72cb8cc9ad9b4b75c7db507ab4bc2480474a51989da", size = 269753, upload-time = "2025-09-25T19:49:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/33/fc/5b145673c4b8d01018307b5c2c1fc87a6f5a436f0ad56607aee389de8ee3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a28bc05039bdf3289d757f49d616ab3efe8cf40d8e8001ccdd621cd4f98f4fc9", size = 289587, upload-time = "2025-09-25T19:49:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/27/d7/1ff22703ec6d4f90e62f1a5654b8867ef96bafb8e8102c2288333e1a6ca6/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7f277a4b3390ab4bebe597800a90da0edae882c6196d3038a73adf446c4f969f", size = 272178, upload-time = "2025-09-25T19:49:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/c8/88/815b6d558a1e4d40ece04a2f84865b0fef233513bd85fd0e40c294272d62/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:79cfa161eda8d2ddf29acad370356b47f02387153b11d46042e93a0a95127493", size = 269295, upload-time = "2025-09-25T19:49:38.164Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/e0db387c79ab4931fc89827d37608c31cc57b6edc08ccd2386139028dc0d/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a5393eae5722bcef046a990b84dff02b954904c36a194f6cfc817d7dca6c6f0b", size = 271700, upload-time = "2025-09-25T19:49:39.917Z" }, + { url = "https://files.pythonhosted.org/packages/06/83/1570edddd150f572dbe9fc00f6203a89fc7d4226821f67328a85c330f239/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f4c94dec1b5ab5d522750cb059bb9409ea8872d4494fd152b53cca99f1ddd8c", size = 334034, upload-time = "2025-09-25T19:49:41.227Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/ea64e51a65e56ae7a8a4ec236c2bfbdd4b23008abd50ac33fbb2d1d15424/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0cae4cb350934dfd74c020525eeae0a5f79257e8a201c0c176f4b84fdbf2a4b4", size = 352766, upload-time = "2025-09-25T19:49:43.08Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/1a388d21ee66876f27d1a1f41287897d0c0f1712ef97d395d708ba93004c/bcrypt-5.0.0-cp314-cp314t-win32.whl", hash = "sha256:b17366316c654e1ad0306a6858e189fc835eca39f7eb2cafd6aaca8ce0c40a2e", size = 152449, upload-time = "2025-09-25T19:49:44.971Z" }, + { url = "https://files.pythonhosted.org/packages/3f/61/3291c2243ae0229e5bca5d19f4032cecad5dfb05a2557169d3a69dc0ba91/bcrypt-5.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:92864f54fb48b4c718fc92a32825d0e42265a627f956bc0361fe869f1adc3e7d", size = 149310, upload-time = "2025-09-25T19:49:46.162Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/4b01c52ae0c1a681d4021e5dd3e45b111a8fb47254a274fa9a378d8d834b/bcrypt-5.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dd19cf5184a90c873009244586396a6a884d591a5323f0e8a5922560718d4993", size = 143761, upload-time = "2025-09-25T19:49:47.345Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/6237f151fbfe295fe3e074ecc6d44228faa1e842a81f6d34a02937ee1736/bcrypt-5.0.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b", size = 494553, upload-time = "2025-09-25T19:49:49.006Z" }, + { url = "https://files.pythonhosted.org/packages/45/b6/4c1205dde5e464ea3bd88e8742e19f899c16fa8916fb8510a851fae985b5/bcrypt-5.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", size = 275009, upload-time = "2025-09-25T19:49:50.581Z" }, + { url = "https://files.pythonhosted.org/packages/3b/71/427945e6ead72ccffe77894b2655b695ccf14ae1866cd977e185d606dd2f/bcrypt-5.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", size = 278029, upload-time = "2025-09-25T19:49:52.533Z" }, + { url = "https://files.pythonhosted.org/packages/17/72/c344825e3b83c5389a369c8a8e58ffe1480b8a699f46c127c34580c4666b/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", size = 275907, upload-time = "2025-09-25T19:49:54.709Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7e/d4e47d2df1641a36d1212e5c0514f5291e1a956a7749f1e595c07a972038/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", size = 296500, upload-time = "2025-09-25T19:49:56.013Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c3/0ae57a68be2039287ec28bc463b82e4b8dc23f9d12c0be331f4782e19108/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", size = 278412, upload-time = "2025-09-25T19:49:57.356Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/77424511adb11e6a99e3a00dcc7745034bee89036ad7d7e255a7e47be7d8/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", size = 275486, upload-time = "2025-09-25T19:49:59.116Z" }, + { url = "https://files.pythonhosted.org/packages/43/0a/405c753f6158e0f3f14b00b462d8bca31296f7ecfc8fc8bc7919c0c7d73a/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", size = 277940, upload-time = "2025-09-25T19:50:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/b3efc285d4aadc1fa83db385ec64dcfa1707e890eb42f03b127d66ac1b7b/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", size = 310776, upload-time = "2025-09-25T19:50:02.393Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/47ee337dacecde6d234890fe929936cb03ebc4c3a7460854bbd9c97780b8/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", size = 312922, upload-time = "2025-09-25T19:50:04.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3a/43d494dfb728f55f4e1cf8fd435d50c16a2d75493225b54c8d06122523c6/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", size = 341367, upload-time = "2025-09-25T19:50:05.559Z" }, + { url = "https://files.pythonhosted.org/packages/55/ab/a0727a4547e383e2e22a630e0f908113db37904f58719dc48d4622139b5c/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", size = 359187, upload-time = "2025-09-25T19:50:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/461f352fdca663524b4643d8b09e8435b4990f17fbf4fea6bc2a90aa0cc7/bcrypt-5.0.0-cp38-abi3-win32.whl", hash = "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", size = 153752, upload-time = "2025-09-25T19:50:08.515Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/4190e60921927b7056820291f56fc57d00d04757c8b316b2d3c0d1d6da2c/bcrypt-5.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", size = 150881, upload-time = "2025-09-25T19:50:09.742Z" }, + { url = "https://files.pythonhosted.org/packages/54/12/cd77221719d0b39ac0b55dbd39358db1cd1246e0282e104366ebbfb8266a/bcrypt-5.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", size = 144931, upload-time = "2025-09-25T19:50:11.016Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/2af136406e1c3839aea9ecadc2f6be2bcd1eff255bd451dd39bcf302c47a/bcrypt-5.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", size = 495313, upload-time = "2025-09-25T19:50:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ee/2f4985dbad090ace5ad1f7dd8ff94477fe089b5fab2040bd784a3d5f187b/bcrypt-5.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", size = 275290, upload-time = "2025-09-25T19:50:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/b77ade812672d15cf50842e167eead80ac3514f3beacac8902915417f8b7/bcrypt-5.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", size = 278253, upload-time = "2025-09-25T19:50:15.089Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/ed00ed32f1040f7990dac7115f82273e3c03da1e1a1587a778d8cea496d8/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", size = 276084, upload-time = "2025-09-25T19:50:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fa6e16145e145e87f1fa351bbd54b429354fd72145cd3d4e0c5157cf4c70/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", size = 297185, upload-time = "2025-09-25T19:50:18.525Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/11f8a31d8b67cca3371e046db49baa7c0594d71eb40ac8121e2fc0888db0/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", size = 278656, upload-time = "2025-09-25T19:50:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/ac/31/79f11865f8078e192847d2cb526e3fa27c200933c982c5b2869720fa5fce/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", size = 275662, upload-time = "2025-09-25T19:50:21.567Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8d/5e43d9584b3b3591a6f9b68f755a4da879a59712981ef5ad2a0ac1379f7a/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", size = 278240, upload-time = "2025-09-25T19:50:23.305Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/44590e3fc158620f680a978aafe8f87a4c4320da81ed11552f0323aa9a57/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", size = 311152, upload-time = "2025-09-25T19:50:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/e4fbfc46f14f47b0d20493669a625da5827d07e8a88ee460af6cd9768b44/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", size = 313284, upload-time = "2025-09-25T19:50:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/25/ae/479f81d3f4594456a01ea2f05b132a519eff9ab5768a70430fa1132384b1/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", size = 341643, upload-time = "2025-09-25T19:50:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/df/d2/36a086dee1473b14276cd6ea7f61aef3b2648710b5d7f1c9e032c29b859f/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", size = 359698, upload-time = "2025-09-25T19:50:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f6/688d2cd64bfd0b14d805ddb8a565e11ca1fb0fd6817175d58b10052b6d88/bcrypt-5.0.0-cp39-abi3-win32.whl", hash = "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", size = 153725, upload-time = "2025-09-25T19:50:34.384Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/9d9a641194a730bda138b3dfe53f584d61c58cd5230e37566e83ec2ffa0d/bcrypt-5.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", size = 150912, upload-time = "2025-09-25T19:50:35.69Z" }, + { url = "https://files.pythonhosted.org/packages/27/44/d2ef5e87509158ad2187f4dd0852df80695bb1ee0cfe0a684727b01a69e0/bcrypt-5.0.0-cp39-abi3-win_arm64.whl", hash = "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", size = 144953, upload-time = "2025-09-25T19:50:37.32Z" }, + { url = "https://files.pythonhosted.org/packages/8a/75/4aa9f5a4d40d762892066ba1046000b329c7cd58e888a6db878019b282dc/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7edda91d5ab52b15636d9c30da87d2cc84f426c72b9dba7a9b4fe142ba11f534", size = 271180, upload-time = "2025-09-25T19:50:38.575Z" }, + { url = "https://files.pythonhosted.org/packages/54/79/875f9558179573d40a9cc743038ac2bf67dfb79cecb1e8b5d70e88c94c3d/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:046ad6db88edb3c5ece4369af997938fb1c19d6a699b9c1b27b0db432faae4c4", size = 273791, upload-time = "2025-09-25T19:50:39.913Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fe/975adb8c216174bf70fc17535f75e85ac06ed5252ea077be10d9cff5ce24/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:dcd58e2b3a908b5ecc9b9df2f0085592506ac2d5110786018ee5e160f28e0911", size = 270746, upload-time = "2025-09-25T19:50:43.306Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f8/972c96f5a2b6c4b3deca57009d93e946bbdbe2241dca9806d502f29dd3ee/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:6b8f520b61e8781efee73cba14e3e8c9556ccfb375623f4f97429544734545b4", size = 273375, upload-time = "2025-09-25T19:50:45.43Z" }, +] + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-bcrypt" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "bcrypt" }, + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "bcrypt", specifier = "==5.0.0" }, + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "wheel" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "setuptools-rust" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "semantic-version" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/ba/b31781d61bf9ee3c232a1d1160db11c11cdeae1d44e06c90723b25a8279f/setuptools_rust-1.13.0.tar.gz", hash = "sha256:f2afcf4baeee689910ce49cfa8aad4e08cce72f417449bcc32891b8664fdc726", size = 314100, upload-time = "2026-06-27T21:45:02.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/80/909e46e684e47b116ed145bf2a1a8f5f7c9d90e8c3f8f7fce6a529c0068d/setuptools_rust-1.13.0-py3-none-any.whl", hash = "sha256:666439c4d90e968bb625bcf87ec0aa02b4f49e599d2f5dc255c633a04e8eca99", size = 30536, upload-time = "2026-06-27T21:45:01.583Z" }, +] + +[[package]] +name = "wheel" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, +] diff --git a/e2e/crossbuild/contourpy/BUILD.bazel b/e2e/crossbuild/contourpy/BUILD.bazel new file mode 100644 index 000000000..40fd8143f --- /dev/null +++ b/e2e/crossbuild/contourpy/BUILD.bazel @@ -0,0 +1,12 @@ +# contourpy ships official prebuilt wheels for linux/amd64 and linux/arm64, +# but [tool.uv] no-binary-package forces it to build from sdist here. Unlike +# //geohash (setuptools) and //zstandard (setuptools+CFFI), this is a +# meson-python backend — pep517_native_whl doesn't support it yet. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "contourpy", + deps = ["@pypi_crossbuild_contourpy//contourpy"], + so_pattern = "whl_install__crossbuild_contourpy.*_contourpy.*\\.so$$", +) diff --git a/e2e/crossbuild/contourpy/contourpy_image_command_test.yaml b/e2e/crossbuild/contourpy/contourpy_image_command_test.yaml new file mode 100644 index 000000000..7d8f5c80c --- /dev/null +++ b/e2e/crossbuild/contourpy/contourpy_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# contourpy_main.py asserts the exact 1.5-contour of z=x+y itself and only +# prints "OK" on success. +commandTests: + - name: contourpy computes the 1.5 contour of z=x+y correctly + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/contourpy/contourpy_main.py b/e2e/crossbuild/contourpy/contourpy_main.py new file mode 100644 index 000000000..e583fae14 --- /dev/null +++ b/e2e/crossbuild/contourpy/contourpy_main.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +import math + +import numpy as np +import contourpy + + +def main() -> None: + x = np.array([0.0, 1.0, 2.0]) + y = np.array([0.0, 1.0, 2.0]) + z = np.array([[0.0, 1.0, 2.0], [1.0, 2.0, 3.0], [2.0, 3.0, 4.0]]) + cg = contourpy.contour_generator(x, y, z) + lines = cg.lines(1.5) + assert len(lines) == 1, "expected exactly one contour line, got {}".format(len(lines)) + + # z=x+y is bilinear (no cross term), so its 1.5-contour is the exact + # line x+y=1.5 from (0,1.5) to (1.5,0) — hand-verified, not just captured + # output. + expected = [(0.0, 1.5), (0.5, 1.0), (1.0, 0.5), (1.5, 0.0)] + points = [tuple(p) for p in lines[0]] + assert len(points) == len(expected), "expected {} points, got {}".format(len(expected), len(points)) + for got, want in zip(points, expected): + assert math.isclose(got[0], want[0], abs_tol=1e-9) and math.isclose(got[1], want[1], abs_tol=1e-9), \ + "point {} != expected {}".format(got, want) + + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/contourpy/pyproject.toml b/e2e/crossbuild/contourpy/pyproject.toml new file mode 100644 index 000000000..1e9101493 --- /dev/null +++ b/e2e/crossbuild/contourpy/pyproject.toml @@ -0,0 +1,15 @@ +[project] +name = "crossbuild_contourpy" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "contourpy==1.3.3", + "meson", + "meson-python", + "ninja", + "pybind11", +] + +[tool.uv] +no-binary-package = ["contourpy"] diff --git a/e2e/crossbuild/contourpy/uv.lock b/e2e/crossbuild/contourpy/uv.lock new file mode 100644 index 000000000..114e75ec0 --- /dev/null +++ b/e2e/crossbuild/contourpy/uv.lock @@ -0,0 +1,364 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform != 'ios'", + "python_full_version >= '3.12' and sys_platform == 'ios'", + "python_full_version < '3.12' and sys_platform != 'ios'", + "python_full_version < '3.12' and sys_platform == 'ios'", +] + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt' and sys_platform != 'ios'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "crossbuild-contourpy" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "contourpy" }, + { name = "meson" }, + { name = "meson-python" }, + { name = "ninja" }, + { name = "pybind11" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "contourpy", specifier = "==1.3.3" }, + { name = "meson" }, + { name = "meson-python" }, + { name = "ninja" }, + { name = "pybind11" }, +] + +[[package]] +name = "meson" +version = "1.11.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/ce/c4d3d849d5cf8d9193b075acf435fb5dc0f4bdab35a3486f1204fd8265a7/meson-1.11.2.tar.gz", hash = "sha256:698feae069cef3ecd4d7aaf281d7df359bdfcf555a9a1564383d3b913fa8a736", size = 2463316, upload-time = "2026-07-11T07:19:44.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/c5/680527bdddf039807f22041882678b7f21d3380b4cdbc46abf2f24e2db6c/meson-1.11.2-py3-none-any.whl", hash = "sha256:7e4f6e83fec83e3eaac928e058b073c7557b282c35b6a2024cea143a39926a39", size = 1078911, upload-time = "2026-07-11T07:19:40.636Z" }, +] + +[[package]] +name = "meson-python" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "meson" }, + { name = "packaging" }, + { name = "pyproject-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/f0/d794d7ed8a843a8a8947768f3b329d1e8601222dc95d930f4a5f9706cd6c/meson_python-0.20.0.tar.gz", hash = "sha256:6d9726ae6cd37e22f210c74b364b30180a68c20442e97ff09f3c566a414af738", size = 102641, upload-time = "2026-06-10T19:42:52.132Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/ad/77f9483e180cabab2772ac222aedd3dfab858e60d992f40414a3f08e7494/meson_python-0.20.0-py3-none-any.whl", hash = "sha256:6a744cf0c09e76ecbdc58cfa374b48c8902dac1b74479628238634efbf36aec9", size = 29386, upload-time = "2026-06-10T19:42:50.614Z" }, +] + +[[package]] +name = "ninja" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/73/79a0b22fc731989c708068427579e840a6cf4e937fe7ae5c5d0b7356ac22/ninja-1.13.0.tar.gz", hash = "sha256:4a40ce995ded54d9dc24f8ea37ff3bf62ad192b547f6c7126e7e25045e76f978", size = 242558, upload-time = "2025-08-11T15:10:19.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/74/d02409ed2aa865e051b7edda22ad416a39d81a84980f544f8de717cab133/ninja-1.13.0-py3-none-macosx_10_9_universal2.whl", hash = "sha256:fa2a8bfc62e31b08f83127d1613d10821775a0eb334197154c4d6067b7068ff1", size = 310125, upload-time = "2025-08-11T15:09:50.971Z" }, + { url = "https://files.pythonhosted.org/packages/8e/de/6e1cd6b84b412ac1ef327b76f0641aeb5dcc01e9d3f9eee0286d0c34fd93/ninja-1.13.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3d00c692fb717fd511abeb44b8c5d00340c36938c12d6538ba989fe764e79630", size = 177467, upload-time = "2025-08-11T15:09:52.767Z" }, + { url = "https://files.pythonhosted.org/packages/c8/83/49320fb6e58ae3c079381e333575fdbcf1cca3506ee160a2dcce775046fa/ninja-1.13.0-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:be7f478ff9f96a128b599a964fc60a6a87b9fa332ee1bd44fa243ac88d50291c", size = 187834, upload-time = "2025-08-11T15:09:54.115Z" }, + { url = "https://files.pythonhosted.org/packages/56/c7/ba22748fb59f7f896b609cd3e568d28a0a367a6d953c24c461fe04fc4433/ninja-1.13.0-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:60056592cf495e9a6a4bea3cd178903056ecb0943e4de45a2ea825edb6dc8d3e", size = 202736, upload-time = "2025-08-11T15:09:55.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/22/d1de07632b78ac8e6b785f41fa9aad7a978ec8c0a1bf15772def36d77aac/ninja-1.13.0-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1c97223cdda0417f414bf864cfb73b72d8777e57ebb279c5f6de368de0062988", size = 179034, upload-time = "2025-08-11T15:09:57.394Z" }, + { url = "https://files.pythonhosted.org/packages/ed/de/0e6edf44d6a04dabd0318a519125ed0415ce437ad5a1ec9b9be03d9048cf/ninja-1.13.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa", size = 180716, upload-time = "2025-08-11T15:09:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/938b562f9057aaa4d6bfbeaa05e81899a47aebb3ba6751e36c027a7f5ff7/ninja-1.13.0-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4be9c1b082d244b1ad7ef41eb8ab088aae8c109a9f3f0b3e56a252d3e00f42c1", size = 146843, upload-time = "2025-08-11T15:10:00.046Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fb/d06a3838de4f8ab866e44ee52a797b5491df823901c54943b2adb0389fbb/ninja-1.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6739d3352073341ad284246f81339a384eec091d9851a886dfa5b00a6d48b3e2", size = 154402, upload-time = "2025-08-11T15:10:01.657Z" }, + { url = "https://files.pythonhosted.org/packages/31/bf/0d7808af695ceddc763cf251b84a9892cd7f51622dc8b4c89d5012779f06/ninja-1.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11be2d22027bde06f14c343f01d31446747dbb51e72d00decca2eb99be911e2f", size = 552388, upload-time = "2025-08-11T15:10:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/9d/70/c99d0c2c809f992752453cce312848abb3b1607e56d4cd1b6cded317351a/ninja-1.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aa45b4037b313c2f698bc13306239b8b93b4680eb47e287773156ac9e9304714", size = 472501, upload-time = "2025-08-11T15:10:04.735Z" }, + { url = "https://files.pythonhosted.org/packages/9f/43/c217b1153f0e499652f5e0766da8523ce3480f0a951039c7af115e224d55/ninja-1.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f8e1e8a1a30835eeb51db05cf5a67151ad37542f5a4af2a438e9490915e5b72", size = 638280, upload-time = "2025-08-11T15:10:06.512Z" }, + { url = "https://files.pythonhosted.org/packages/8c/45/9151bba2c8d0ae2b6260f71696330590de5850e5574b7b5694dce6023e20/ninja-1.13.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:3d7d7779d12cb20c6d054c61b702139fd23a7a964ec8f2c823f1ab1b084150db", size = 642420, upload-time = "2025-08-11T15:10:08.35Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/95752eb635bb8ad27d101d71bef15bc63049de23f299e312878fc21cb2da/ninja-1.13.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:d741a5e6754e0bda767e3274a0f0deeef4807f1fec6c0d7921a0244018926ae5", size = 585106, upload-time = "2025-08-11T15:10:09.818Z" }, + { url = "https://files.pythonhosted.org/packages/c1/31/aa56a1a286703800c0cbe39fb4e82811c277772dc8cd084f442dd8e2938a/ninja-1.13.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:e8bad11f8a00b64137e9b315b137d8bb6cbf3086fbdc43bf1f90fd33324d2e96", size = 707138, upload-time = "2025-08-11T15:10:11.366Z" }, + { url = "https://files.pythonhosted.org/packages/34/6f/5f5a54a1041af945130abdb2b8529cbef0cdcbbf9bcf3f4195378319d29a/ninja-1.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4f2a072db3c0f944c32793e91532d8948d20d9ab83da9c0c7c15b5768072200", size = 581758, upload-time = "2025-08-11T15:10:13.295Z" }, + { url = "https://files.pythonhosted.org/packages/95/97/51359c77527d45943fe7a94d00a3843b81162e6c4244b3579fe8fc54cb9c/ninja-1.13.0-py3-none-win32.whl", hash = "sha256:8cfbb80b4a53456ae8a39f90ae3d7a2129f45ea164f43fadfa15dc38c4aef1c9", size = 267201, upload-time = "2025-08-11T15:10:15.158Z" }, + { url = "https://files.pythonhosted.org/packages/29/45/c0adfbfb0b5895aa18cec400c535b4f7ff3e52536e0403602fc1a23f7de9/ninja-1.13.0-py3-none-win_amd64.whl", hash = "sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e", size = 309975, upload-time = "2025-08-11T15:10:16.697Z" }, + { url = "https://files.pythonhosted.org/packages/df/93/a7b983643d1253bb223234b5b226e69de6cda02b76cdca7770f684b795f5/ninja-1.13.0-py3-none-win_arm64.whl", hash = "sha256:3c0b40b1f0bba764644385319028650087b4c1b18cdfa6f45cb39a3669b81aa9", size = 290806, upload-time = "2025-08-11T15:10:18.018Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.12' and sys_platform != 'ios'", + "python_full_version < '3.12' and sys_platform == 'ios'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform != 'ios'", + "python_full_version >= '3.12' and sys_platform == 'ios'", +] +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, + { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, + { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, + { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, + { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, + { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" }, + { url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" }, + { url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" }, + { url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" }, + { url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" }, + { url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pybind11" +version = "3.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/f0/35145a3c3baffeef55d4b8324caa33abaa8fa56ab345ecd4b2211d09163e/pybind11-3.0.4.tar.gz", hash = "sha256:3286b59c8a774b9ee650169302dd5a4eedc30a8617905a0560dd8ee44775130c", size = 589533, upload-time = "2026-04-19T03:08:15.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/06/c3a23c9a0263b136c519f033a58d4641e73065fefc7754e9667ec206d992/pybind11-3.0.4-py3-none-any.whl", hash = "sha256:961720ee652da51d531b7b2451a6bd2bc042b0106e6d9baa48ecb7d58034ce63", size = 314166, upload-time = "2026-04-19T03:08:14.091Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pyproject-metadata" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/76/1cae539918a7b1746d624c2f01560b793c22cd8c081157505bb9bbf0e34d/pyproject_metadata-0.12.1.tar.gz", hash = "sha256:8809a4df6fe08279b39a8890669506ed3158e0617855ac9aff098fcbe772ae4c", size = 48457, upload-time = "2026-07-04T02:19:32.029Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/8e/d883718e872abc214ba053f60f7e6edc2abd5ffbd1544beb01a9c92ddd3c/pyproject_metadata-0.12.1-py3-none-any.whl", hash = "sha256:f7162d580a96386a8eb096da06215f981f547d1490f03055ef99e323bc2da427", size = 23452, upload-time = "2026-07-04T02:19:30.657Z" }, +] diff --git a/e2e/crossbuild/geohash/BUILD.bazel b/e2e/crossbuild/geohash/BUILD.bazel new file mode 100644 index 000000000..63b21f86c --- /dev/null +++ b/e2e/crossbuild/geohash/BUILD.bazel @@ -0,0 +1,158 @@ +# python-geohash has no prebuilt wheel — this package covers the actual +# cross-compilation of its C++ extension for linux/amd64, linux/arm64, and +# (from a macOS host) arm64/amd64 macOS. See //psycopg2 for the +# platform-transition-only packaging coverage. + +load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") +load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") +load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@container_structure_test//:defs.bzl", "container_structure_test") +load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_shell//shell:sh_test.bzl", "sh_test") +load("//tools:checks.bzl", "assert_so_arch", "assert_so_suffix") + +# assert_so_arch/assert_so_suffix thread this into a genrule cmd, so a +# trailing "$" (the regex end-anchor) must be doubled for Bazel's Make-variable +# expansion, same as $$(...) elsewhere in a cmd string. +_SO_PATTERN = "site-packages/_geohash.*\\.so$$" + +exports_files(["require_cxx_driver.patch"]) + +py_binary( + name = "geohash_bin", + srcs = ["geohash_main.py"], + dep_group = "crossbuild", + main = "geohash_main.py", + python_version = "3.12", + deps = [ + "@pypi_crossbuild//python_geohash", + ], +) + +py_image_layer( + name = "geohash_layers", + binary = ":geohash_bin", +) + +platform_transition_filegroup( + name = "geohash_amd64_layers", + srcs = [":geohash_layers"], + target_platform = "//:amd64_linux", +) + +platform_transition_filegroup( + name = "geohash_arm64_layers", + srcs = [":geohash_layers"], + target_platform = "//:arm64_linux", +) + +# Bazel-9-safe version of the ELF/suffix checks below. +build_test( + name = "geohash_build_test", + targets = [ + ":geohash_amd64_layers", + ":geohash_arm64_layers", + ], +) + +# ELF machine byte and EXT_SUFFIX/SOABI of the built .so — catches a cross +# build that silently fell back to the host compiler despite claiming the +# right wheel tag. +assert_so_arch( + name = "geohash_so_arch_amd64_test", + actual = ":geohash_amd64_layers", + expected_machine_hex = "3e00", + so_pattern = _SO_PATTERN, +) + +assert_so_arch( + name = "geohash_so_arch_arm64_test", + actual = ":geohash_arm64_layers", + expected_machine_hex = "b700", + so_pattern = _SO_PATTERN, +) + +assert_so_suffix( + name = "geohash_so_suffix_amd64_test", + actual = ":geohash_amd64_layers", + expected_suffix = "cpython-312-x86_64-linux-gnu", + so_pattern = _SO_PATTERN, +) + +assert_so_suffix( + name = "geohash_so_suffix_arm64_test", + actual = ":geohash_arm64_layers", + expected_suffix = "cpython-312-aarch64-linux-gnu", + so_pattern = _SO_PATTERN, +) + +oci_image( + name = "geohash_image", + base = "@ubuntu", + entrypoint = ["/app"], + tars = [":geohash_layers"], +) + +platform_transition_filegroup( + name = "geohash_amd64_image", + srcs = [":geohash_image"], + target_platform = "//:amd64_linux", +) + +platform_transition_filegroup( + name = "geohash_arm64_image", + srcs = [":geohash_image"], + target_platform = "//:arm64_linux", +) + +container_structure_test( + name = "geohash_amd64_image_command_test", + configs = ["geohash_image_command_test.yaml"], + image = ":geohash_amd64_image", + platform = "linux/amd64", + tags = ["requires-docker"], +) + +# Runs the arm64 build under QEMU (binfmt_misc) instead of just checking its +# ELF/suffix — proves the extension computes the right answer, not just that +# it looks cross-compiled. Local repro: sudo apt-get install qemu-user-static +# binfmt-support. +container_structure_test( + name = "geohash_arm64_image_command_test", + configs = ["geohash_image_command_test.yaml"], + image = ":geohash_arm64_image", + platform = "linux/aarch64", + tags = [ + "requires-docker", + "requires-qemu", + ], +) + +# geohash_bin with no platform override already targets the ambient host, +# so no transition is needed to exercise native macOS. +sh_test( + name = "geohash_macos_native_test", + srcs = ["check_geohash_output.sh"], + args = ["$(rootpath :geohash_bin)"], + data = [":geohash_bin"], + target_compatible_with = ["@platforms//os:macos"], +) + +# manual, not target_compatible_with: the transition below always resolves +# to os:macos regardless of the real host, so target_compatible_with can't +# tell Linux apart from macOS here. test.sh invokes both by label after +# checking uname. +platform_transition_filegroup( + name = "geohash_amd64_macos_bin", + srcs = [":geohash_bin"], + tags = ["manual"], + target_platform = "//:amd64_macos", +) + +sh_test( + name = "geohash_macos_amd64_cross_test", + srcs = ["check_geohash_output.sh"], + args = ["$(rootpath :geohash_amd64_macos_bin)"], + data = [":geohash_amd64_macos_bin"], + tags = ["manual"], +) diff --git a/e2e/crossbuild/geohash/check_geohash_output.sh b/e2e/crossbuild/geohash/check_geohash_output.sh new file mode 100755 index 000000000..0a7fa5e1c --- /dev/null +++ b/e2e/crossbuild/geohash/check_geohash_output.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# geohash_main.py asserts geohash.encode(37.7749, -122.4194) itself and only +# prints "OK" on success, so this just has to confirm the binary reached +# that point rather than re-checking the expected geohash value here too. +set -euo pipefail + +bin="${1:?usage: check_geohash_output.sh }" +expected="OK" + +actual="$("$bin")" +if [[ "$actual" != "$expected" ]]; then + echo "FAIL: $bin printed '$actual', expected '$expected'" + exit 1 +fi + +echo "PASS: $bin printed '$actual'" diff --git a/e2e/crossbuild/geohash/geohash_image_command_test.yaml b/e2e/crossbuild/geohash/geohash_image_command_test.yaml new file mode 100644 index 000000000..075bf6ec9 --- /dev/null +++ b/e2e/crossbuild/geohash/geohash_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# geohash.encode(37.7749, -122.4194) is deterministic across architectures; +# geohash_main.py asserts the exact value and only prints "OK" on success. +commandTests: + - name: geohash encodes correctly + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/geohash/geohash_main.py b/e2e/crossbuild/geohash/geohash_main.py new file mode 100644 index 000000000..70580279b --- /dev/null +++ b/e2e/crossbuild/geohash/geohash_main.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +import geohash + + +def main() -> None: + encoded = geohash.encode(37.7749, -122.4194) + assert encoded == "9q8yyk8ytpxr", "geohash.encode returned {!r}, expected '9q8yyk8ytpxr'".format(encoded) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch b/e2e/crossbuild/geohash/require_cxx_driver.patch similarity index 100% rename from e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch rename to e2e/crossbuild/geohash/require_cxx_driver.patch diff --git a/e2e/crossbuild/jpype1/BUILD.bazel b/e2e/crossbuild/jpype1/BUILD.bazel new file mode 100644 index 000000000..c29d5c161 --- /dev/null +++ b/e2e/crossbuild/jpype1/BUILD.bazel @@ -0,0 +1,17 @@ +# jpype1 ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# [tool.uv] no-binary-package forces it to build from sdist here. Its +# scikit-build-core/CMake build additionally needs a JDK (javac/JNI headers) +# and Apache Ant (to build a Java-side JAR) — both always exec-platform +# tools regardless of what CPU _jpype.so targets, since jpype1's compiled +# extension only links against libdl, never against libjvm/libjawt (see +# CMakeLists.txt's target_link_libraries), and the JAR Ant produces is +# portable JVM bytecode. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "jpype1", + check_so_suffix = False, + deps = ["@pypi_crossbuild_jpype1//jpype1"], + so_pattern = "whl_install__crossbuild_jpype1.*_jpype.*\\.so$$", +) diff --git a/e2e/crossbuild/jpype1/jpype1_image_command_test.yaml b/e2e/crossbuild/jpype1/jpype1_image_command_test.yaml new file mode 100644 index 000000000..fdc4cdcd7 --- /dev/null +++ b/e2e/crossbuild/jpype1/jpype1_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# jpype1_main.py asserts jpype.__version__ itself and only prints "OK" on +# success. +commandTests: + - name: jpype1 imports successfully after an Ant + JNI cross build + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/jpype1/jpype1_main.py b/e2e/crossbuild/jpype1/jpype1_main.py new file mode 100644 index 000000000..13d5d2088 --- /dev/null +++ b/e2e/crossbuild/jpype1/jpype1_main.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +import jpype + + +def main() -> None: + # jpype.__version__ is a plain constant baked into the pure-Python + # package — checking it proves the compiled _jpype extension (and its + # Java-side JAR, built via Ant) imported successfully, without needing + # to actually start a JVM at runtime (which would need a target-arch JRE + # inside the image too). + assert jpype.__version__ == "1.7.1", "expected jpype 1.7.1, got {}".format(jpype.__version__) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/jpype1/pyproject.toml b/e2e/crossbuild/jpype1/pyproject.toml new file mode 100644 index 000000000..752870bad --- /dev/null +++ b/e2e/crossbuild/jpype1/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "crossbuild_jpype1" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "jpype1==1.7.1", + "scikit-build-core", + "setuptools", + "wheel", +] + +[tool.uv] +no-binary-package = ["jpype1"] diff --git a/e2e/crossbuild/jpype1/uv.lock b/e2e/crossbuild/jpype1/uv.lock new file mode 100644 index 000000000..2a0b9eee6 --- /dev/null +++ b/e2e/crossbuild/jpype1/uv.lock @@ -0,0 +1,149 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-jpype1" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "jpype1" }, + { name = "scikit-build-core" }, + { name = "setuptools" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "jpype1", specifier = "==1.7.1" }, + { name = "scikit-build-core" }, + { name = "setuptools" }, + { name = "wheel" }, +] + +[[package]] +name = "jpype1" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/a2/5d27e81d24eef64668bf702bfe0e091cc48388b4666f36e025243eb9d827/jpype1-1.7.1.tar.gz", hash = "sha256:3cd88838dc3d2d546f7eaeadaaff864e590010c15f2b6a44b6f37e60796a14b2", size = 783791, upload-time = "2026-05-06T23:55:10.664Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/5e/5611d50222d146a060dbf22e69c4017545341ea6b289a591d5a9bdaad718/jpype1-1.7.1-1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:4c81ee11aee5ed938d7415877cd9c7a0cc9cbf1dac87f7eab928e641323a385b", size = 571633, upload-time = "2026-05-19T20:19:33.536Z" }, + { url = "https://files.pythonhosted.org/packages/79/32/8b2279b12364f260111c7843bf9ede7dc442d5521d6d2ca728b3d522d445/jpype1-1.7.1-1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:b3ddd9f9099202212a34679dfb95dda590bcfbd23289559d104e24abec9120d1", size = 569654, upload-time = "2026-05-19T20:19:36.41Z" }, + { url = "https://files.pythonhosted.org/packages/b5/67/5caa0de30bcb1c8786cc988144a68908e0624de20cfed470a67b1dd1f60c/jpype1-1.7.1-1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:6d491a81281407f8a68552eb3c0e635e576e066c069268dc29a1ea27bb4778ae", size = 569800, upload-time = "2026-05-19T20:19:38.877Z" }, + { url = "https://files.pythonhosted.org/packages/5b/1d/9ee10b1aad9f01ea6ac6159981120eb5ace01962f9cfaa7de6b911de3eb8/jpype1-1.7.1-1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:ace0ba1a67561358fa5b57b8e93ed8bcf16f0a8d5cba79c875089c56827adf8e", size = 569753, upload-time = "2026-05-19T20:19:41.514Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c8/f0f306866dfa2bae97f83db48aa084ed049583f61dfba713124211b08fdf/jpype1-1.7.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2e1459738e9baf560548965b364206890acf34e42673efcfe5048c2c1203e4cf", size = 375606, upload-time = "2026-05-06T23:54:01.62Z" }, + { url = "https://files.pythonhosted.org/packages/28/a9/08eb2c8556598043981692251180479babc56086c5464bb2631929b94acf/jpype1-1.7.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc68b8e94ba5981e6142b4bcbbfa262ebe41438a679e0ebc2daf0759cc8d3e19", size = 408134, upload-time = "2026-05-06T23:54:04.251Z" }, + { url = "https://files.pythonhosted.org/packages/e2/61/36001f0979fa0fffa28dac49f44cbb642cfcbd9f67e090d7fb9a8ace9e80/jpype1-1.7.1-cp311-cp311-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:47bc10f263fc8ea3f97e46a753e355a565c317a61109f298169fcc4365ff415f", size = 454588, upload-time = "2026-05-06T23:54:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/c0/e7/140c78ee6c0804b1ff5eb8313eb76a29e49e973da810539cabf6d454e6bc/jpype1-1.7.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4cabb1d0c23bd8455ab0ef027a6a4b62d6e49c95b96ef8ff652ea83cbba6de6c", size = 439352, upload-time = "2026-05-06T23:54:09.416Z" }, + { url = "https://files.pythonhosted.org/packages/f2/38/8efa98a77f028895bb2cd6eb134b670334e376011f24e6c0f502f515987e/jpype1-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:3af59fdbf1798158b01f1a68b7b19ff805a2d18175542434d6aa89e45d5e53b5", size = 357971, upload-time = "2026-05-06T23:54:11.74Z" }, + { url = "https://files.pythonhosted.org/packages/87/76/6a3aef14a4f21e0254a20f3ae446566274cf84e6079bad00ec784dab4dfa/jpype1-1.7.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7328a61ae4945bd2963c15b7d7ead1d8dfc71ea784dec43dedbea4437d645843", size = 374560, upload-time = "2026-05-06T23:54:14.007Z" }, + { url = "https://files.pythonhosted.org/packages/72/ad/e2db5dae7cd821385096f607deb79bcdd25331c07a58608318d4dade2e48/jpype1-1.7.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158aee356b2c0bf489939d85f6fb31e54a800bd2d95a89b83e5bd7c07fdb048e", size = 407331, upload-time = "2026-05-06T23:54:15.87Z" }, + { url = "https://files.pythonhosted.org/packages/c3/97/f54c66ed8a9ce33fdc87991712260169c1f9ec514110e266b3a56b73ef13/jpype1-1.7.1-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:1cde7f185ef36c2840daf9293423d609eace5b79c632e2267023d6c75ef52988", size = 453957, upload-time = "2026-05-06T23:54:18.684Z" }, + { url = "https://files.pythonhosted.org/packages/03/ed/bc55cc34dd54864a5a717c3f76ff2771961154325aef683d8e4b85b7c51a/jpype1-1.7.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4de86ec7f9f381c7aea8cbbecaa189c020e5fb700620bd96f4762f954757656b", size = 438525, upload-time = "2026-05-06T23:54:21.395Z" }, + { url = "https://files.pythonhosted.org/packages/ca/80/c0098bedd014bc9a1a8a349e40a1fc1408c79af28f6c32bdbb1a2b839c7b/jpype1-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:d7dad528c73d02987358485dc37fab36edb9ad8bce53533e65f54cff1b68a4bc", size = 356985, upload-time = "2026-05-06T23:54:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/22/1c/d3e60c3fefb0ed22afc27e7ed6032565f9c5cbf1452ff03129b8f7354195/jpype1-1.7.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2c54e9c7b7df819631db2cc8e64eaded7884d7dfaa67c035c70de512a8987b34", size = 374581, upload-time = "2026-05-06T23:54:25.801Z" }, + { url = "https://files.pythonhosted.org/packages/6f/10/47d8327d96f6aa9049ea84189508ed446e81b233d8978d49b737b4a0df51/jpype1-1.7.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:988d2db564b61ffcc4fa9533fb65e98037d869b866e02c145e49125554cad6cc", size = 407509, upload-time = "2026-05-06T23:54:27.94Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/995f4ac18eb3016c3819af5ce0c1a89e94f1cbefc560db688118b32eab3d/jpype1-1.7.1-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:1c387dc58f28aefce50955eb7f24403f05b8a2942ef22c7f08d731d1fc753a50", size = 454093, upload-time = "2026-05-06T23:54:30.702Z" }, + { url = "https://files.pythonhosted.org/packages/86/34/1a45d77fc164daef989b650254144c323462ba00895cedfcb794a7a5dbab/jpype1-1.7.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:907a4dcc89cca1655fe3fad389e9f60d5c681ddf070927a9013a6d0f64ccf118", size = 438527, upload-time = "2026-05-06T23:54:33.033Z" }, + { url = "https://files.pythonhosted.org/packages/dd/10/1f47deb971c20519233577474d397255bbdc4717aa7f0192b0b505d7b47b/jpype1-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:969e160c15ab83b21c657837797ddae3701482d3db54f57ae81c75b558942533", size = 357069, upload-time = "2026-05-06T23:54:42.379Z" }, + { url = "https://files.pythonhosted.org/packages/83/79/760198389ce7e3a6048fd54e1ab5e31139298e2d253cbb9181b1a2cbe48f/jpype1-1.7.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0486725034916270f1c28e27bd74ef793f96d41b822956e3edf5666f99058665", size = 409596, upload-time = "2026-05-06T23:54:35.07Z" }, + { url = "https://files.pythonhosted.org/packages/7c/4e/175b0d0c8e29f7ba6e00f0588e2df06773796bd3c58fa5910cee3aefe40b/jpype1-1.7.1-cp313-cp313t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:39b57767ed33bba453e4c81f2dfcb39be8b3ad25eaeedd96391e171bde3c765f", size = 455365, upload-time = "2026-05-06T23:54:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/29/a9/0576c3d54bfa0bd6b9392f4624bd39bc9cc924a5362ba95d16e3ad77778a/jpype1-1.7.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7605e33971f8f16634e4786ce0a4b2d1691aebd09ca21fdc7a700e9a0f3dd6a7", size = 439563, upload-time = "2026-05-06T23:54:40.188Z" }, + { url = "https://files.pythonhosted.org/packages/91/4e/3bc23e8f50e7bbec2e0f7479346ca17fbc4811df2c710ae6be573ad9317d/jpype1-1.7.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b5e87d88523354d3e46769e4d3244318571d6d35a170febf4f82e3ce408d54b1", size = 374428, upload-time = "2026-05-06T23:54:44.457Z" }, + { url = "https://files.pythonhosted.org/packages/59/1f/0cf0b34e73dd8622ae6fd0e2393edbc5ba5365d76349486ba02292c3cc98/jpype1-1.7.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d32ace75bfc63ccac22258e1d2de33210cfb20d2520db0b413f2b9b1318dd96", size = 407388, upload-time = "2026-05-06T23:54:46.634Z" }, + { url = "https://files.pythonhosted.org/packages/2d/70/6c800d4e3a00200c5c8f52f32db4400623e0d9c1c5136834acb9230478ce/jpype1-1.7.1-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:295934261cede86a6d47b3ad6fd4c259aefe07d4f292a23ea6b33a75f40b3153", size = 454007, upload-time = "2026-05-06T23:54:49.442Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7f/858a229a9525bc717594dc394cc1d0677c786513285da54d0c0ba90d9342/jpype1-1.7.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29977b16a6f88a617fb274994108d816b59680fdab10edb03fd57b1da4ff3e61", size = 438408, upload-time = "2026-05-06T23:54:52.404Z" }, + { url = "https://files.pythonhosted.org/packages/09/d0/adba12d654a84c8e2af8c401acf3fe6b85d98f2ee1f6c29afecae826e871/jpype1-1.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:bff1d3561afb5fdd38f8a69d03669450662c242ec245804240c1ce82c2fc5398", size = 364457, upload-time = "2026-05-06T23:55:01.661Z" }, + { url = "https://files.pythonhosted.org/packages/c2/06/e9b4c867381b0c2573e5080464586b4956de9e3b0c1f40c551f17d1052c9/jpype1-1.7.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:906381e076b2dbbbbef830a7d1be7bdde4f35e59c3c058e40f1e4a36024bcde5", size = 409453, upload-time = "2026-05-06T23:54:54.866Z" }, + { url = "https://files.pythonhosted.org/packages/2f/43/c3cb7b6c82d9f901c1316d25016d18bfad0381eb55cfc960b7f999a42ef3/jpype1-1.7.1-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:7bef4ac17e0b0dbb96ee6afbd8878a5fa85353e3eb3eba4fe86e1df3dd62eb1b", size = 455217, upload-time = "2026-05-06T23:54:57.552Z" }, + { url = "https://files.pythonhosted.org/packages/9f/87/f5b46e288dc3a0c7c6fb02e00f68a621035fa03cac3b6b489effd4170b13/jpype1-1.7.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b230c9475525b29114e6396b864c154f02f7cb041f2ac6bde006ed569e579aea", size = 439454, upload-time = "2026-05-06T23:54:59.609Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "scikit-build-core" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "pathspec" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/7c/0f69b0c7150ce4bcee78c199fe3b7e03a6e01578451bd5d5d1a58beb32f9/scikit_build_core-1.0.3.tar.gz", hash = "sha256:a4d7a05978ee37975c37743510c8991e2debce7ef83afb0a07c0c576fd4f16e8", size = 477539, upload-time = "2026-07-12T05:08:30.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b0/7ad8fa9aebb0835b2e20afebf1483cbe175d1612fe01e85042ce9ced8755/scikit_build_core-1.0.3-py3-none-any.whl", hash = "sha256:ae95427b7d3c14a6cf8bbfd4d901f6138ab64c99e20cbe8ea7d75cd26093f085", size = 278294, upload-time = "2026-07-12T05:08:28.725Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "wheel" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, +] diff --git a/e2e/crossbuild/msgpack/BUILD.bazel b/e2e/crossbuild/msgpack/BUILD.bazel new file mode 100644 index 000000000..7a4b78219 --- /dev/null +++ b/e2e/crossbuild/msgpack/BUILD.bazel @@ -0,0 +1,16 @@ +# msgpack-python ships official prebuilt wheels for linux/amd64 and +# linux/arm64, but [tool.uv] no-binary-package forces it to build from +# sdist here. Same setuptools/distutils backend as //geohash, //zstandard, +# and //psutil, but its extension (_cmsgpack) is generated by Cython — +# committed as pre-Cythonized .c in the sdist, so no Cython build +# dependency is needed — exercising that code-generation path's symbol/link +# pattern rather than a second hand-written-C or hand-written-C++ package. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "msgpack", + check_so_suffix = False, + deps = ["@pypi_crossbuild_msgpack//msgpack"], + so_pattern = "whl_install__crossbuild_msgpack.*_cmsgpack.*\\.so$$", +) diff --git a/e2e/crossbuild/msgpack/msgpack_image_command_test.yaml b/e2e/crossbuild/msgpack/msgpack_image_command_test.yaml new file mode 100644 index 000000000..b4d9efcdb --- /dev/null +++ b/e2e/crossbuild/msgpack/msgpack_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# msgpack_main.py asserts a real pack/unpack round-trip through the compiled +# _cmsgpack extension itself and only prints "OK" on success. +commandTests: + - name: msgpack round-trips a nested structure correctly + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/msgpack/msgpack_main.py b/e2e/crossbuild/msgpack/msgpack_main.py new file mode 100644 index 000000000..8e9f1a41d --- /dev/null +++ b/e2e/crossbuild/msgpack/msgpack_main.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +import msgpack + + +def main() -> None: + # A round-trip through msgpack's compiled Cython extension (_cmsgpack) + # must reproduce the exact same structure, including nested types. + payload = {"a": 1, "b": [1, 2, 3], "c": "text", "d": None, "e": True} + packed = msgpack.packb(payload) + unpacked = msgpack.unpackb(packed, raw=False) + assert unpacked == payload, "round-trip produced {!r}, expected {!r}".format(unpacked, payload) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/msgpack/pyproject.toml b/e2e/crossbuild/msgpack/pyproject.toml new file mode 100644 index 000000000..1d6b56870 --- /dev/null +++ b/e2e/crossbuild/msgpack/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "crossbuild_msgpack" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "msgpack==1.2.1", + "setuptools", +] + +[tool.uv] +no-binary-package = ["msgpack"] diff --git a/e2e/crossbuild/msgpack/uv.lock b/e2e/crossbuild/msgpack/uv.lock new file mode 100644 index 000000000..844642782 --- /dev/null +++ b/e2e/crossbuild/msgpack/uv.lock @@ -0,0 +1,133 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-msgpack" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "msgpack" }, + { name = "setuptools" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "msgpack", specifier = "==1.2.1" }, + { name = "setuptools" }, +] + +[[package]] +name = "msgpack" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/6b/e9b1cdc042c4458801d2545ed782a95f3d6ba8e270cce8745b8603c7f748/msgpack-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29a3f6e9667868429d8240dfd063ea5ffdc1321c13d783aa23827a38de0dcb22", size = 82812, upload-time = "2026-06-18T16:12:45.022Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3a/dd518a1bf78ed1e9ad8afe57307c079a00eafe4b3068932a27ca1ea56b4f/msgpack-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aded5bdf32609dc7987a49bbbd15a8ef096193f96dd8bbeb791de729e650acf5", size = 82739, upload-time = "2026-06-18T16:12:46.025Z" }, + { url = "https://files.pythonhosted.org/packages/70/e0/7ba9e1542bf0771a27b8b37c1316e3f95ae9d748fd765284655c476ad4ef/msgpack-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:146ee4e9ce80b365c6d4c47073da9da7bcec473e58194ceee5dd7620ace77e06", size = 414233, upload-time = "2026-06-18T16:12:47.029Z" }, + { url = "https://files.pythonhosted.org/packages/03/8d/671d81534ea0e2b0e8a121be100020da09eb78861fe3aa8f3ef7dcd3bed1/msgpack-1.2.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a28d076ca7c82b9c8728ad90b7147489449557038bed50e4241eb832395169b4", size = 423843, upload-time = "2026-06-18T16:12:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b6/e5c737515ed1f166664b87601b532f58cbb73d8aa6a90b99f7c2c5037e8e/msgpack-1.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7d31c0ac0c640f877804c67cb2bc9f4e23dc2db97e96c2e67fa27d38283b41f8", size = 390772, upload-time = "2026-06-18T16:12:49.624Z" }, + { url = "https://files.pythonhosted.org/packages/a8/46/62ed8c2e87d7021eab19921594d961ef3aa3794eec76c716dc30f3bfd433/msgpack-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ff92d7feeaf5bc26c51495b69e2f99ed97ab79346fb6555f44be7dd2ac6503b", size = 409559, upload-time = "2026-06-18T16:12:50.936Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/59aa3887b860bbf43532835e192b1c388a17590d6068ae4f8b2bc74c906e/msgpack-1.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:779197a6513bab3c3632265e3d0f7cb3227e62510841a6f34f1eaa37efbb345e", size = 387838, upload-time = "2026-06-18T16:12:52.161Z" }, + { url = "https://files.pythonhosted.org/packages/09/11/f8563e471093420cf6478cb3271a0175d8402b82d879783d4035d2d03360/msgpack-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:67f6dd22fa72a93752643f07889796d62739a13415ee630169a8ce764f86cf9f", size = 421732, upload-time = "2026-06-18T16:12:53.556Z" }, + { url = "https://files.pythonhosted.org/packages/57/cf/e673683c4c6c90c1022b24c65af4b03eda72b182a1176ef6449069d66acc/msgpack-1.2.1-cp311-cp311-win32.whl", hash = "sha256:91054a783328e0ea7954b8771095705c8d2243b814743fbaadf14552c9c52c5d", size = 64091, upload-time = "2026-06-18T16:12:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/ca212739d179f9083bff2c7c08c24101c3555a334fadc2b876b18768a3ae/msgpack-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2eda0b7ebb1283a98d3e4492ac933c8af6aff59fd3df1c3ed024f536af4b1dc8", size = 70462, upload-time = "2026-06-18T16:12:55.898Z" }, + { url = "https://files.pythonhosted.org/packages/6d/be/6798347b425e26f35db82e69dd83c09716c856a3714e7bffc4c0860fd830/msgpack-1.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ee967f7c7e1df2890c671ff2ee51a28ded0efc95da3e507176dee881ce36c66", size = 65059, upload-time = "2026-06-18T16:12:57.053Z" }, + { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, + { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504, upload-time = "2026-06-18T16:13:08.822Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421, upload-time = "2026-06-18T16:13:09.828Z" }, + { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775, upload-time = "2026-06-18T16:13:11.056Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151, upload-time = "2026-06-18T16:13:12.173Z" }, + { url = "https://files.pythonhosted.org/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351, upload-time = "2026-06-18T16:13:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518, upload-time = "2026-06-18T16:13:14.233Z" }, + { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405, upload-time = "2026-06-18T16:13:15.435Z" }, + { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257, upload-time = "2026-06-18T16:13:17.022Z" }, + { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469, upload-time = "2026-06-18T16:13:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802, upload-time = "2026-06-18T16:13:19.685Z" }, + { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273, upload-time = "2026-06-18T16:13:21.028Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471, upload-time = "2026-06-18T16:13:22.293Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274, upload-time = "2026-06-18T16:13:23.455Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795, upload-time = "2026-06-18T16:13:24.687Z" }, + { url = "https://files.pythonhosted.org/packages/77/58/cce442852c6b9e1639c7c8ac8fd9143121cb32dab0f308df4d1426a8eb9c/msgpack-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:05f340e47e7e47d2da8db9b53e1bb1d294369e9ef45a747441309f6650b8351d", size = 83610, upload-time = "2026-06-18T16:13:25.724Z" }, + { url = "https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:810b916696c86ef0deb3b74588480224df4c1b071136c34183e4a2a4284d7ac7", size = 83138, upload-time = "2026-06-18T16:13:26.781Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/99e58722feaffc5f2fbcc0c8c0d1451ab9f84097f7af87291b46af2390f4/msgpack-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca0dacff965c47afdc3749a8469d7302a8f801d6a28758d55120d75e66ce6889", size = 406090, upload-time = "2026-06-18T16:13:28.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/03/8c63e8cf52958534ef688625965ab04c269a6cadd8caef16758b380a821a/msgpack-1.2.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e2bf9280bceb5efca998435904b5d3e9fdbcc11d90dc9df30aec7973252b720", size = 412106, upload-time = "2026-06-18T16:13:29.427Z" }, + { url = "https://files.pythonhosted.org/packages/63/d2/155d9e71b40e41fd934bc0c48b9b2770f22263e1ac20aad8e29fdca7be3f/msgpack-1.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6c4be5d1c02a42b066ca6ddb71adf36432868fdcdb6ee87e634e86e0674190", size = 374851, upload-time = "2026-06-18T16:13:30.631Z" }, + { url = "https://files.pythonhosted.org/packages/98/48/deaf2326262a8d5ea3295ce9649912ecd3f551ba7ec8e33c665d2ba583f3/msgpack-1.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec0e675d59150a6269ddc9139087c722292664a37d071a849c05c473350f1f2d", size = 396168, upload-time = "2026-06-18T16:13:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/2a/b4410f906c2ec0008f1608d3ab5143afc3ad3f4e6da0fed3ea2231d0bef4/msgpack-1.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dd3bfe82d53edfe4b7fc9a7ec9761e23a7a5b1dac22264505af428253c29ed24", size = 371959, upload-time = "2026-06-18T16:13:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/59/86/1edc67270099a528fa2093ea60fe191233cd238e4bd30cfacf7db79fc959/msgpack-1.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ad5467fc3f68b5468e06c5f788d712e9f8ffc8b0cd1bcb160c105c1ee92dae7", size = 408457, upload-time = "2026-06-18T16:13:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/82/90/8b630fef07d8c5ab457b71ff2c217910c83d333c7a68472c186e87cc504a/msgpack-1.2.1-cp314-cp314-win32.whl", hash = "sha256:98b58bdb89c46190e4609bb36abe17c6d4105ad13f9c5f8f6f64d320f8ced3fb", size = 65942, upload-time = "2026-06-18T16:13:36.056Z" }, + { url = "https://files.pythonhosted.org/packages/16/f1/467b81e98b24dd3885d7b1857728797b4ffc76a7a7483af4fb321a07de3c/msgpack-1.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:74847557e28ce71bd3c438a447ca90e4b507e997ddbdef8a12a7b283b86c156b", size = 72627, upload-time = "2026-06-18T16:13:37.079Z" }, + { url = "https://files.pythonhosted.org/packages/a7/1d/5d8c4c89985feb6acefb82a09e501c60392261856d2408d20bfe4f0360b1/msgpack-1.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:b50b727bd652bdc37d950336c848ef20ec54a4cafc38dce19b1cd86ad625d0f7", size = 66908, upload-time = "2026-06-18T16:13:38.23Z" }, + { url = "https://files.pythonhosted.org/packages/1b/02/ad2afb678b4de94496cd432b581759b756a92c1192d8c767edd6b132efdc/msgpack-1.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8d00f177ca88a77c1cf848d204a38f249751650b601cb6532acc68805d8a8273", size = 86000, upload-time = "2026-06-18T16:13:39.44Z" }, + { url = "https://files.pythonhosted.org/packages/54/74/0b797484013128837f3b1cbb6cea019277c4de4e377dc512b4d9a0f92940/msgpack-1.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5bb9c386f0a329c035ddbab4b72d1028bf9627add8dda41070288563d57ed1b1", size = 86544, upload-time = "2026-06-18T16:13:40.447Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b4/b774d7eb95561739907fec675582f83203cf41c597a418c2589b4bfb8e9d/msgpack-1.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20466cca18c49c7292a8984bc15d65857b171e7264bdcb5f96baf8be238791fc", size = 427661, upload-time = "2026-06-18T16:13:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f9/3243191dc9937e00756c8bc1b0272fed8f23758e43df2a3b46f533e5090f/msgpack-1.2.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:196300e7e5d6e74d50f1607ab9c06c4a1484c383cd22defd727902591f7e8dde", size = 426375, upload-time = "2026-06-18T16:13:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/23/c7/1693111db9944ba4ad4b67a1e788400d78a0b6af7a6523dc7e4e58f8274b/msgpack-1.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575957e79cd51903a4e8495a242442949641e08f1efd5197b43bebd3ea7682b4", size = 380495, upload-time = "2026-06-18T16:13:44.306Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2b/92f86956a0c13e8662f7e2ad630c4eb4db07497b967589bd5245e018b2c1/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8c2ed1e48cc0f460bf3c7780e7137ff21a4e18433451916f2442c1b21036cd7d", size = 410897, upload-time = "2026-06-18T16:13:45.629Z" }, + { url = "https://files.pythonhosted.org/packages/da/ea/1479f72d200313a76fc2f823a79d1e07ed052ab7b8a0280640aa7b95de42/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f6277e5f783c36786a145e0247fc189a03f35f84b251646e53592d2bc12b355", size = 378519, upload-time = "2026-06-18T16:13:46.998Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/fa006060ffa1011d32bfae826fe766fe73e02982183601633b7121058ab3/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9389552ecf4784886345ead0647e4edc96bee37cbab05b75540f542f766c48c", size = 419815, upload-time = "2026-06-18T16:13:48.205Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/aab6c946570496b78e67804721f3d5e2d62a93081b9b37df77764ef56347/msgpack-1.2.1-cp314-cp314t-win32.whl", hash = "sha256:c1c79a604a2969a868a78b6ebd27a887e00c624f14f66b3038e0590cb23332d1", size = 70914, upload-time = "2026-06-18T16:13:49.385Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/e608956488a2af014cfe6e3d665e090b8ee42aa14b07f8f95b8880d66b09/msgpack-1.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f12038a35fabd52e56a3547bab42401af49a45caa6dd00b34c44de235bc93ee2", size = 77999, upload-time = "2026-06-18T16:13:50.467Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8a/27e2e57055176e366a46b85d02d68e7a5bcfbdd8474c9706375d965f24d3/msgpack-1.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0adcf06ffde0777c0e1a9b771a2b1c4226ba1bbf748c8efcc02fcdeca3299107", size = 71160, upload-time = "2026-06-18T16:13:51.498Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] diff --git a/e2e/crossbuild/numpy/BUILD.bazel b/e2e/crossbuild/numpy/BUILD.bazel new file mode 100644 index 000000000..f19890073 --- /dev/null +++ b/e2e/crossbuild/numpy/BUILD.bazel @@ -0,0 +1,16 @@ +# numpy ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# [tool.uv] no-binary-package forces it to build from sdist here. The only +# other real-world meson-python package besides //contourpy, at far greater +# scale (numpy itself vendors its own meson via +# vendored-meson/meson/meson.py, and needs Cython plus -Dblas=none +# -Dlapack=none since this sandbox has no system BLAS/LAPACK — see +# MODULE.bazel's RULES_PY_MESON_SETUP_ARGS override), so this backend isn't +# validated by one lucky (and comparatively simple) package alone. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "numpy", + deps = ["@pypi_crossbuild_numpy//numpy"], + so_pattern = "whl_install__crossbuild_numpy.*_multiarray_umath.*\\.so$$", +) diff --git a/e2e/crossbuild/numpy/numpy_image_command_test.yaml b/e2e/crossbuild/numpy/numpy_image_command_test.yaml new file mode 100644 index 000000000..f0445d0f4 --- /dev/null +++ b/e2e/crossbuild/numpy/numpy_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# numpy_main.py asserts real elementwise arithmetic and a no-BLAS matmul +# fallback through the compiled core itself and only prints "OK" on success. +commandTests: + - name: numpy computes elementwise arithmetic and a no-BLAS matmul correctly + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/numpy/numpy_main.py b/e2e/crossbuild/numpy/numpy_main.py new file mode 100644 index 000000000..df1777fb0 --- /dev/null +++ b/e2e/crossbuild/numpy/numpy_main.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +import numpy as np + + +def main() -> None: + # Plain elementwise arithmetic never touches BLAS regardless of build + # config — a baseline sanity check that the compiled core imported and + # runs at all. + a = np.array([1, 2, 3], dtype=np.int64) + b = np.array([4, 5, 6], dtype=np.int64) + result = (a + b).tolist() + assert result == [5, 7, 9], "elementwise add: got {}, expected [5, 7, 9]".format(result) + + # Matrix multiplication normally routes through BLAS (dgemm) when one is + # linked; built with -Dblas=none, numpy falls back to its own internal + # gemm loop instead — this specifically exercises that fallback path is + # numerically correct, not just present. + m1 = np.array([[1.0, 2.0], [3.0, 4.0]]) + m2 = np.array([[5.0, 6.0], [7.0, 8.0]]) + product = (m1 @ m2).tolist() + expected = [[19.0, 22.0], [43.0, 50.0]] + assert product == expected, "matmul (no-BLAS fallback): got {}, expected {}".format(product, expected) + + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/numpy/pyproject.toml b/e2e/crossbuild/numpy/pyproject.toml new file mode 100644 index 000000000..4a02db46a --- /dev/null +++ b/e2e/crossbuild/numpy/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "crossbuild_numpy" +version = "0.0.0" +requires-python = ">=3.12" +dependencies = [ + "build", + "cython>=3.0.6", + "meson-python>=0.18.0", + "ninja", + "numpy==2.5.1", +] + +[tool.uv] +no-binary-package = ["numpy"] diff --git a/e2e/crossbuild/numpy/uv.lock b/e2e/crossbuild/numpy/uv.lock new file mode 100644 index 000000000..77a4e7e40 --- /dev/null +++ b/e2e/crossbuild/numpy/uv.lock @@ -0,0 +1,211 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" +resolution-markers = [ + "sys_platform != 'ios'", + "sys_platform == 'ios'", +] + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-numpy" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "cython" }, + { name = "meson-python" }, + { name = "ninja" }, + { name = "numpy" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "cython", specifier = ">=3.0.6" }, + { name = "meson-python", specifier = ">=0.18.0" }, + { name = "ninja" }, + { name = "numpy", specifier = "==2.5.1" }, +] + +[[package]] +name = "cython" +version = "3.2.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/de/db48b8870e766cfea809986cc50c1e986c663a9ab7bafd0ac1a2512c4a26/cython-3.2.9.tar.gz", hash = "sha256:d249c9022ab13286b17bd66f30609e800c5f95efeecb06168990c7a66cecde6c", size = 3293493, upload-time = "2026-07-24T06:21:21.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/37/c74d842306c8fe381c415b37460d5e3086a820fac72b8ff5cb48513ccfcd/cython-3.2.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:114b2dee0fa1daa48a59574d848da0ff1b6bdb725a755e9b92fad14962e1ff8d", size = 3009571, upload-time = "2026-07-24T06:21:52.534Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/f7c42b161edd585e3ae556fd62a2c72cd80a6ed527a9907f0c5c6fb060de/cython-3.2.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5cd9c5f138cb052130b40ad3b6976d2180c35348410995812678f4636bd8f94", size = 3183562, upload-time = "2026-07-24T06:21:54.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/1b/c04520ac7f3157aa12a69b632c16261170dac9fab6c48608cc004b8f1b17/cython-3.2.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23e80bc885c599e72072e18d0746df82d394b73100c1e153cda7359e6e59fe09", size = 3354811, upload-time = "2026-07-24T06:21:56.72Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/4ce33235a25b19fcd51dc639f0f403b783a3b7f9b1934eade0d993fbe029/cython-3.2.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b1fd5a9c03f72a18618668a8e90d569442ed742f910e3ad003dcc9348e9598b", size = 2778077, upload-time = "2026-07-24T06:21:58.7Z" }, + { url = "https://files.pythonhosted.org/packages/83/fa/7ffbaab88558e28411715ad35d913cac7d64ee965344c185325da84c4309/cython-3.2.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44b7fc417933d65bf31bce00337ff318efa3ea59daed21d10fe842d41e657c08", size = 2998816, upload-time = "2026-07-24T06:22:00.822Z" }, + { url = "https://files.pythonhosted.org/packages/04/69/feed68904f389452494d9e0861c24228c0bda656f9fbd32f9e5b525b2ef4/cython-3.2.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41637c644d7224d2d3170ee312077c2173693f0d4a0da1c82a0cffa3680a42dc", size = 3185802, upload-time = "2026-07-24T06:22:02.831Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0d/a7f094343e5c4925efac60e6dbdcf8602042e7f54c83ae14ccbc8033d2d9/cython-3.2.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f815cd3387bd88ca9eeabc357ce4bdf884eef0ab2949db0fbd5e0b69fe5ee422", size = 3360405, upload-time = "2026-07-24T06:22:04.645Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ba/a5c25226e29cb4f3a2c97d2b29de10e37c8a6b67b3c2f2a8b16ba713b218/cython-3.2.9-cp313-cp313-win_amd64.whl", hash = "sha256:ddb43637b7749b88644df4319e1c36f767e7fb71a92bb9942558c8de2f1cc5f4", size = 2774714, upload-time = "2026-07-24T06:22:06.953Z" }, + { url = "https://files.pythonhosted.org/packages/3c/69/e5969fa87c7b8833f62fe790e1617a1391112fa55fe12079c41a4553119c/cython-3.2.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:63a42e131112072f912b66734088abc946c6bc42cb7454461a6dfdd2d09d3bae", size = 3013040, upload-time = "2026-07-24T06:22:08.9Z" }, + { url = "https://files.pythonhosted.org/packages/b4/98/8eaceeec00d4f9cc75e3106397c005952e0d710332c4966215b8a110a522/cython-3.2.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f25b402a6f1eed34af2af57603a9aadcf594dacaced1655e925eb317fba3f337", size = 3231531, upload-time = "2026-07-24T06:22:11.028Z" }, + { url = "https://files.pythonhosted.org/packages/94/a4/1e03a0c115afa9de7b06891721d6489d6a05f78934a6897a0f5a409ee2f5/cython-3.2.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d3cba9c4770cf76370fead8d2ae71bc474f3ef67ae4119e455d025726bcdc1c", size = 3372818, upload-time = "2026-07-24T06:22:12.97Z" }, + { url = "https://files.pythonhosted.org/packages/1b/04/b5c4d76723824d84e3761718c51964f7829335ee1c7c16b69f11b111adf0/cython-3.2.9-cp314-cp314-win_amd64.whl", hash = "sha256:56d95c0674c25f281c6ae8f1d17bd425d6c2818bb304ff781831bb5d00d04b0b", size = 2812223, upload-time = "2026-07-24T06:22:14.9Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4a/342312c5fe021c8e0c386e1915d138e0902c48ae179b0374ab04773a8831/cython-3.2.9-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:944dc8747f640b3527649c566a5fc75ee0c15e80642ea2fdae4fe6378e1a9d4a", size = 2899729, upload-time = "2026-07-24T06:22:24.877Z" }, + { url = "https://files.pythonhosted.org/packages/f0/62/ea919ee426cb4d435ec8155e1ee6bcbb46b20d8f070527191b59769d4e7f/cython-3.2.9-cp39-abi3-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4b871ad97dd7fb1cbf56f6238c54423febd310afc1d9d9bc70c69c89b7ce57fc", size = 3226650, upload-time = "2026-07-24T06:22:26.947Z" }, + { url = "https://files.pythonhosted.org/packages/18/02/057b4f63e2ced8c3cf217c4e9fb544bfe48145f493347c7ca3f51607526c/cython-3.2.9-cp39-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9b6ebc6c74b4318eaa4e51e520dc8b95ebc7b262953c3ecb24131104681f14e", size = 2881919, upload-time = "2026-07-24T06:22:29.318Z" }, + { url = "https://files.pythonhosted.org/packages/64/e4/e158793ee3de7e4417ba17e7ff1015d6e2cf557cb485ad270b2446c9d1c7/cython-3.2.9-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:92989da161a7d18a7ad4baebc49289b2b77556d5a94916f90140ba26aecf6892", size = 3004702, upload-time = "2026-07-24T06:22:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/d5bbbd743ab4feddb24a7e823b34c3ec4ebab91ff503d16743a4e7ce106b/cython-3.2.9-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:e75ec625d8f8781ced690b7a2f5c2d138067711cf24bb8fb68c872c30c2fefe5", size = 2902695, upload-time = "2026-07-24T06:22:33.525Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/80850817395985259f135baa510d9186d3a325df81cd1862060bba977029/cython-3.2.9-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:2b1756ddc3bc0cd4341a515fc420c3e25e13c249f5537159b3fb0bff8d19e55c", size = 3241554, upload-time = "2026-07-24T06:22:35.667Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ce/6be776814f6cb81751f3da737ed537385738148e1ea99f89fb4637799198/cython-3.2.9-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7d41baea51ea00f9237f75af498577827493bca5e9b45bbd4e351543727e589a", size = 3124337, upload-time = "2026-07-24T06:22:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/e2/48/27c948cbbfe6050994e67a497ae530955dcda7e79084319321c49969e0fd/cython-3.2.9-cp39-abi3-win32.whl", hash = "sha256:61d4abbf84f77c8d19361d05d9f51d65d8d95e74f736eae55fa1aed8a1430469", size = 2435609, upload-time = "2026-07-24T06:22:40.005Z" }, + { url = "https://files.pythonhosted.org/packages/17/ef/cf0e1bd7542296f1752be63b027f90271448d8c8062eac66d8e44a79b883/cython-3.2.9-cp39-abi3-win_arm64.whl", hash = "sha256:57a6a78d14f7dd7d6062d9bca694e2a8c1c14113b6ceceea076abcd1161fdc5a", size = 2458025, upload-time = "2026-07-24T06:22:41.973Z" }, + { url = "https://files.pythonhosted.org/packages/00/ec/e61deec9bcfbb0e1b36f8b5ba75cb44644419b4bfd0fdd666bffd21d9579/cython-3.2.9-py3-none-any.whl", hash = "sha256:a2b0e87f6b80790c929308ca0831d686f7a180feab684fe8cd4a4380bd96aaca", size = 1259272, upload-time = "2026-07-24T06:21:18.95Z" }, +] + +[[package]] +name = "meson" +version = "1.11.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/ce/c4d3d849d5cf8d9193b075acf435fb5dc0f4bdab35a3486f1204fd8265a7/meson-1.11.2.tar.gz", hash = "sha256:698feae069cef3ecd4d7aaf281d7df359bdfcf555a9a1564383d3b913fa8a736", size = 2463316, upload-time = "2026-07-11T07:19:44.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/c5/680527bdddf039807f22041882678b7f21d3380b4cdbc46abf2f24e2db6c/meson-1.11.2-py3-none-any.whl", hash = "sha256:7e4f6e83fec83e3eaac928e058b073c7557b282c35b6a2024cea143a39926a39", size = 1078911, upload-time = "2026-07-11T07:19:40.636Z" }, +] + +[[package]] +name = "meson-python" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "meson" }, + { name = "packaging" }, + { name = "pyproject-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/f0/d794d7ed8a843a8a8947768f3b329d1e8601222dc95d930f4a5f9706cd6c/meson_python-0.20.0.tar.gz", hash = "sha256:6d9726ae6cd37e22f210c74b364b30180a68c20442e97ff09f3c566a414af738", size = 102641, upload-time = "2026-06-10T19:42:52.132Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/ad/77f9483e180cabab2772ac222aedd3dfab858e60d992f40414a3f08e7494/meson_python-0.20.0-py3-none-any.whl", hash = "sha256:6a744cf0c09e76ecbdc58cfa374b48c8902dac1b74479628238634efbf36aec9", size = 29386, upload-time = "2026-06-10T19:42:50.614Z" }, +] + +[[package]] +name = "ninja" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/73/79a0b22fc731989c708068427579e840a6cf4e937fe7ae5c5d0b7356ac22/ninja-1.13.0.tar.gz", hash = "sha256:4a40ce995ded54d9dc24f8ea37ff3bf62ad192b547f6c7126e7e25045e76f978", size = 242558, upload-time = "2025-08-11T15:10:19.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/74/d02409ed2aa865e051b7edda22ad416a39d81a84980f544f8de717cab133/ninja-1.13.0-py3-none-macosx_10_9_universal2.whl", hash = "sha256:fa2a8bfc62e31b08f83127d1613d10821775a0eb334197154c4d6067b7068ff1", size = 310125, upload-time = "2025-08-11T15:09:50.971Z" }, + { url = "https://files.pythonhosted.org/packages/8e/de/6e1cd6b84b412ac1ef327b76f0641aeb5dcc01e9d3f9eee0286d0c34fd93/ninja-1.13.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3d00c692fb717fd511abeb44b8c5d00340c36938c12d6538ba989fe764e79630", size = 177467, upload-time = "2025-08-11T15:09:52.767Z" }, + { url = "https://files.pythonhosted.org/packages/c8/83/49320fb6e58ae3c079381e333575fdbcf1cca3506ee160a2dcce775046fa/ninja-1.13.0-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:be7f478ff9f96a128b599a964fc60a6a87b9fa332ee1bd44fa243ac88d50291c", size = 187834, upload-time = "2025-08-11T15:09:54.115Z" }, + { url = "https://files.pythonhosted.org/packages/56/c7/ba22748fb59f7f896b609cd3e568d28a0a367a6d953c24c461fe04fc4433/ninja-1.13.0-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:60056592cf495e9a6a4bea3cd178903056ecb0943e4de45a2ea825edb6dc8d3e", size = 202736, upload-time = "2025-08-11T15:09:55.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/22/d1de07632b78ac8e6b785f41fa9aad7a978ec8c0a1bf15772def36d77aac/ninja-1.13.0-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1c97223cdda0417f414bf864cfb73b72d8777e57ebb279c5f6de368de0062988", size = 179034, upload-time = "2025-08-11T15:09:57.394Z" }, + { url = "https://files.pythonhosted.org/packages/ed/de/0e6edf44d6a04dabd0318a519125ed0415ce437ad5a1ec9b9be03d9048cf/ninja-1.13.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa", size = 180716, upload-time = "2025-08-11T15:09:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/938b562f9057aaa4d6bfbeaa05e81899a47aebb3ba6751e36c027a7f5ff7/ninja-1.13.0-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4be9c1b082d244b1ad7ef41eb8ab088aae8c109a9f3f0b3e56a252d3e00f42c1", size = 146843, upload-time = "2025-08-11T15:10:00.046Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fb/d06a3838de4f8ab866e44ee52a797b5491df823901c54943b2adb0389fbb/ninja-1.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6739d3352073341ad284246f81339a384eec091d9851a886dfa5b00a6d48b3e2", size = 154402, upload-time = "2025-08-11T15:10:01.657Z" }, + { url = "https://files.pythonhosted.org/packages/31/bf/0d7808af695ceddc763cf251b84a9892cd7f51622dc8b4c89d5012779f06/ninja-1.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11be2d22027bde06f14c343f01d31446747dbb51e72d00decca2eb99be911e2f", size = 552388, upload-time = "2025-08-11T15:10:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/9d/70/c99d0c2c809f992752453cce312848abb3b1607e56d4cd1b6cded317351a/ninja-1.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aa45b4037b313c2f698bc13306239b8b93b4680eb47e287773156ac9e9304714", size = 472501, upload-time = "2025-08-11T15:10:04.735Z" }, + { url = "https://files.pythonhosted.org/packages/9f/43/c217b1153f0e499652f5e0766da8523ce3480f0a951039c7af115e224d55/ninja-1.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f8e1e8a1a30835eeb51db05cf5a67151ad37542f5a4af2a438e9490915e5b72", size = 638280, upload-time = "2025-08-11T15:10:06.512Z" }, + { url = "https://files.pythonhosted.org/packages/8c/45/9151bba2c8d0ae2b6260f71696330590de5850e5574b7b5694dce6023e20/ninja-1.13.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:3d7d7779d12cb20c6d054c61b702139fd23a7a964ec8f2c823f1ab1b084150db", size = 642420, upload-time = "2025-08-11T15:10:08.35Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/95752eb635bb8ad27d101d71bef15bc63049de23f299e312878fc21cb2da/ninja-1.13.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:d741a5e6754e0bda767e3274a0f0deeef4807f1fec6c0d7921a0244018926ae5", size = 585106, upload-time = "2025-08-11T15:10:09.818Z" }, + { url = "https://files.pythonhosted.org/packages/c1/31/aa56a1a286703800c0cbe39fb4e82811c277772dc8cd084f442dd8e2938a/ninja-1.13.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:e8bad11f8a00b64137e9b315b137d8bb6cbf3086fbdc43bf1f90fd33324d2e96", size = 707138, upload-time = "2025-08-11T15:10:11.366Z" }, + { url = "https://files.pythonhosted.org/packages/34/6f/5f5a54a1041af945130abdb2b8529cbef0cdcbbf9bcf3f4195378319d29a/ninja-1.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4f2a072db3c0f944c32793e91532d8948d20d9ab83da9c0c7c15b5768072200", size = 581758, upload-time = "2025-08-11T15:10:13.295Z" }, + { url = "https://files.pythonhosted.org/packages/95/97/51359c77527d45943fe7a94d00a3843b81162e6c4244b3579fe8fc54cb9c/ninja-1.13.0-py3-none-win32.whl", hash = "sha256:8cfbb80b4a53456ae8a39f90ae3d7a2129f45ea164f43fadfa15dc38c4aef1c9", size = 267201, upload-time = "2025-08-11T15:10:15.158Z" }, + { url = "https://files.pythonhosted.org/packages/29/45/c0adfbfb0b5895aa18cec400c535b4f7ff3e52536e0403602fc1a23f7de9/ninja-1.13.0-py3-none-win_amd64.whl", hash = "sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e", size = 309975, upload-time = "2025-08-11T15:10:16.697Z" }, + { url = "https://files.pythonhosted.org/packages/df/93/a7b983643d1253bb223234b5b226e69de6cda02b76cdca7770f684b795f5/ninja-1.13.0-py3-none-win_arm64.whl", hash = "sha256:3c0b40b1f0bba764644385319028650087b4c1b18cdfa6f45cb39a3669b81aa9", size = 290806, upload-time = "2025-08-11T15:10:18.018Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, + { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, + { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, + { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, + { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, + { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" }, + { url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" }, + { url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" }, + { url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" }, + { url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" }, + { url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pyproject-metadata" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/76/1cae539918a7b1746d624c2f01560b793c22cd8c081157505bb9bbf0e34d/pyproject_metadata-0.12.1.tar.gz", hash = "sha256:8809a4df6fe08279b39a8890669506ed3158e0617855ac9aff098fcbe772ae4c", size = 48457, upload-time = "2026-07-04T02:19:32.029Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/8e/d883718e872abc214ba053f60f7e6edc2abd5ffbd1544beb01a9c92ddd3c/pyproject_metadata-0.12.1-py3-none-any.whl", hash = "sha256:f7162d580a96386a8eb096da06215f981f547d1490f03055ef99e323bc2da427", size = 23452, upload-time = "2026-07-04T02:19:30.657Z" }, +] diff --git a/e2e/crossbuild/psutil/BUILD.bazel b/e2e/crossbuild/psutil/BUILD.bazel new file mode 100644 index 000000000..d737c7933 --- /dev/null +++ b/e2e/crossbuild/psutil/BUILD.bazel @@ -0,0 +1,14 @@ +# psutil ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# [tool.uv] no-binary-package forces it to build from sdist here. A second, +# far more widely-used plain setuptools/distutils C-extension package next +# to //geohash and //zstandard, so the setuptools backend's cross support +# isn't validated by niche packages alone. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "psutil", + check_so_suffix = False, + deps = ["@pypi_crossbuild_psutil//psutil"], + so_pattern = "whl_install__crossbuild_psutil.*_psutil_linux.*\\.so$$", +) diff --git a/e2e/crossbuild/psutil/psutil_image_command_test.yaml b/e2e/crossbuild/psutil/psutil_image_command_test.yaml new file mode 100644 index 000000000..252f3a096 --- /dev/null +++ b/e2e/crossbuild/psutil/psutil_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# psutil_main.py asserts real cpu/memory info from its compiled Linux +# backend itself and only prints "OK" on success. +commandTests: + - name: psutil reads real cpu/memory info through its compiled backend + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/psutil/psutil_main.py b/e2e/crossbuild/psutil/psutil_main.py new file mode 100644 index 000000000..73bad3d23 --- /dev/null +++ b/e2e/crossbuild/psutil/psutil_main.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +import psutil + + +def main() -> None: + # cpu_count()/virtual_memory().total read real /proc/cpuinfo and + # /proc/meminfo via psutil's compiled Linux backend (_psutil_linux.so) — + # both must be positive on any real (or QEMU-emulated) Linux system. + cpu_count = psutil.cpu_count() + assert cpu_count is not None and cpu_count >= 1, "cpu_count() returned {!r}".format(cpu_count) + mem_total = psutil.virtual_memory().total + assert mem_total > 0, "virtual_memory().total returned {!r}".format(mem_total) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/psutil/pyproject.toml b/e2e/crossbuild/psutil/pyproject.toml new file mode 100644 index 000000000..6a3052b38 --- /dev/null +++ b/e2e/crossbuild/psutil/pyproject.toml @@ -0,0 +1,13 @@ +[project] +name = "crossbuild_psutil" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "psutil==7.2.2", + "setuptools", + "wheel", +] + +[tool.uv] +no-binary-package = ["psutil"] diff --git a/e2e/crossbuild/psutil/uv.lock b/e2e/crossbuild/psutil/uv.lock new file mode 100644 index 000000000..3305dde8a --- /dev/null +++ b/e2e/crossbuild/psutil/uv.lock @@ -0,0 +1,112 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-psutil" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "psutil" }, + { name = "setuptools" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "psutil", specifier = "==7.2.2" }, + { name = "setuptools" }, + { name = "wheel" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "wheel" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, +] diff --git a/e2e/crossbuild/pydantic_core/BUILD.bazel b/e2e/crossbuild/pydantic_core/BUILD.bazel new file mode 100644 index 000000000..ae8dfd4f5 --- /dev/null +++ b/e2e/crossbuild/pydantic_core/BUILD.bazel @@ -0,0 +1,14 @@ +# pydantic-core ships official prebuilt wheels for linux/amd64 and +# linux/arm64, but [tool.uv] no-binary-package forces it to build from sdist +# here. A second, much more widely-depended-on maturin/PyO3 package next to +# //rpds_py — pydantic-core underpins Pydantic v2 and, transitively, most of +# the modern Python web/data ecosystem (FastAPI included) — so this backend +# isn't validated by one lucky package alone. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "pydantic_core", + deps = ["@pypi_crossbuild_pydantic_core//pydantic_core"], + so_pattern = "whl_install__crossbuild_pydantic_core.*_pydantic_core.*\\.so$$", +) diff --git a/e2e/crossbuild/pydantic_core/pydantic_core_image_command_test.yaml b/e2e/crossbuild/pydantic_core/pydantic_core_image_command_test.yaml new file mode 100644 index 000000000..5428f90b2 --- /dev/null +++ b/e2e/crossbuild/pydantic_core/pydantic_core_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# pydantic_core_main.py asserts the coerced int value itself and only +# prints "OK" on success. +commandTests: + - name: pydantic-core validates and coerces a string to int + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/pydantic_core/pydantic_core_main.py b/e2e/crossbuild/pydantic_core/pydantic_core_main.py new file mode 100644 index 000000000..dafac4835 --- /dev/null +++ b/e2e/crossbuild/pydantic_core/pydantic_core_main.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +from pydantic_core import core_schema, SchemaValidator + + +def main() -> None: + validator = SchemaValidator(core_schema.int_schema()) + result = validator.validate_python("123") + # pydantic-core's lax int mode coerces the numeric string to a real int. + assert result == 123 and isinstance(result, int), "expected int 123, got {!r}".format(result) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pydantic_core/pyproject.toml b/e2e/crossbuild/pydantic_core/pyproject.toml new file mode 100644 index 000000000..7c8f2db5b --- /dev/null +++ b/e2e/crossbuild/pydantic_core/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "crossbuild_pydantic_core" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "maturin", + "pydantic-core==2.47.0", +] + +[tool.uv] +no-binary-package = ["pydantic-core"] diff --git a/e2e/crossbuild/pydantic_core/uv.lock b/e2e/crossbuild/pydantic_core/uv.lock new file mode 100644 index 000000000..81581281f --- /dev/null +++ b/e2e/crossbuild/pydantic_core/uv.lock @@ -0,0 +1,194 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-pydantic-core" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "maturin" }, + { name = "pydantic-core" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "maturin" }, + { name = "pydantic-core", specifier = "==2.47.0" }, +] + +[[package]] +name = "maturin" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/b3/addd877f871fb1860d46d3a4f206ecb10b946c85846805e6367631926fd3/maturin-1.14.1.tar.gz", hash = "sha256:9d6577a62cd08e0ceba7a0db06fb098e0c9b1b3429bad747a4f3a18215a1b3df", size = 369637, upload-time = "2026-06-19T05:19:49.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/f0/97c5a5bd9c71653a066c0976a484eaaae50b9369557838a4176b7b0bdaa5/maturin-1.14.1-py3-none-linux_armv6l.whl", hash = "sha256:522292398945442cdafa9daeb2271b2340fbde57027b818f923f88eab04174f8", size = 10207496, upload-time = "2026-06-19T05:19:09.321Z" }, + { url = "https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ffe5ad71f21d1e6603c4dd75f7fee34adf5ed5ebcebb692886549888ebb329ed", size = 19680113, upload-time = "2026-06-19T05:19:13.43Z" }, + { url = "https://files.pythonhosted.org/packages/43/b6/79c881410a3b1c187f7eb3d407aecae646c6a4433d630d72200359015e83/maturin-1.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f3306078070c1508fd715b9116070cbcaff5959024272a9f1e6f5cb29768b86c", size = 10169205, upload-time = "2026-06-19T05:19:16.615Z" }, + { url = "https://files.pythonhosted.org/packages/93/9d/44b6f26dcb7f7a04c5501ac2dbb6ca1490150682baa525ca5860504f9eab/maturin-1.14.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:cd457cd88961156e26379e1155bd287cc0ec1c8b2f1582b0660fb31b87c8842d", size = 10188098, upload-time = "2026-06-19T05:19:19.736Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bd/9c0d5d6983905ce2c9edaa073a7e89355a9cf7f396988e05d32f1c37785d/maturin-1.14.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:dfc54ae32e6fcb18302193ab9a30b0b25eefffba994ae13238974805533ef75e", size = 10627576, upload-time = "2026-06-19T05:19:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/e5/33/b096412bd6a7cb399652b260666f901adf88a687181a6dbd6a3f89f0a94e/maturin-1.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:a131d912b5267e640bc96d70f4914e10590aed64082ec9abacba7cea52004224", size = 10085181, upload-time = "2026-06-19T05:19:25.69Z" }, + { url = "https://files.pythonhosted.org/packages/56/8d/08c3bf469c38a23c9e6c877e338193001eb604d010fedc08341974e38528/maturin-1.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:be18fc568fb76884c0205456336892a75105ec398e6b667cd777c6268bd06d69", size = 10026363, upload-time = "2026-06-19T05:19:28.904Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/c4d1a92839f8745ab4aab988a7db884a79d6d710bd3b286fcf9316dece1a/maturin-1.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:994a0c8ba3ad8a92b3a9ee1b02645d200d610216b15cff5102b0fe65e8e08666", size = 13321347, upload-time = "2026-06-19T05:19:32.411Z" }, + { url = "https://files.pythonhosted.org/packages/b3/fa/170f04624d03fd07d2a8b1b67de83a127af93aef9eaa425839553347297b/maturin-1.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be80866363e605d137991b491a741a84cde9ae350183c4c85f49690ca9aaaa65", size = 10877609, upload-time = "2026-06-19T05:19:35.448Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/1ae2e1d0ded282bf2c55ac13f0811d87deb425e200ae64a15785675dede9/maturin-1.14.1-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:5282dffd4b539d2be245f4e5b1a5ab6bc1033b58f4a4872f5833f9d43c954aa4", size = 10417316, upload-time = "2026-06-19T05:19:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/fb/27/bf677183920718da49cd7982d6a3ffc440aad8919329f571d189f81b7bdf/maturin-1.14.1-py3-none-win32.whl", hash = "sha256:1a04de0a20188f95c721b5702eed18140bdcccb28c386797093eca3f62f4d4e0", size = 8931293, upload-time = "2026-06-19T05:19:41.183Z" }, + { url = "https://files.pythonhosted.org/packages/63/4b/585adeb9167b08d3cdff0032a938b0e72655c92003df4f52c3f696a1bcc2/maturin-1.14.1-py3-none-win_amd64.whl", hash = "sha256:3c9f94640ecc4895e94abaf834a0684430032c865b2748a36c12461fd9252fdd", size = 10314067, upload-time = "2026-06-19T05:19:44.389Z" }, + { url = "https://files.pythonhosted.org/packages/51/d4/dac8c0720ae246be1700afb6fbdbbea20fe35b13f6570b2f70faa005df77/maturin-1.14.1-py3-none-win_arm64.whl", hash = "sha256:15cea8fcb3ba47dd636f50092bb34baea8b04ac777392f23e6bf8a9a61efb894", size = 9718943, upload-time = "2026-06-19T05:19:47.49Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/74/319859f70c733f341df03823c8ca27ce9003faaac3ffa3110f3af1c8641a/pydantic_core-2.47.0.tar.gz", hash = "sha256:422c1797a7864b2a9a996435aba92fe571fb80190f67a31edbc1ac040c7b51fe", size = 476601, upload-time = "2026-05-22T13:19:00.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/e0/0da7149bbd84c438beb208e17174d03a798f2c8ce5a978cbc19fb3052be6/pydantic_core-2.47.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fe87ccbc39a103709d0a5afa75240c15a94611af129261e9484bef0bc97960b2", size = 2114007, upload-time = "2026-05-22T13:20:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/51/30/362c68ac4dc1a830066bf250850725d95be0567bb6a85434616ac68f5939/pydantic_core-2.47.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45882c24324f123037982c65eb8d60da778447e6bc87c82241f81d6c6d2c307e", size = 1948028, upload-time = "2026-05-22T13:19:25.939Z" }, + { url = "https://files.pythonhosted.org/packages/60/d6/1dd26612212fab9145a2b0d876459764ad04248331cb6f61ab4909fddc43/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983e39b39547772543f3518557d0a86dbb3b7bb58bf8e82faba1e0cfa3e816d9", size = 1972491, upload-time = "2026-05-22T13:20:35.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c4/00b31fd04acf601efff148add88cfe5f3c21f43f872e79f76e4580cfaf18/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3eb92447d3a079b945b61b8cbd6c3ec2954de3655c4efa0ebd35b069e472c2a9", size = 2045790, upload-time = "2026-05-22T13:18:25.672Z" }, + { url = "https://files.pythonhosted.org/packages/8b/33/7d1a8116bde9d259b3289090a2d93b87562001731cdf81d78bef5d1060d8/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af9600c680bec4b8d23c32ddaf7a5d91ed39a2cf758c082e34e860140cdcd87", size = 2223039, upload-time = "2026-05-22T13:20:37.64Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f6/4c94adcfe1bdaad3f8865a2115bed02e02cba809ffab25c0f85c0cc9b78a/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d6098342d4510a9034a500a53b1d737daf9cfc18a47cd21047d02d7d1587557", size = 2282031, upload-time = "2026-05-22T13:17:41.455Z" }, + { url = "https://files.pythonhosted.org/packages/b6/4f/7fe179b37f887297a5bfd7b38a4a26cd485748b6b424c43c73a36c02f57b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a891c20be5110deb1904f639f3615ec5022b3495995850d1abe7b8fa1550b5", size = 2088600, upload-time = "2026-05-22T13:17:36.643Z" }, + { url = "https://files.pythonhosted.org/packages/fa/15/daef331c1571ee986e1410511218c4d58e6ead75e0db735051925caa572b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:13990d357a50078e382b15fa3ce3f08043223b4be3eaeb340b184f54c1a2397a", size = 2112087, upload-time = "2026-05-22T13:19:30.024Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c7/7cfbb736f9ac501a92171e93bf640d065a13e12dcbcfb7effd21cce2f1ca/pydantic_core-2.47.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0f7343305387bb5884f24d384b7978ad099a277b27529e592c041a502a37c32", size = 2171199, upload-time = "2026-05-22T13:19:12.183Z" }, + { url = "https://files.pythonhosted.org/packages/5f/03/48e63b1f7d2088d747dde98b5dd7b89a46fff9173b6c10dc6189289c4aa5/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2c5e11bb1be2de2707c9367f364e73091ef30d34be54b3a4564d7421ac1a16bd", size = 2176850, upload-time = "2026-05-22T13:17:39.318Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/e653f7723f1dff5c054dada5f5d7f2c294067c087a52188847a0414cff2e/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e1b52aa981e034896712460c899ee30707c8c6a385e79bb7648aac76c748a3da", size = 2315368, upload-time = "2026-05-22T13:18:36.365Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ff/5aa6fcde3bd427648fee1a363671d8b4852c716603acd77091fb4cf1fc3d/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57d46021c20d4efc28f69b4ca4670dffbb7bdafa51d1967b747849726ec643b", size = 2351750, upload-time = "2026-05-22T13:19:28.187Z" }, + { url = "https://files.pythonhosted.org/packages/85/1d/6ee14bea4426d6bc421033d8d6ec69a6938d5773f7bd1d535b221fa48a7b/pydantic_core-2.47.0-cp311-cp311-win32.whl", hash = "sha256:d93c02ae8bd33f73624319d85cba47e754155c5bf104c0c5ca96fcd1f3094939", size = 1971464, upload-time = "2026-05-22T13:20:30.718Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6b/e466253efba866851af6e1094c488b4c5fb6adbfd8993d13e12b2a575541/pydantic_core-2.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:859ca679f00e5feb11b58b616eb7bc0efbb13654be21f5c898e510e27671c900", size = 2070625, upload-time = "2026-05-22T13:18:17.224Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/10628ab2df9f2421b6f3b88add9e026f1cb79198be417ee7d684ef0de5d7/pydantic_core-2.47.0-cp311-cp311-win_arm64.whl", hash = "sha256:482667e5b7a3e97b0836f33a716199c4ec6ba9c896ca4db6eae799ec527c1e64", size = 2052484, upload-time = "2026-05-22T13:17:32.654Z" }, + { url = "https://files.pythonhosted.org/packages/19/23/2daeff7346433ad9a3567852dd7a716329f9a7952dcf1ee74b166271bdc7/pydantic_core-2.47.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:70a7aeba54854f5d97da65cb1a61f000f53df3704cab41cd81d65ab127ddd031", size = 2108216, upload-time = "2026-05-22T13:19:31.898Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/2989cb5112b892b7dc13af570ff57d0f383f770fc88bbb644262df1b3017/pydantic_core-2.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c0e97329e38228f57fe1f2d91ba0ef39cc75cc1a84fe6ef58942d2fc6cb406bf", size = 1951502, upload-time = "2026-05-22T13:19:54.702Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a6/2417d8b1856cf7579a21e2679f02417b910e4f29120303e2c45137525072/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:faf83e50714837af72f13e9369c50377552a4a74049d4477bed51c7e5822d94b", size = 1975590, upload-time = "2026-05-22T13:17:26.586Z" }, + { url = "https://files.pythonhosted.org/packages/fc/71/0cd0813355b385bef8fa9a719982e0b44847afedc043b988c9f7c5d02ca9/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f50abe60347bf8afe2b2f58db86cf3ac6e418eec7ffa01d9dc90ba29fc64f243", size = 2055885, upload-time = "2026-05-22T13:20:42.378Z" }, + { url = "https://files.pythonhosted.org/packages/a3/33/5687c6dcf8ecca106c95b2a49f04a633320ab49961da6e57682db37b4482/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f13b18e7dec056336f29ee77dea3cc5db0271d6215cac7249cc5c61b0a49d293", size = 2235292, upload-time = "2026-05-22T13:19:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/36/98/08e81f1a0f0aa82cfa1a4d07b66eb116740fd6c82ba4baa8f96d4b377132/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3aaabbdbbbb8dff33fa053ffb2c980f39dec745fc03592f50e1e010449129841", size = 2308945, upload-time = "2026-05-22T13:18:38.113Z" }, + { url = "https://files.pythonhosted.org/packages/04/f1/6e35bdbdb79f96e630265297452d709b2ebd5facfbd83d3eb702eee24939/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d2907ee6d15cf26787bfbeb4c42e18e52f358086eab91baea961a0d909248d6", size = 2093861, upload-time = "2026-05-22T13:20:26.271Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c4/6a48e5da6a567bcf6d3ab113d2d476e1b93e3be941b4c486918f1c9d6714/pydantic_core-2.47.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:c413761260967f4dbb51135e1b49f30a1c29e15bf371fbb39754ed6475739545", size = 2124948, upload-time = "2026-05-22T13:18:15.728Z" }, + { url = "https://files.pythonhosted.org/packages/94/a1/e356c98dfc6bd5e6e166f2c832865a62941370b17a7199d35bc5999fecc8/pydantic_core-2.47.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bb527ac6e5a9721023b24615e1a55c01f47c60007f08b7d2afb89ff9c7a0e22", size = 2182065, upload-time = "2026-05-22T13:19:07.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/aa/6e99aac0a891b05cc522cc464aebeec2bb877fa4744be641a013ebc1785a/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b3abf7fd5e6abe483a63413f9cd26b7c93c20780e19c8556434c7279f6b2f10c", size = 2185830, upload-time = "2026-05-22T13:18:34.551Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/c6c5c1ad40b4d58f11d6e754e9c3990a2a3cfff20a9cf5c1f0a855a791b2/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:9cefe43d17a5a273d71697c084d3787defa7f578cd5fab4cef4c66d13c9e44b2", size = 2327330, upload-time = "2026-05-22T13:19:48.203Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f8/064747538297e385a1f197f35551d1bf6093e88c5ce9b4e15c035f0a1cfe/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:38a8b5371b7938e4f6c31060dbd51d3b3229aef7c43eaac2eb8b153e43c3f189", size = 2366505, upload-time = "2026-05-22T13:20:11.895Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d5/2d8715ef982c0b1875e42f4248b48439133a2781f0be77f0e4dbc84d147d/pydantic_core-2.47.0-cp312-cp312-win32.whl", hash = "sha256:b87e95e644df2a36bd631dd0d6e097aa73d19a55adf7b1724ebdeece3d9c76b7", size = 1957410, upload-time = "2026-05-22T13:17:38.025Z" }, + { url = "https://files.pythonhosted.org/packages/0e/ea/9d908a80798db41c7c38926259ed74d015869f0afe4be6ed56f71793a084/pydantic_core-2.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0078c5695322050ccedbc86eafaf3e2548439782c51d99e575de0e31b9fe4f4", size = 2072354, upload-time = "2026-05-22T13:17:42.779Z" }, + { url = "https://files.pythonhosted.org/packages/fe/78/5549cba47c662ec7f05d79527474786e5ff7f08ef3e65a409a8a2ab6013e/pydantic_core-2.47.0-cp312-cp312-win_arm64.whl", hash = "sha256:7eedc31996e9eba3bdfbbc380805ac6d765c889b7e93b17cd00ecb0200fd6dca", size = 2035452, upload-time = "2026-05-22T13:18:18.75Z" }, + { url = "https://files.pythonhosted.org/packages/7a/91/810cabda42f7fdd13b349702694e1140f6071fd42d1e542d606d5ad0c2d4/pydantic_core-2.47.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:263560ece98bffbbc0a8047ce60b8a278c859db6a2a4e30d9454b02891045eca", size = 2108548, upload-time = "2026-05-22T13:18:09.878Z" }, + { url = "https://files.pythonhosted.org/packages/fa/87/f444a6d63bcbdff3c45291df842941ed56c568f45dd3742f25afb567b5a2/pydantic_core-2.47.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a7fdaff39a66bf66e9037da482575513d2f20bfb02ea9d9222b5cb3b902fc695", size = 1951421, upload-time = "2026-05-22T13:20:32.973Z" }, + { url = "https://files.pythonhosted.org/packages/f5/09/c90dff5407c11e59023161c84df19dd5ed93966a23b2f08cd21d45812ab9/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e6c8ee5ce8c270bfae09763ae4bbbccfe81090c97d670a621fb86cb1ef6042", size = 1976554, upload-time = "2026-05-22T13:19:04.085Z" }, + { url = "https://files.pythonhosted.org/packages/95/cf/55fbe9f1b396f91005cd1cb7acf2bcf380a1f1b57e261ac78bcdc0ff42f3/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e38cdae682cfec4b3816722dccf6376ca59049726d57dca83c2fe7cc13665589", size = 2055005, upload-time = "2026-05-22T13:18:12.809Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c6/4f7cbaa62582e95c080cdd45fb5d4350ff05dac87ea32930c75dcb427bf1/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc3193ff0b7e2e168f84c6185e70475738c191f3154e0af8f897cd0f8f9a489", size = 2235489, upload-time = "2026-05-22T13:19:13.994Z" }, + { url = "https://files.pythonhosted.org/packages/31/75/16913c82ffd194c537222b3d0e8a05c11681e551add67308ec4af6023724/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57ff41672a615f38af528ee904602be51c653248354e5db8e9252668abe91e68", size = 2308360, upload-time = "2026-05-22T13:18:39.894Z" }, + { url = "https://files.pythonhosted.org/packages/05/9f/b24bb1b764fc360adace5df806a81fd62ef1662df2973891e487c3fd5a2c/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473b9a2b2a1f0dd55cbb32d2b902f93babe7f141a0bb48fb4d3d4d2b3e93e9a0", size = 2092549, upload-time = "2026-05-22T13:17:45.38Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d3/0268ea5972b91178250c0a573bb54c17f697665cd2aa35623087a3589fc6/pydantic_core-2.47.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:195f9c4ac43a7b2a044a7b86631c3352abdb820bed2823ea29f98f779255f459", size = 2123849, upload-time = "2026-05-22T13:18:03.817Z" }, + { url = "https://files.pythonhosted.org/packages/8f/92/26b2147738a89f78925775bb4b34ae53f981ce880ee77ee2c2ccbc49466a/pydantic_core-2.47.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c1cd10d39ef1ff8bcd68b6865bee9c434631ac0608d402fe86e678851c2e2a5", size = 2181733, upload-time = "2026-05-22T13:17:35.308Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fa/8a858dde4784c7245b7216ab9a71518cb1a898a83ffb5c0509181789de19/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7cbe66352fe2b39511d49150e5b52159429cd21f5633a3e801dd2c43829dcdca", size = 2184065, upload-time = "2026-05-22T13:18:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/69/20/ea165877f965622e021f04d63330f9ceb55ede0aefa862863e06a9a610cb/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e35192a1d53e55d510d8bb1023c988c7cdae6d94539074971741b2a7656e49a1", size = 2326881, upload-time = "2026-05-22T13:18:41.477Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d6/ad22a6f0941be5a5478e6c378d0ec3c7641be96d7a86a3ea1f9e9830a269/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81de54576de2e20baec76cc5afae2820f9049e6fdc4f357bac3391da02d0ba97", size = 2365574, upload-time = "2026-05-22T13:20:02.947Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4e/eb5e3429dd29311e75ab89313cde09b709b0637fd88838d2cb4a98760b02/pydantic_core-2.47.0-cp313-cp313-win32.whl", hash = "sha256:05da6647bdfd3888936ac10aa39b239d659f3c93dff281af0fc5943eb55629dd", size = 1955451, upload-time = "2026-05-22T13:17:31.178Z" }, + { url = "https://files.pythonhosted.org/packages/15/12/ec107c12aa8729c766285d4aa6caa5f5addf8b2ef6cfd35c455a3ca5c66e/pydantic_core-2.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:021220e0a03b66112737ee1fc49759340ce8fafb8d9ade1b7fb366b06033fa45", size = 2071285, upload-time = "2026-05-22T13:19:50.585Z" }, + { url = "https://files.pythonhosted.org/packages/f4/02/b003a55acfeb35823925d1cd502b80e3fe6c5d477865c36815fbefdf49ac/pydantic_core-2.47.0-cp313-cp313-win_arm64.whl", hash = "sha256:55156ee2f6f561ea4e25ab55f84bd70b9c9ed2546a834cb2b038fe10225aaa37", size = 2034804, upload-time = "2026-05-22T13:18:32.64Z" }, + { url = "https://files.pythonhosted.org/packages/ef/46/a4675c783822e229bf04e290ae28cf5a057b00a46039498743b066e0fefd/pydantic_core-2.47.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6e37a6974fbd8fa7cae12285a76970d50b3689ffd6ed7c7fdd176ba81dd22d0e", size = 2104537, upload-time = "2026-05-22T13:18:05.312Z" }, + { url = "https://files.pythonhosted.org/packages/67/bb/f6d6d1dd8362d616b227b55af8bc2d1b7d4ea842facb7c50a82298ba3b9d/pydantic_core-2.47.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2433b8524785cc117e602233bc574879bc8d87f09523edeec51665d5c46cf42d", size = 1951581, upload-time = "2026-05-22T13:18:14.244Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ae/7d01ed8658ccf8beae8a3fcf2cd023c3ba0ab0b19d3f456845a709cece94/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f9f2be064c8bf1189f46f7062fd42765d94f59cfb7db7ef8db19563192110a", size = 1978461, upload-time = "2026-05-22T13:19:15.829Z" }, + { url = "https://files.pythonhosted.org/packages/80/e5/dd38ccbd1e68f1c3fd7f8b413a8b32db11bd16d5999c3dc3aed4e54290df/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1f0a9659a2eb161573418e3138f616101ba21bbd2ff04916dca7b6712155e015", size = 2049444, upload-time = "2026-05-22T13:19:06.258Z" }, + { url = "https://files.pythonhosted.org/packages/7d/63/0cb998f3f4ea4255ab6d891e2537d4566cd31630df0d406ce45b00306729/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2995074b99242aa28991e0120a3c881babc139e08750a05b7ea7d140644e091d", size = 2231772, upload-time = "2026-05-22T13:20:05.22Z" }, + { url = "https://files.pythonhosted.org/packages/3f/20/2cacf5c4a1bdda1356351df38f343c6cf13af6194e6e0ee0f7967395793f/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5b224dc04c3ff9b08c24419464eb7f6ad7a1049e12284a00bf80df82bd15fdb", size = 2305322, upload-time = "2026-05-22T13:20:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/e3/8f/b7e09086bd48b1ef3f74227ed98907496924a622c7f9315cf661946233c6/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:264361b7236d4374fef6342908f87d084a0d58a2f8d0811e99f714309cb0ba7e", size = 2097748, upload-time = "2026-05-22T13:20:21.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/27/2927049e93f6fbbaa838b2bb656dbd63c6d6fcaab9909d632fd93573ebd9/pydantic_core-2.47.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:53368beaf693f6302a6e33bdefe950857534a04d282811421bd20176d0fb5636", size = 2122971, upload-time = "2026-05-22T13:19:37.977Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3b/80b58a0c7f4339f024ad5c5b6316bef895536abf75c45dc85f0c83ae1a92/pydantic_core-2.47.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5d2177b44ba7d9d86850f865f362feeaac6a2ed8517a9b505b97ff0b7fdbd7dd", size = 2181287, upload-time = "2026-05-22T13:18:20.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0a/dfcb9575603aaf113d2cae1fb622570046a210276eba2267764b3f83f4f2/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fb57a6b538ec7a01b937986bc093aec530fb056135b6bc9cfdd0bf8460c25bc2", size = 2177842, upload-time = "2026-05-22T13:17:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/57/c2/31a198c8180b417d18410e7640c505b39c51ac291aca34f71ac37093f4c4/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:18c9c7c3a18e9bdbf1215d913f6bd00e17595dc92949817935cb87a3cf5f1697", size = 2321802, upload-time = "2026-05-22T13:17:54.495Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/052d872b61f88d2f71b3d881c08abfbe33cb9d64bd988712bb4fb973001c/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2f72a382886ca85bb1247303b9134cf9978c9d454de62e710a1ebcd9d2131927", size = 2363870, upload-time = "2026-05-22T13:18:45.053Z" }, + { url = "https://files.pythonhosted.org/packages/be/60/c8c985d4081dafaa88fe6ac6a41ebe2b82d289c391b2bcbd3508f585e7a9/pydantic_core-2.47.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:cdf4dc2cdd0eacad1bd81c4d25422b4c25b206acae095d2d64e5d5cb7facc6b3", size = 1369335, upload-time = "2026-05-22T13:17:51.719Z" }, + { url = "https://files.pythonhosted.org/packages/42/70/30dfcc18dc5552f7235ae2ffd7b699a1ba0d38ebfcdb97f371c792d61601/pydantic_core-2.47.0-cp314-cp314-win32.whl", hash = "sha256:1e859dd5e06e9807080e14995db131649a77c61131cc464a7fe492a69ce82488", size = 1952107, upload-time = "2026-05-22T13:20:24.07Z" }, + { url = "https://files.pythonhosted.org/packages/fa/49/f5c517ba99b9e1036ead16cedd0fc189dbcbf900fb0b85b746b6a0b9b389/pydantic_core-2.47.0-cp314-cp314-win_amd64.whl", hash = "sha256:234ecade0e358caa1ea516c218b3f61e61e30532cad1a8bb12f2487325838548", size = 2071388, upload-time = "2026-05-22T13:18:46.74Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6c/6b95e00ed7a3c7f78cb8544bc34cb29412c05512af507fc4466912576d50/pydantic_core-2.47.0-cp314-cp314-win_arm64.whl", hash = "sha256:58158d0111e86893bc35aacabe509f951ed303cddf8cdba43533190bde317914", size = 2026046, upload-time = "2026-05-22T13:18:22.112Z" }, + { url = "https://files.pythonhosted.org/packages/22/2c/fa67f96f381ba3c83e8cd75a6eb3c538e123d8d02e19d80383bff01ffda0/pydantic_core-2.47.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:24017fd3befd4d7cc4a8c71f4a1e9a44d29fdc91723c5446b0e795ab808adee7", size = 2102407, upload-time = "2026-05-22T13:17:46.882Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e8/99abe6c33db3dda235a2095eae5fdd03266857abd9be1c50ed97a59587c3/pydantic_core-2.47.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dfa0820888cc4549fcce7e6bd8affa7d75198d885ccd0bb0760def4bb8461862", size = 1931963, upload-time = "2026-05-22T13:18:23.776Z" }, + { url = "https://files.pythonhosted.org/packages/5c/dd/96d1884f65737f793e64b6b8745ee793e3cb4735e086ead0a40e5349294e/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d507f331756f7066cde7c9f35ed78fa78223a54369dbc8a34d6da7a5074fa1", size = 1973492, upload-time = "2026-05-22T13:17:22.128Z" }, + { url = "https://files.pythonhosted.org/packages/07/8c/0504f091c75b229cd07d61b45464d7c5291c3ecf2e7d847f215fe81cf5e5/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c4a885fb50c05903bc703a00830616e680304fdcdd90fc9535a52e72debe712", size = 2035548, upload-time = "2026-05-22T13:17:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bf/e9f69c55ef6c945d29e4afb306f62a15354bfd09f1ee25d9aecd4c6cbb82/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b107cbd764bf68f12a57c7aa5846d868bc7463490a1ac2d0f19bffef624c5a9", size = 2238356, upload-time = "2026-05-22T13:19:10.309Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/dfbd214487033093f5946c1fd5915ae5dc6b278efe764397b5e2ef8092a8/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b5f46412c8226d0c8f1f423c324c75afe342e4b854836933579fb484f68598c", size = 2284799, upload-time = "2026-05-22T13:17:27.959Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ec/f80488fa26a6b27bd0d1267f35b0fce3bfeec23ca97021085a94ccd3adc3/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90cbf7e35d597503cbdb5cd85409cbb75f377290bc7e8e37cc5dfe4f5cc66cf8", size = 2107895, upload-time = "2026-05-22T13:18:27.282Z" }, + { url = "https://files.pythonhosted.org/packages/9b/1d/67ac210745f63a982b145d8f281dc76bd347d98052792f087224a178da54/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:04ee7ba7172cb4484af51b2890f19069d35773698abc8c6ebb651f52fbf41134", size = 2102797, upload-time = "2026-05-22T13:19:40.139Z" }, + { url = "https://files.pythonhosted.org/packages/6c/75/f3b9bd4d88fcaad9a5abf2ec6969f37a70e34f40a5f8d2d78077f168e83d/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a7acb3e120ddba94372b8146e62ea3a0bce203180e34641c817c87f995c91e0", size = 2160123, upload-time = "2026-05-22T13:19:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/e94ac13bd17c341e86c4b67deb47b63718208fe413034fdb01e7a4bf1dd8/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:1a2f7ceb58013d167d8c96f10ec9b3a137018c819ba356f68ff1cb74302fd22e", size = 2164386, upload-time = "2026-05-22T13:18:48.372Z" }, + { url = "https://files.pythonhosted.org/packages/36/e5/862ff195402f5b08db9ad4d9ebe7cbed993f51528aab7edcb62531442556/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:482b097637fec5037eb13fe9f9d5fe47e568a5b451d686bc2b854076cc0b50ca", size = 2303767, upload-time = "2026-05-22T13:18:50.211Z" }, + { url = "https://files.pythonhosted.org/packages/c2/05/c8ebbb97cf44686fc9cc64a6bb86ac72a8871426a9f61417e395d77c4894/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a8c7f5fad73eb404f4b84c75f3d9d3865b748ded248b7366341db6e516fc502b", size = 2361148, upload-time = "2026-05-22T13:18:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8b/4695ec6ce81eda7cc822383de993c5b2c289cfc84d3f032a30c55eb238fc/pydantic_core-2.47.0-cp314-cp314t-win32.whl", hash = "sha256:f343c39928097175acf2f7d0cba5c00b0f62265d88a173a4ce264266ac849bd9", size = 1939588, upload-time = "2026-05-22T13:19:42.151Z" }, + { url = "https://files.pythonhosted.org/packages/96/4d/bc2e188ab648b3ab284e80a0340c5d5b9723c22572c6e36ba39eb300e718/pydantic_core-2.47.0-cp314-cp314t-win_amd64.whl", hash = "sha256:52d40e074da44e42b2425aedebd513e405a31807036ef597175117a9b01743a6", size = 2049697, upload-time = "2026-05-22T13:18:08.244Z" }, + { url = "https://files.pythonhosted.org/packages/6f/46/ca1e6813e029993e57340c6a37740450c51919e3809472f79060f4d64cf0/pydantic_core-2.47.0-cp314-cp314t-win_arm64.whl", hash = "sha256:25cac08c9735e61e5c0b9f7a85c438661fc0e9da226afdfa984c3da6c5942a5a", size = 2025906, upload-time = "2026-05-22T13:17:50.322Z" }, + { url = "https://files.pythonhosted.org/packages/1e/a3/7391a9a511aba60ba119dcbc221a36109dd05ff498dcd6e6ff7222a21b76/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:dbe50ffd50c7e1b8e3bedafafd10fabe8a7cf51916f995fd57316eb1293f2439", size = 2112946, upload-time = "2026-05-22T13:18:54.846Z" }, + { url = "https://files.pythonhosted.org/packages/71/74/1d0fe337fa5a89069731206be4da2b41793b8f8fe28f34ed4d941028a62f/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:67c3f4b57a1cda846a9b6258e0ef70f99b0757d0b6a55f7e3e5b100620937d2c", size = 1940704, upload-time = "2026-05-22T13:18:00.366Z" }, + { url = "https://files.pythonhosted.org/packages/ac/75/d40231aed211f97ffc3264d7a7c98d1f52f7b9c8d165cee75c8c1c13e5c3/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1e025c83b3987784191ec5aa78cfb94686f1ba73d98ae4d520c09cdecda8d", size = 1985024, upload-time = "2026-05-22T13:17:29.331Z" }, + { url = "https://files.pythonhosted.org/packages/a6/bc/e27d3fb897c5b059a508b88eb7c4cc1f0fe600be3231728bb003e1e2b464/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547cac87585ab8a6e9495fd3be22ae8ccaabb3c909f6ae589a180677c105cc8", size = 2136202, upload-time = "2026-05-22T13:17:34.031Z" }, + { url = "https://files.pythonhosted.org/packages/4e/21/81cc7e3acbf7d4eed41e9585e81b5840aaf6ddbe65974a20946038d6516b/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:d648515c65f8871ceca6a0446be32fb1a0aae414db3907ec0df6cc2380dd0c04", size = 2098016, upload-time = "2026-05-22T13:18:56.902Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6e/c98e869e9f754f18088ad9b55887972d08606e7bf81dba088779e927eb65/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3292813ac8ed17671a5b1ac8256b6e98b96c29c1c6d061c35899e2f6e0444cac", size = 1931175, upload-time = "2026-05-22T13:20:07.566Z" }, + { url = "https://files.pythonhosted.org/packages/5d/65/ce0d773f4b51dc332764ba1bd585c81f62d5c92231a66d152aff16be8dfa/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf3cfcea028f41a9b42a47f4a53d72ca4274d04e3ee525bd58ca89ea8c5e1910", size = 1995356, upload-time = "2026-05-22T13:19:44.143Z" }, + { url = "https://files.pythonhosted.org/packages/19/2c/6e63683a77d342c93bad67bb0762ca8fe1d8418acc8617d70ccdcc5ec5ff/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52afdd8640d59890539060e91c8a494cf96b463e63b2ba499cc5c23abcb5e96b", size = 2144893, upload-time = "2026-05-22T13:17:59.008Z" }, + { url = "https://files.pythonhosted.org/packages/f1/bf/06a01e2f6668aa10646e5c9b050a609d975a93d58454e26e16fd9f82cd38/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ff201e8b93cd6a3849ec3fecb1d642d0391ca4a387f1162adaadddfd1986598c", size = 2114751, upload-time = "2026-05-22T13:18:02.245Z" }, + { url = "https://files.pythonhosted.org/packages/41/50/caf4cc67fdd664baf89bfe264d72079e901a02d903c813ced9de173cdd69/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eba39fca6e1fc7c58a5e6b5c320c6eec86014f7075dfa0fb1a79076e00304b3a", size = 1947894, upload-time = "2026-05-22T13:19:36.12Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c0/96ba102865c9ccb945a758272741d00175837bf32bb71750f6e2bf4543fb/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b494566e8e7e1a3992a550900902d6c0051538e53f5957e24003e7775638a24", size = 2131698, upload-time = "2026-05-22T13:18:58.55Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f8/ee7c5d4eafaecdeaf92ce84f48d748c139888e90fa25b2ae988c5aea874c/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c96f745745fe778a92e74f40675c57b80dd46fc98186c9020e5ba4514a0470bd", size = 2157797, upload-time = "2026-05-22T13:17:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/08/69/b3eba1d0e015cee3906f7056cfd9ed383f6cef486fde5398a002df2594e4/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dbfb8f8ac48a8fd5a9f83cdbba0a23796f3ff5f9421c735808ed134d3318046f", size = 2177829, upload-time = "2026-05-22T13:20:09.611Z" }, + { url = "https://files.pythonhosted.org/packages/8a/36/a0ceff9b7c3a0980128c9ef763db1e9fe9c2b1fcecf6ed055e88af39f123/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:4ded2d8dc3beb086623ab3256b81a0b51fc026c94eb363f480aec09b204a1cbd", size = 2307425, upload-time = "2026-05-22T13:19:46.177Z" }, + { url = "https://files.pythonhosted.org/packages/d6/0a/930e210e95ade33ecacabc4ba822aa1662a0aaf843d2cf57abce27fb95b1/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:25f8aa59fd3f85651387c37b289cd8f0bbc8f632e7dad13c6b837759e78be88d", size = 2351547, upload-time = "2026-05-22T13:17:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0c/90941408bb6c1e84563d99177c9e62c536dce0388b5a8bf37b90b4f6f095/pydantic_core-2.47.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:0ae0096729c64aa6155cef74e75d1945017b01cfb82f313a18d843fafc497476", size = 2180871, upload-time = "2026-05-22T13:19:56.696Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml b/e2e/crossbuild/pyproject.toml similarity index 88% rename from e2e/cases/uv-deps-650/crossbuild/pyproject.toml rename to e2e/crossbuild/pyproject.toml index d6e6ed0c0..648b141a7 100644 --- a/e2e/cases/uv-deps-650/crossbuild/pyproject.toml +++ b/e2e/crossbuild/pyproject.toml @@ -5,7 +5,6 @@ requires-python = ">=3.11" authors = [] dependencies = [ "cffi", - "psycopg2-binary", "python-geohash==0.8.5", "setuptools", "build", diff --git a/e2e/crossbuild/rpds_py/BUILD.bazel b/e2e/crossbuild/rpds_py/BUILD.bazel new file mode 100644 index 000000000..7ece315d2 --- /dev/null +++ b/e2e/crossbuild/rpds_py/BUILD.bazel @@ -0,0 +1,16 @@ +# rpds-py ships official prebuilt wheels for linux/amd64 and linux/arm64, +# but [tool.uv] no-binary-package forces it to build from sdist here. +# Unlike //geohash (setuptools), //contourpy (meson-python), and +# //awkward_cpp (scikit-build-core/CMake), this is a Rust/maturin+PyO3 +# extension — build_helper.py needs a Rust cross toolchain (cargo/rustc) +# and CARGO_TARGET__LINKER pointed at our C cross toolchain, since +# maturin's own cross-compile detection doesn't cover a plain Linux-arch +# cross build any more than meson-python/scikit-build-core's did. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "rpds_py", + deps = ["@pypi_crossbuild_rpds_py//rpds_py"], + so_pattern = "whl_install__crossbuild_rpds_py.*rpds/rpds.*\\.so$$", +) diff --git a/e2e/crossbuild/rpds_py/pyproject.toml b/e2e/crossbuild/rpds_py/pyproject.toml new file mode 100644 index 000000000..7d99faddd --- /dev/null +++ b/e2e/crossbuild/rpds_py/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "crossbuild_rpds_py" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "maturin", + "rpds-py==2026.6.3", +] + +[tool.uv] +no-binary-package = ["rpds-py"] diff --git a/e2e/crossbuild/rpds_py/rpds_py_image_command_test.yaml b/e2e/crossbuild/rpds_py/rpds_py_image_command_test.yaml new file mode 100644 index 000000000..1cd919c2d --- /dev/null +++ b/e2e/crossbuild/rpds_py/rpds_py_image_command_test.yaml @@ -0,0 +1,9 @@ +schemaVersion: 2.0.0 + +# rpds_py_main.py asserts rpds.List([1,2,3]).push_front(0)'s exact iteration +# order itself and only prints "OK" on success. +commandTests: + - name: rpds-py List.push_front computes the correct order + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/rpds_py/rpds_py_main.py b/e2e/crossbuild/rpds_py/rpds_py_main.py new file mode 100644 index 000000000..7cc3db78b --- /dev/null +++ b/e2e/crossbuild/rpds_py/rpds_py_main.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +import rpds + + +def main() -> None: + # push_front(0) onto [1, 2, 3] must yield 0, 1, 2, 3 in iteration order. + values = list(rpds.List([1, 2, 3]).push_front(0)) + assert values == [0, 1, 2, 3], "expected [0, 1, 2, 3], got {}".format(values) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/rpds_py/uv.lock b/e2e/crossbuild/rpds_py/uv.lock new file mode 100644 index 000000000..f3170591b --- /dev/null +++ b/e2e/crossbuild/rpds_py/uv.lock @@ -0,0 +1,205 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-rpds-py" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "maturin" }, + { name = "rpds-py" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "maturin" }, + { name = "rpds-py", specifier = "==2026.6.3" }, +] + +[[package]] +name = "maturin" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/b3/addd877f871fb1860d46d3a4f206ecb10b946c85846805e6367631926fd3/maturin-1.14.1.tar.gz", hash = "sha256:9d6577a62cd08e0ceba7a0db06fb098e0c9b1b3429bad747a4f3a18215a1b3df", size = 369637, upload-time = "2026-06-19T05:19:49.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/f0/97c5a5bd9c71653a066c0976a484eaaae50b9369557838a4176b7b0bdaa5/maturin-1.14.1-py3-none-linux_armv6l.whl", hash = "sha256:522292398945442cdafa9daeb2271b2340fbde57027b818f923f88eab04174f8", size = 10207496, upload-time = "2026-06-19T05:19:09.321Z" }, + { url = "https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ffe5ad71f21d1e6603c4dd75f7fee34adf5ed5ebcebb692886549888ebb329ed", size = 19680113, upload-time = "2026-06-19T05:19:13.43Z" }, + { url = "https://files.pythonhosted.org/packages/43/b6/79c881410a3b1c187f7eb3d407aecae646c6a4433d630d72200359015e83/maturin-1.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f3306078070c1508fd715b9116070cbcaff5959024272a9f1e6f5cb29768b86c", size = 10169205, upload-time = "2026-06-19T05:19:16.615Z" }, + { url = "https://files.pythonhosted.org/packages/93/9d/44b6f26dcb7f7a04c5501ac2dbb6ca1490150682baa525ca5860504f9eab/maturin-1.14.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:cd457cd88961156e26379e1155bd287cc0ec1c8b2f1582b0660fb31b87c8842d", size = 10188098, upload-time = "2026-06-19T05:19:19.736Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bd/9c0d5d6983905ce2c9edaa073a7e89355a9cf7f396988e05d32f1c37785d/maturin-1.14.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:dfc54ae32e6fcb18302193ab9a30b0b25eefffba994ae13238974805533ef75e", size = 10627576, upload-time = "2026-06-19T05:19:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/e5/33/b096412bd6a7cb399652b260666f901adf88a687181a6dbd6a3f89f0a94e/maturin-1.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:a131d912b5267e640bc96d70f4914e10590aed64082ec9abacba7cea52004224", size = 10085181, upload-time = "2026-06-19T05:19:25.69Z" }, + { url = "https://files.pythonhosted.org/packages/56/8d/08c3bf469c38a23c9e6c877e338193001eb604d010fedc08341974e38528/maturin-1.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:be18fc568fb76884c0205456336892a75105ec398e6b667cd777c6268bd06d69", size = 10026363, upload-time = "2026-06-19T05:19:28.904Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/c4d1a92839f8745ab4aab988a7db884a79d6d710bd3b286fcf9316dece1a/maturin-1.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:994a0c8ba3ad8a92b3a9ee1b02645d200d610216b15cff5102b0fe65e8e08666", size = 13321347, upload-time = "2026-06-19T05:19:32.411Z" }, + { url = "https://files.pythonhosted.org/packages/b3/fa/170f04624d03fd07d2a8b1b67de83a127af93aef9eaa425839553347297b/maturin-1.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be80866363e605d137991b491a741a84cde9ae350183c4c85f49690ca9aaaa65", size = 10877609, upload-time = "2026-06-19T05:19:35.448Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/1ae2e1d0ded282bf2c55ac13f0811d87deb425e200ae64a15785675dede9/maturin-1.14.1-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:5282dffd4b539d2be245f4e5b1a5ab6bc1033b58f4a4872f5833f9d43c954aa4", size = 10417316, upload-time = "2026-06-19T05:19:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/fb/27/bf677183920718da49cd7982d6a3ffc440aad8919329f571d189f81b7bdf/maturin-1.14.1-py3-none-win32.whl", hash = "sha256:1a04de0a20188f95c721b5702eed18140bdcccb28c386797093eca3f62f4d4e0", size = 8931293, upload-time = "2026-06-19T05:19:41.183Z" }, + { url = "https://files.pythonhosted.org/packages/63/4b/585adeb9167b08d3cdff0032a938b0e72655c92003df4f52c3f696a1bcc2/maturin-1.14.1-py3-none-win_amd64.whl", hash = "sha256:3c9f94640ecc4895e94abaf834a0684430032c865b2748a36c12461fd9252fdd", size = 10314067, upload-time = "2026-06-19T05:19:44.389Z" }, + { url = "https://files.pythonhosted.org/packages/51/d4/dac8c0720ae246be1700afb6fbdbbea20fe35b13f6570b2f70faa005df77/maturin-1.14.1-py3-none-win_arm64.whl", hash = "sha256:15cea8fcb3ba47dd636f50092bb34baea8b04ac777392f23e6bf8a9a61efb894", size = 9718943, upload-time = "2026-06-19T05:19:47.49Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/1f/a2dca5ffdbf1d475ffc4e80e4d5d720ff3a00f691795910116960ee12511/rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7", size = 342174, upload-time = "2026-06-30T07:14:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/323d08583c0832911768663d1944f0107fcd4088704858d84b5e06d105a0/rpds_py-2026.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db08f45aecde626498fb3df07bcf6d2ec040af42e859a4f5040d79c200342911", size = 345513, upload-time = "2026-06-30T07:14:56.515Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2a/e31989834d18d2f26ec1d2774c5b1eb3331df4ea8ada525175294c94b48a/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc992ab27b15f852c76755eb2ab7dce86585ddadba6fa5946e58556088845b4", size = 373783, upload-time = "2026-06-30T07:14:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/fe/e80107ee3639585c9941c17d6a42cd65325022f656c023191fce78c324c8/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f88d653e7b3b779d71ae7454e20dcc9b6bae903f33c269db9f2be41bda3f261", size = 378316, upload-time = "2026-06-30T07:14:59.077Z" }, + { url = "https://files.pythonhosted.org/packages/22/6f/81e3adf81acfb6fa694de2a6e4e7d8863121e3e0799e0a7725e6cf5679c4/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e52655eaf81e32593abedaa4bfe33170c8cfedf3365ed9be6e11e07f148f0278", size = 499423, upload-time = "2026-06-30T07:15:00.488Z" }, + { url = "https://files.pythonhosted.org/packages/2d/9a/41263969df0ce3d9af2a96d5005a288200af1989aed3354bfceb5fc0b21f/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfcc8b909769d19db55c7cc9541eb64b9b774b1057ffffb4f1048070475bb9f9", size = 386077, upload-time = "2026-06-30T07:15:01.911Z" }, + { url = "https://files.pythonhosted.org/packages/5e/19/7e98f468bd50346faff5b10e5297374b443bfdddacc8e9fbc65984539597/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1255b302953c86a486b81d330d5ee1d5bd937691ce271b6be0ef0e299eaab7", size = 371315, upload-time = "2026-06-30T07:15:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/99/3c/2b973b4d371906a134b03decfea7f5d9835a2c6d263454392e15b64b5b18/rpds_py-2026.6.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8d2294a31386bfa251d8c8a39472beee17db67d4f1a6eabea665d35c9a4461c3", size = 383502, upload-time = "2026-06-30T07:15:04.627Z" }, + { url = "https://files.pythonhosted.org/packages/98/2a/12e2799500af0a307bca76b63361c51f9fe479223561489c29eea1f2ee41/rpds_py-2026.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8f23ead891a3b762f35ab3b04623da7056545b48aa60d59957e6789914545da", size = 402673, upload-time = "2026-06-30T07:15:05.856Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e3/21e5872d165fe08be4f229e3d5ee9d90019c0bf0e5538de60dbd54009450/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:421aba32367055614287a4292b6a17f1939c9452299f7a0209c117e990b646d4", size = 549964, upload-time = "2026-06-30T07:15:07.159Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d0/5ee0fe36844297de8123bee27bc12078c1a7416ad9f1b8a8ca18d6b0c0ac/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e5822dfc2f0d4ab7e745eaa6d85945069329beeccef965af3f3bb26058fcab6", size = 615446, upload-time = "2026-06-30T07:15:08.531Z" }, + { url = "https://files.pythonhosted.org/packages/b1/80/1ea5873cb683f2fbe5f21b23ea1f6d179ead19f3c5b249b7eb5dca568ef2/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83e35b57523816c8613fd0776b40cd8bb9f596b37ddd2692eb4a6bb5ab2f8c93", size = 576975, upload-time = "2026-06-30T07:15:09.97Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e1/90ef639217a5ddb15b7f4f61b1c33911fd044ad03c311bafdd2bcab85582/rpds_py-2026.6.3-cp311-cp311-win32.whl", hash = "sha256:de3eceba0b683bcbb1ab93da016d0270df1f9ae7be716b40214c5dafac6ea45a", size = 204453, upload-time = "2026-06-30T07:15:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b7/b7a1695d7af36f521fb11e80d6d3adbd744f73b921859bd3c2a2c0dc706f/rpds_py-2026.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:2c54a076ca4d370980ab57bc0e31df57bbe8d41340436a90ef8b1219a3cbb127", size = 223219, upload-time = "2026-06-30T07:15:12.476Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a2/145afacf796e4506062825941176ad9445c2dcf2b3b6a1f13d3030a15e19/rpds_py-2026.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:168c733a7112e071bb7a66460e667edfcff06c017a3c523f7a8a8e08d0140804", size = 219137, upload-time = "2026-06-30T07:15:13.631Z" }, + { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, + { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, + { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, + { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, + { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, + { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, + { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, + { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, + { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, + { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, + { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, + { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, + { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, + { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, + { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/08/ae/f23a2697e6ee6340a578b0f136be6483657bef0c6f9497b752bb5c0964bb/rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13", size = 344726, upload-time = "2026-06-30T07:16:44.5Z" }, + { url = "https://files.pythonhosted.org/packages/c3/63/e7b3a1a5358dd32c930a1062d8e15b67fd6e8922e81df9e91706d66ee5c8/rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05", size = 339587, upload-time = "2026-06-30T07:16:46.255Z" }, + { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, + { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, + { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, + { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, + { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, + { url = "https://files.pythonhosted.org/packages/29/71/4d8fcf700931815594bce892255bbd973b94efaf0fc1932b0590df18d886/rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369", size = 202864, upload-time = "2026-06-30T07:17:05.746Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/b577562de0edbb55b2be85ce5fd09c33e386b9b13eee09833af4240fd5c4/rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146", size = 220430, upload-time = "2026-06-30T07:17:07.471Z" }, + { url = "https://files.pythonhosted.org/packages/c8/95/d6d0b2509825141eef60669a5739eec88dbc6a48053d6c92993a5704defe/rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e", size = 215877, upload-time = "2026-06-30T07:17:09.008Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bf/f3ea278f0afd615c1d0f19cb69043a41526e2bb600c2b536eb192218eb27/rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b", size = 346933, upload-time = "2026-06-30T07:17:10.762Z" }, + { url = "https://files.pythonhosted.org/packages/9d/29/9907bdf1c5346763cf10b7f6852aad86652168c259def904cbe0082c5864/rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690", size = 340274, upload-time = "2026-06-30T07:17:12.266Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, + { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, + { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, + { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, + { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/ba/76/65002b08596c389105720a8c0d22298b8dc25a4baf89b2ce431343c8b1de/rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577", size = 201204, upload-time = "2026-06-30T07:17:30.193Z" }, + { url = "https://files.pythonhosted.org/packages/8c/97/d855d6b3c322d1f27e26f5241c42016b56cf01377ea8ed348285f54652f0/rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324", size = 220719, upload-time = "2026-06-30T07:17:31.788Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9c/f0d19ac587fd0e4ab6b72cda355e9c5a6166b01ef7e064e437aef8eb9fef/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4cf2d36a2357e4d07bb5a4f98801265327b48256867816cfd2ceb001e9754a8f", size = 349791, upload-time = "2026-06-30T07:17:33.315Z" }, + { url = "https://files.pythonhosted.org/packages/38/c7/1d49d204c9fd2ee6c537601dc4c1ba921e03363ca576bfab94a00254ac9a/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30c6dc199b24a5e3e81d50da0f00858c5bbdb2617a750395687f4339c5818171", size = 352842, upload-time = "2026-06-30T07:17:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e5/c0b5dc93cd0d4c06ce1f438907649514e2ea077bcd911e3154a51e96c38e/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9891e594296ab9dada6551c8e7b387b2721f27a67eecd528412e8906247a7b90", size = 382094, upload-time = "2026-06-30T07:17:36.514Z" }, + { url = "https://files.pythonhosted.org/packages/0d/54/ec0e907b4ca8d541112db352409bd15f871c9b243e0c92c9b5a46ae96f01/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5c2dc92304aa48a4a60443b548bb12f12e119d4b72f314015e67b9e1be97fca", size = 388662, upload-time = "2026-06-30T07:17:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f4/921c22a4fd0f1c1ac13a3996ffbf0aa67951e2c8ad0d1d9574938a2932e8/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:127e08c0642d880cf32ca47ec2a4a77b901f7e2dd1ad9762adb13955d72ffcc9", size = 504896, upload-time = "2026-06-30T07:17:39.689Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1b/a114b972cefa1ab1cdb3c7bb177cd3844a12826c507c722d3a73516dbbaf/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bb68f03f395eb793220b45c097bd4d8c32944393da0fad8b999efac0868fc8c", size = 391545, upload-time = "2026-06-30T07:17:41.336Z" }, + { url = "https://files.pythonhosted.org/packages/4e/98/af9b3db77d47fcbe6c8c1f36e2c2147ec70292819e99c325f871584a1c11/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3450b693fde92133e9f51060568a4c31fcca76d5e53bbd611e689ca446517e9", size = 380059, upload-time = "2026-06-30T07:17:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ba/0efd8668b97c1d26a61566386c636a7a7a09829e474fdf807caa15a2c844/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:5e8d07bddee435a2ff6f1920e18feff28d0bc4533e42f4bf6927fbd073312c41", size = 393235, upload-time = "2026-06-30T07:17:44.637Z" }, + { url = "https://files.pythonhosted.org/packages/62/90/8c139ee9690f73b0829f32647de6f40d826f8f443af6fa72644f96351aac/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a83ae6c67b7676b9878378547ca8e93ed77a580037bcbcd1d32f739e1e6089c", size = 413008, upload-time = "2026-06-30T07:17:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/0043896fdd7828ce09a1d9a8b06433714d0960fc4ff3fc4aa72b666b764e/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2bfd04c19ddbd6640de0b51894d764bd2758854d5b75bd102d2ef10cb9c293a9", size = 558118, upload-time = "2026-06-30T07:17:47.759Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/02355f0e134f783a8f9814c4680a1bd311d37671577a5964ea838573ff37/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ca6546b66be9dc4738b1b043d5ebd5488c66c578c5ff0fd0e8065313fe3afb76", size = 623138, upload-time = "2026-06-30T07:17:49.355Z" }, + { url = "https://files.pythonhosted.org/packages/10/85/48f0abdcef5cce4e034c7a5b0ceeceba0b01bf0d942824f4bb720afe2dec/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8e65860d238379ed982fd9ba690579b5e95af2f4840f99c772816dbe573cb826", size = 586486, upload-time = "2026-06-30T07:17:51.141Z" }, +] diff --git a/e2e/crossbuild/test.sh b/e2e/crossbuild/test.sh new file mode 100755 index 000000000..940a5d9a1 --- /dev/null +++ b/e2e/crossbuild/test.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# geohash_macos_amd64_cross_test is tagged "manual" (see BUILD.bazel), so +# this is the only place that runs it — and only on a real macOS host. +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")" + +if [[ "$(uname)" == "Darwin" ]]; then + echo "macOS host detected — building and running the macOS cross target too" + bazel test --test_output=errors //geohash:geohash_macos_amd64_cross_test +else + echo "Linux host — skipping macOS cross target (no Xcode SDK available from here)" +fi diff --git a/e2e/crossbuild/tiktoken/BUILD.bazel b/e2e/crossbuild/tiktoken/BUILD.bazel new file mode 100644 index 000000000..29c102b22 --- /dev/null +++ b/e2e/crossbuild/tiktoken/BUILD.bazel @@ -0,0 +1,16 @@ +# tiktoken ships official prebuilt wheels for linux/amd64 and linux/arm64, +# but [tool.uv] no-binary-package forces it to build from sdist here. A +# second setuptools-rust package alongside //bcrypt — same build-backend +# shape (plain "setuptools.build_meta" with "setuptools-rust" only visible +# in build-system.requires, no --target flag of its own) on a different, +# widely-used real-world crate (OpenAI's BPE tokenizer core), so this path +# isn't validated by one lucky package alone. + +load("//tools:cross_case.bzl", "pep517_cross_case") + +pep517_cross_case( + name = "tiktoken", + check_so_suffix = False, + deps = ["@pypi_crossbuild_tiktoken//tiktoken"], + so_pattern = "whl_install__crossbuild_tiktoken.*_tiktoken.*\\.so$$", +) diff --git a/e2e/crossbuild/tiktoken/pyproject.toml b/e2e/crossbuild/tiktoken/pyproject.toml new file mode 100644 index 000000000..312dc35c8 --- /dev/null +++ b/e2e/crossbuild/tiktoken/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "crossbuild_tiktoken" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "setuptools", + "setuptools-rust", + "tiktoken==0.13.0", + "wheel", +] + +[tool.uv] +no-binary-package = ["tiktoken"] diff --git a/e2e/crossbuild/tiktoken/tiktoken_image_command_test.yaml b/e2e/crossbuild/tiktoken/tiktoken_image_command_test.yaml new file mode 100644 index 000000000..59b81cd1a --- /dev/null +++ b/e2e/crossbuild/tiktoken/tiktoken_image_command_test.yaml @@ -0,0 +1,10 @@ +schemaVersion: 2.0.0 + +# tiktoken_main.py asserts a real encode/decode round-trip through the +# compiled Rust core (_tiktoken.CoreBPE) itself and only prints "OK" on +# success. +commandTests: + - name: tiktoken encodes and decodes through its compiled Rust core + exitCode: 0 + command: /app + expectedOutput: ["OK"] diff --git a/e2e/crossbuild/tiktoken/tiktoken_main.py b/e2e/crossbuild/tiktoken/tiktoken_main.py new file mode 100644 index 000000000..9076c12d0 --- /dev/null +++ b/e2e/crossbuild/tiktoken/tiktoken_main.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +import tiktoken + + +def main() -> None: + # tiktoken's real encodings (cl100k_base, o200k_base, ...) download their + # BPE vocab over the network on first use — not available in a sandboxed + # cross build/QEMU-emulated container. Build a minimal encoding directly + # instead: one rank per raw byte, no merges, so encode() must exercise + # the real compiled Rust core (_tiktoken.CoreBPE) to reduce "hi" to its + # two literal byte values with no other correct output possible. + mergeable_ranks = {bytes([i]): i for i in range(256)} + enc = tiktoken.Encoding( + name="byte-level-test", + pat_str=r".+", + mergeable_ranks=mergeable_ranks, + special_tokens={}, + ) + tokens = enc.encode("hi") + assert tokens == [104, 105], "expected [104, 105], got {}".format(tokens) + decoded = enc.decode(tokens) + assert decoded == "hi", "expected 'hi', got {!r}".format(decoded) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/tiktoken/uv.lock b/e2e/crossbuild/tiktoken/uv.lock new file mode 100644 index 000000000..3e4d23ca1 --- /dev/null +++ b/e2e/crossbuild/tiktoken/uv.lock @@ -0,0 +1,382 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/e3/85ec501f206fb049259288c1f3506e53876937fb00edb47009348e66756b/charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5", size = 317075, upload-time = "2026-07-07T14:32:56.021Z" }, + { url = "https://files.pythonhosted.org/packages/c3/69/2a5385192e67175f7d8bd5ce4f57c24bc956439adeae5c13a99aa28a53d1/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2", size = 213837, upload-time = "2026-07-07T14:32:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/b3/46/03ddc7da576d814fe0a36dd1f0fd3258e95404b4b2e3c026b7923d7e133f/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a", size = 235503, upload-time = "2026-07-07T14:32:59.205Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6e/de0229a7ef40f6f9d28a837eebf4ec47bdca5dab4e900c84f22919af636a/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29", size = 229944, upload-time = "2026-07-07T14:33:00.803Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/49b9060e8418b14fb5cba9cf6bfb383111e2538a03a1fb18e66a95aeb3d5/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c", size = 221276, upload-time = "2026-07-07T14:33:02.199Z" }, + { url = "https://files.pythonhosted.org/packages/44/95/80282cce0fae9c3061203d723ee87da996aed79679e65d8935050ee7ca1f/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b", size = 205260, upload-time = "2026-07-07T14:33:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/0c/74/2f62c8821b969ea3bd67cc2e6976834f48ca5d12664d2559ebcd9bcfbed7/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db", size = 217786, upload-time = "2026-07-07T14:33:05.12Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8d/feabb82cb49fcad14515b1d7d1ca4787b0da7fc723a212bf89bc9e0fac52/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993", size = 216798, upload-time = "2026-07-07T14:33:06.629Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ff/c946d63bc3786d5b84d960b0f7ab7e25b828486a946b5aa997625bcaf6a6/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da", size = 206429, upload-time = "2026-07-07T14:33:08.006Z" }, + { url = "https://files.pythonhosted.org/packages/af/ba/5e5007c370702f85d2ef75791fac7943ed41e080364a673b20142e430e3e/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3", size = 223066, upload-time = "2026-07-07T14:33:09.783Z" }, + { url = "https://files.pythonhosted.org/packages/83/d5/9096aa3cf532dfad237861544eb47a0f20d5adbf1039760fed8eaae935d9/charset_normalizer-3.4.9-cp311-cp311-win32.whl", hash = "sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d", size = 150456, upload-time = "2026-07-07T14:33:11.217Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a1/e29995109e455dc8eff8d0fac6ae509be39561318a7cfeac5d33ad029213/charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1", size = 161410, upload-time = "2026-07-07T14:33:12.743Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8d/1569f4d0032d6ba2a4fe4591c35bf87868c600c41a71eb5c2e1ffa8464c2/charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec", size = 152649, upload-time = "2026-07-07T14:33:14.173Z" }, + { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" }, + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" }, + { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-tiktoken" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "tiktoken" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "tiktoken", specifier = "==0.13.0" }, + { name = "wheel" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "regex" +version = "2026.7.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e5/cef4de2bac939280b68d32adc659478845238a8274f2f79c465063f590ad/regex-2026.7.19-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ac777001cdfc28b72477d93c8564bb7583081ea8fb45cdca3d568e0a4f87183c", size = 494012, upload-time = "2026-07-19T00:16:39.927Z" }, + { url = "https://files.pythonhosted.org/packages/ff/87/e86f51eb117457bb7803132ffe5cb6e2841e2b5bea4cc85d397f3c6e257d/regex-2026.7.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:59787bd5f8c70aa339084e961d2996b53fbdeab4d5393bba5c1fe1fc32e02bae", size = 295281, upload-time = "2026-07-19T00:16:41.433Z" }, + { url = "https://files.pythonhosted.org/packages/41/2e/2360c41d8080a3d9ec7e5c90fad6eab3b50192869d10e9a5609e48c8177b/regex-2026.7.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:90c633e7e8d6bf4e992b8b36ce69e018f834b641dd6de8cea6d78c06ffa119c5", size = 290615, upload-time = "2026-07-19T00:16:43.058Z" }, + { url = "https://files.pythonhosted.org/packages/cf/69/b65ba4344efbc771b28fe5dde84cbbb6c8f9551165952fe78def5b9dde6a/regex-2026.7.19-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:87ccab0db8d5f4fbb0272642113c1adb2ffc698c16d3a0944580222331fa7a20", size = 791804, upload-time = "2026-07-19T00:16:44.662Z" }, + { url = "https://files.pythonhosted.org/packages/81/b6/a40dfa0dc6224b36f620c00296eacc830489cbf8c2837b6750dfe6170375/regex-2026.7.19-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e50d748a32da622f256e8d505867f5d3c43a837c6a9f0efb149655fadd1042a", size = 861723, upload-time = "2026-07-19T00:16:46.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/02/735991dee71abd83196a7962f7ed8bf5aa05720ff06e2d3ff896a85e2bbb/regex-2026.7.19-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf1516fe58fc104f39b2d1dbe2d5e27d0cd45c4be2e42ba6ee0cc763701ec3c7", size = 905932, upload-time = "2026-07-19T00:16:47.956Z" }, + { url = "https://files.pythonhosted.org/packages/45/6c/e7098d8b846ccdbf431d8c081b61e496526a27a28094ed09e0dce21b3f54/regex-2026.7.19-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09f3e5287f94f17b709dc9a9e70865855feee835c861613be144218ce4ca82cc", size = 801407, upload-time = "2026-07-19T00:16:49.43Z" }, + { url = "https://files.pythonhosted.org/packages/8a/18/34b69274e2649bcc7d9b089c2b2983fb2632d8ecf667e359593be9072e79/regex-2026.7.19-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6383cd2ed53a646c659ba1fe65727db76437fdaa069e697a0b44a51d5843d864", size = 774448, upload-time = "2026-07-19T00:16:51.352Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e6/0a72247d025585fd3800b98e040b84d562a88af6303347100484849f4f01/regex-2026.7.19-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:09d3007fc76249a83cdd33de160d50e6cb77f54e09d8fa9e7148e10607ce24af", size = 783297, upload-time = "2026-07-19T00:16:53.071Z" }, + { url = "https://files.pythonhosted.org/packages/b1/aa/c4f65ae7dd02a36b323a70c4cff326e1f3442361aaebc9311100a130d54f/regex-2026.7.19-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f8c6e7a1cfa3dc9d0ee2de0e65e834537fa29992cc3976ffec914afc35c5dd5", size = 854736, upload-time = "2026-07-19T00:16:54.607Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/668082bcc817b9e694189b84997aeba7385b7779faa6711788679c482e35/regex-2026.7.19-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b2ea4a3e8357be8849e833beeae757ac3c7a6b3fc055c03c808a53c91ad30d82", size = 763298, upload-time = "2026-07-19T00:16:56.289Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fb/2d07ad555e7af88aa5f867fdafa47a8d945ee237c20af3ebceb46a820835/regex-2026.7.19-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:80115dd39481fd3a4b4080220799dbcacb921a844de4b827264ececacbe17c78", size = 844430, upload-time = "2026-07-19T00:16:57.933Z" }, + { url = "https://files.pythonhosted.org/packages/51/15/c82a471fe3dce56f03745635b43aa456c40dc0db089e07ef148b331507d1/regex-2026.7.19-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6ce43a0269d68cee79a7d1ade7def53c20f8f2a047b92d7b5d5bcc73ae88327", size = 789683, upload-time = "2026-07-19T00:16:59.583Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f4/7532a2c59d56f5398902c20de60f0c9a5d1cd364e42a051b48e1b210be7b/regex-2026.7.19-cp311-cp311-win32.whl", hash = "sha256:9be2a6647740dd3cca6acb24e87f03d7632cd280dbce9bbe40c26353a215a45d", size = 266778, upload-time = "2026-07-19T00:17:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/cf1bc631db154eb95520d9d5dbc2371ff77a0f014bbf7d748fed8496aa63/regex-2026.7.19-cp311-cp311-win_amd64.whl", hash = "sha256:8d3469c91dd92ee41b7c95280edbd975ef1ba9195086686623a1c6e8935ce965", size = 277983, upload-time = "2026-07-19T00:17:02.571Z" }, + { url = "https://files.pythonhosted.org/packages/8d/bd/56ceaf170e875d5a6761bf2bfd0d040f1cacc896850d5e40cb29b11bbd06/regex-2026.7.19-cp311-cp311-win_arm64.whl", hash = "sha256:36aacfb15faaff3ced55afbf35ec72f50d4aee22082c4f7fe0573a33e2fca92e", size = 276961, upload-time = "2026-07-19T00:17:04.135Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b9/d11d7e501ac8fd7d617684423ebb9561e0b998481c1e4cbc0cb212c5d74a/regex-2026.7.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2cc3460cedf7579948486eab03bc9ad7089df4d7281c0f47f4afe03e8d13f02d", size = 496778, upload-time = "2026-07-19T00:17:05.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a9/a5ab6f312f24318019170dc485d5421fe4f89e43a98640da50d95a8a7041/regex-2026.7.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0e9554c8785eac5cffe6300f69a91f58ba72bc88a5f8d661235ad7c6aa5b8ccd", size = 297122, upload-time = "2026-07-19T00:17:07.59Z" }, + { url = "https://files.pythonhosted.org/packages/b3/63/4cab4d7f2d384a144d420b763d97674cb70619c878ea6fcd7640d0e62143/regex-2026.7.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7da47a0f248977f08e2cb659ff3c17ddc13a4d39b3a7baa0a81bf5b415430f6", size = 292009, upload-time = "2026-07-19T00:17:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/102a81b218298957d4ea7d2f084fae537a71add9d6ff93c8e67284c5f45e/regex-2026.7.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93db40c8de0815baab96a06e08a984bac71f989d13bab789e382158c5d426797", size = 796708, upload-time = "2026-07-19T00:17:11.542Z" }, + { url = "https://files.pythonhosted.org/packages/78/b5/dc136af5629938a037cd2b304c12240e132ec92f38be8ff9cc89af2a1f2d/regex-2026.7.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:66bd62c59a5427746e8c44becae1d9b99d22fb13f30f492083dfb9ad7c45cc18", size = 865651, upload-time = "2026-07-19T00:17:13.312Z" }, + { url = "https://files.pythonhosted.org/packages/e0/75/67402ae3cd9c8c988a4c805d15ee3eef015e7ca4cb112cf3e640fc1f4153/regex-2026.7.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1649eb39fcc9ea80c4d2f110fde2b8ab2aef3877b98f02ab9b14e961f418c511", size = 911756, upload-time = "2026-07-19T00:17:15.015Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8e/096d00c7c480ef2ff4265349b14e2261d4ab787ba1f74e2e80d1c58079c3/regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dce8ec9695f531a1b8a6f314fd4b393adcccf2ea861db480cdf97a301d01a68", size = 801798, upload-time = "2026-07-19T00:17:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/41/e7ecac6edb5722417f85cc67eaf386322fbe8acf6918ec2fdc37c20dd9d0/regex-2026.7.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3080a7fd38ef049bd489e01c970c97dd84ff446a885b0f1f6b26d9b1ad13ce11", size = 776933, upload-time = "2026-07-19T00:17:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/6f/69/03c9b3f058d66403e0ca2c938696e81d51cd4c6d47ec5265f02f96948d9a/regex-2026.7.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d793a7988e04fcb1e2e135567443d82173225d657419ec09414a9b5a145b986", size = 784338, upload-time = "2026-07-19T00:17:21.057Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f7/b38ab3d43f284afbb618fcd15d0e77eb786ae461ce1f6bc7494619ddc0f2/regex-2026.7.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e8b0abe7d870f53ca5143895fef7d1041a0c831a140d3dc2c760dd7ba25d4a8b", size = 860452, upload-time = "2026-07-19T00:17:23.119Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/ff60ef0571121714f3cf9920bc183071e384a10b556d042e0fdb06cc07a5/regex-2026.7.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4e5413bd5f13d3a4e3539ca98f70f75e7fca92518dd7f117f030ebedd10b60cb", size = 765958, upload-time = "2026-07-19T00:17:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0f/bd34021162c0ab47f9a315bd56cd5642e920c8e5668a75ef6c6a6fca590d/regex-2026.7.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:73b133a9e6fb512858e7f065e96f1180aa46646bc74a83aea62f1d314f3dd035", size = 851765, upload-time = "2026-07-19T00:17:26.993Z" }, + { url = "https://files.pythonhosted.org/packages/2a/20/a2ca43edade0595cccfdc98636739f536d9e26898e7dbddc2b9e98898953/regex-2026.7.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbe6493fbd27321b1d1f2dd4f5c7e5bd4d8b1d7cab7f32fd67db3d0b2ed8248a", size = 789714, upload-time = "2026-07-19T00:17:28.699Z" }, + { url = "https://files.pythonhosted.org/packages/5d/47/e02db4015d424fc83c00ea0ac8c5e5ec14397943de9abf909d5ce3a25931/regex-2026.7.19-cp312-cp312-win32.whl", hash = "sha256:ddd67571c10869f65a5d7dde536d1e066e306cc90de57d7de4d5f34802428bb5", size = 267157, upload-time = "2026-07-19T00:17:31.051Z" }, + { url = "https://files.pythonhosted.org/packages/08/8e/c780c131f79b42ed22d1bd7da4096c2c35f813e835acd02ef0f018bd892c/regex-2026.7.19-cp312-cp312-win_amd64.whl", hash = "sha256:e30d40268a28d54ce0437031750497004c22602b8e3ab891f759b795a003b312", size = 277777, upload-time = "2026-07-19T00:17:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3d/84165e4299ff76f3a40fe1f2abf939e976f693383a08d2beea6af62bd2c1/regex-2026.7.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f035d9dc1d25eff9d361456572231c7d27b5ccd473ca7dc0adfce732bd006d40", size = 496552, upload-time = "2026-07-19T00:17:36.808Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/a65293e6e4cf28eb7ee1be5335a5386c40d6742e9f47fafc8fec785e16c7/regex-2026.7.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42572142ed0b9d5d261ba727157c426510da78e20828b66bbb855098b8a4e38", size = 296983, upload-time = "2026-07-19T00:17:38.816Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/2d0564e93d87bc48618360ddca232a2ca612bbdf53ce8465d45ca5ce14ee/regex-2026.7.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40b34dd88658e4fedd2fddbf0275ac970d00614b731357f425722a3ed1983d11", size = 291832, upload-time = "2026-07-19T00:17:40.726Z" }, + { url = "https://files.pythonhosted.org/packages/07/cd/42dfbabff3dfc9603c501c0e2e2c5adbb09d127b267bf5348de0af338c15/regex-2026.7.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c41c63992bf1874cebb6e7f56fd7d3c007924659a604ae3d90e427d40d4fd13", size = 796775, upload-time = "2026-07-19T00:17:42.382Z" }, + { url = "https://files.pythonhosted.org/packages/df/5d/f6a4839f2b934e3eed5973fd07f5929ee97d4c98939fb275ea23c274ee16/regex-2026.7.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d3372064506b94dd2c67c845f2db8062e9e9ba84d04e33cb96d7d33c11fe1ae", size = 865687, upload-time = "2026-07-19T00:17:44.185Z" }, + { url = "https://files.pythonhosted.org/packages/14/b0/b47d6c36049bc59806a50bd4c86ced70bbe058d787f80281b1d7a9b0e024/regex-2026.7.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fce7760bf283405b2c7999cab3da4e72f7deca6396013115e3f7a955db9760da", size = 911962, upload-time = "2026-07-19T00:17:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/2a/be/ff61f28f9273658cfe23acbbac5217221f6519960ed401e61dfdab12bc35/regex-2026.7.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0d702548d89d572b2929879bc883bb7a4c4709efafe4512cadee56c55c9bd15", size = 801817, upload-time = "2026-07-19T00:17:48.25Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bb/8b4f7f26b333f9f79e1b453613c39bb4776f51d38ae66dd0ba31d6b354ca/regex-2026.7.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d446c6ac40bb6e05025ccee55b84d80fe9bf8e93010ffc4bb9484f13d498835f", size = 776908, upload-time = "2026-07-19T00:17:50.183Z" }, + { url = "https://files.pythonhosted.org/packages/09/13/610110fc5921d380516d03c26b652555f08aa0d23ea78a771231873c3638/regex-2026.7.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c3501bfa814ab07b5580741f9bf78dfdfe146a04057f82df9e2402d2a975939", size = 784426, upload-time = "2026-07-19T00:17:52.454Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f5/1ef9e2a83a5947c57ebff0b377cb5727c3d5ec1992317a320d035cd0dbb6/regex-2026.7.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c4585c3e64b4f9e583b4d2683f18f5d5d872b3d71dcf24594b74ecc23602fa96", size = 860600, upload-time = "2026-07-19T00:17:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/a0/02/073af33a3ec149241d11c80acea91e722aa0adbf05addd50f251c4fe89c3/regex-2026.7.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:571fde9741eb0ccde23dd4e0c1d50fbae910e901fa7e629faf39b2dda740d220", size = 765950, upload-time = "2026-07-19T00:17:56.041Z" }, + { url = "https://files.pythonhosted.org/packages/81/a9/d1e9f819dc394a568ef370cd56cf25394e957a2235f8370f23b576e5a475/regex-2026.7.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:15b364b9b98d6d2fe1a85034c23a3180ff913f46caddc3895f6fd65186255ccc", size = 851794, upload-time = "2026-07-19T00:17:57.897Z" }, + { url = "https://files.pythonhosted.org/packages/03/3a/8ae83eda7579feacdf984e71fb9e70635fb6f832eeddca58427ec4fca926/regex-2026.7.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffd8893ccc1c2fce6e0d6ca402d716fe1b29db70c7132609a05955e31b2aa8f2", size = 789845, upload-time = "2026-07-19T00:17:59.97Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/c195cbfe5a75fdec64d8f6554fd15237b837919d2c61bdc141d7c807b08b/regex-2026.7.19-cp313-cp313-win32.whl", hash = "sha256:f0fa4fa9c3632d708742baf2282f2055c11d888a790362670a403cbf48a2c404", size = 267135, upload-time = "2026-07-19T00:18:01.958Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/a11de8404b7272b70acb45c1c05987cce60b45d5693da2e176f0e390d564/regex-2026.7.19-cp313-cp313-win_amd64.whl", hash = "sha256:d51ffd3427640fa2da6ade574ceba932f210ad095f65fcc450a2b0a0d454868e", size = 277747, upload-time = "2026-07-19T00:18:04.121Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/0f5c8eff1b4f1f3d83276d365fccecf666afcc7d947420943bf394d07adb/regex-2026.7.19-cp313-cp313-win_arm64.whl", hash = "sha256:c670fe7be5b6020b76bc6e8d2196074657e1327595bca93a389e1a76ab130ad8", size = 277129, upload-time = "2026-07-19T00:18:05.821Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4c/44b74742052cedda40f9ae469532a037112f7311a36669a891fba8984bb0/regex-2026.7.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db47b561c9afd884baa1f96f797c9ca369872c4b65912bc691cfa99e68340af2", size = 501134, upload-time = "2026-07-19T00:18:07.567Z" }, + { url = "https://files.pythonhosted.org/packages/f0/45/bbd038b5e39ee5613a5a689290145b40058cc152c41de9cc23639d2b9734/regex-2026.7.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65dcd28d3eba2ab7c2fd906485cc301392b47cc2234790d27d4e4814e02cdfda", size = 299418, upload-time = "2026-07-19T00:18:09.38Z" }, + { url = "https://files.pythonhosted.org/packages/65/38/c5bde94b4cedfd5850d64c3f08222d8e1600e84f6ee71d9b44b4b8163f74/regex-2026.7.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f2e7f8e2ab6c2922be02c7ec45185aa5bd771e2e57b95455ee343a44d8130dff", size = 294486, upload-time = "2026-07-19T00:18:11.188Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6a/2f5e107cb26c960b781967178899daf2787a7ab151844ed3c01d6fc95474/regex-2026.7.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe31f28c94402043161876a258a9c6f757cb485905c7614ce8d6cd40e6b7bdc1", size = 811643, upload-time = "2026-07-19T00:18:12.975Z" }, + { url = "https://files.pythonhosted.org/packages/37/d4/a2f963406d7d73a62eed84ba05a258afb6cad1b21aa4517443ce40506b78/regex-2026.7.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f8f6fa298bb4f7f58a33334406218ba74716e68feddf5e4e54cd5d8082705abf", size = 871081, upload-time = "2026-07-19T00:18:14.733Z" }, + { url = "https://files.pythonhosted.org/packages/45/a3/44be546340bedb15f13063f5e7fe16793ea4d9ea2e805d09bd174ac27724/regex-2026.7.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cc1b2440423a851fad781309dd87843868f4f66a6bcd1ddb9225cf4ec2c84732", size = 917372, upload-time = "2026-07-19T00:18:16.724Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f6/e0870b0fd2a40dba0074e4b76e514b21313d37946c9248453e34ec43923e/regex-2026.7.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ac59a0900474a52b7c04af8196affc22bd9842acb0950df12f7b813e983609a", size = 816089, upload-time = "2026-07-19T00:18:18.617Z" }, + { url = "https://files.pythonhosted.org/packages/ae/27/957e8e22690ad6634572b39b71f130a6105f4d0718bb16849eac00fff147/regex-2026.7.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4896db1f4ce0576765b8272aa922df324e0f5b9bb2c3d03044ff32a7234a9aba", size = 785206, upload-time = "2026-07-19T00:18:20.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/a4/186e410941e731037c01166069ab86da9f65e8f8110c18009ccf4bd623ee/regex-2026.7.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4e6883a021db30511d9fb8cfb0f222ce1f2c369f7d4d8b0448f449a93ba0bdfc", size = 800431, upload-time = "2026-07-19T00:18:22.716Z" }, + { url = "https://files.pythonhosted.org/packages/73/9f/e4e10e023d291d64a33e246610b724493bf1ce98e0e59c9b7c837e5acfb7/regex-2026.7.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:09523a592938aa9f587fb74467c63ff0cf88fc3df14c82ab0f0517dcf76aaa62", size = 864906, upload-time = "2026-07-19T00:18:24.772Z" }, + { url = "https://files.pythonhosted.org/packages/24/57/ccb20b6be5f1f52a053d1ba2a8f7a077edb9d918248b8490d7506c6832b3/regex-2026.7.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1ebac3474b8589fce2f9b225b650afd61448f7c73a5d0255a10cc6366471aed1", size = 773559, upload-time = "2026-07-19T00:18:27.008Z" }, + { url = "https://files.pythonhosted.org/packages/a3/82/f3b263cf8fad927dc102891da8502e718b7ff9d19af7a2a07c03865d7188/regex-2026.7.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4a0530bb1b8c1c985e7e2122e2b4d3aedd8a3c21c6bfddae6767c4405668b56e", size = 857739, upload-time = "2026-07-19T00:18:29.107Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/1687bd1b6c2aed5e672ccf845fc11557821fe7366d921b50889ea5ce57bf/regex-2026.7.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef7eeb108c47ce7bcc9513e51bcb1bf57e8f483d52fce68a8642e3527141ae0", size = 804522, upload-time = "2026-07-19T00:18:31.362Z" }, + { url = "https://files.pythonhosted.org/packages/76/7c/cc4e7655181b2d9235b704f2c5e19d8eff002bbc437bae59baee0e381aca/regex-2026.7.19-cp313-cp313t-win32.whl", hash = "sha256:64b6ca7391a1395c2638dd5c7456d67bea44fc6c5e8e92c5dc8aa6a8f23292b4", size = 269141, upload-time = "2026-07-19T00:18:33.479Z" }, + { url = "https://files.pythonhosted.org/packages/bb/14/961b4c7b05a2391c32dbc85e27773076671ef8f97f36cec70fe414734c02/regex-2026.7.19-cp313-cp313t-win_amd64.whl", hash = "sha256:f04b9f56b0e0614c0126be12c2c2d9f8850c1e57af302bd0a63bed379d4af974", size = 280036, upload-time = "2026-07-19T00:18:35.419Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/795644550d788ddbb6dc458c95895f8009978ea6d6ea76b005eb3f45e8c9/regex-2026.7.19-cp313-cp313t-win_arm64.whl", hash = "sha256:fcee38cd8e5089d6d4f048ba1233b3ad76e5954f545382180889112ff5cb712d", size = 279394, upload-time = "2026-07-19T00:18:37.454Z" }, + { url = "https://files.pythonhosted.org/packages/d2/25/0c4c452f8ef3efe456745b2f33195f5904b573fb4c2ff3f0cb9ec188461e/regex-2026.7.19-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a81758ed242b861b72e778ba34d41366441a2e10b16b472784c88da2dea7e2dd", size = 496750, upload-time = "2026-07-19T00:18:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/24/9e/b70ca6c1704f6c7cd32a9e143c86cc5968d10981eca284bad670c245ea7d/regex-2026.7.19-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4aa5435cdb3eb6f55fe98a171b05e3fbcd95fadaa4aa32acf62afd9b0cfdbcac", size = 297093, upload-time = "2026-07-19T00:18:41.583Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/0b692da2520d51fbff19c88b83d97e4c702909dd02386c585998b7e2dbed/regex-2026.7.19-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:60be8693a1dadc210bbcbc0db3e26da5f7d01d1d5a3da594e99b4fa42df404f5", size = 292043, upload-time = "2026-07-19T00:18:43.347Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a7/1d478e614016045a33feae57446215f9fd65b665a5ceb2f891fb3183bc52/regex-2026.7.19-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d19662dbedbe783d323196312d38f5ba53cf56296378252171985da6899887d3", size = 797214, upload-time = "2026-07-19T00:18:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ae/11b9c9411d92c30e3d2db32df5a31133e4a99a8fc397a604fd08f6c4bffb/regex-2026.7.19-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d15df07081d91b76ff20d43f94592ee110330152d617b730fdbe5ef9fb680053", size = 866433, upload-time = "2026-07-19T00:18:47.315Z" }, + { url = "https://files.pythonhosted.org/packages/b1/62/2b2efc4992f91d6d204b24c647c9f9412e85379d92b7c0ab9fdae622327e/regex-2026.7.19-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:56ad4d9f77df871a99e25c37091052a02528ec0eb059de928ee33956b854b45b", size = 911360, upload-time = "2026-07-19T00:18:49.588Z" }, + { url = "https://files.pythonhosted.org/packages/14/71/986ceea9aa3da548bf1357cad89b63915ec6d21ec957c8113b29ece567df/regex-2026.7.19-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7322ec6cc9fba9d49ab888bb82d67ac5625627aa168f0165139b17018df3fb8a", size = 801275, upload-time = "2026-07-19T00:18:51.767Z" }, + { url = "https://files.pythonhosted.org/packages/15/be/ce9d9534b2cda96eab32c548261224b9b4e220a4126f098f60f42ae7b4cd/regex-2026.7.19-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9c7472192ebfad53a6be7c4a8bfb2d64b81c0e93a1fc8c57e1dd0b638297b5d1", size = 777131, upload-time = "2026-07-19T00:18:54.053Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/58b5c710f2c3929515a25f3a1ca0dad0dcd4518d4fff3cf23bc7adb8dcd2/regex-2026.7.19-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c10b82c2634df08dfb13b1f04e38fe310d086ee092f4f69c0c8da234251e556e", size = 785020, upload-time = "2026-07-19T00:18:56.579Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/5fe091935b74f15fe0f97998c215cae418d1c0413f6258c7d4d2e83aa37f/regex-2026.7.19-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:17ed5692f6acc4183e98331101a5f9e4f64d72fe58b753da4d444a2c77d05b12", size = 861263, upload-time = "2026-07-19T00:18:58.64Z" }, + { url = "https://files.pythonhosted.org/packages/d8/fa/d60bf82e10841eef62a9e32aac401468f05fddfbcb2942e342b1ba3d2433/regex-2026.7.19-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:22a992de9a0d91bda927bf02b94351d737a0302905432c88a53de7c4b9ce62e2", size = 766199, upload-time = "2026-07-19T00:19:00.705Z" }, + { url = "https://files.pythonhosted.org/packages/bf/5d/11e64d151b0662b81d6bf644c74dc118d461df85bdf2577fadbbf751788a/regex-2026.7.19-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:618a0aed532be87294c4477b0481f3aa0f1520f4014a4374dd4cf789b4cd2c97", size = 851317, upload-time = "2026-07-19T00:19:03.015Z" }, + { url = "https://files.pythonhosted.org/packages/7c/34/532efb87488d90807bae6a443d357ee5e2728a478c597619c8aaa17cc0bd/regex-2026.7.19-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ce9e679f776649746729b6c86382da519ef649c8e34cc41df0d2e5e0f6c36d4", size = 789557, upload-time = "2026-07-19T00:19:05.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/90/3a8d5ca977171ec3ae21a71207d2228b2663bde14d7f7ef0e6363ecf9290/regex-2026.7.19-cp314-cp314-win32.whl", hash = "sha256:73f272fba87b8ccfe70a137d02a54af386f6d27aa509fbffdd978f5947aae1aa", size = 272531, upload-time = "2026-07-19T00:19:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/96/e1/8862885e70409de70e8c005f57fb2e7be8d9ef0317250d60f4c9660a300d/regex-2026.7.19-cp314-cp314-win_amd64.whl", hash = "sha256:d721e53758b2cca74990185eb0671dd466d7a388a1a45d0c6f4c13cef41a68ac", size = 280831, upload-time = "2026-07-19T00:19:09.46Z" }, + { url = "https://files.pythonhosted.org/packages/08/82/2693e53e29f9104d9de95d37ce4dd826bd32d5f9c0085d3aa6ac042675c4/regex-2026.7.19-cp314-cp314-win_arm64.whl", hash = "sha256:65fa6cb38ed5e9c3637e68e544f598b39c3b86b808ed0627a67b68320384b459", size = 281099, upload-time = "2026-07-19T00:19:11.398Z" }, + { url = "https://files.pythonhosted.org/packages/92/b7/9a01aa16461a18cde9d7b9c3ab21e501db2ce33725f53014342b91df2b0a/regex-2026.7.19-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:5a2721c8720e2cb3c209925dfb9200199b4b07361c9e01d321719404b21458b3", size = 501121, upload-time = "2026-07-19T00:19:13.425Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/bbaeca815dc9191c424c94a4fdc5c87c75748a64a6271821212ebdd4e1a3/regex-2026.7.19-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:199535629f25caf89698039af3d1ad5fcae7f933e2112c73f1cdf49165c99518", size = 299415, upload-time = "2026-07-19T00:19:15.43Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d6/0dd1a321afaab95eb7ff44aa0f637301786f1dc71c6b797b9ed236ed8890/regex-2026.7.19-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9b60d7814174f059e5de4ab98271cc5ba9259cfea55273a81544dceea32dc8d9", size = 294483, upload-time = "2026-07-19T00:19:17.879Z" }, + { url = "https://files.pythonhosted.org/packages/92/5f/40bacf91d0904f812e13bbbab3864604c463eced8afdc54aeaa50492ea95/regex-2026.7.19-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbece16025afda5e3031af0c4059207e61dcf73ef13af844964f57f387d1c435", size = 811833, upload-time = "2026-07-19T00:19:20.102Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/4902744261f775aeede8b5627314b38482da29cf49a57b66a6fb753246c5/regex-2026.7.19-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d24ecb4f5e009ea0bd275ee37ad9953b32005e2e5e60f8bbae16da0dbbf0d3a0", size = 871270, upload-time = "2026-07-19T00:19:22.365Z" }, + { url = "https://files.pythonhosted.org/packages/16/70/6980c9be6bf21c0a60ed3e0aea39cf419ecf3b08d1d9947bc56e196ef186/regex-2026.7.19-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8cae6fd77a5b72dae505084b1a2ee0360139faf72fedbab667cd7cc65aae7a6a", size = 917534, upload-time = "2026-07-19T00:19:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/52/92/8b2bd872782ce8c42691e39acb38eb8efe014e5ddb78ad7d943d6f197ce9/regex-2026.7.19-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9724e6cb5e478cd7d8cabf027826178739cb18cf0e117d0e32814d479fa02276", size = 816135, upload-time = "2026-07-19T00:19:26.919Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/33a602f657bdc4041f17d79f92ab18261d255d91a06117a6e29df023e5e2/regex-2026.7.19-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:572fc57b0009c735ee56c175ea021b637a15551a312f56734277f923d6fd0f6c", size = 785492, upload-time = "2026-07-19T00:19:29.192Z" }, + { url = "https://files.pythonhosted.org/packages/9e/36/0987cf4cb271680064a70d24a475873775a151d0b7058698a006cb0cae4a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:20568e182eb82d39a6bf7cff3fd58566f14c75c6f74b2c8c96537eecf9010e3a", size = 800658, upload-time = "2026-07-19T00:19:31.392Z" }, + { url = "https://files.pythonhosted.org/packages/a8/24/c14f31c135e1ba55fa4f9a58ca98d0842512bf6188230763c31c8f449e3b/regex-2026.7.19-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:1d58561843f0ff7dc78b4c28b5e2dc388f3eff94ebc8a232a3adba961fc00009", size = 865073, upload-time = "2026-07-19T00:19:33.485Z" }, + { url = "https://files.pythonhosted.org/packages/14/85/181a12211f22469f24d2de1ebddfe397d2396e2c29013b9a58134a91069a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:61bb1bd45520aacd56dd80943bd34991fb5350afdd1f36f2282230fd5154a218", size = 773684, upload-time = "2026-07-19T00:19:35.599Z" }, + { url = "https://files.pythonhosted.org/packages/23/58/bd1a0c1a62251366f8d21f41b1ea3c76994962071b8b6ea42f72d505c0f0/regex-2026.7.19-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:cd3584591ea4429026cdb931b054342c2bcf189b44ff367f8d5c15bc092a2966", size = 857769, upload-time = "2026-07-19T00:19:37.738Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4f/f7e2dad6756b2fe1fe75dd90a628c3b45f249d39f948dd90cd2476325417/regex-2026.7.19-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cc26a66e212fa5d6c6170c3a40d99d888db3020c6fdab1523250d4341382e44", size = 804546, upload-time = "2026-07-19T00:19:40.229Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d7/01d31d5bdb09bc026fab77f59a371fdf8f9b292e4810546c56182ca70498/regex-2026.7.19-cp314-cp314t-win32.whl", hash = "sha256:2c4e61e2e1be56f63ec3cc618aa9e0de81ef6f43d177205451840022e24f5b78", size = 274526, upload-time = "2026-07-19T00:19:42.398Z" }, + { url = "https://files.pythonhosted.org/packages/52/0e/cea4ce73bc0a8247a0748228ae6669984c7e1f8134b6fa66e59c0572e0ea/regex-2026.7.19-cp314-cp314t-win_amd64.whl", hash = "sha256:c639ea314df70a7b2811e8020448c75af8c9445f5a60f8a4ced81c306a9380c2", size = 283763, upload-time = "2026-07-19T00:19:44.644Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b6/26e41975febae63b7a6e3e02f32cff6cff2e4f10d19c929082f56aebf7c6/regex-2026.7.19-cp314-cp314t-win_arm64.whl", hash = "sha256:9a15e785f244f3e07847b984ce8773fc3da10a9f3c131cc49a4c5b4d672b4547", size = 283451, upload-time = "2026-07-19T00:19:46.639Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "setuptools-rust" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "semantic-version" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/ba/b31781d61bf9ee3c232a1d1160db11c11cdeae1d44e06c90723b25a8279f/setuptools_rust-1.13.0.tar.gz", hash = "sha256:f2afcf4baeee689910ce49cfa8aad4e08cce72f417449bcc32891b8664fdc726", size = 314100, upload-time = "2026-06-27T21:45:02.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/80/909e46e684e47b116ed145bf2a1a8f5f7c9d90e8c3f8f7fce6a529c0068d/setuptools_rust-1.13.0-py3-none-any.whl", hash = "sha256:666439c4d90e968bb625bcf87ec0aa02b4f49e599d2f5dc255c633a04e8eca99", size = 30536, upload-time = "2026-06-27T21:45:01.583Z" }, +] + +[[package]] +name = "tiktoken" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/4c/1bc81f4cd53e827c4ee67ca951b5935724716049452d8dfa09b8b82372bb/tiktoken-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7bfe1849caa65d1e1d9871817170ec497bbb7984e182012e1bdce72f66608cdb", size = 1036353, upload-time = "2026-05-15T04:50:21.757Z" }, + { url = "https://files.pythonhosted.org/packages/75/91/10b9c7076bc02c246c853201fdbbe300a4b8c5ed7b84c25f7403f4e32655/tiktoken-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26", size = 984644, upload-time = "2026-05-15T04:50:23.256Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e4/fceae98015fab47fcd49b8bd7f46145bcd187a47e0add1e5378ed67ef980/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4", size = 1119261, upload-time = "2026-05-15T04:50:24.348Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/fe42ad00de01a8c4a49ad8649a2c8a316835a9cad5961b11d21eac0020a5/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173", size = 1138253, upload-time = "2026-05-15T04:50:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/ccee1ecccca107e9a16efcecdeeb964c325305038554d466ece65b42338f/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff", size = 1185747, upload-time = "2026-05-15T04:50:27.02Z" }, + { url = "https://files.pythonhosted.org/packages/9d/03/cd0cba295522b91eb55c6b2704f1df895f8226cfe60ab10d4d51d0cc9e69/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed", size = 1241265, upload-time = "2026-05-15T04:50:28.815Z" }, + { url = "https://files.pythonhosted.org/packages/7e/25/a10efd564402d82c2ff50d12057353ace447aa8007deceaa48641f63d35c/tiktoken-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc1c44cd37b43fc46bae593129164f4f281e82ea116b57a85aa81bda57eafc94", size = 876509, upload-time = "2026-05-15T04:50:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/85/8e/144bde4e01df66b34bb865557c7cd754ed08b036217ebd79c9db5e9048a9/tiktoken-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:32ac870a806cfb260a02d0cb70426aef02e038297f8ad50df5040bb5af360791", size = 1034888, upload-time = "2026-05-15T04:50:31.579Z" }, + { url = "https://files.pythonhosted.org/packages/36/18/d4ac9d20956cdebca04841316660ed584c2fecdc2b81722a28bc7ad3b1e4/tiktoken-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b", size = 982970, upload-time = "2026-05-15T04:50:32.961Z" }, + { url = "https://files.pythonhosted.org/packages/74/ed/6bb8d05b9f731f749fee5c6f5ca63e981143c826a5985877330507bd13b7/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7", size = 1115741, upload-time = "2026-05-15T04:50:34.475Z" }, + { url = "https://files.pythonhosted.org/packages/34/de/2ca96b07a82d972b74fe4b46de055b79c904e45c7eab699354a0bfa697dc/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649", size = 1136523, upload-time = "2026-05-15T04:50:35.782Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/9dafec002c2d4424378563cf4cf5c7fb93631d2a55013c8b87554ee4012c/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b", size = 1181954, upload-time = "2026-05-15T04:50:36.99Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d0/1f8578c45b2f24759b46f0b50d31878c63c73e6bf0f2227e10ec5c5408dc/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91", size = 1240069, upload-time = "2026-05-15T04:50:38.221Z" }, + { url = "https://files.pythonhosted.org/packages/aa/90/28d7f154888610aa9237e541986beb62b479df29d193a5a0617dbb1514d0/tiktoken-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f2d16e7a7c783ad81f36e457d046d1f1c8af70b22aec8a13238efe531977c41", size = 874748, upload-time = "2026-05-15T04:50:39.587Z" }, + { url = "https://files.pythonhosted.org/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228, upload-time = "2026-05-15T04:50:40.988Z" }, + { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978, upload-time = "2026-05-15T04:50:42.195Z" }, + { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355, upload-time = "2026-05-15T04:50:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772, upload-time = "2026-05-15T04:50:44.782Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415, upload-time = "2026-05-15T04:50:46.422Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879, upload-time = "2026-05-15T04:50:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829, upload-time = "2026-05-15T04:50:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600, upload-time = "2026-05-15T04:50:50.4Z" }, + { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516, upload-time = "2026-05-15T04:50:52.03Z" }, + { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518, upload-time = "2026-05-15T04:50:53.543Z" }, + { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867, upload-time = "2026-05-15T04:50:55.191Z" }, + { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826, upload-time = "2026-05-15T04:50:56.296Z" }, + { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, + { url = "https://files.pythonhosted.org/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820, upload-time = "2026-05-15T04:50:59.528Z" }, + { url = "https://files.pythonhosted.org/packages/8c/93/0dd6adca026a616c3a92974566b43381eea4b475ce1f36c062b8271a9ac5/tiktoken-0.13.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaaaef47c2406277181d2086484c317bf7fc433e2d5d03ff94f56b0dcec87471", size = 1034977, upload-time = "2026-05-15T04:51:00.957Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5ec6e6bc5b30bed6d93f7f2162d8f6b32437b3ba27cb527cfe004f6109c9/tiktoken-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ca8b310bd93b3772cb1b7922d915446864860f562bdfe4825c63a0aed3fb28cd", size = 983635, upload-time = "2026-05-15T04:51:02.629Z" }, + { url = "https://files.pythonhosted.org/packages/94/b0/c8ae9aff00d625c50659b4513e707a0462c4bf5d4d6cc1b802103225c02e/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:32e0c12305105002c047b3bb1070b0dd9a73b0cb3b2856a8972b810e7a4f5881", size = 1116036, upload-time = "2026-05-15T04:51:04.082Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ac/6a5dddd1d0a6018ecb389bd0353e6b4a515eb4d2286611bd0ace1937b9e1/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:5ba5fd62507a932d1241346179e3b39bc7bf7408f03c272652d93b3bedf5db24", size = 1135544, upload-time = "2026-05-15T04:51:05.229Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b8/585032b4384b2f7dcdaddcb52865c83a701a420d09e3c2b4a2be1c450c57/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d108bc2d470fc53c8ecd24f2c0fd2b5f98c33e87cdb6aa2e9b8c5dced703d273", size = 1182217, upload-time = "2026-05-15T04:51:06.517Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b6/993ff1ded3958215fd341a847b8e5ffeb5de473f435296870d314fc91ac4/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb99cb5127449f58d0a2d5f5ccfb390d8dbdfd919c221246caaee29d8725ed51", size = 1239404, upload-time = "2026-05-15T04:51:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3d/fef7e06e3b33e7538db0ced734cf9fe23b6832d2ac4990c119c377aec55e/tiktoken-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:115c4f26ffa11caac8b54eea35c2ad38c612c20a48d35dd15d70a02ac6f51f58", size = 918686, upload-time = "2026-05-15T04:51:08.925Z" }, + { url = "https://files.pythonhosted.org/packages/c1/82/a7fc44582bc32ab00de988a2299bf77c077f59068b233109e34b7d6ca7e6/tiktoken-0.13.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:472527e9132952f2fbf77cd290658bacf003d4d5a3fabc18e5fbd407cbae4d9b", size = 1034454, upload-time = "2026-05-15T04:51:10.035Z" }, + { url = "https://files.pythonhosted.org/packages/37/d0/24d8a890c14f432a05cea669c17bebeaa99f96a7c79523b590f564246411/tiktoken-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e2f67d27c9626cdd25fe33d9313c5cdb3d8d82da646b68d6eb8e7e9c20e6448", size = 982976, upload-time = "2026-05-15T04:51:11.23Z" }, + { url = "https://files.pythonhosted.org/packages/49/b7/2ab43f62788a9266187a9bfc1d3af99ad83e5eaa25fbef168a69cd5ad14f/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2b920b35805cd64585a37c3dc7ce65fba4d2d36016be01e1d7942482ca29093a", size = 1115526, upload-time = "2026-05-15T04:51:12.608Z" }, + { url = "https://files.pythonhosted.org/packages/64/39/1494321ed323ce7a14d88e3cd6cb9058625977df1c6961ddc492bd10a9f3/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:493af3aa28a4aaf2e3d2600a2ee717252c9bf5ab38fff94eb5a02db5ab77e5ad", size = 1136466, upload-time = "2026-05-15T04:51:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/96/d9/dfd086aa2d918c563a140720e0ce296cada1634efd2783d5cf51e05f984e/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6644c9c2b5cf3916f5a3641d7d12fdb3f006a7b3d9ff6acdaec44e29ab1ff91e", size = 1181863, upload-time = "2026-05-15T04:51:15.025Z" }, + { url = "https://files.pythonhosted.org/packages/2f/68/a18b4f307086954fdae32714cb4f85562e34f9d34ab206e61f1816aa6018/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cb65b60b9408563676d874a3a4ee573370066f0dc4e29d84e82e989c6517424", size = 1239218, upload-time = "2026-05-15T04:51:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/16/5b/f2aa703a4fc5d2dff73460a7d46cc2f3f44aa0f3dd8eeb20d2a0ecf68862/tiktoken-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:85b78cc3a2c3d48723ca751fa981f1fedccd54194ca0471b957364353a898b07", size = 918110, upload-time = "2026-05-15T04:51:17.237Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "wheel" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, +] diff --git a/e2e/crossbuild/tools/BUILD.bazel b/e2e/crossbuild/tools/BUILD.bazel index 987e249f0..6c332822a 100644 --- a/e2e/crossbuild/tools/BUILD.bazel +++ b/e2e/crossbuild/tools/BUILD.bazel @@ -1,17 +1,62 @@ -# Shared helpers consumed by //... via load("//tools:..."). +# Shared helpers consumed via load("//tools:..."). -load("@aspect_rules_py//py:defs.bzl", "py_binary") +load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") +load("@rules_shell//shell:sh_test.bzl", "sh_test") +load(":ant_layer.bzl", "ant_home") +load(":rust_layer.bzl", "rust_pinned_sysroot") +load(":toolchain_test.bzl", "exec_python_path") -# Consumed cross-package by the `collect_wheels` macro (//tools:collect_wheels.bzl), -# which declares a py_test with this script as `main` in the caller's package. exports_files([ - "check_wheel_native.py", - "check_wheel_tags.py", + "assert_absent.py", + "check_so_arch.sh", + "check_so_suffix.sh", ]) -py_binary( - name = "collect_wheels_tool", - srcs = ["collect_wheels.py"], - main = "collect_wheels.py", +# The exec-platform (x86_64) rust_toolchain's sysroot, pinned by label so it's +# available even when the rest of the build is transitioned to arm64 — see +# rust_layer.bzl for why current_rust_toolchain alone isn't enough. +rust_pinned_sysroot( + name = "rust_host_sysroot", + # rust_linux_x86_64__x86_64-unknown-linux-gnu__stable (in @rust_toolchains) + # is the toolchain() *resolution* wrapper; the actual rust_toolchain rule + # instance (the one with ToolchainInfo/TemplateVariableInfo) is this repo. + actual = "@@rules_rust++rust+rust_linux_x86_64__x86_64-unknown-linux-gnu__stable_tools//:rust_toolchain", visibility = ["//visibility:public"], ) + +# Ant is architecture-independent (bytecode + launcher scripts), so unlike +# the Rust sysroot there's no cross/native split — one $(ANT_HOME) covers +# both. +ant_home( + name = "ant_home", + all_files = "@apache_ant//:all_files", + ant_bin = "@apache_ant//:bin/ant", + visibility = ["//visibility:public"], +) + +# EXEC_TOOLS_TOOLCHAIN must resolve the exec-platform Python interpreter even +# when the target is arm64 — unpack.py runs on the exec side. Doesn't depend +# on any case's binary; the mechanism it checks is shared by all of them. +exec_python_path( + name = "unpack_path", +) + +exec_python_path( + name = "unpack_path_for_arm64", +) + +platform_transition_filegroup( + name = "unpack_path_for_arm64_transition", + srcs = [":unpack_path_for_arm64"], + target_platform = "//:arm64_linux", +) + +sh_test( + name = "exec_toolchain_resolution_test", + srcs = ["test_exec_toolchain.sh"], + data = [ + ":unpack_path", + ":unpack_path_for_arm64_transition", + ], + target_compatible_with = ["@platforms//os:linux"], +) diff --git a/e2e/crossbuild/tools/ant_layer.bzl b/e2e/crossbuild/tools/ant_layer.bzl new file mode 100644 index 000000000..e35005451 --- /dev/null +++ b/e2e/crossbuild/tools/ant_layer.bzl @@ -0,0 +1,33 @@ +"""Exposes a vendored Apache Ant install's bin/ dir as a Make variable. + +Ant is plain Java bytecode plus shell/bat launcher scripts — architecture +independent, so unlike the Rust toolchain there's no host/target split to +worry about: jpype1's CMake build only ever runs Ant to build a JAR (always +a host-executed step, regardless of what CPU the compiled .so targets). +""" + +def _ant_home_impl(ctx): + ant_bin = ctx.file.ant_bin + return [ + DefaultInfo(files = ctx.attr.all_files[DefaultInfo].files), + platform_common.TemplateVariableInfo({ + "ANT_HOME": ant_bin.dirname.rsplit("/", 1)[0], + "ANT_BIN_DIR": ant_bin.dirname, + }), + ] + +ant_home = rule( + implementation = _ant_home_impl, + attrs = { + "all_files": attr.label( + doc = "filegroup covering the whole extracted Ant distribution.", + mandatory = True, + ), + "ant_bin": attr.label( + allow_single_file = True, + doc = "The `bin/ant` launcher script.", + mandatory = True, + ), + }, + doc = "Exposes $(ANT_HOME) / $(ANT_BIN_DIR) for a vendored Ant distribution.", +) diff --git a/e2e/crossbuild/tools/assert_absent.py b/e2e/crossbuild/tools/assert_absent.py new file mode 100644 index 000000000..8cdcf7864 --- /dev/null +++ b/e2e/crossbuild/tools/assert_absent.py @@ -0,0 +1,49 @@ +"""Fail if a tar-listing file contains any forbidden path substring. + +Docker-free guard wired into `assert_tar_listing`: it scans the same layer +listing the snapshot test diffs, but asserts an *invariant* rather than exact +bytes, so it keeps holding even when a snapshot is regenerated. + +Guards the packaging policy that otherwise only surfaces inside a running +container: + + * `py_image_layer`'s pip-package layer strips `__pycache__`/`.pyc` and + install metadata (see `_should_skip_pkg_path`). Nothing may smuggle them + back in — in particular a reintroduced `_wheels/` venv tree, which + ships as a distinct declared output the source-layer dedup doesn't catch, + re-injecting both the duplicate wheel files and the stripped bytecode. + +Usage (from the macro): assert_absent.py ... +""" + +import sys + + +def main(argv: list[str]) -> None: + if len(argv) < 3: + sys.exit("usage: assert_absent.py ...") + listing_path = argv[1] + forbidden = argv[2:] + + with open(listing_path, encoding="utf-8") as f: + lines = f.read().splitlines() + + failures = [] + for line in lines: + for pat in forbidden: + if pat in line: + failures.append((pat, line.strip())) + + if failures: + msg = ["{} forbidden path(s) in {}:".format(len(failures), listing_path)] + for pat, line in failures[:20]: + msg.append(" [{}] {}".format(pat, line)) + if len(failures) > 20: + msg.append(" ... ({} more)".format(len(failures) - 20)) + sys.exit("\n".join(msg)) + + print("assert_absent: ok ({} lines, none matched {})".format(len(lines), forbidden)) + + +if __name__ == "__main__": + main(sys.argv) diff --git a/e2e/crossbuild/tools/asserts.bzl b/e2e/crossbuild/tools/asserts.bzl new file mode 100644 index 000000000..c3b3fea01 --- /dev/null +++ b/e2e/crossbuild/tools/asserts.bzl @@ -0,0 +1,107 @@ +"""Test helper""" + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("@bazel_lib//lib:write_source_files.bzl", "write_source_file") + +# Path substrings that must never appear in any image layer. These ship via +# the venv/runfiles source layer only if something bypasses the pip-package +# layer's `_should_skip_pkg_path` filter — e.g. a reintroduced +# `_wheels/` intermediate tree, which also re-duplicates wheel files. +# Asserted by a Docker-free py_test (see assert_tar_listing); intentionally an +# invariant, not exact bytes, so it survives snapshot regeneration. +_FORBIDDEN_LAYER_PATHS = [ + "__pycache__", + ".pyc", + "/_wheels/", +] + +# Paths whose byte size varies across Bazel releases or builds. We keep +# the rows in the listing (so a missing/renamed file would still be +# caught) but redact the size column so a single snapshot works across +# Bazel-version bumps. +_VOLATILE_SIZE_PATHS = [ + "/_repo_mapping", +] + +# Paths to drop from the listing entirely. Bazel 8 ships runfiles.bash via +# @bazel_tools, Bazel 9 routes it through @rules_shell at a different +# runfiles path — neither this rule nor the user-facing image cares which, +# so filter the row out so one snapshot works on both. +_FILTERED_PATHS = [ + "/bazel_tools/tools/bash/runfiles/runfiles.bash", +] + +# buildifier: disable=function-docstring +def assert_tar_listing(name, actual, expected, **kwargs): + actual_listing = "{}_listing".format(name) + native.genrule( + name = actual_listing, + srcs = actual, + testonly = True, + outs = ["_{}.listing".format(name)], + cmd = """\ +iter=0 +for f in $(SRCS); do + echo "---" + echo "layer: $$iter" + echo "files:" + # Redact the size column for known-volatile rows in place, replacing + # both the right-aligned padding spaces and the digits with a single + # ` *` token. Digit-count-agnostic so a single snapshot survives + # cross-platform size drift (e.g. `_repo_mapping` rendered as 4 vs 5 + # digits across builds). The size lives right before the `Jan 1 2023` + # timestamp that mtree pins on every entry, so ` Jan` + # is unambiguous. Loses column alignment on the redacted row only — + # snapshot diffs are byte-exact, not visual, so alignment doesn't + # matter. + TZ="UTC" LC_ALL="en_US.UTF-8" $(BSDTAR_BIN) -tvf $$f \\ + | awk -v volatile='{volatile}' -v filtered='{filtered}' ' + BEGIN {{ + n = split(volatile, paths, "|") + nf = split(filtered, fpaths, "|") + }} + {{ + # Drop rows for Bazel-version-sensitive paths entirely. + for (j = 1; j <= nf; j++) {{ + if (fpaths[j] != "" && index($$0, fpaths[j])) next + }} + for (i = 1; i <= n; i++) {{ + if (paths[i] != "" && index($$0, paths[i]) && match($$0, /[ ]+[0-9]+ Jan/)) {{ + # RLENGTH spans leading spaces + digits + " Jan". + # Keep the " Jan" suffix (4 chars); replace the rest. + $$0 = substr($$0, 1, RSTART - 1) " *" substr($$0, RSTART + RLENGTH - 4) + break + }} + }} + print + }}' \\ + | sort -k9 | sed "s/^/ - /g" + iter=$$(($$iter + 1)) +done > $@ +""".format( + volatile = "|".join(_VOLATILE_SIZE_PATHS), + filtered = "|".join(_FILTERED_PATHS), + ), + toolchains = ["@bsd_tar_toolchains//:resolved_toolchain"], + ) + + write_source_file( + name = name, + in_file = actual_listing, + out_file = "snapshots/{}".format(expected), + testonly = True, + **kwargs + ) + + # Docker-free invariant guard over the same listing: assert the stripped + # bytecode/metadata (and any `_wheels/` smuggling tree) never reappear + # in a layer. Complements the byte-exact snapshot above — regenerating the + # snapshot can't make this pass. + py_test( + name = "{}_no_forbidden_paths".format(name), + srcs = ["//tools:assert_absent.py"], + main = "//tools:assert_absent.py", + args = ["$(rootpath :{})".format(actual_listing)] + _FORBIDDEN_LAYER_PATHS, + data = [":{}".format(actual_listing)], + testonly = True, + ) diff --git a/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh b/e2e/crossbuild/tools/check_so_arch.sh similarity index 52% rename from e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh rename to e2e/crossbuild/tools/check_so_arch.sh index 6b1569373..b41e0bc2f 100755 --- a/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh +++ b/e2e/crossbuild/tools/check_so_arch.sh @@ -1,26 +1,31 @@ #!/usr/bin/env bash -# Check that _geohash.so inside a py_image_layer tar is ELF for the expected arch. +# Check that a native extension .so inside a tar is ELF for the expected arch. # # Uses only POSIX utilities (tar, od, find) — no Python dependency. # -# Usage: check_so_arch.sh +# Usage: check_so_arch.sh +# so_path_grep_pattern: grep -E pattern matching the .so's full path inside +# the tar, specific enough to pick exactly one .so if the tar bundles +# more than the package under test (e.g. a reference build for diffing). # expected_machine_le_hex: ELF e_machine as little-endian hex bytes # x86_64 (EM_X86_64 = 62 = 0x3e) → "3e00" # aarch64 (EM_AARCH64 = 183 = 0xb7) → "b700" set -euo pipefail -tar_file="${1:?usage: check_so_arch.sh }" -expected="${2:?expected ELF machine as little-endian hex}" +tar_file="${1:?usage: check_so_arch.sh }" +so_pattern="${2:?so path grep pattern}" +expected="${3:?expected ELF machine as little-endian hex}" tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT tar xf "$tar_file" -C "$tmp" 2>/dev/null || true -so="$(find "$tmp" -name '_geohash*.so' -type f | head -1)" +so="$(cd "$tmp" && find . -type f | grep -E "$so_pattern" | head -1)" if [ -z "$so" ]; then - echo "FAIL: no _geohash*.so found in $tar_file" + echo "FAIL: no .so matching '$so_pattern' found in $tar_file" exit 1 fi +so="$tmp/$so" magic="$(od -A n -t x1 -N 4 "$so" | tr -d ' ')" if [ "$magic" != "7f454c46" ]; then diff --git a/e2e/crossbuild/tools/check_so_suffix.sh b/e2e/crossbuild/tools/check_so_suffix.sh new file mode 100755 index 000000000..701a3e460 --- /dev/null +++ b/e2e/crossbuild/tools/check_so_suffix.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Check that a native extension .so inside a tar has the correct platform +# suffix in its filename — i.e. EXT_SUFFIX and SOABI reflect the target +# platform, not the exec host. +# +# Usage: check_so_suffix.sh +# so_path_grep_pattern: grep -E pattern matching the .so's full path inside +# the tar, specific enough to pick exactly one .so if the tar bundles +# more than the package under test (e.g. a reference build for diffing). +set -euo pipefail + +tar_file="${1:?usage: check_so_suffix.sh }" +so_pattern="${2:?so path grep pattern}" +expected="${3:?expected suffix substring, e.g. cpython-312-x86_64-linux-gnu}" + +so_name=$(tar tf "$tar_file" | grep -E "$so_pattern" | head -1) +if [ -z "$so_name" ]; then + echo "FAIL: no .so matching '$so_pattern' in tar $tar_file" + exit 1 +fi + +echo ".so: $so_name" + +if ! echo "$so_name" | grep -q "$expected"; then + echo "FAIL: expected suffix '$expected' not found in filename" + exit 1 +fi + +echo "PASS: $so_name contains '$expected'" diff --git a/e2e/crossbuild/tools/checks.bzl b/e2e/crossbuild/tools/checks.bzl new file mode 100644 index 000000000..73b260491 --- /dev/null +++ b/e2e/crossbuild/tools/checks.bzl @@ -0,0 +1,49 @@ +"""Structural checks on a native extension .so inside a py_image_layer tar. + +Both check the *squashed* tar specifically — the "default" one is the +runfiles/source layer and never contains the installed pip package, only +"squashed" does. Neither proves the code runs correctly; pair with an +execution test (e.g. container_structure_test) for that. +""" + +load("@bazel_skylib//rules:build_test.bzl", "build_test") + +def _squashed_tar_check(name, actual, script, so_pattern, expected): + check_name = "_{}_check".format(name) + native.genrule( + name = check_name, + srcs = [actual], + outs = ["{}.ok".format(check_name)], + cmd = """ +tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep '_squashed\\.tar' | head -1) +$(location {script}) $$tar_file '{so_pattern}' '{expected}' +touch $@ +""".format(script = script, so_pattern = so_pattern, expected = expected), + tools = [script], + ) + build_test( + name = name, + targets = [":{}".format(check_name)], + ) + +def assert_so_arch(name, actual, so_pattern, expected_machine_hex): + """Checks the ELF e_machine of a native extension .so inside a py_image_layer tar. + + Args: + name: test name. + actual: the py_image_layer (or a platform_transition_filegroup wrapping one) to check. + so_pattern: grep -E pattern matching the .so's full path inside the tar. + expected_machine_hex: little-endian ELF e_machine hex, e.g. "3e00" (x86_64), "b700" (aarch64). + """ + _squashed_tar_check(name, actual, "//tools:check_so_arch.sh", so_pattern, expected_machine_hex) + +def assert_so_suffix(name, actual, so_pattern, expected_suffix): + """Checks the EXT_SUFFIX/SOABI in a native extension .so's filename inside a py_image_layer tar. + + Args: + name: test name. + actual: the py_image_layer (or a platform_transition_filegroup wrapping one) to check. + so_pattern: grep -E pattern matching the .so's full path inside the tar. + expected_suffix: substring expected in the matched filename, e.g. "cpython-312-x86_64-linux-gnu". + """ + _squashed_tar_check(name, actual, "//tools:check_so_suffix.sh", so_pattern, expected_suffix) diff --git a/e2e/crossbuild/tools/cross_case.bzl b/e2e/crossbuild/tools/cross_case.bzl new file mode 100644 index 000000000..1449c7b5f --- /dev/null +++ b/e2e/crossbuild/tools/cross_case.bzl @@ -0,0 +1,143 @@ +"""Shared scaffolding for a "build one real package for amd64+arm64, then +actually run it" e2e/crossbuild case. + +Every case here cross-compiles a package from the same amd64 exec host for +linux/amd64 and linux/arm64, then runs both — QEMU for arm64 — via +container_structure_test, plus a per-arch structural check (ELF machine, +and, where the .so's own filename carries one, its cpython ABI tag). This +macro is the ~90 lines every case shared verbatim; anything genuinely +case-specific (extra data deps, a diff-against-a-reference-wheel test +instead of a command test, macOS coverage) stays hand-written — see +//geohash and //zstandard, which aren't built from this macro for exactly +that reason. +""" + +load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") +load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") +load("@container_structure_test//:defs.bzl", "container_structure_test") +load("@rules_oci//oci:defs.bzl", "oci_image") +load(":checks.bzl", "assert_so_arch", "assert_so_suffix") + +def pep517_cross_case(name, deps, so_pattern, check_so_suffix = True, main = None, dep_group = None, image_command_test_config = None): + """Declares the amd64/arm64 build+run scaffolding for one e2e/crossbuild package. + + Produces (all unprefixed, matching the package's own BUILD.bazel): + "_bin", "layers", "{amd64,arm64}_layers", "_so_arch_{amd64,arm64}_test", + "_so_suffix_{amd64,arm64}_test" (if check_so_suffix), "image", + "{amd64,arm64}_image", "{amd64,arm64}_command_test". + + Args: + name: the package's own directory/case name, e.g. "bcrypt". Only + used to derive default filenames/labels below — every produced + target keeps its existing unprefixed name (":layers", not + ":_layers"), so migrating a case onto this macro doesn't + rename anything CI or a human already refers to. + deps: the py_binary's deps — the hub's target package, e.g. + ["@pypi_crossbuild_bcrypt//bcrypt"]. + so_pattern: grep -E pattern matching the compiled .so's path inside + the squashed tar (see //tools:checks.bzl). + check_so_suffix: whether the .so's filename carries a cpython + version/ABI tag worth asserting. False for ctypes-loaded .so's + (awkward_cpp), abi3 builds (psutil), or an unsuffixed .so + (jpype1's _jpype.so). + main: py_binary's main/srcs file; defaults to "_main.py". + dep_group: py_binary's dep_group; defaults to "crossbuild_". + image_command_test_config: the container_structure_test YAML; + defaults to "_image_command_test.yaml". + """ + main = main or (name + "_main.py") + dep_group = dep_group or ("crossbuild_" + name) + image_command_test_config = image_command_test_config or (name + "_image_command_test.yaml") + + py_binary( + name = name + "_bin", + srcs = [main], + dep_group = dep_group, + main = main, + python_version = "3.12", + deps = deps, + ) + + py_image_layer( + name = "layers", + binary = ":" + name + "_bin", + ) + + platform_transition_filegroup( + name = "amd64_layers", + srcs = [":layers"], + target_platform = "//:amd64_linux", + ) + + platform_transition_filegroup( + name = "arm64_layers", + srcs = [":layers"], + target_platform = "//:arm64_linux", + ) + + assert_so_arch( + name = name + "_so_arch_amd64_test", + actual = ":amd64_layers", + expected_machine_hex = "3e00", + so_pattern = so_pattern, + ) + + assert_so_arch( + name = name + "_so_arch_arm64_test", + actual = ":arm64_layers", + expected_machine_hex = "b700", + so_pattern = so_pattern, + ) + + if check_so_suffix: + assert_so_suffix( + name = name + "_so_suffix_amd64_test", + actual = ":amd64_layers", + expected_suffix = "cpython-312-x86_64-linux-gnu", + so_pattern = so_pattern, + ) + + assert_so_suffix( + name = name + "_so_suffix_arm64_test", + actual = ":arm64_layers", + expected_suffix = "cpython-312-aarch64-linux-gnu", + so_pattern = so_pattern, + ) + + oci_image( + name = "image", + base = "@ubuntu", + entrypoint = ["/app"], + tars = [":layers"], + ) + + platform_transition_filegroup( + name = "amd64_image", + srcs = [":image"], + target_platform = "//:amd64_linux", + ) + + platform_transition_filegroup( + name = "arm64_image", + srcs = [":image"], + target_platform = "//:arm64_linux", + ) + + container_structure_test( + name = "amd64_command_test", + configs = [image_command_test_config], + image = ":amd64_image", + platform = "linux/amd64", + tags = ["requires-docker"], + ) + + container_structure_test( + name = "arm64_command_test", + configs = [image_command_test_config], + image = ":arm64_image", + platform = "linux/aarch64", + tags = [ + "requires-docker", + "requires-qemu", + ], + ) diff --git a/e2e/crossbuild/tools/rust_layer.bzl b/e2e/crossbuild/tools/rust_layer.bzl new file mode 100644 index 000000000..0cae5a4d0 --- /dev/null +++ b/e2e/crossbuild/tools/rust_layer.bzl @@ -0,0 +1,31 @@ +"""Exposes a specific (non-ambient-resolved) rust_toolchain's sysroot. + +`@rules_rust//rust/toolchain:current_rust_toolchain` resolves against the +build's ambient --platforms, so under a cross (arm64) transition it returns +the arm64-*targeting* toolchain — whose sysroot only carries LLVM's shared +libs for x86_64, not the x86_64 rust-std a build script/proc-macro (always +compiled for the exec platform) needs. This rule instead pins to a specific +`rust_toolchain` target by label, bypassing toolchain resolution entirely, +so a package can also pull in the plain x86_64-targeting toolchain's sysroot +regardless of which platform the rest of the build is transitioned to. +""" + +def _rust_pinned_sysroot_impl(ctx): + toolchain = ctx.attr.actual[platform_common.ToolchainInfo] + return [ + DefaultInfo(files = toolchain.all_files), + platform_common.TemplateVariableInfo({ + "RUST_HOST_SYSROOT": toolchain.sysroot, + }), + ] + +rust_pinned_sysroot = rule( + implementation = _rust_pinned_sysroot_impl, + attrs = { + "actual": attr.label( + doc = "A rust_toolchain target (not a toolchain_type alias) to pin to.", + mandatory = True, + ), + }, + doc = "Exposes `actual`'s sysroot as $(RUST_HOST_SYSROOT), bypassing toolchain resolution.", +) diff --git a/e2e/crossbuild/tools/test_exec_toolchain.sh b/e2e/crossbuild/tools/test_exec_toolchain.sh new file mode 100755 index 000000000..ed40fff09 --- /dev/null +++ b/e2e/crossbuild/tools/test_exec_toolchain.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# EXEC_TOOLS_TOOLCHAIN must resolve the exec-platform Python interpreter even +# when the target platform is arm64 — unpack.py runs on the exec side, and an +# arm64 interpreter would fail with "Exec format error" on an amd64 host. +set -euo pipefail + +DIR="${TEST_SRCDIR}/_main/tools" + +native_path_file="$DIR/unpack_path.txt" +arm64_path_file="$DIR/unpack_path_for_arm64.txt" + +if [[ ! -f "$native_path_file" ]]; then + echo "FAIL: $native_path_file not found" + exit 1 +fi + +if [[ ! -f "$arm64_path_file" ]]; then + echo "FAIL: $arm64_path_file not found" + exit 1 +fi + +native_path=$(cat "$native_path_file") +arm64_path=$(cat "$arm64_path_file") + +echo "Native exec Python path: $native_path" +echo "Arm64-target exec Python path: $arm64_path" + +# The arm64 transition changes the config fingerprint (the ST-* hash in the +# path) even when the resolved interpreter is the same exec tool, so path +# equality isn't a valid assertion — check neither path names an arm64/aarch64 +# interpreter instead. +if [[ "$arm64_path" == *"arm64"* ]] || [[ "$arm64_path" == *"aarch64"* ]]; then + echo "FAIL: arm64-target exec Python path contains arm64/aarch64 — exec platform not honoured." + echo " Path: $arm64_path" + exit 1 +fi + +if [[ "$native_path" == *"arm64"* ]] || [[ "$native_path" == *"aarch64"* ]]; then + echo "FAIL: native exec Python path unexpectedly contains arm64/aarch64." + echo " Path: $native_path" + exit 1 +fi + +echo "PASS: EXEC_TOOLS_TOOLCHAIN resolved exec-platform Python for arm64 target ($(uname -m) host)" \ No newline at end of file diff --git a/e2e/cases/uv-deps-650/crossbuild/toolchain_test.bzl b/e2e/crossbuild/tools/toolchain_test.bzl similarity index 100% rename from e2e/cases/uv-deps-650/crossbuild/toolchain_test.bzl rename to e2e/crossbuild/tools/toolchain_test.bzl diff --git a/e2e/cases/uv-deps-650/crossbuild/uv.lock b/e2e/crossbuild/uv.lock similarity index 68% rename from e2e/cases/uv-deps-650/crossbuild/uv.lock rename to e2e/crossbuild/uv.lock index 85263a4e5..0aed06f66 100644 --- a/e2e/cases/uv-deps-650/crossbuild/uv.lock +++ b/e2e/crossbuild/uv.lock @@ -130,7 +130,6 @@ source = { virtual = "." } dependencies = [ { name = "build" }, { name = "cffi" }, - { name = "psycopg2-binary" }, { name = "python-geohash" }, { name = "setuptools" }, ] @@ -139,7 +138,6 @@ dependencies = [ requires-dist = [ { name = "build" }, { name = "cffi" }, - { name = "psycopg2-binary" }, { name = "python-geohash", specifier = "==0.8.5" }, { name = "setuptools" }, ] @@ -153,58 +151,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] -[[package]] -name = "psycopg2-binary" -version = "2.9.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/6c/8767aaa597ba424643dc87348c6f1754dd9f48e80fdc1b9f7ca5c3a7c213/psycopg2-binary-2.9.11.tar.gz", hash = "sha256:b6aed9e096bf63f9e75edf2581aa9a7e7186d97ab5c177aa6c87797cd591236c", size = 379620, upload-time = "2025-10-10T11:14:48.041Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/ae/8d8266f6dd183ab4d48b95b9674034e1b482a3f8619b33a0d86438694577/psycopg2_binary-2.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e8480afd62362d0a6a27dd09e4ca2def6fa50ed3a4e7c09165266106b2ffa10", size = 3756452, upload-time = "2025-10-10T11:11:11.583Z" }, - { url = "https://files.pythonhosted.org/packages/4b/34/aa03d327739c1be70e09d01182619aca8ebab5970cd0cfa50dd8b9cec2ac/psycopg2_binary-2.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:763c93ef1df3da6d1a90f86ea7f3f806dc06b21c198fa87c3c25504abec9404a", size = 3863957, upload-time = "2025-10-10T11:11:16.932Z" }, - { url = "https://files.pythonhosted.org/packages/48/89/3fdb5902bdab8868bbedc1c6e6023a4e08112ceac5db97fc2012060e0c9a/psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e164359396576a3cc701ba8af4751ae68a07235d7a380c631184a611220d9a4", size = 4410955, upload-time = "2025-10-10T11:11:21.21Z" }, - { url = "https://files.pythonhosted.org/packages/ce/24/e18339c407a13c72b336e0d9013fbbbde77b6fd13e853979019a1269519c/psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d57c9c387660b8893093459738b6abddbb30a7eab058b77b0d0d1c7d521ddfd7", size = 4468007, upload-time = "2025-10-10T11:11:24.831Z" }, - { url = "https://files.pythonhosted.org/packages/91/7e/b8441e831a0f16c159b5381698f9f7f7ed54b77d57bc9c5f99144cc78232/psycopg2_binary-2.9.11-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2c226ef95eb2250974bf6fa7a842082b31f68385c4f3268370e3f3870e7859ee", size = 4165012, upload-time = "2025-10-10T11:11:29.51Z" }, - { url = "https://files.pythonhosted.org/packages/0d/61/4aa89eeb6d751f05178a13da95516c036e27468c5d4d2509bb1e15341c81/psycopg2_binary-2.9.11-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a311f1edc9967723d3511ea7d2708e2c3592e3405677bf53d5c7246753591fbb", size = 3981881, upload-time = "2025-10-30T02:55:07.332Z" }, - { url = "https://files.pythonhosted.org/packages/76/a1/2f5841cae4c635a9459fe7aca8ed771336e9383b6429e05c01267b0774cf/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb415404821b6d1c47353ebe9c8645967a5235e6d88f914147e7fd411419e6f", size = 3650985, upload-time = "2025-10-10T11:11:34.975Z" }, - { url = "https://files.pythonhosted.org/packages/84/74/4defcac9d002bca5709951b975173c8c2fa968e1a95dc713f61b3a8d3b6a/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f07c9c4a5093258a03b28fab9b4f151aa376989e7f35f855088234e656ee6a94", size = 3296039, upload-time = "2025-10-10T11:11:40.432Z" }, - { url = "https://files.pythonhosted.org/packages/6d/c2/782a3c64403d8ce35b5c50e1b684412cf94f171dc18111be8c976abd2de1/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:00ce1830d971f43b667abe4a56e42c1e2d594b32da4802e44a73bacacb25535f", size = 3043477, upload-time = "2025-10-30T02:55:11.182Z" }, - { url = "https://files.pythonhosted.org/packages/c8/31/36a1d8e702aa35c38fc117c2b8be3f182613faa25d794b8aeaab948d4c03/psycopg2_binary-2.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cffe9d7697ae7456649617e8bb8d7a45afb71cd13f7ab22af3e5c61f04840908", size = 3345842, upload-time = "2025-10-10T11:11:45.366Z" }, - { url = "https://files.pythonhosted.org/packages/6e/b4/a5375cda5b54cb95ee9b836930fea30ae5a8f14aa97da7821722323d979b/psycopg2_binary-2.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:304fd7b7f97eef30e91b8f7e720b3db75fee010b520e434ea35ed1ff22501d03", size = 2713894, upload-time = "2025-10-10T11:11:48.775Z" }, - { url = "https://files.pythonhosted.org/packages/d8/91/f870a02f51be4a65987b45a7de4c2e1897dd0d01051e2b559a38fa634e3e/psycopg2_binary-2.9.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:be9b840ac0525a283a96b556616f5b4820e0526addb8dcf6525a0fa162730be4", size = 3756603, upload-time = "2025-10-10T11:11:52.213Z" }, - { url = "https://files.pythonhosted.org/packages/27/fa/cae40e06849b6c9a95eb5c04d419942f00d9eaac8d81626107461e268821/psycopg2_binary-2.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f090b7ddd13ca842ebfe301cd587a76a4cf0913b1e429eb92c1be5dbeb1a19bc", size = 3864509, upload-time = "2025-10-10T11:11:56.452Z" }, - { url = "https://files.pythonhosted.org/packages/2d/75/364847b879eb630b3ac8293798e380e441a957c53657995053c5ec39a316/psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ab8905b5dcb05bf3fb22e0cf90e10f469563486ffb6a96569e51f897c750a76a", size = 4411159, upload-time = "2025-10-10T11:12:00.49Z" }, - { url = "https://files.pythonhosted.org/packages/6f/a0/567f7ea38b6e1c62aafd58375665a547c00c608a471620c0edc364733e13/psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf940cd7e7fec19181fdbc29d76911741153d51cab52e5c21165f3262125685e", size = 4468234, upload-time = "2025-10-10T11:12:04.892Z" }, - { url = "https://files.pythonhosted.org/packages/30/da/4e42788fb811bbbfd7b7f045570c062f49e350e1d1f3df056c3fb5763353/psycopg2_binary-2.9.11-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa0f693d3c68ae925966f0b14b8edda71696608039f4ed61b1fe9ffa468d16db", size = 4166236, upload-time = "2025-10-10T11:12:11.674Z" }, - { url = "https://files.pythonhosted.org/packages/3c/94/c1777c355bc560992af848d98216148be5f1be001af06e06fc49cbded578/psycopg2_binary-2.9.11-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a1cf393f1cdaf6a9b57c0a719a1068ba1069f022a59b8b1fe44b006745b59757", size = 3983083, upload-time = "2025-10-30T02:55:15.73Z" }, - { url = "https://files.pythonhosted.org/packages/bd/42/c9a21edf0e3daa7825ed04a4a8588686c6c14904344344a039556d78aa58/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7a6beb4beaa62f88592ccc65df20328029d721db309cb3250b0aae0fa146c3", size = 3652281, upload-time = "2025-10-10T11:12:17.713Z" }, - { url = "https://files.pythonhosted.org/packages/12/22/dedfbcfa97917982301496b6b5e5e6c5531d1f35dd2b488b08d1ebc52482/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:31b32c457a6025e74d233957cc9736742ac5a6cb196c6b68499f6bb51390bd6a", size = 3298010, upload-time = "2025-10-10T11:12:22.671Z" }, - { url = "https://files.pythonhosted.org/packages/66/ea/d3390e6696276078bd01b2ece417deac954dfdd552d2edc3d03204416c0c/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:edcb3aeb11cb4bf13a2af3c53a15b3d612edeb6409047ea0b5d6a21a9d744b34", size = 3044641, upload-time = "2025-10-30T02:55:19.929Z" }, - { url = "https://files.pythonhosted.org/packages/12/9a/0402ded6cbd321da0c0ba7d34dc12b29b14f5764c2fc10750daa38e825fc/psycopg2_binary-2.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b6d93d7c0b61a1dd6197d208ab613eb7dcfdcca0a49c42ceb082257991de9d", size = 3347940, upload-time = "2025-10-10T11:12:26.529Z" }, - { url = "https://files.pythonhosted.org/packages/b1/d2/99b55e85832ccde77b211738ff3925a5d73ad183c0b37bcbbe5a8ff04978/psycopg2_binary-2.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:b33fabeb1fde21180479b2d4667e994de7bbf0eec22832ba5d9b5e4cf65b6c6d", size = 2714147, upload-time = "2025-10-10T11:12:29.535Z" }, - { url = "https://files.pythonhosted.org/packages/ff/a8/a2709681b3ac11b0b1786def10006b8995125ba268c9a54bea6f5ae8bd3e/psycopg2_binary-2.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b8fb3db325435d34235b044b199e56cdf9ff41223a4b9752e8576465170bb38c", size = 3756572, upload-time = "2025-10-10T11:12:32.873Z" }, - { url = "https://files.pythonhosted.org/packages/62/e1/c2b38d256d0dafd32713e9f31982a5b028f4a3651f446be70785f484f472/psycopg2_binary-2.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:366df99e710a2acd90efed3764bb1e28df6c675d33a7fb40df9b7281694432ee", size = 3864529, upload-time = "2025-10-10T11:12:36.791Z" }, - { url = "https://files.pythonhosted.org/packages/11/32/b2ffe8f3853c181e88f0a157c5fb4e383102238d73c52ac6d93a5c8bffe6/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c55b385daa2f92cb64b12ec4536c66954ac53654c7f15a203578da4e78105c0", size = 4411242, upload-time = "2025-10-10T11:12:42.388Z" }, - { url = "https://files.pythonhosted.org/packages/10/04/6ca7477e6160ae258dc96f67c371157776564679aefd247b66f4661501a2/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c0377174bf1dd416993d16edc15357f6eb17ac998244cca19bc67cdc0e2e5766", size = 4468258, upload-time = "2025-10-10T11:12:48.654Z" }, - { url = "https://files.pythonhosted.org/packages/3c/7e/6a1a38f86412df101435809f225d57c1a021307dd0689f7a5e7fe83588b1/psycopg2_binary-2.9.11-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6ff3335ce08c75afaed19e08699e8aacf95d4a260b495a4a8545244fe2ceb3", size = 4166295, upload-time = "2025-10-10T11:12:52.525Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7d/c07374c501b45f3579a9eb761cbf2604ddef3d96ad48679112c2c5aa9c25/psycopg2_binary-2.9.11-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:84011ba3109e06ac412f95399b704d3d6950e386b7994475b231cf61eec2fc1f", size = 3983133, upload-time = "2025-10-30T02:55:24.329Z" }, - { url = "https://files.pythonhosted.org/packages/82/56/993b7104cb8345ad7d4516538ccf8f0d0ac640b1ebd8c754a7b024e76878/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba34475ceb08cccbdd98f6b46916917ae6eeb92b5ae111df10b544c3a4621dc4", size = 3652383, upload-time = "2025-10-10T11:12:56.387Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ac/eaeb6029362fd8d454a27374d84c6866c82c33bfc24587b4face5a8e43ef/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b31e90fdd0f968c2de3b26ab014314fe814225b6c324f770952f7d38abf17e3c", size = 3298168, upload-time = "2025-10-10T11:13:00.403Z" }, - { url = "https://files.pythonhosted.org/packages/2b/39/50c3facc66bded9ada5cbc0de867499a703dc6bca6be03070b4e3b65da6c/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d526864e0f67f74937a8fce859bd56c979f5e2ec57ca7c627f5f1071ef7fee60", size = 3044712, upload-time = "2025-10-30T02:55:27.975Z" }, - { url = "https://files.pythonhosted.org/packages/9c/8e/b7de019a1f562f72ada81081a12823d3c1590bedc48d7d2559410a2763fe/psycopg2_binary-2.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04195548662fa544626c8ea0f06561eb6203f1984ba5b4562764fbeb4c3d14b1", size = 3347549, upload-time = "2025-10-10T11:13:03.971Z" }, - { url = "https://files.pythonhosted.org/packages/80/2d/1bb683f64737bbb1f86c82b7359db1eb2be4e2c0c13b947f80efefa7d3e5/psycopg2_binary-2.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:efff12b432179443f54e230fdf60de1f6cc726b6c832db8701227d089310e8aa", size = 2714215, upload-time = "2025-10-10T11:13:07.14Z" }, - { url = "https://files.pythonhosted.org/packages/64/12/93ef0098590cf51d9732b4f139533732565704f45bdc1ffa741b7c95fb54/psycopg2_binary-2.9.11-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:92e3b669236327083a2e33ccfa0d320dd01b9803b3e14dd986a4fc54aa00f4e1", size = 3756567, upload-time = "2025-10-10T11:13:11.885Z" }, - { url = "https://files.pythonhosted.org/packages/7c/a9/9d55c614a891288f15ca4b5209b09f0f01e3124056924e17b81b9fa054cc/psycopg2_binary-2.9.11-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e0deeb03da539fa3577fcb0b3f2554a97f7e5477c246098dbb18091a4a01c16f", size = 3864755, upload-time = "2025-10-10T11:13:17.727Z" }, - { url = "https://files.pythonhosted.org/packages/13/1e/98874ce72fd29cbde93209977b196a2edae03f8490d1bd8158e7f1daf3a0/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b52a3f9bb540a3e4ec0f6ba6d31339727b2950c9772850d6545b7eae0b9d7c5", size = 4411646, upload-time = "2025-10-10T11:13:24.432Z" }, - { url = "https://files.pythonhosted.org/packages/5a/bd/a335ce6645334fb8d758cc358810defca14a1d19ffbc8a10bd38a2328565/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:db4fd476874ccfdbb630a54426964959e58da4c61c9feba73e6094d51303d7d8", size = 4468701, upload-time = "2025-10-10T11:13:29.266Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/c8b4f53f34e295e45709b7568bf9b9407a612ea30387d35eb9fa84f269b4/psycopg2_binary-2.9.11-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47f212c1d3be608a12937cc131bd85502954398aaa1320cb4c14421a0ffccf4c", size = 4166293, upload-time = "2025-10-10T11:13:33.336Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e0/f8cc36eadd1b716ab36bb290618a3292e009867e5c97ce4aba908cb99644/psycopg2_binary-2.9.11-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e35b7abae2b0adab776add56111df1735ccc71406e56203515e228a8dc07089f", size = 3983184, upload-time = "2025-10-30T02:55:32.483Z" }, - { url = "https://files.pythonhosted.org/packages/53/3e/2a8fe18a4e61cfb3417da67b6318e12691772c0696d79434184a511906dc/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fcf21be3ce5f5659daefd2b3b3b6e4727b028221ddc94e6c1523425579664747", size = 3652650, upload-time = "2025-10-10T11:13:38.181Z" }, - { url = "https://files.pythonhosted.org/packages/76/36/03801461b31b29fe58d228c24388f999fe814dfc302856e0d17f97d7c54d/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9bd81e64e8de111237737b29d68039b9c813bdf520156af36d26819c9a979e5f", size = 3298663, upload-time = "2025-10-10T11:13:44.878Z" }, - { url = "https://files.pythonhosted.org/packages/97/77/21b0ea2e1a73aa5fa9222b2a6b8ba325c43c3a8d54272839c991f2345656/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:32770a4d666fbdafab017086655bcddab791d7cb260a16679cc5a7338b64343b", size = 3044737, upload-time = "2025-10-30T02:55:35.69Z" }, - { url = "https://files.pythonhosted.org/packages/67/69/f36abe5f118c1dca6d3726ceae164b9356985805480731ac6712a63f24f0/psycopg2_binary-2.9.11-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3cb3a676873d7506825221045bd70e0427c905b9c8ee8d6acd70cfcbd6e576d", size = 3347643, upload-time = "2025-10-10T11:13:53.499Z" }, - { url = "https://files.pythonhosted.org/packages/e1/36/9c0c326fe3a4227953dfb29f5d0c8ae3b8eb8c1cd2967aa569f50cb3c61f/psycopg2_binary-2.9.11-cp314-cp314-win_amd64.whl", hash = "sha256:4012c9c954dfaccd28f94e84ab9f94e12df76b4afb22331b1f0d3154893a6316", size = 2803913, upload-time = "2025-10-10T11:13:57.058Z" }, -] - [[package]] name = "pycparser" version = "3.0" diff --git a/e2e/crossbuild/zstandard/BUILD.bazel b/e2e/crossbuild/zstandard/BUILD.bazel new file mode 100644 index 000000000..9ebfd0bab --- /dev/null +++ b/e2e/crossbuild/zstandard/BUILD.bazel @@ -0,0 +1,117 @@ +# zstandard ships official prebuilt wheels for linux/amd64 and linux/arm64, +# but [tool.uv] no-binary-package forces it to build from sdist here — same +# pep517_native_whl cross path as //geohash, on a package with a known-good +# binary to diff against instead of a hardcoded expected value. + +load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") +load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") +load("@container_structure_test//:defs.bzl", "container_structure_test") +load("@rules_oci//oci:defs.bzl", "oci_image") +load("//tools:checks.bzl", "assert_so_arch", "assert_so_suffix") + +# Matches only our own build's backend_c.so (installed under a +# whl_install__crossbuild_zstandard path), not the two official reference +# .so's bundled as compare_bin's data. +_SO_PATTERN = "whl_install__crossbuild_zstandard.*backend_c.*\\.so$$" + +py_binary( + name = "compare_bin", + srcs = ["compare_backend.py"], + data = [ + "@official_zstandard_amd64_linux//:backend_c", + "@official_zstandard_arm64_linux//:backend_c", + ], + dep_group = "crossbuild_zstandard", + main = "compare_backend.py", + python_version = "3.12", + deps = [ + "@bazel_tools//tools/python/runfiles", + "@pypi_crossbuild_zstandard//zstandard", + ], +) + +py_image_layer( + name = "layers", + binary = ":compare_bin", +) + +platform_transition_filegroup( + name = "amd64_layers", + srcs = [":layers"], + target_platform = "//:amd64_linux", +) + +platform_transition_filegroup( + name = "arm64_layers", + srcs = [":layers"], + target_platform = "//:arm64_linux", +) + +# ELF machine byte and EXT_SUFFIX/SOABI of our cross-compiled .so. Cheaper +# and faster to fail than amd64_diff_test/arm64_diff_test below, though +# those already imply this — a wrong-arch .so wouldn't load there either. +assert_so_arch( + name = "zstandard_so_arch_amd64_test", + actual = ":amd64_layers", + expected_machine_hex = "3e00", + so_pattern = _SO_PATTERN, +) + +assert_so_arch( + name = "zstandard_so_arch_arm64_test", + actual = ":arm64_layers", + expected_machine_hex = "b700", + so_pattern = _SO_PATTERN, +) + +assert_so_suffix( + name = "zstandard_so_suffix_amd64_test", + actual = ":amd64_layers", + expected_suffix = "cpython-312-x86_64-linux-gnu", + so_pattern = _SO_PATTERN, +) + +assert_so_suffix( + name = "zstandard_so_suffix_arm64_test", + actual = ":arm64_layers", + expected_suffix = "cpython-312-aarch64-linux-gnu", + so_pattern = _SO_PATTERN, +) + +oci_image( + name = "image", + base = "@ubuntu", + entrypoint = ["/app"], + tars = [":layers"], +) + +platform_transition_filegroup( + name = "amd64_image", + srcs = [":image"], + target_platform = "//:amd64_linux", +) + +platform_transition_filegroup( + name = "arm64_image", + srcs = [":image"], + target_platform = "//:arm64_linux", +) + +container_structure_test( + name = "amd64_diff_test", + configs = ["zstandard_diff_test.yaml"], + image = ":amd64_image", + platform = "linux/amd64", + tags = ["requires-docker"], +) + +container_structure_test( + name = "arm64_diff_test", + configs = ["zstandard_diff_test.yaml"], + image = ":arm64_image", + platform = "linux/aarch64", + tags = [ + "requires-docker", + "requires-qemu", + ], +) diff --git a/e2e/crossbuild/zstandard/compare_backend.py b/e2e/crossbuild/zstandard/compare_backend.py new file mode 100644 index 000000000..317fcfd18 --- /dev/null +++ b/e2e/crossbuild/zstandard/compare_backend.py @@ -0,0 +1,52 @@ +"""Compares our cross-compiled zstandard backend_c against PyPI's official wheel. + +Loads both .so files (ours via the normal import, the official one from an +arbitrary path via importlib) into the same process and checks they agree — +not just that both look like the right architecture, but that they actually +compute identical results. +""" + +import importlib.util +import platform +import sys +import types + +import zstandard.backend_c as ours +from bazel_tools.tools.python.runfiles import runfiles + +_DATA = b"The quick brown fox jumps over the lazy dog. " * 500 + +_OFFICIAL_SO = { + "x86_64": "official_zstandard_amd64_linux/zstandard/backend_c.cpython-312-x86_64-linux-gnu.so", + "aarch64": "official_zstandard_arm64_linux/zstandard/backend_c.cpython-312-aarch64-linux-gnu.so", +} + + +def _load(path: str) -> types.ModuleType: + spec = importlib.util.spec_from_file_location("backend_c", path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod + + +def main() -> None: + machine = platform.machine() + rlocation = _OFFICIAL_SO.get(machine) + if not rlocation: + sys.exit("unsupported machine: {}".format(machine)) + + official_path = runfiles.Create().Rlocation(rlocation) + official = _load(official_path) + + ours_compressed = ours.ZstdCompressor(level=3).compress(_DATA) + official_compressed = official.ZstdCompressor(level=3).compress(_DATA) + + assert ours_compressed == official_compressed, "compressed output differs between our build and the official wheel" + assert official.ZstdDecompressor().decompress(ours_compressed) == _DATA + assert ours.ZstdDecompressor().decompress(official_compressed) == _DATA + + print("PASS: identical compressed output, cross-decompression OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/zstandard/pyproject.toml b/e2e/crossbuild/zstandard/pyproject.toml new file mode 100644 index 000000000..be35ac14a --- /dev/null +++ b/e2e/crossbuild/zstandard/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "crossbuild_zstandard" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "cffi", + "setuptools", + "wheel", + "zstandard==0.22.0", +] + +[tool.uv] +no-binary-package = ["zstandard"] diff --git a/e2e/crossbuild/zstandard/uv.lock b/e2e/crossbuild/zstandard/uv.lock new file mode 100644 index 000000000..ce0553cfb --- /dev/null +++ b/e2e/crossbuild/zstandard/uv.lock @@ -0,0 +1,222 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, + { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" }, + { url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" }, + { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" }, + { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" }, + { url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" }, + { url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" }, + { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, + { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, + { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, + { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, + { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" }, + { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" }, + { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, + { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, + { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, + { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, + { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, + { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, + { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, + { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, + { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" }, + { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" }, + { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, + { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, + { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" }, + { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" }, + { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" }, + { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, + { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" }, + { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "crossbuild-zstandard" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "cffi" }, + { name = "setuptools" }, + { name = "wheel" }, + { name = "zstandard" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "cffi" }, + { name = "setuptools" }, + { name = "wheel" }, + { name = "zstandard", specifier = "==0.22.0" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "wheel" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, +] + +[[package]] +name = "zstandard" +version = "0.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/91/2162ab4239b3bd6743e8e407bc2442fca0d326e2d77b3f4a88d90ad5a1fa/zstandard-0.22.0.tar.gz", hash = "sha256:8226a33c542bcb54cd6bd0a366067b610b41713b64c9abec1bc4533d69f51e70", size = 660738, upload-time = "2023-11-01T06:57:31.719Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/41/80fc08ed96e68df920d28592710f5ed96fb288fda1fbb4b6aee5fdbaa5f6/zstandard-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:589402548251056878d2e7c8859286eb91bd841af117dbe4ab000e6450987e08", size = 921016, upload-time = "2023-11-01T06:49:32.023Z" }, + { url = "https://files.pythonhosted.org/packages/54/fc/c1b1a1e140451f3362789f546731b3ef36c78668be19d7fc6fbd4326b535/zstandard-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a97079b955b00b732c6f280d5023e0eefe359045e8b83b08cf0333af9ec78f26", size = 703352, upload-time = "2023-11-01T06:49:36.263Z" }, + { url = "https://files.pythonhosted.org/packages/68/fb/0a9389ee8ccc532ac4567562c7746bd7537d16bc5b079b2696fe3c510c37/zstandard-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:445b47bc32de69d990ad0f34da0e20f535914623d1e506e74d6bc5c9dc40bb09", size = 4918211, upload-time = "2023-11-01T06:49:54.265Z" }, + { url = "https://files.pythonhosted.org/packages/80/6a/f8a618f84aafb9c373a959e7e51ad34bda73f1d99cd856c05c8f0b78e87f/zstandard-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33591d59f4956c9812f8063eff2e2c0065bc02050837f152574069f5f9f17775", size = 5433363, upload-time = "2023-11-01T06:50:14.145Z" }, + { url = "https://files.pythonhosted.org/packages/a4/e1/0b29be2d3a8d86053f284add5a0b4174c820fefc96183b01d5cbcedd498d/zstandard-0.22.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:888196c9c8893a1e8ff5e89b8f894e7f4f0e64a5af4d8f3c410f0319128bb2f8", size = 4847234, upload-time = "2023-11-01T06:50:35.646Z" }, + { url = "https://files.pythonhosted.org/packages/55/0b/b23b1a6e4d4525f663162344d4896f396267e7f65607f16f7a62e1862a23/zstandard-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:53866a9d8ab363271c9e80c7c2e9441814961d47f88c9bc3b248142c32141d94", size = 4923512, upload-time = "2023-11-01T06:50:53.934Z" }, + { url = "https://files.pythonhosted.org/packages/9f/da/e16b2a5613141aaa719e4b09cdadf5eb3fb099311ffc8c0b13785bdcbe1a/zstandard-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ac59d5d6910b220141c1737b79d4a5aa9e57466e7469a012ed42ce2d3995e88", size = 5447292, upload-time = "2023-11-01T06:51:16.79Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1d/ecca5dee2d173b3b70fa8d6bdeec17f9a875aa6fdac4a6bfaadf7c9668a1/zstandard-0.22.0-cp311-cp311-win32.whl", hash = "sha256:2b11ea433db22e720758cba584c9d661077121fcf60ab43351950ded20283440", size = 442566, upload-time = "2023-11-01T06:51:20.56Z" }, + { url = "https://files.pythonhosted.org/packages/8a/bc/878a5b8f413d5fe902842fde08ecf317d3979c9728135034a519c409ce3f/zstandard-0.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:11f0d1aab9516a497137b41e3d3ed4bbf7b2ee2abc79e5c8b010ad286d7464bd", size = 511638, upload-time = "2023-11-01T06:51:24.548Z" }, + { url = "https://files.pythonhosted.org/packages/0f/f9/6b531e83f2e61bb9d66508113fd68557d990639be3dd37116af272932614/zstandard-0.22.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6c25b8eb733d4e741246151d895dd0308137532737f337411160ff69ca24f93a", size = 920922, upload-time = "2023-11-01T06:51:29.476Z" }, + { url = "https://files.pythonhosted.org/packages/7d/80/9e40e57ba17dbbf6c55bcf0ac4ee533c367285209f309bdd9ab290c40536/zstandard-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9b2cde1cd1b2a10246dbc143ba49d942d14fb3d2b4bccf4618d475c65464912", size = 703142, upload-time = "2023-11-01T06:51:33.594Z" }, + { url = "https://files.pythonhosted.org/packages/47/44/be2d67304ba9bf4694ffcaa99d146814d70c4cb0bfc00e0e86fdfae66a31/zstandard-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88b7df61a292603e7cd662d92565d915796b094ffb3d206579aaebac6b85d5f", size = 4918778, upload-time = "2023-11-01T06:51:53.663Z" }, + { url = "https://files.pythonhosted.org/packages/e5/01/080939755ca12ebbb7fc38b6f4ddecd5e8c416d571d4927ece1360baba2c/zstandard-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466e6ad8caefb589ed281c076deb6f0cd330e8bc13c5035854ffb9c2014b118c", size = 5426393, upload-time = "2023-11-01T06:52:14.784Z" }, + { url = "https://files.pythonhosted.org/packages/e1/68/66f1edfa9760213e9a85cf70a6c78a9db1a9d9bf0a36c7fdf9ed117bf163/zstandard-0.22.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1d67d0d53d2a138f9e29d8acdabe11310c185e36f0a848efa104d4e40b808e4", size = 4845899, upload-time = "2023-11-01T06:52:35.365Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c5/d5f4521c5444f3d1e8bd0dc32b40766b0de1950eee46c734a3a98ddc8f96/zstandard-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:39b2853efc9403927f9065cc48c9980649462acbdf81cd4f0cb773af2fd734bc", size = 4920875, upload-time = "2023-11-01T06:52:55.355Z" }, + { url = "https://files.pythonhosted.org/packages/f9/7a/2702eb29c3851a04f42e63443420520b392e432bdb30cb21c11dac1f5eb3/zstandard-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8a1b2effa96a5f019e72874969394edd393e2fbd6414a8208fea363a22803b45", size = 5451783, upload-time = "2023-11-01T06:53:15.066Z" }, + { url = "https://files.pythonhosted.org/packages/08/3e/4b78e8378dfdb25f51a1123ec4e44f98a490d58ccf51104a3a9c6f821eb1/zstandard-0.22.0-cp312-cp312-win32.whl", hash = "sha256:88c5b4b47a8a138338a07fc94e2ba3b1535f69247670abfe422de4e0b344aae2", size = 442885, upload-time = "2023-11-01T06:53:19.076Z" }, + { url = "https://files.pythonhosted.org/packages/b6/91/15feaf0d389f7d696ed0fbd75b51c6cbc04e9b8b474292a3bb2b5157e093/zstandard-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:de20a212ef3d00d609d0b22eb7cc798d5a69035e81839f549b538eff4105d01c", size = 511809, upload-time = "2023-11-01T06:53:22.745Z" }, +] diff --git a/e2e/crossbuild/zstandard/zstandard_diff_test.yaml b/e2e/crossbuild/zstandard/zstandard_diff_test.yaml new file mode 100644 index 000000000..7eb22a14e --- /dev/null +++ b/e2e/crossbuild/zstandard/zstandard_diff_test.yaml @@ -0,0 +1,7 @@ +schemaVersion: 2.0.0 + +commandTests: + - name: cross-compiled zstandard matches the official wheel + exitCode: 0 + command: /app + expectedOutput: ["PASS: identical compressed output, cross-decompression OK"] From 62b3a96d9ed2b37b1d8fa6d78edce1cc50b95784 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 7 Aug 2026 11:29:24 -0600 Subject: [PATCH 017/103] crossbuild helper --- uv/private/pep517_whl/build_helper.py | 525 +++++++++++++++++- uv/private/pep517_whl/cc_layer.bzl | 2 +- uv/private/pep517_whl/tests/BUILD.bazel | 12 + .../tests/build_helper_cross_test.py | 92 +++ 4 files changed, 608 insertions(+), 23 deletions(-) create mode 100644 uv/private/pep517_whl/tests/build_helper_cross_test.py diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index afc641e99..97df4e73b 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -12,9 +12,11 @@ import importlib import os import platform as _platform +import re import shlex import shutil import sys +import textwrap from os import chmod, defpath, listdir, makedirs, path, pathsep from subprocess import CalledProcessError, check_call, check_output, STDOUT, run from tempfile import TemporaryFile @@ -37,14 +39,39 @@ # to locate sibling tools and resources. Clang does so under -no-canonical-prefixes: # https://github.com/llvm/llvm-project/blob/llvmorg-22.1.4/clang/tools/driver/driver.cpp#L63-L78 _DEBUG_FLAG = "-fdebug-default-version=4" + +# gcc_toolchain's tool_path for the cpp_compile/cpp_link_dynamic_library +# actions is plain "gcc", not "g++": Bazel toolchains dispatch C vs C++ by +# file extension/-x, not by driver name, and gcc_toolchain's link flags carry +# no -lstdc++. `-static-libstdc++` alone is a no-op there — that flag only +# modifies an *implicit* libstdc++ link that only the "g++" argv[0] spec adds +# in the first place. `-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic` forces the static +# archive regardless of driver name, making a C++ extension self-contained +# instead of depending on the target's libstdc++.so.6 matching ours — and +# without it, cross-arch (and even native) C++ extensions can build and even +# import (borrowing symbols another already-loaded .so happened to pull in) +# yet fail once nothing else in the process provides them. GNU-ld-only +# syntax: skipped on Darwin, where clang++ already links libc++ implicitly. +_STATIC_LIBSTDCXX_FLAGS = ("-Wl,-Bstatic", "-lstdc++", "-Wl,-Bdynamic") + _COMPILER_WRAPPER = """#!/usr/bin/env python3 import os import sys filtered_args = [arg for arg in sys.argv[1:] if arg != "{debug_flag}"] +is_cxx = {is_cxx!r} +is_darwin = {is_darwin!r} +is_link = "-c" not in filtered_args +if is_cxx and is_link and not is_darwin: + filtered_args = filtered_args + {static_libstdcxx_flags!r} sysroot = {sysroot!r} if sysroot and "-isysroot" not in filtered_args: filtered_args = ["-isysroot", sysroot] + filtered_args + +# argv[0] must be the compiler's full path, not just its basename: GCC's +# driver resolves prefix-relative resources (libstdc++.a, LTO plugins) off +# argv[0], not /proc/self/exe. A basename-only argv[0] makes it silently +# search relative to our wrapper's own directory instead and miss them. os.execv("{compiler_path}", ["{compiler_path}"] + filtered_args) """ @@ -90,6 +117,9 @@ drop_prefixes = {drop_prefixes!r} lld_path = {lld_path!r} debug_flag = {debug_flag!r} +is_cxx = {is_cxx!r} +is_darwin = {is_darwin!r} +static_libstdcxx_flags = {static_libstdcxx_flags!r} is_link = "-c" not in args filtered = [] @@ -105,6 +135,29 @@ filtered.append(a) i += 1 +# Standalone (non-"-shared") executables built by this cross toolchain are +# never the actual wheel deliverable — always some build tool's own +# throwaway sanity-check/feature-probe binary (e.g. meson's own compiler +# check, or a project's cc.run() call) that an exe_wrapper immediately +# executes under QEMU. Dynamically-linked target-arch PIE binaries hit a +# real qemu-user/glibc bug there ("Inconsistency detected by ld.so: +# ... DT_VERSYM ... Assertion failed") on process startup's own relocation +# path, verified independent of any toolchain mismatch (a single-toolchain +# hello-world binary reproduces it); statically linking sidesteps it +# entirely, since it never touches ld.so's dynamic-executable-startup path. +# The actual .so deliverables this wrapper also builds are unaffected — +# they always pass "-shared" and load via dlopen()'s own, unrelated path. +# Mutually exclusive with the static-libstdc++-only trick below: a trailing +# "-Wl,-Bdynamic" there would undo a preceding bare "-static" for whatever +# the driver appends after our args (libc included), reintroducing the same +# bug — and full static linking already covers libstdc++ too, making that +# partial trick redundant for a binary that's never shipped anyway. +is_shared = "-shared" in filtered +if is_link and not is_shared and not is_darwin: + filtered.append("-static") +elif is_cxx and is_link and not is_darwin: + filtered.extend(static_libstdcxx_flags) + if is_link and lld_path: os.environ.setdefault("PATH", "") os.environ["PATH"] = os.path.dirname(lld_path) + os.pathsep + os.environ["PATH"] @@ -112,7 +165,7 @@ filtered.insert(0, "-fuse-ld=lld") real = {compiler_path!r} -os.execv(real, [os.path.basename(real)] + wrapper_flags + filtered) +os.execv(real, [real] + wrapper_flags + filtered) """ @@ -176,22 +229,37 @@ def _local_cxx_companion(current: Optional[str], compiler_path: str) -> str: return compiler_path +def _write_generated_file(file_path: str, content: str, executable: bool = False) -> str: + """Write content to file_path, creating parent dirs. Returns file_path for chaining.""" + makedirs(path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + f.write(content) + if executable: + chmod(file_path, 0o755) + return file_path + + def _make_compiler_wrapper( tmpdir: str, name: str, compiler_path: str, sysroot: Optional[str] = None, + is_cxx: bool = False, + is_darwin: bool = False, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) - makedirs(path.dirname(wrapper), exist_ok=True) - with open(wrapper, "w") as f: - f.write(_COMPILER_WRAPPER.format( + return _write_generated_file( + wrapper, + _COMPILER_WRAPPER.format( debug_flag=_DEBUG_FLAG, compiler_path=compiler_path, sysroot=sysroot, - )) - chmod(wrapper, 0o755) - return wrapper + is_cxx=is_cxx, + is_darwin=is_darwin, + static_libstdcxx_flags=list(_STATIC_LIBSTDCXX_FLAGS), + ), + executable=True, + ) def _get_wrapper_flags(cflags: str) -> list[str]: @@ -234,11 +302,13 @@ def _make_cross_compiler_wrapper( compiler_path: str, wrapper_flags: list[str], lld_path: Optional[str] = None, + is_cxx: bool = False, + is_darwin: bool = False, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) - makedirs(path.dirname(wrapper), exist_ok=True) - with open(wrapper, "w") as f: - f.write(_CROSS_COMPILER_WRAPPER.format( + return _write_generated_file( + wrapper, + _CROSS_COMPILER_WRAPPER.format( compiler_path=compiler_path, wrapper_flags=wrapper_flags, drop_exact=sorted(_DROP_LINKER_FLAGS), @@ -246,9 +316,12 @@ def _make_cross_compiler_wrapper( drop_prefixes=list(_DROP_LINKER_PREFIXES), lld_path=lld_path, debug_flag=_DEBUG_FLAG, - )) - chmod(wrapper, 0o755) - return wrapper + is_cxx=is_cxx, + is_darwin=is_darwin, + static_libstdcxx_flags=list(_STATIC_LIBSTDCXX_FLAGS), + ), + executable=True, + ) def _override_tool(env: Dict[str, str], key: str, wrapper: str) -> None: @@ -263,7 +336,7 @@ def _override_tool(env: Dict[str, str], key: str, wrapper: str) -> None: def _absolutize_tool_paths(env: Dict[str, str]) -> None: """Resolve toolchain paths before the backend changes cwd.""" - for key in ("JAVA_HOME", "JAVA"): + for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): value = env.get(key) if value: env[key] = _absolutize_path(value) @@ -282,6 +355,8 @@ def _compiler_env( tmpdir: str, execroot_marker: Optional[str] = None, cross: bool = False, + target_os: str = "", + target_cpu: str = "", ) -> Dict[str, str]: env = dict(os.environ) if execroot_marker: @@ -301,14 +376,48 @@ def _compiler_env( "RUNFILES_MANIFEST_ONLY", ): env.pop(key, None) + # A build dependency's console-script wrappers resolve their own bundled + # binary via Python import machinery (ninja, meson), so they never need + # PATH. Some (maturin) instead ship a plain wheel-data script under + # /bin — rules_py's venv assembly only merges each + # dep's lib/site-packages into the shared venv, not its bin/, so that + # script never lands on sys.path or PATH by itself. Its files are still + # real runfiles under the runfiles root, just not indexed anywhere else, + # so find it the same way Bazel's own runfiles resolution would: walk + # the runfiles tree for a whl_install output's bin/ directory. + bin_dirs = [] + for runfiles_root in sys.path: + if not path.isdir(runfiles_root) or "runfiles" not in runfiles_root: + continue + for entry in os.listdir(runfiles_root): + bin_dir = path.join(runfiles_root, entry, "actual_install.install", "bin") + if path.isdir(bin_dir): + bin_dirs.append(bin_dir) + env["PATH"] = pathsep.join([ path.dirname(sys.executable), + *bin_dirs, env.get("PATH", defpath), ]) env["TMP"] = tmpdir env["TEMP"] = tmpdir env["TEMPDIR"] = tmpdir + # python-build-standalone interpreters (our python_interpreters toolchain) + # bake their *original build-time* prefix into sysconfig's LIBDIR + # (observed: "/install/lib", nonexistent once relocated into a Bazel + # toolchain) — harmless for pure-Python builds, but anything that needs + # to actually link against libpythonX.Y (meson's own Cython compiler + # sanity check does, to link its transpiled-and-compiled test program) + # fails with "cannot find -lpythonX.Y". The toolchain's own pkg-config + # file resolves paths relative to itself instead (${pcfiledir}/../..), + # so pointing PKG_CONFIG_PATH at it sidesteps the broken sysconfig value + # entirely for any tool that tries pkg-config before falling back to it. + interpreter_root = path.dirname(path.dirname(path.realpath(sys.executable))) + pkgconfig_dir = path.join(interpreter_root, "lib", "pkgconfig") + if path.isdir(pkgconfig_dir): + env["PKG_CONFIG_PATH"] = pathsep.join([pkgconfig_dir, env.get("PKG_CONFIG_PATH", "")]).rstrip(pathsep) + # Bazel expands tool paths relative to the execroot. Resolve them while the # helper still runs there; bare tool names deliberately remain on PATH. _absolutize_tool_paths(env) @@ -319,15 +428,25 @@ def _compiler_env( cxx_path = _local_cxx_companion(env.get("CXX"), cxx_path) sysroot = _darwin_sysroot() + is_darwin = target_os == "darwin" if cross else _platform.system() == "Darwin" if cross: wrapper_flags = _get_wrapper_flags(env.get("CFLAGS", "")) lld_path = _find_lld(cc_path) - cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path) - cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path) + cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path, is_darwin=is_darwin) + cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path, is_cxx=True, is_darwin=is_darwin) + + # gcc_toolchain's own layout (/xbin/gcc, /sysroot/...): + # a target-arch binary linked by this compiler needs ITS glibc/loader + # to run, not whatever the exec host or an unrelated toolchain (e.g. + # our python_interpreters build) happens to provide. Only meson's + # exe_wrapper (see _generate_meson_cross_file) uses this today. + target_gcc_sysroot = path.join(path.dirname(path.dirname(cc_path)), "sysroot") + if not is_darwin and path.isdir(target_gcc_sysroot): + env["RULES_PY_TARGET_GCC_SYSROOT"] = target_gcc_sysroot else: - cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot) - cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot) + cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot, is_darwin=is_darwin) + cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot, is_cxx=True, is_darwin=is_darwin) env.setdefault("CC", cc) env.setdefault("CXX", cxx) @@ -346,6 +465,10 @@ def _compiler_env( env["_PYTHON_SYSCONFIGDATA_NAME"] = module_name env["PYTHONPATH"] = sysconfig_dir + pathsep + env.get("PYTHONPATH", "") + if target_os and target_cpu: + site_dir = _generate_cross_site(tmpdir, target_os, target_cpu) + env["PYTHONPATH"] = site_dir + pathsep + env.get("PYTHONPATH", "") + # MPI builds (e.g. mpi4py) consult $MPICC before searching PATH, so a # plain C compiler here would shadow the real mpicc. Only set it when # a system mpicc exists, wrapped to keep the debug-flag stripping. @@ -363,6 +486,26 @@ def _compiler_env( ]: _override_tool(env, key, wrapper) + # maturin's PEP 517 wrapper (and setuptools-rust) locate cargo via + # shutil.which("cargo"), not just $CARGO — otherwise they fall back to + # auto-installing a Rust toolchain via the puccinialin package, which + # isn't one of our declared build deps. + cargo_path = env.get("CARGO") + if cargo_path: + env["PATH"] = pathsep.join([path.dirname(cargo_path), env.get("PATH", defpath)]) + + # Cargo defaults its registry cache to $CARGO_HOME (~/.cargo), which + # in the sandbox is a read-only path outside the action's writable + # tree — give it a real, writable home instead. + cargo_home = path.join(tmpdir, ".cargo_home") + makedirs(cargo_home, exist_ok=True) + env.setdefault("CARGO_HOME", cargo_home) + + # CMake's find_program(ANT_EXECUTABLE) (jpype1 et al.) needs ant on PATH. + ant_bin_dir = env.pop("RULES_PY_ANT_BIN_DIR", None) + if ant_bin_dir: + env["PATH"] = pathsep.join([ant_bin_dir, env.get("PATH", defpath)]) + return env @@ -386,9 +529,305 @@ def _load_pyproject_data(worktree: str) -> Optional[Dict[str, object]]: return None -def _legacy_metadata_conflicts_with_pyproject(worktree: str) -> bool: +# Our lowercase target_os values, Title-Cased for whatever tool wants that +# spelling: CMAKE_SYSTEM_NAME and the faked platform.system()/os.uname() +# sysname both use it. +_TITLECASE_OS = {"linux": "Linux", "darwin": "Darwin", "windows": "Windows"} + + +def _generate_cmake_toolchain_file( + tmpdir: str, + build_env: Dict[str, str], + target_os: str, + target_cpu: str, +) -> str: + """Cross toolchain file for scikit-build-core/CMake. + + scikit-build-core's cross-compile detection only covers macOS + ARCHFLAGS/CMAKE_OSX_ARCHITECTURES (see its builder.py); a generic + Linux-arch cross build gets none of that, so CMake configures as a + native build. It still compiles/links fine off $CC/$CXX, but + CMAKE_STRIP falls back to `find_program`'s host `strip` rather than + ours, which then rejects the foreign-arch .so ("Unable to recognise + the format of the input file"). Setting CMAKE_SYSTEM_NAME also puts + CMake into real CMAKE_CROSSCOMPILING mode. + """ + return _write_generated_file( + path.join(tmpdir, "cross_toolchain.cmake"), + textwrap.dedent("""\ + set(CMAKE_SYSTEM_NAME {system}) + set(CMAKE_SYSTEM_PROCESSOR {processor}) + set(CMAKE_C_COMPILER {cc}) + set(CMAKE_CXX_COMPILER {cxx}) + set(CMAKE_AR {ar}) + set(CMAKE_STRIP {strip}) + """).format( + system=_TITLECASE_OS.get(target_os, target_os), + processor=target_cpu, + cc=build_env["CC"], + cxx=build_env["CXX"], + ar=build_env.get("AR", "ar"), + strip=build_env.get("STRIP", "strip"), + ), + ) + + +_MESON_EXE_WRAPPER = """#!/usr/bin/env python3 +import os +import sys + +qemu_ld_prefix = {qemu_ld_prefix!r} +if qemu_ld_prefix: + os.environ["QEMU_LD_PREFIX"] = qemu_ld_prefix +os.execv(sys.argv[1], sys.argv[1:]) +""" + + +def _generate_meson_cross_file( + tmpdir: str, + build_env: Dict[str, str], + target_os: str, + target_cpu: str, +) -> str: + """Cross file for meson-python. + + meson-python only auto-synthesizes a cross file for macOS ARCHFLAGS, + cibuildwheel/Android, and iOS (see its __init__.py); a generic + Linux-arch cross build gets none of that and configures as a native + build, so meson tries to run its compiler sanity-check binary and + fails with "not runnable". `needs_exe_wrapper` alone only covers + meson's OWN compiler sanity checks (which just skip running anything + when it's set) — some projects' meson.build also call `cc.run()` + directly (numpy does, for a runtime feature check), which instead + hard-errors ("Can not run test applications in this cross + environment") unless an actual `exe_wrapper` program is configured. + binfmt_misc on this host already runs target-arch ELFs transparently + (verified: qemu-aarch64 is registered), so the wrapper mostly just + needs to exec straight through — it's meson's contract that needs a + program here, not anything the emulation itself is missing. The one + thing it does add is QEMU_LD_PREFIX, pointed at the gcc cross + toolchain's own sysroot: meson's *compiler* sanity check links a tiny + test binary against that sysroot's glibc, and without QEMU_LD_PREFIX + qemu-user falls back to searching the exec host's own filesystem for + ld-linux-aarch64.so.1 (an amd64 Linux box has none) — an entirely + different failure mode than the earlier "not runnable" one, but the + same root cause of not telling qemu-user which glibc actually matches. + """ + exe_wrapper = _write_generated_file( + path.join(tmpdir, "meson_exe_wrapper.py"), + _MESON_EXE_WRAPPER.format(qemu_ld_prefix=build_env.get("RULES_PY_TARGET_GCC_SYSROOT", "")), + executable=True, + ) + return _write_generated_file( + path.join(tmpdir, "cross_file.ini"), + textwrap.dedent("""\ + [binaries] + c = '{cc}' + cpp = '{cxx}' + ar = '{ar}' + strip = '{strip}' + exe_wrapper = ['{exe_wrapper}'] + + [host_machine] + system = '{system}' + cpu_family = '{cpu_family}' + cpu = '{cpu}' + endian = 'little' + + [properties] + needs_exe_wrapper = true + """).format( + cc=build_env["CC"], + cxx=build_env["CXX"], + exe_wrapper=exe_wrapper, + ar=build_env.get("AR", "ar"), + strip=build_env.get("STRIP", "strip"), + system=target_os, + cpu_family=target_cpu, + cpu=target_cpu, + ), + ) + + +_RUST_TARGET_OS = {"linux": "unknown-linux-gnu", "darwin": "apple-darwin"} + +_RUSTC_WRAPPER = """#!/usr/bin/env python3 +import os +import sys + +os.execv({rustc!r}, [{rustc!r}, "--sysroot", {sysroot!r}] + sys.argv[1:]) +""" + + +def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> str: + """Symlink-merge the target toolchain's sysroot with the host's rust-std. + + A rules_rust cross rust_toolchain's sysroot only bundles the exec + platform's LLVM shared libs (needed to *run* rustc), not its rust-std — + cargo still needs a real exec-platform rust-std to compile build + scripts/proc-macros, which are always host artifacts regardless of + --target. rustup-based cross setups don't hit this because one rustc + install holds every added target's std side by side; recreate that here + by merging the two Bazel-fetched, single-target sysroots into one. + """ + target_sysroot = path.dirname(path.dirname(target_rustc)) + merged = path.join(tmpdir, ".rust_sysroot") + if path.exists(merged): + return merged + makedirs(merged) + for entry in os.listdir(target_sysroot): + if entry != "lib": + os.symlink(path.join(target_sysroot, entry), path.join(merged, entry)) + merged_lib = path.join(merged, "lib") + makedirs(merged_lib) + for entry in os.listdir(path.join(target_sysroot, "lib")): + if entry != "rustlib": + os.symlink(path.join(target_sysroot, "lib", entry), path.join(merged_lib, entry)) + merged_rustlib = path.join(merged_lib, "rustlib") + makedirs(merged_rustlib) + host_rustlib = path.join(host_sysroot, "lib", "rustlib") + target_rustlib = path.join(target_sysroot, "lib", "rustlib") + overridden = set() + for entry in os.listdir(host_rustlib): + os.symlink(path.join(host_rustlib, entry), path.join(merged_rustlib, entry)) + overridden.add(entry) + for entry in os.listdir(target_rustlib): + if entry not in overridden: + os.symlink(path.join(target_rustlib, entry), path.join(merged_rustlib, entry)) + return merged + + +def _configure_cargo_cross_env(build_env: Dict[str, str], tmpdir: str, target_os: str, target_cpu: str) -> None: + """Cross env vars for maturin/setuptools-rust (Cargo-driven PyO3 builds). + + Cargo has no cross auto-detection to piggyback on the way meson-python's + macOS ARCHFLAGS case does — a cross build always needs an explicit + --target, and cargo has no idea which linker can actually produce a + binary for that target unless told via CARGO_TARGET__LINKER, so + it falls back to $CC (the *host* driver) and fails at the link step. + """ + os_suffix = _RUST_TARGET_OS.get(target_os, target_os) + triple = "{}-{}".format(target_cpu, os_suffix) + build_env["CARGO_BUILD_TARGET"] = triple + linker_var = "CARGO_TARGET_{}_LINKER".format(triple.upper().replace("-", "_")) + build_env[linker_var] = build_env["CC"] + + # PyO3's build script (pyo3-ffi) refuses to cross-compile without either + # an abi3-py3* feature or an explicit target Python version — maturin + # works around this itself (PYO3_CONFIG_FILE), but setuptools-rust just + # shells out to plain `cargo rustc` with no PyO3-specific help at all. + # Harmless to set even for non-PyO3 crates (simply unused). + build_env["PYO3_CROSS_PYTHON_VERSION"] = "{}.{}".format(sys.version_info.major, sys.version_info.minor) + + host_sysroot = build_env.get("RULES_PY_RUST_HOST_SYSROOT") + if host_sysroot: + merged_sysroot = _merge_rust_sysroot(tmpdir, build_env["RUSTC"], host_sysroot) + build_env["RUSTC"] = _write_generated_file( + path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), + _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=merged_sysroot), + executable=True, + ) + + # maturin's PEP 517 wrapper passes -i by default so it + # can inspect the target interpreter's ABI. In cross mode it refuses to + # actually execute that path (it may not be host-runnable) and instead + # name-parses it for a "pythonX.Y"-shaped basename — but our venv's + # sys.executable is the generic "python" symlink, which fails that + # parse. Point it at the versioned sibling instead, which the venv's + # bin dir (already on $PATH) also provides. + build_env["MATURIN_PEP517_ARGS"] = "--interpreter python{}.{}".format( + sys.version_info.major, + sys.version_info.minor, + ) + + +_SITECUSTOMIZE_TEMPLATE = """\ +import os +import platform +import collections + +_machine = {machine!r} +_sysname = {sysname!r} + +os.uname = lambda: os.uname_result((_sysname, "build", "", "", _machine)) + +# CS_GLIBC_LIB_VERSION otherwise leaks the *host's* glibc version, which +# feeds manylinux-tag determination in pip/packaging/subprocess. +if hasattr(os, "confstr"): + _real_confstr = os.confstr + + def _confstr(name): + if name == "CS_GLIBC_LIB_VERSION": + return "glibc_unknown" + return _real_confstr(name) + + os.confstr = _confstr + +# platform.uname_result.processor is a lazily-computed property that falls +# back to the real host on this field, so build our own namedtuple instead +# of the real type (mirrors crossenv's platform-patch.py). +_PlatformUname = collections.namedtuple("uname_result", "system node release version machine processor") +_platform_uname = _PlatformUname(_sysname, "build", "", "", _machine, _machine) + +platform.uname = lambda: _platform_uname +platform.system = lambda: _sysname +platform.machine = lambda: _machine +platform.libc_ver = lambda *a, **k: ("", "") + +# packaging.tags._linux_platforms derives its arch from sysconfig.get_platform() +# (already correctly faked via $_PYTHON_HOST_PLATFORM), not from platform.machine() +# — no patch needed there. Only the manylinux-compatibility gate below is ours to +# set, via the top-level _manylinux hook packaging._manylinux itself looks for. +""" + +_MANYLINUX_HOOK = """\ +# Cross build: we have no verified manylinux compatibility for the target +# (no target glibc version is threaded through yet), so refuse rather than +# silently claim host-arch manylinux tags are usable on the target. +def manylinux_compatible(tag_major, tag_minor, tag_arch): + return False + + +manylinux1_compatible = False +manylinux2010_compatible = False +manylinux2014_compatible = False +""" + + +def _generate_cross_site(tmpdir: str, target_os: str, target_cpu: str) -> str: + """sitecustomize + _manylinux hook faking the target's runtime identity. + + sysconfig.get_platform()/_get_sysconfigdata_name() are already faked via + env vars that CPython itself reads (_PYTHON_HOST_PLATFORM, + _PYTHON_SYSCONFIGDATA_NAME) — no patching needed there. But some build + backends and package setup.py scripts branch on os.uname()/ + platform.machine() directly (e.g. to pick vectorized/arch-specific code + paths), which env vars can't reach. sitecustomize.py runs automatically + on interpreter startup — before any backend code executes — and patches + the already-imported os/platform modules in place. Modeled on crossenv's + os-patch.py/platform-patch.py/_manylinux.py, minus what rules_py doesn't + need (dual venvs, distutils.sysconfig, importlib.machinery interception). + """ + site_dir = path.join(tmpdir, ".cross_site") + _write_generated_file( + path.join(site_dir, "sitecustomize.py"), + _SITECUSTOMIZE_TEMPLATE.format(machine=target_cpu, sysname=_TITLECASE_OS.get(target_os, target_os)), + ) + _write_generated_file(path.join(site_dir, "_manylinux.py"), _MANYLINUX_HOOK) + return site_dir + + +_REQUIREMENT_NAME_RE = re.compile(r"^\s*([A-Za-z0-9][A-Za-z0-9._-]*)") + + +def _requirement_name(requirement: str) -> str: + """PEP 508 requirement string -> bare package name, extras/specifiers/markers stripped.""" + match = _REQUIREMENT_NAME_RE.match(requirement) + return match.group(1) if match else "" + + +def _legacy_metadata_conflicts_with_pyproject(worktree: str, pyproject_data: Optional[Dict[str, object]]) -> bool: setup_py = path.join(worktree, "setup.py") - pyproject_data = _load_pyproject_data(worktree) if not (pyproject_data and path.exists(setup_py)): return False @@ -525,9 +964,17 @@ def _validate_wheel_platform(wheel_filename: str) -> None: # and re-point CC/CXX/etc. through wrapper scripts in tmp_root so the # Bazel-supplied workspace-relative compiler paths survive the cwd # change into the worktree. -build_env = _compiler_env(tmp_root, opts.execroot_marker, cross=opts.cross) +build_env = _compiler_env( + tmp_root, + opts.execroot_marker, + cross=opts.cross, + target_os=opts.target_os, + target_cpu=opts.target_cpu, +) -if _legacy_metadata_conflicts_with_pyproject(t): +pyproject_data = _load_pyproject_data(t) + +if _legacy_metadata_conflicts_with_pyproject(t, pyproject_data): print( "Warning: falling back to setup.py because pyproject.toml omits dynamic dependency metadata " "that setuptools still reads from setup.py/setup.cfg.", @@ -564,6 +1011,40 @@ def _validate_wheel_platform(wheel_filename: str) -> None: "--skip-dependency-check", "--outdir", outdir, ] + build_system = (pyproject_data or {}).get("build-system", {}) + build_backend = build_system.get("build-backend") if isinstance(build_system, dict) else None + + # meson-python has no auto-detection for a missing system BLAS/LAPACK + # the way it does for a missing cross-file (see below) — a package that + # needs one (numpy) has to pass its own -Dblas=none/-Dlapack=none (or + # similar) setup-args, and needs them for a native build here too, since + # our build venv never has a system BLAS/LAPACK either. meson-python's + # "setup-args" config-setting is list-typed, and `build`'s -C flag + # accumulates repeated keys into a list, so this can't collide with the + # --cross-file argument the cross branch below adds separately. + if build_backend == "mesonpy": + for arg in shlex.split(build_env.get("RULES_PY_MESON_SETUP_ARGS", "")): + cmd += ["-C", "setup-args=" + arg] + + if opts.cross: + build_requires = build_system.get("requires", []) if isinstance(build_system, dict) else [] + if not isinstance(build_requires, list): + build_requires = [] + # setuptools-rust has no build-backend value of its own — it's just + # setuptools.build_meta with an extra requirement — and no --target + # flag of its own either: it shells out to plain `cargo rustc` and + # relies on $CARGO_BUILD_TARGET, same as maturin does once we set it. + uses_setuptools_rust = build_backend in _SETUPTOOLS_BACKENDS and any( + isinstance(req, str) and _requirement_name(req) == "setuptools-rust" for req in build_requires + ) + if build_backend == "mesonpy": + cross_file = _generate_meson_cross_file(tmp_root, build_env, opts.target_os, opts.target_cpu) + cmd += ["-C", "setup-args=--cross-file=" + cross_file] + elif build_backend == "scikit_build_core.build": + toolchain = _generate_cmake_toolchain_file(tmp_root, build_env, opts.target_os, opts.target_cpu) + cmd += ["-C", "cmake.toolchain-file=" + toolchain] + elif (build_backend == "maturin" or uses_setuptools_rust) and build_env.get("CARGO"): + _configure_cargo_cross_env(build_env, tmp_root, opts.target_os, opts.target_cpu) else: print("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!", file=sys.stderr) raise SystemExit(1) diff --git a/uv/private/pep517_whl/cc_layer.bzl b/uv/private/pep517_whl/cc_layer.bzl index 74a0da98d..9a0b2841d 100644 --- a/uv/private/pep517_whl/cc_layer.bzl +++ b/uv/private/pep517_whl/cc_layer.bzl @@ -11,7 +11,7 @@ _CC_DISABLED_FEATURES = [ "layering_check", ] -_PATH_FLAG_PREFIXES = ("-I", "-L", "-isysroot", "-iwithsysroot", "-B") +_PATH_FLAG_PREFIXES = ("-I", "-L", "-isysroot", "-iwithsysroot", "-isystem", "-B") CC_LAYER_ATTRS = { "_os_linux": attr.label(default = "@platforms//os:linux"), diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index 3f4d9346f..7c886f3a5 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -26,6 +26,18 @@ py_test( deps = ["//uv/private/pep517_whl:memory_monitor"], ) +py_test( + name = "build_helper_cross_test", + srcs = ["build_helper_cross_test.py"], + data = ["//uv/private/pep517_whl:build_helper.py"], + main = "build_helper_cross_test.py", + target_compatible_with = ["@platforms//os:linux"], + deps = [ + "@pypi//build", + "@pypi//setuptools", + ], +) + py_test( name = "local_cxx_companion_test", srcs = ["local_cxx_companion_test.py"], diff --git a/uv/private/pep517_whl/tests/build_helper_cross_test.py b/uv/private/pep517_whl/tests/build_helper_cross_test.py new file mode 100644 index 000000000..b120d3c3e --- /dev/null +++ b/uv/private/pep517_whl/tests/build_helper_cross_test.py @@ -0,0 +1,92 @@ +"""Verify build_helper.py's cross-build runtime-identity faking end to end. + +A package's setup.py can branch on platform.machine()/os.uname() directly +(e.g. to pick a vectorized code path) — sysconfig.get_platform() env vars +don't reach that. This drives build_helper.py exactly as sdist_build's +generated build_tool does (a plain subprocess against a real sdist), so it +also exercises exactly what pycross-distutils-probe/uv-sdist-mpicc rely on: +build_helper.py must stay importable as a bare script with no sibling-module +dependencies, since those tests find it by path and run it standalone. +""" + +import os +import subprocess +import sys +import tarfile +import tempfile + +_SETUP_PY = """\ +import os +import platform +import sys + +from setuptools import setup + +expected = os.environ.get("EXPECTED_MACHINE") +if expected is not None: + if platform.machine() != expected: + sys.exit("WRONG_PLATFORM_MACHINE: saw {!r}, expected {!r}".format(platform.machine(), expected)) + if os.uname().machine != expected: + sys.exit("WRONG_UNAME_MACHINE: saw {!r}, expected {!r}".format(os.uname().machine, expected)) + if os.environ.get("EXPECT_MANYLINUX_DISABLED") == "1": + import _manylinux + if _manylinux.manylinux_compatible(2, 17, expected): + sys.exit("MANYLINUX_NOT_DISABLED") + +setup(name="cross_site_probe", version="1.0", py_modules=[]) +""" + + +def _make_sdist(workdir: str) -> str: + pkgdir = os.path.join(workdir, "cross_site_probe-1.0") + os.makedirs(pkgdir) + with open(os.path.join(pkgdir, "setup.py"), "w") as f: + f.write(_SETUP_PY) + sdist = os.path.join(workdir, "cross_site_probe-1.0.tar.gz") + with tarfile.open(sdist, "w:gz") as archive: + archive.add(pkgdir, arcname="cross_site_probe-1.0") + return sdist + + +def _run(helper: str, sdist: str, workdir: str, label: str, env: dict, args: list) -> None: + outdir = os.path.join(workdir, "out-" + label) + full_env = {"HOME": workdir, "PATH": "/usr/bin:/bin"} + full_env.update(env) + result = subprocess.run( + [sys.executable, helper, *args, sdist, outdir], + capture_output=True, + cwd=workdir, + env=full_env, + text=True, + ) + if result.returncode: + raise AssertionError("build_helper failed for {}:\n{}\n{}".format(label, result.stdout, result.stderr)) + + +def main() -> None: + workdir = tempfile.mkdtemp(dir=os.environ["TEST_TMPDIR"]) + sdist = _make_sdist(workdir) + helper = os.path.join(os.path.dirname(os.path.dirname(__file__)), "build_helper.py") + + real_machine = os.uname().machine + fake_machine = "aarch64" if real_machine != "aarch64" else "x86_64" + + # Cross build: setup.py must see the FAKED target arch, not the host's, + # and manylinux compatibility must be refused for it. + _run( + helper, + sdist, + workdir, + "cross", + {"EXPECTED_MACHINE": fake_machine, "EXPECT_MANYLINUX_DISABLED": "1"}, + ["--cross", "--target-os", "linux", "--target-cpu", fake_machine], + ) + + # Native build: no faking involved — setup.py must see the real host arch. + _run(helper, sdist, workdir, "native", {"EXPECTED_MACHINE": real_machine}, []) + + print("OK") + + +if __name__ == "__main__": + main() From 4965c22b3a36113471fb573ec72df699390bae5a Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 7 Aug 2026 11:37:12 -0600 Subject: [PATCH 018/103] typing e2e --- .../uv_gazelle_778.gazelle_python.yaml | 1 - e2e/cases/uv-deps-650/crossbuild/BUILD.bazel | 278 --- e2e/cases/uv-deps-650/crossbuild/__main__.py | 5 - .../uv-deps-650/crossbuild/check_so_suffix.sh | 25 - .../snapshots/app_amd64_layers_listing.yaml | 1943 ----------------- .../snapshots/app_arm64_layers_listing.yaml | 1943 ----------------- .../crossbuild/test_crossbuild_pyc.sh | 25 - .../crossbuild/test_exec_toolchain.sh | 56 - e2e/cases/uv-deps-650/setup.MODULE.bazel | 17 - e2e/cases/uv-gazelle-778/BUILD.bazel | 3 +- e2e/cases/uv-sdist-jdk-build/BUILD.bazel | 21 +- 11 files changed, 12 insertions(+), 4305 deletions(-) delete mode 100644 e2e/cases/uv-deps-650/crossbuild/BUILD.bazel delete mode 100644 e2e/cases/uv-deps-650/crossbuild/__main__.py delete mode 100755 e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh delete mode 100644 e2e/cases/uv-deps-650/crossbuild/snapshots/app_amd64_layers_listing.yaml delete mode 100644 e2e/cases/uv-deps-650/crossbuild/snapshots/app_arm64_layers_listing.yaml delete mode 100755 e2e/cases/uv-deps-650/crossbuild/test_crossbuild_pyc.sh delete mode 100755 e2e/cases/uv-deps-650/crossbuild/test_exec_toolchain.sh diff --git a/e2e/cases/snapshots/uv_gazelle_778.gazelle_python.yaml b/e2e/cases/snapshots/uv_gazelle_778.gazelle_python.yaml index 5056bd9a6..d1fa6108d 100644 --- a/e2e/cases/snapshots/uv_gazelle_778.gazelle_python.yaml +++ b/e2e/cases/snapshots/uv_gazelle_778.gazelle_python.yaml @@ -143,7 +143,6 @@ manifest: pkg_resources: setuptools pluggy: pluggy psutil: psutil - psycopg2: psycopg2_binary pycparser: pycparser pydantic: pydantic pydantic_core: pydantic_core diff --git a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel b/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel deleted file mode 100644 index e68e771c2..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/BUILD.bazel +++ /dev/null @@ -1,278 +0,0 @@ -load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") -load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") -load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("@rules_oci//oci:defs.bzl", "oci_image", "oci_image_index") -load("@rules_shell//shell:sh_test.bzl", "sh_test") -load("//tools:asserts.bzl", "assert_tar_listing") -load(":toolchain_test.bzl", "exec_python_path") - -exports_files(["require_cxx_driver.patch"]) - -platform( - name = "arm64_linux", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:aarch64", - ], - flags = [ - "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", - "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", - "--stripopt=--strip-all", - ], -) - -platform( - name = "amd64_linux", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:x86_64", - ], - flags = [ - "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", - "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", - "--stripopt=--strip-all", - ], -) - -py_binary( - name = "app_bin", - srcs = ["__main__.py"], - dep_group = "crossbuild", - main = "__main__.py", - python_version = "3.12", - deps = [ - "@pypi_uv_deps_650//psycopg2_binary", - ], -) - -py_image_layer( - name = "app_layers", - binary = ":app_bin", -) - -platform_transition_filegroup( - name = "amd64_layers", - srcs = [":app_layers"], - target_platform = ":amd64_linux", -) - -assert_tar_listing( - name = "app_amd64_layers", - actual = [":amd64_layers"], - expected = "app_amd64_layers_listing.yaml", - tags = ["skip-on-bazel9"], -) - -platform_transition_filegroup( - name = "arm64_layers", - srcs = [":app_layers"], - target_platform = ":arm64_linux", -) - -assert_tar_listing( - name = "app_arm64_layers", - actual = [":arm64_layers"], - expected = "app_arm64_layers_listing.yaml", - tags = ["skip-on-bazel9"], -) - -oci_image( - name = "image", - # This is defined by an oci.pull() call in /MODULE.bazel - base = "@ubuntu", - entrypoint = ["/{}/app_bin".format(package_name())], - tars = [":app_layers"], -) - -platform_transition_filegroup( - name = "amd64_image", - srcs = [":image"], - target_platform = ":amd64_linux", -) - -platform_transition_filegroup( - name = "arm64_image", - srcs = [":image"], - target_platform = ":arm64_linux", -) - -oci_image_index( - name = "image_index", - images = [ - ":arm64_image", - ":amd64_image", - ], -) - -# ── Test: EXEC_TOOLS_TOOLCHAIN resolves exec-platform Python (analysis-time) ── -# -# Verifies that ctx.toolchains[EXEC_TOOLS_TOOLCHAIN] selects the exec-platform -# Python interpreter even when the target platform is arm64. The unpack.py -# script runs on this interpreter, so exec-platform resolution is the critical -# invariant for hermetic cross-arch wheel installs. - -exec_python_path( - name = "unpack_path", -) - -# A second rule instance whose output is named unpack_path_for_arm64.txt. -# platform_transition_filegroup re-exports its srcs' files unchanged, so the -# source rule's name determines the filename visible in the test's runfiles. -exec_python_path( - name = "unpack_path_for_arm64", -) - -platform_transition_filegroup( - name = "unpack_path_for_arm64_transition", - srcs = [":unpack_path_for_arm64"], - target_platform = ":arm64_linux", -) - -sh_test( - name = "exec_toolchain_resolution_test", - srcs = ["test_exec_toolchain.sh"], - data = [ - ":unpack_path", - ":unpack_path_for_arm64_transition", - ], - target_compatible_with = ["@platforms//os:linux"], -) - -# ── Test: cross-arch whl_install with compile_pyc (build-time) ────────────── -# -# Building arm64_layers on an amd64 host exercises whl_install with -# compile_pyc=True against a non-host target platform. The compileall action -# must use the exec-platform interpreter; if it selects the arm64 interpreter -# instead, the action fails with "Exec format error" and the test fails to build. - -sh_test( - name = "crossbuild_compile_pyc_test", - srcs = ["test_crossbuild_pyc.sh"], - data = [":arm64_layers"], - target_compatible_with = ["@platforms//os:linux"], -) - -# Bazel-version-agnostic cross-arch build coverage. The snapshot tests above -# already build the same layers, but they skip on Bazel 9; this build_test -# keeps the cross-arch whl_install + compile_pyc path exercised everywhere. -build_test( - name = "crossbuild_build_test", - targets = [ - ":amd64_layers", - ":arm64_layers", - ":geohash_amd64_layers", - ":geohash_arm64_layers", - ], -) - -py_binary( - name = "geohash_bin", - srcs = ["geohash_main.py"], - dep_group = "crossbuild", - main = "geohash_main.py", - python_version = "3.12", - deps = [ - "@pypi_uv_deps_650//python_geohash", - ], -) - -platform_transition_filegroup( - name = "geohash_amd64_linux", - srcs = [":geohash_bin"], - target_platform = ":amd64_linux", -) - -platform_transition_filegroup( - name = "geohash_arm64_linux", - srcs = [":geohash_bin"], - target_platform = ":arm64_linux", -) - -# ── Verify .so architecture ── - -py_image_layer( - name = "geohash_layers", - binary = ":geohash_bin", -) - -platform_transition_filegroup( - name = "geohash_amd64_layers", - srcs = [":geohash_layers"], - target_platform = ":amd64_linux", -) - -platform_transition_filegroup( - name = "geohash_arm64_layers", - srcs = [":geohash_layers"], - target_platform = ":arm64_linux", -) - -genrule( - name = "_geohash_amd64_so_arch_check", - srcs = [":geohash_amd64_layers"], - outs = ["_geohash_amd64_so_arch.ok"], - cmd = """ -tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep 'geohash_layers.*\\.tar' | head -1) -$(location check_so_arch.sh) $$tar_file 3e00 -touch $@ -""", - tools = [":check_so_arch.sh"], -) - -genrule( - name = "_geohash_arm64_so_arch_check", - srcs = [":geohash_arm64_layers"], - outs = ["_geohash_arm64_so_arch.ok"], - cmd = """ -tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep 'geohash_layers.*\\.tar' | head -1) -$(location check_so_arch.sh) $$tar_file b700 -touch $@ -""", - tools = [":check_so_arch.sh"], -) - -build_test( - name = "geohash_so_arch_amd64_test", - targets = [":_geohash_amd64_so_arch_check"], -) - -build_test( - name = "geohash_so_arch_arm64_test", - targets = [":_geohash_arm64_so_arch_check"], -) - -# ── Verify .so filename suffix (EXT_SUFFIX / SOABI) ── - -genrule( - name = "_geohash_amd64_so_suffix_check", - srcs = [":geohash_amd64_layers"], - outs = ["_geohash_amd64_so_suffix.ok"], - cmd = """ -tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep 'geohash_layers.*\\.tar' | head -1) -$(location check_so_suffix.sh) $$tar_file cpython-312-x86_64-linux-gnu -touch $@ -""", - tools = [":check_so_suffix.sh"], -) - -genrule( - name = "_geohash_arm64_so_suffix_check", - srcs = [":geohash_arm64_layers"], - outs = ["_geohash_arm64_so_suffix.ok"], - cmd = """ -tar_file=$$(echo $(SRCS) | tr ' ' '\\n' | grep 'geohash_layers.*\\.tar' | head -1) -$(location check_so_suffix.sh) $$tar_file cpython-312-aarch64-linux-gnu -touch $@ -""", - tools = [":check_so_suffix.sh"], -) - -build_test( - name = "geohash_so_suffix_amd64_test", - targets = [":_geohash_amd64_so_suffix_check"], -) - -build_test( - name = "geohash_so_suffix_arm64_test", - targets = [":_geohash_arm64_so_suffix_check"], -) diff --git a/e2e/cases/uv-deps-650/crossbuild/__main__.py b/e2e/cases/uv-deps-650/crossbuild/__main__.py deleted file mode 100644 index 7699804a4..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/__main__.py +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env python3 - -import psycopg2 - -print(psycopg2.__file__) diff --git a/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh b/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh deleted file mode 100755 index d3df61ed3..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -# Check that _geohash.so inside a py_image_layer tar has the correct platform -# suffix in its filename — i.e. EXT_SUFFIX and SOABI reflect the target -# platform, not the exec host. -# -# Usage: check_so_suffix.sh -set -euo pipefail - -tar_file="${1:?usage: check_so_suffix.sh }" -expected="${2:?expected suffix substring, e.g. cpython-312-x86_64-linux-gnu}" - -so_name=$(tar tf "$tar_file" | grep '_geohash.*\.so$' | head -1) -if [ -z "$so_name" ]; then - echo "FAIL: no _geohash*.so in tar $tar_file" - exit 1 -fi - -echo ".so: $so_name" - -if ! echo "$so_name" | grep -q "$expected"; then - echo "FAIL: expected suffix '$expected' not found in filename" - exit 1 -fi - -echo "PASS: $so_name contains '$expected'" diff --git a/e2e/cases/uv-deps-650/crossbuild/snapshots/app_amd64_layers_listing.yaml b/e2e/cases/uv-deps-650/crossbuild/snapshots/app_amd64_layers_listing.yaml deleted file mode 100644 index 4c1de51c0..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/snapshots/app_amd64_layers_listing.yaml +++ /dev/null @@ -1,1943 +0,0 @@ ---- -layer: 0 -files: - - -rwxr-xr-x 0 0 0 4768 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/__init__.py - - -rwxr-xr-x 0 0 0 2922 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/_ipaddress.py - - -rwxr-xr-x 0 0 0 7153 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/_json.py - - -rwxr-xr-x 0 0 0 339185 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/_psycopg.cpython-312-x86_64-linux-gnu.so - - -rwxr-xr-x 0 0 0 18494 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/_range.py - - -rwxr-xr-x 0 0 0 14512 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/errorcodes.py - - -rwxr-xr-x 0 0 0 1425 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/errors.py - - -rwxr-xr-x 0 0 0 6797 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/extensions.py - - -rwxr-xr-x 0 0 0 44215 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/extras.py - - -rwxr-xr-x 0 0 0 6316 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/pool.py - - -rwxr-xr-x 0 0 0 14779 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/sql.py - - -rwxr-xr-x 0 0 0 4870 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/tz.py - - -rwxr-xr-x 0 0 0 4936 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info/METADATA - - -rwxr-xr-x 0 0 0 2238 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info/licenses/LICENSE - - -rwxr-xr-x 0 0 0 9 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info/top_level.txt - - -rwxr-xr-x 0 0 0 17497 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libcom_err-2abe824b.so.2.1 - - -rwxr-xr-x 0 0 0 6489873 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libcrypto-81d66ed9.so.3 - - -rwxr-xr-x 0 0 0 345209 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libgssapi_krb5-497db0c6.so.2.2 - - -rwxr-xr-x 0 0 0 219953 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libk5crypto-b1f99d5c.so.3.1 - - -rwxr-xr-x 0 0 0 17913 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libkeyutils-dfe70bd6.so.1.5 - - -rwxr-xr-x 0 0 0 1018953 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libkrb5-fcafa220.so.3.3 - - -rwxr-xr-x 0 0 0 76873 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libkrb5support-d0bcff84.so.0.1 - - -rwxr-xr-x 0 0 0 60977 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/liblber-568fe118.so.2.0.200 - - -rwxr-xr-x 0 0 0 451425 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libldap-1accf1ee.so.2.0.200 - - -rwxr-xr-x 0 0 0 406817 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libpcre-9513aab5.so.1.2.0 - - -rwxr-xr-x 0 0 0 387497 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libpq-9b38f5e3.so.5.17 - - -rwxr-xr-x 0 0 0 119217 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libsasl2-883649fd.so.3.0.0 - - -rwxr-xr-x 0 0 0 178337 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libselinux-0922c95c.so.1 - - -rwxr-xr-x 0 0 0 1139041 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libssl-81ffa89e.so.3 ---- -layer: 1 -files: - - -rwxr-xr-x 0 0 0 18856 Jan 1 2023 ./app - - -rwxr-xr-x 0 0 0 2100 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/bin/activate - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/bin/python -> ../../../../../aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/python3 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/bin/python3 -> python - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/bin/python3.12 -> python - - -rwxr-xr-x 0 0 0 331 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/lib/python3.12/site-packages/_app_bin.venv.pth - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/lib/python3.12/site-packages/psycopg2 -> ../../../../../../../aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info -> ../../../../../../../aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/lib/python3.12/site-packages/psycopg2_binary.libs -> ../../../../../../../aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs - - -rwxr-xr-x 0 0 0 111 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/pyvenv.cfg - - -rwxr-xr-x 0 0 0 66 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/__main__.py - - -rwxr-xr-x 0 0 0 * Jan 1 2023 ./app.runfiles/_repo_mapping - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/2to3 -> 2to3-3.12 - - -rwxr-xr-x 0 0 0 158 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/2to3-3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/idle3 -> idle3.12 - - -rwxr-xr-x 0 0 0 156 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/idle3.12 - - -rwxr-xr-x 0 0 0 234 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/pip - - -rwxr-xr-x 0 0 0 234 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/pip3 - - -rwxr-xr-x 0 0 0 234 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/pip3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/pydoc3 -> pydoc3.12 - - -rwxr-xr-x 0 0 0 141 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/pydoc3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/python -> python3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/python3 -> python3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/python3-config -> python3.12-config - - -rwxr-xr-x 0 0 0 95359104 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/python3.12 - - -rwxr-xr-x 0 0 0 3082 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/bin/python3.12-config - - -rwxr-xr-x 0 0 0 2854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/Python.h - - -rwxr-xr-x 0 0 0 32616 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/abstract.h - - -rwxr-xr-x 0 0 0 264 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/bltinmodule.h - - -rwxr-xr-x 0 0 0 1136 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/boolobject.h - - -rwxr-xr-x 0 0 0 1466 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/bytearrayobject.h - - -rwxr-xr-x 0 0 0 2619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/bytesobject.h - - -rwxr-xr-x 0 0 0 6267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/ceval.h - - -rwxr-xr-x 0 0 0 7071 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/codecs.h - - -rwxr-xr-x 0 0 0 448 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/compile.h - - -rwxr-xr-x 0 0 0 728 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/complexobject.h - - -rwxr-xr-x 0 0 0 7870 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/abstract.h - - -rwxr-xr-x 0 0 0 1163 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/bytearrayobject.h - - -rwxr-xr-x 0 0 0 4660 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/bytesobject.h - - -rwxr-xr-x 0 0 0 1076 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/cellobject.h - - -rwxr-xr-x 0 0 0 1650 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/ceval.h - - -rwxr-xr-x 0 0 0 2245 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/classobject.h - - -rwxr-xr-x 0 0 0 16188 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/code.h - - -rwxr-xr-x 0 0 0 2660 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/compile.h - - -rwxr-xr-x 0 0 0 1248 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/complexobject.h - - -rwxr-xr-x 0 0 0 1965 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/context.h - - -rwxr-xr-x 0 0 0 1642 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/descrobject.h - - -rwxr-xr-x 0 0 0 4686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/dictobject.h - - -rwxr-xr-x 0 0 0 818 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/fileobject.h - - -rwxr-xr-x 0 0 0 232 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/fileutils.h - - -rwxr-xr-x 0 0 0 900 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/floatobject.h - - -rwxr-xr-x 0 0 0 1108 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/frameobject.h - - -rwxr-xr-x 0 0 0 7188 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/funcobject.h - - -rwxr-xr-x 0 0 0 3316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/genobject.h - - -rwxr-xr-x 0 0 0 1623 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/import.h - - -rwxr-xr-x 0 0 0 7820 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/initconfig.h - - -rwxr-xr-x 0 0 0 387 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/interpreteridobject.h - - -rwxr-xr-x 0 0 0 1633 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/listobject.h - - -rwxr-xr-x 0 0 0 4889 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/longintrepr.h - - -rwxr-xr-x 0 0 0 4679 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/longobject.h - - -rwxr-xr-x 0 0 0 2272 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/memoryobject.h - - -rwxr-xr-x 0 0 0 2276 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/methodobject.h - - -rwxr-xr-x 0 0 0 4336 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/modsupport.h - - -rwxr-xr-x 0 0 0 21212 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/object.h - - -rwxr-xr-x 0 0 0 3316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/objimpl.h - - -rwxr-xr-x 0 0 0 1311 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/odictobject.h - - -rwxr-xr-x 0 0 0 848 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/picklebufobject.h - - -rwxr-xr-x 0 0 0 3505 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pthread_stubs.h - - -rwxr-xr-x 0 0 0 1387 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pyctype.h - - -rwxr-xr-x 0 0 0 1413 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pydebug.h - - -rwxr-xr-x 0 0 0 4276 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pyerrors.h - - -rwxr-xr-x 0 0 0 444 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pyfpe.h - - -rwxr-xr-x 0 0 0 1479 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pyframe.h - - -rwxr-xr-x 0 0 0 3423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pylifecycle.h - - -rwxr-xr-x 0 0 0 3379 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pymem.h - - -rwxr-xr-x 0 0 0 17228 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pystate.h - - -rwxr-xr-x 0 0 0 4903 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pythonrun.h - - -rwxr-xr-x 0 0 0 1418 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pythread.h - - -rwxr-xr-x 0 0 0 12402 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/pytime.h - - -rwxr-xr-x 0 0 0 2146 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/setobject.h - - -rwxr-xr-x 0 0 0 489 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/sysmodule.h - - -rwxr-xr-x 0 0 0 444 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/traceback.h - - -rwxr-xr-x 0 0 0 1377 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/tupleobject.h - - -rwxr-xr-x 0 0 0 35296 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/unicodeobject.h - - -rwxr-xr-x 0 0 0 564 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/warnings.h - - -rwxr-xr-x 0 0 0 2032 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/cpython/weakrefobject.h - - -rwxr-xr-x 0 0 0 9769 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/datetime.h - - -rwxr-xr-x 0 0 0 3080 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/descrobject.h - - -rwxr-xr-x 0 0 0 3860 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/dictobject.h - - -rwxr-xr-x 0 0 0 22471 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/dynamic_annotations.h - - -rwxr-xr-x 0 0 0 253 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/enumobject.h - - -rwxr-xr-x 0 0 0 1779 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/errcode.h - - -rwxr-xr-x 0 0 0 1267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/exports.h - - -rwxr-xr-x 0 0 0 1650 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/fileobject.h - - -rwxr-xr-x 0 0 0 507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/fileutils.h - - -rwxr-xr-x 0 0 0 1532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/floatobject.h - - -rwxr-xr-x 0 0 0 336 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/frameobject.h - - -rwxr-xr-x 0 0 0 334 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/genericaliasobject.h - - -rwxr-xr-x 0 0 0 3033 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/import.h - - -rwxr-xr-x 0 0 0 611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_abstract.h - - -rwxr-xr-x 0 0 0 3035 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_asdl.h - - -rwxr-xr-x 0 0 0 31288 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_ast.h - - -rwxr-xr-x 0 0 0 6749 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_ast_state.h - - -rwxr-xr-x 0 0 0 1149 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_atexit.h - - -rwxr-xr-x 0 0 0 16979 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_atomic.h - - -rwxr-xr-x 0 0 0 2438 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_atomic_funcs.h - - -rwxr-xr-x 0 0 0 6062 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_bitutils.h - - -rwxr-xr-x 0 0 0 8688 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_blocks_output_buffer.h - - -rwxr-xr-x 0 0 0 3384 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_bytes_methods.h - - -rwxr-xr-x 0 0 0 1339 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_bytesobject.h - - -rwxr-xr-x 0 0 0 3920 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_call.h - - -rwxr-xr-x 0 0 0 5265 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_ceval.h - - -rwxr-xr-x 0 0 0 2744 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_ceval_state.h - - -rwxr-xr-x 0 0 0 15835 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_code.h - - -rwxr-xr-x 0 0 0 3453 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_compile.h - - -rwxr-xr-x 0 0 0 2909 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_condvar.h - - -rwxr-xr-x 0 0 0 1301 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_context.h - - -rwxr-xr-x 0 0 0 499 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_descrobject.h - - -rwxr-xr-x 0 0 0 6384 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_dict.h - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_dict_state.h - - -rwxr-xr-x 0 0 0 1615 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_dtoa.h - - -rwxr-xr-x 0 0 0 562 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_emscripten_signal.h - - -rwxr-xr-x 0 0 0 842 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_exceptions.h - - -rwxr-xr-x 0 0 0 2220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_faulthandler.h - - -rwxr-xr-x 0 0 0 7910 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_fileutils.h - - -rwxr-xr-x 0 0 0 2724 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_fileutils_windows.h - - -rwxr-xr-x 0 0 0 1578 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_floatobject.h - - -rwxr-xr-x 0 0 0 4630 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_flowgraph.h - - -rwxr-xr-x 0 0 0 480 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_format.h - - -rwxr-xr-x 0 0 0 9255 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_frame.h - - -rwxr-xr-x 0 0 0 611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_function.h - - -rwxr-xr-x 0 0 0 7658 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_gc.h - - -rwxr-xr-x 0 0 0 1186 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_genobject.h - - -rwxr-xr-x 0 0 0 490 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_getopt.h - - -rwxr-xr-x 0 0 0 1565 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_gil.h - - -rwxr-xr-x 0 0 0 3035 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_global_objects.h - - -rwxr-xr-x 0 0 0 115361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_global_objects_fini_generated.h - - -rwxr-xr-x 0 0 0 25438 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_global_strings.h - - -rwxr-xr-x 0 0 0 3742 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_hamt.h - - -rwxr-xr-x 0 0 0 4286 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_hashtable.h - - -rwxr-xr-x 0 0 0 6358 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_import.h - - -rwxr-xr-x 0 0 0 5706 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_initconfig.h - - -rwxr-xr-x 0 0 0 2998 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_instruments.h - - -rwxr-xr-x 0 0 0 9086 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_interp.h - - -rwxr-xr-x 0 0 0 1397 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_intrinsics.h - - -rwxr-xr-x 0 0 0 1980 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_list.h - - -rwxr-xr-x 0 0 0 7805 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_long.h - - -rwxr-xr-x 0 0 0 383 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_memoryobject.h - - -rwxr-xr-x 0 0 0 1192 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_moduleobject.h - - -rwxr-xr-x 0 0 0 392 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_namespace.h - - -rwxr-xr-x 0 0 0 14917 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_object.h - - -rwxr-xr-x 0 0 0 1016 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_object_state.h - - -rwxr-xr-x 0 0 0 27284 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_obmalloc.h - - -rwxr-xr-x 0 0 0 2085 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_obmalloc_init.h - - -rwxr-xr-x 0 0 0 20081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_opcode.h - - -rwxr-xr-x 0 0 0 2686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_opcode_utils.h - - -rwxr-xr-x 0 0 0 1358 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_parser.h - - -rwxr-xr-x 0 0 0 606 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pathconfig.h - - -rwxr-xr-x 0 0 0 2733 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pyarena.h - - -rwxr-xr-x 0 0 0 3110 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pyerrors.h - - -rwxr-xr-x 0 0 0 709 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pyhash.h - - -rwxr-xr-x 0 0 0 3365 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pylifecycle.h - - -rwxr-xr-x 0 0 0 8600 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pymath.h - - -rwxr-xr-x 0 0 0 3040 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pymem.h - - -rwxr-xr-x 0 0 0 2654 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pymem_init.h - - -rwxr-xr-x 0 0 0 4982 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pystate.h - - -rwxr-xr-x 0 0 0 2075 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_pythread.h - - -rwxr-xr-x 0 0 0 346 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_range.h - - -rwxr-xr-x 0 0 0 8429 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_runtime.h - - -rwxr-xr-x 0 0 0 5912 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_runtime_init.h - - -rwxr-xr-x 0 0 0 45751 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_runtime_init_generated.h - - -rwxr-xr-x 0 0 0 2611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_signal.h - - -rwxr-xr-x 0 0 0 414 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_sliceobject.h - - -rwxr-xr-x 0 0 0 937 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_strhex.h - - -rwxr-xr-x 0 0 0 923 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_structseq.h - - -rwxr-xr-x 0 0 0 7035 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_symtable.h - - -rwxr-xr-x 0 0 0 999 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_sysmodule.h - - -rwxr-xr-x 0 0 0 388 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_time.h - - -rwxr-xr-x 0 0 0 3050 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_token.h - - -rwxr-xr-x 0 0 0 3501 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_traceback.h - - -rwxr-xr-x 0 0 0 3075 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_tracemalloc.h - - -rwxr-xr-x 0 0 0 2197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_tuple.h - - -rwxr-xr-x 0 0 0 4731 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_typeobject.h - - -rwxr-xr-x 0 0 0 763 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_typevarobject.h - - -rwxr-xr-x 0 0 0 898 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_ucnhash.h - - -rwxr-xr-x 0 0 0 2657 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_unicodeobject.h - - -rwxr-xr-x 0 0 0 125516 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_unicodeobject_generated.h - - -rwxr-xr-x 0 0 0 682 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_unionobject.h - - -rwxr-xr-x 0 0 0 740 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/internal/pycore_warnings.h - - -rwxr-xr-x 0 0 0 333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/interpreteridobject.h - - -rwxr-xr-x 0 0 0 772 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/intrcheck.h - - -rwxr-xr-x 0 0 0 597 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/iterobject.h - - -rwxr-xr-x 0 0 0 1782 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/listobject.h - - -rwxr-xr-x 0 0 0 3739 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/longobject.h - - -rwxr-xr-x 0 0 0 827 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/marshal.h - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/memoryobject.h - - -rwxr-xr-x 0 0 0 5076 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/methodobject.h - - -rwxr-xr-x 0 0 0 6515 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/modsupport.h - - -rwxr-xr-x 0 0 0 3559 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/moduleobject.h - - -rwxr-xr-x 0 0 0 37155 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/object.h - - -rwxr-xr-x 0 0 0 9238 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/objimpl.h - - -rwxr-xr-x 0 0 0 12808 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/opcode.h - - -rwxr-xr-x 0 0 0 737 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/osdefs.h - - -rwxr-xr-x 0 0 0 291 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/osmodule.h - - -rwxr-xr-x 0 0 0 1301 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/patchlevel.h - - -rwxr-xr-x 0 0 0 2473 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/py_curses.h - - -rwxr-xr-x 0 0 0 5282 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pybuffer.h - - -rwxr-xr-x 0 0 0 1727 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pycapsule.h - - -rwxr-xr-x 0 0 0 55951 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pyconfig.h - - -rwxr-xr-x 0 0 0 2404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pydtrace.h - - -rwxr-xr-x 0 0 0 13017 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pyerrors.h - - -rwxr-xr-x 0 0 0 2850 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pyexpat.h - - -rwxr-xr-x 0 0 0 551 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pyframe.h - - -rwxr-xr-x 0 0 0 4154 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pyhash.h - - -rwxr-xr-x 0 0 0 2249 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pylifecycle.h - - -rwxr-xr-x 0 0 0 2810 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pymacconfig.h - - -rwxr-xr-x 0 0 0 6656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pymacro.h - - -rwxr-xr-x 0 0 0 1688 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pymath.h - - -rwxr-xr-x 0 0 0 3914 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pymem.h - - -rwxr-xr-x 0 0 0 25593 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pyport.h - - -rwxr-xr-x 0 0 0 4635 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pystate.h - - -rwxr-xr-x 0 0 0 2741 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pystats.h - - -rwxr-xr-x 0 0 0 436 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pystrcmp.h - - -rwxr-xr-x 0 0 0 1557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pystrtod.h - - -rwxr-xr-x 0 0 0 1313 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pythonrun.h - - -rwxr-xr-x 0 0 0 4875 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pythread.h - - -rwxr-xr-x 0 0 0 851 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/pytypedefs.h - - -rwxr-xr-x 0 0 0 630 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/rangeobject.h - - -rwxr-xr-x 0 0 0 1557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/setobject.h - - -rwxr-xr-x 0 0 0 2518 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/sliceobject.h - - -rwxr-xr-x 0 0 0 1645 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/structmember.h - - -rwxr-xr-x 0 0 0 1398 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/structseq.h - - -rwxr-xr-x 0 0 0 1729 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/sysmodule.h - - -rwxr-xr-x 0 0 0 585 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/traceback.h - - -rwxr-xr-x 0 0 0 2285 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/tracemalloc.h - - -rwxr-xr-x 0 0 0 1615 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/tupleobject.h - - -rwxr-xr-x 0 0 0 2342 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/typeslots.h - - -rwxr-xr-x 0 0 0 35164 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/unicodeobject.h - - -rwxr-xr-x 0 0 0 1129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/warnings.h - - -rwxr-xr-x 0 0 0 1234 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/include/python3.12/weakrefobject.h - - -rwxr-xr-x 0 0 0 5162 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/itcl4.3.5/itcl.tcl - - -rwxr-xr-x 0 0 0 2886 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/itcl4.3.5/itclConfig.sh - - -rwxr-xr-x 0 0 0 19378 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/itcl4.3.5/itclHullCmds.tcl - - -rwxr-xr-x 0 0 0 12114 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/itcl4.3.5/itclWidget.tcl - - -rwxr-xr-x 0 0 0 2348 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/itcl4.3.5/libitclstub.a - - -rwxr-xr-x 0 0 0 2348 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/itcl4.3.5/libitclstub4.3.5.a - - -rwxr-xr-x 0 0 0 306344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/itcl4.3.5/libtcl9itcl4.3.5.so - - -rwxr-xr-x 0 0 0 436 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/itcl4.3.5/pkgIndex.tcl - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/libpython3.12.so -> libpython3.12.so.1.0 - - -rwxr-xr-x 0 0 0 205968800 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/libpython3.12.so.1.0 - - -rwxr-xr-x 0 0 0 16800 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/libpython3.so - - -rwxr-xr-x 0 0 0 2385136 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/libtcl9.0.so - - -rwxr-xr-x 0 0 0 3119304 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/libtcl9tk9.0.so - - -rwxr-xr-x 0 0 0 312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/pkgconfig/python-3.12-embed.pc - - -rwxr-xr-x 0 0 0 298 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/pkgconfig/python-3.12.pc - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/pkgconfig/python3-embed.pc -> python-3.12-embed.pc - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/pkgconfig/python3.pc -> python-3.12.pc - - -rwxr-xr-x 0 0 0 13936 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/LICENSE.txt - - -rwxr-xr-x 0 0 0 5218 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/__future__.py - - -rwxr-xr-x 0 0 0 227 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/__hello__.py - - -rwxr-xr-x 0 0 0 97 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/__phello__/__init__.py - - -rwxr-xr-x 0 0 0 97 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/__phello__/spam.py - - -rwxr-xr-x 0 0 0 4021 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_aix_support.py - - -rwxr-xr-x 0 0 0 32089 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_collections_abc.py - - -rwxr-xr-x 0 0 0 8761 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_compat_pickle.py - - -rwxr-xr-x 0 0 0 5681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_compression.py - - -rwxr-xr-x 0 0 0 14653 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_markupbase.py - - -rwxr-xr-x 0 0 0 22023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_osx_support.py - - -rwxr-xr-x 0 0 0 6189 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_py_abc.py - - -rwxr-xr-x 0 0 0 92087 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_pydatetime.py - - -rwxr-xr-x 0 0 0 227283 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_pydecimal.py - - -rwxr-xr-x 0 0 0 93593 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_pyio.py - - -rwxr-xr-x 0 0 0 10790 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_pylong.py - - -rwxr-xr-x 0 0 0 3128 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_sitebuiltins.py - - -rwxr-xr-x 0 0 0 28393 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_strptime.py - - -rwxr-xr-x 0 0 0 43790 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_sysconfigdata__linux_x86_64-linux-gnu.py - - -rwxr-xr-x 0 0 0 7220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_threading_local.py - - -rwxr-xr-x 0 0 0 5893 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/_weakrefset.py - - -rwxr-xr-x 0 0 0 6538 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/abc.py - - -rwxr-xr-x 0 0 0 34211 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/aifc.py - - -rwxr-xr-x 0 0 0 500 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/antigravity.py - - -rwxr-xr-x 0 0 0 101155 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/argparse.py - - -rwxr-xr-x 0 0 0 64452 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ast.py - - -rwxr-xr-x 0 0 0 1220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/__init__.py - - -rwxr-xr-x 0 0 0 3491 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/__main__.py - - -rwxr-xr-x 0 0 0 78567 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/base_events.py - - -rwxr-xr-x 0 0 0 1974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/base_futures.py - - -rwxr-xr-x 0 0 0 8869 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/base_subprocess.py - - -rwxr-xr-x 0 0 0 2672 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/base_tasks.py - - -rwxr-xr-x 0 0 0 1413 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/constants.py - - -rwxr-xr-x 0 0 0 3342 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/coroutines.py - - -rwxr-xr-x 0 0 0 29339 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/events.py - - -rwxr-xr-x 0 0 0 1752 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/exceptions.py - - -rwxr-xr-x 0 0 0 2404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/format_helpers.py - - -rwxr-xr-x 0 0 0 14340 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/futures.py - - -rwxr-xr-x 0 0 0 18995 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/locks.py - - -rwxr-xr-x 0 0 0 124 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/log.py - - -rwxr-xr-x 0 0 0 481 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/mixins.py - - -rwxr-xr-x 0 0 0 33500 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/proactor_events.py - - -rwxr-xr-x 0 0 0 6957 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/protocols.py - - -rwxr-xr-x 0 0 0 7974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/queues.py - - -rwxr-xr-x 0 0 0 7230 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/runners.py - - -rwxr-xr-x 0 0 0 48332 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/selector_events.py - - -rwxr-xr-x 0 0 0 31899 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/sslproto.py - - -rwxr-xr-x 0 0 0 7077 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/staggered.py - - -rwxr-xr-x 0 0 0 27619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/streams.py - - -rwxr-xr-x 0 0 0 7737 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/subprocess.py - - -rwxr-xr-x 0 0 0 9559 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/taskgroups.py - - -rwxr-xr-x 0 0 0 37362 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/tasks.py - - -rwxr-xr-x 0 0 0 790 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/threads.py - - -rwxr-xr-x 0 0 0 5321 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/timeouts.py - - -rwxr-xr-x 0 0 0 10722 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/transports.py - - -rwxr-xr-x 0 0 0 2475 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/trsock.py - - -rwxr-xr-x 0 0 0 53124 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/unix_events.py - - -rwxr-xr-x 0 0 0 32587 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/windows_events.py - - -rwxr-xr-x 0 0 0 5060 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/asyncio/windows_utils.py - - -rwxr-xr-x 0 0 0 20635 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/base64.py - - -rwxr-xr-x 0 0 0 33573 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/bdb.py - - -rwxr-xr-x 0 0 0 3423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/bisect.py - - -rwxr-xr-x 0 0 0 11847 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/bz2.py - - -rwxr-xr-x 0 0 0 6556 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/cProfile.py - - -rwxr-xr-x 0 0 0 25864 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/calendar.py - - -rwxr-xr-x 0 0 0 34479 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/cgi.py - - -rwxr-xr-x 0 0 0 12421 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/cgitb.py - - -rwxr-xr-x 0 0 0 5500 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/chunk.py - - -rwxr-xr-x 0 0 0 14873 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/cmd.py - - -rwxr-xr-x 0 0 0 10962 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/code.py - - -rwxr-xr-x 0 0 0 36870 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/codecs.py - - -rwxr-xr-x 0 0 0 5908 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/codeop.py - - -rwxr-xr-x 0 0 0 52378 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/collections/__init__.py - - -rwxr-xr-x 0 0 0 119 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/collections/abc.py - - -rwxr-xr-x 0 0 0 4062 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/colorsys.py - - -rwxr-xr-x 0 0 0 20507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/compileall.py - - -rwxr-xr-x 0 0 0 38 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/concurrent/__init__.py - - -rwxr-xr-x 0 0 0 1583 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/concurrent/futures/__init__.py - - -rwxr-xr-x 0 0 0 22833 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/concurrent/futures/_base.py - - -rwxr-xr-x 0 0 0 35854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/concurrent/futures/process.py - - -rwxr-xr-x 0 0 0 8946 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/concurrent/futures/thread.py - - -rwxr-xr-x 0 0 0 167611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/Makefile - - -rwxr-xr-x 0 0 0 11525 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup - - -rwxr-xr-x 0 0 0 902 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.bootstrap - - -rwxr-xr-x 0 0 0 3365 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.local - - -rwxr-xr-x 0 0 0 6396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/Setup.stdlib - - -rwxr-xr-x 0 0 0 8716 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/config.c - - -rwxr-xr-x 0 0 0 1752 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/config.c.in - - -rwxr-xr-x 0 0 0 15358 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/install-sh - - -rwxr-xr-x 0 0 0 9312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/makesetup - - -rwxr-xr-x 0 0 0 2100 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/python-config.py - - -rwxr-xr-x 0 0 0 4096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/config-3.12-x86_64-linux-gnu/python.o - - -rwxr-xr-x 0 0 0 53789 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/configparser.py - - -rwxr-xr-x 0 0 0 27637 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/contextlib.py - - -rwxr-xr-x 0 0 0 129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/contextvars.py - - -rwxr-xr-x 0 0 0 8412 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/copy.py - - -rwxr-xr-x 0 0 0 7614 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/copyreg.py - - -rwxr-xr-x 0 0 0 3913 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/crypt.py - - -rwxr-xr-x 0 0 0 16386 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/csv.py - - -rwxr-xr-x 0 0 0 18268 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/__init__.py - - -rwxr-xr-x 0 0 0 12505 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/_aix.py - - -rwxr-xr-x 0 0 0 2535 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/_endian.py - - -rwxr-xr-x 0 0 0 296 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/README.ctypes - - -rwxr-xr-x 0 0 0 154 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/__init__.py - - -rwxr-xr-x 0 0 0 5024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/dyld.py - - -rwxr-xr-x 0 0 0 960 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/dylib.py - - -rwxr-xr-x 0 0 0 84 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/fetch_macholib - - -rwxr-xr-x 0 0 0 75 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/fetch_macholib.bat - - -rwxr-xr-x 0 0 0 1105 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/framework.py - - -rwxr-xr-x 0 0 0 13959 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/util.py - - -rwxr-xr-x 0 0 0 5629 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ctypes/wintypes.py - - -rwxr-xr-x 0 0 0 3369 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/curses/__init__.py - - -rwxr-xr-x 0 0 0 2543 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/curses/ascii.py - - -rwxr-xr-x 0 0 0 5634 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/curses/has_key.py - - -rwxr-xr-x 0 0 0 87 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/curses/panel.py - - -rwxr-xr-x 0 0 0 7754 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/curses/textpad.py - - -rwxr-xr-x 0 0 0 62085 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/dataclasses.py - - -rwxr-xr-x 0 0 0 268 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/datetime.py - - -rwxr-xr-x 0 0 0 5882 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/dbm/__init__.py - - -rwxr-xr-x 0 0 0 11594 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/dbm/dumb.py - - -rwxr-xr-x 0 0 0 72 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/dbm/gnu.py - - -rwxr-xr-x 0 0 0 70 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/dbm/ndbm.py - - -rwxr-xr-x 0 0 0 2805 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/decimal.py - - -rwxr-xr-x 0 0 0 83368 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/difflib.py - - -rwxr-xr-x 0 0 0 30227 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/dis.py - - -rwxr-xr-x 0 0 0 106749 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/doctest.py - - -rwxr-xr-x 0 0 0 1764 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/__init__.py - - -rwxr-xr-x 0 0 0 8541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/_encoded_words.py - - -rwxr-xr-x 0 0 0 111685 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/_header_value_parser.py - - -rwxr-xr-x 0 0 0 17821 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/_parseaddr.py - - -rwxr-xr-x 0 0 0 15535 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/_policybase.py - - -rwxr-xr-x 0 0 0 9561 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/architecture.rst - - -rwxr-xr-x 0 0 0 3551 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/base64mime.py - - -rwxr-xr-x 0 0 0 17063 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/charset.py - - -rwxr-xr-x 0 0 0 10588 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/contentmanager.py - - -rwxr-xr-x 0 0 0 1778 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/encoders.py - - -rwxr-xr-x 0 0 0 3814 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/errors.py - - -rwxr-xr-x 0 0 0 22796 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/feedparser.py - - -rwxr-xr-x 0 0 0 21403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/generator.py - - -rwxr-xr-x 0 0 0 24092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/header.py - - -rwxr-xr-x 0 0 0 20819 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/headerregistry.py - - -rwxr-xr-x 0 0 0 2129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/iterators.py - - -rwxr-xr-x 0 0 0 48396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/message.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/__init__.py - - -rwxr-xr-x 0 0 0 1321 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/application.py - - -rwxr-xr-x 0 0 0 3094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/audio.py - - -rwxr-xr-x 0 0 0 914 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/base.py - - -rwxr-xr-x 0 0 0 3726 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/image.py - - -rwxr-xr-x 0 0 0 1315 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/message.py - - -rwxr-xr-x 0 0 0 1619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/multipart.py - - -rwxr-xr-x 0 0 0 689 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/nonmultipart.py - - -rwxr-xr-x 0 0 0 1394 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/mime/text.py - - -rwxr-xr-x 0 0 0 4975 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/parser.py - - -rwxr-xr-x 0 0 0 10614 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/policy.py - - -rwxr-xr-x 0 0 0 9864 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/quoprimime.py - - -rwxr-xr-x 0 0 0 16071 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/email/utils.py - - -rwxr-xr-x 0 0 0 5884 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/__init__.py - - -rwxr-xr-x 0 0 0 15677 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/aliases.py - - -rwxr-xr-x 0 0 0 1248 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/ascii.py - - -rwxr-xr-x 0 0 0 1533 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/base64_codec.py - - -rwxr-xr-x 0 0 0 1019 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/big5.py - - -rwxr-xr-x 0 0 0 1039 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/big5hkscs.py - - -rwxr-xr-x 0 0 0 2249 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/bz2_codec.py - - -rwxr-xr-x 0 0 0 2084 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/charmap.py - - -rwxr-xr-x 0 0 0 13121 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp037.py - - -rwxr-xr-x 0 0 0 13568 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1006.py - - -rwxr-xr-x 0 0 0 13113 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1026.py - - -rwxr-xr-x 0 0 0 34597 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1125.py - - -rwxr-xr-x 0 0 0 13105 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1140.py - - -rwxr-xr-x 0 0 0 13686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1250.py - - -rwxr-xr-x 0 0 0 13361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1251.py - - -rwxr-xr-x 0 0 0 13511 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1252.py - - -rwxr-xr-x 0 0 0 13094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1253.py - - -rwxr-xr-x 0 0 0 13502 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1254.py - - -rwxr-xr-x 0 0 0 12466 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1255.py - - -rwxr-xr-x 0 0 0 12814 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1256.py - - -rwxr-xr-x 0 0 0 13374 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1257.py - - -rwxr-xr-x 0 0 0 13364 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp1258.py - - -rwxr-xr-x 0 0 0 14132 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp273.py - - -rwxr-xr-x 0 0 0 12055 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp424.py - - -rwxr-xr-x 0 0 0 34564 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp437.py - - -rwxr-xr-x 0 0 0 13121 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp500.py - - -rwxr-xr-x 0 0 0 13686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp720.py - - -rwxr-xr-x 0 0 0 34681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp737.py - - -rwxr-xr-x 0 0 0 34476 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp775.py - - -rwxr-xr-x 0 0 0 34105 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp850.py - - -rwxr-xr-x 0 0 0 35002 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp852.py - - -rwxr-xr-x 0 0 0 33850 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp855.py - - -rwxr-xr-x 0 0 0 12423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp856.py - - -rwxr-xr-x 0 0 0 33908 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp857.py - - -rwxr-xr-x 0 0 0 34015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp858.py - - -rwxr-xr-x 0 0 0 34681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp860.py - - -rwxr-xr-x 0 0 0 34633 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp861.py - - -rwxr-xr-x 0 0 0 33370 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp862.py - - -rwxr-xr-x 0 0 0 34252 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp863.py - - -rwxr-xr-x 0 0 0 33663 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp864.py - - -rwxr-xr-x 0 0 0 34618 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp865.py - - -rwxr-xr-x 0 0 0 34396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp866.py - - -rwxr-xr-x 0 0 0 32965 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp869.py - - -rwxr-xr-x 0 0 0 12595 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp874.py - - -rwxr-xr-x 0 0 0 12854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp875.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp932.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp949.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/cp950.py - - -rwxr-xr-x 0 0 0 1051 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/euc_jis_2004.py - - -rwxr-xr-x 0 0 0 1051 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/euc_jisx0213.py - - -rwxr-xr-x 0 0 0 1027 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/euc_jp.py - - -rwxr-xr-x 0 0 0 1027 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/euc_kr.py - - -rwxr-xr-x 0 0 0 1031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/gb18030.py - - -rwxr-xr-x 0 0 0 1027 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/gb2312.py - - -rwxr-xr-x 0 0 0 1015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/gbk.py - - -rwxr-xr-x 0 0 0 1508 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/hex_codec.py - - -rwxr-xr-x 0 0 0 13475 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/hp_roman8.py - - -rwxr-xr-x 0 0 0 1011 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/hz.py - - -rwxr-xr-x 0 0 0 9710 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/idna.py - - -rwxr-xr-x 0 0 0 1053 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp.py - - -rwxr-xr-x 0 0 0 1061 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_1.py - - -rwxr-xr-x 0 0 0 1061 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_2.py - - -rwxr-xr-x 0 0 0 1073 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_2004.py - - -rwxr-xr-x 0 0 0 1061 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_3.py - - -rwxr-xr-x 0 0 0 1069 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_ext.py - - -rwxr-xr-x 0 0 0 1053 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_kr.py - - -rwxr-xr-x 0 0 0 13176 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_1.py - - -rwxr-xr-x 0 0 0 13589 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_10.py - - -rwxr-xr-x 0 0 0 12335 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_11.py - - -rwxr-xr-x 0 0 0 13271 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_13.py - - -rwxr-xr-x 0 0 0 13652 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_14.py - - -rwxr-xr-x 0 0 0 13212 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_15.py - - -rwxr-xr-x 0 0 0 13557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_16.py - - -rwxr-xr-x 0 0 0 13404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_2.py - - -rwxr-xr-x 0 0 0 13089 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_3.py - - -rwxr-xr-x 0 0 0 13376 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_4.py - - -rwxr-xr-x 0 0 0 13015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_5.py - - -rwxr-xr-x 0 0 0 10833 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_6.py - - -rwxr-xr-x 0 0 0 12844 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_7.py - - -rwxr-xr-x 0 0 0 11036 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_8.py - - -rwxr-xr-x 0 0 0 13156 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_9.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/johab.py - - -rwxr-xr-x 0 0 0 13779 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/koi8_r.py - - -rwxr-xr-x 0 0 0 13193 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/koi8_t.py - - -rwxr-xr-x 0 0 0 13762 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/koi8_u.py - - -rwxr-xr-x 0 0 0 13723 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/kz1048.py - - -rwxr-xr-x 0 0 0 1264 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/latin_1.py - - -rwxr-xr-x 0 0 0 36467 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_arabic.py - - -rwxr-xr-x 0 0 0 13633 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_croatian.py - - -rwxr-xr-x 0 0 0 13454 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_cyrillic.py - - -rwxr-xr-x 0 0 0 15170 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_farsi.py - - -rwxr-xr-x 0 0 0 13721 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_greek.py - - -rwxr-xr-x 0 0 0 13498 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_iceland.py - - -rwxr-xr-x 0 0 0 14118 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_latin2.py - - -rwxr-xr-x 0 0 0 13480 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_roman.py - - -rwxr-xr-x 0 0 0 13661 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_romanian.py - - -rwxr-xr-x 0 0 0 13513 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mac_turkish.py - - -rwxr-xr-x 0 0 0 1211 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/mbcs.py - - -rwxr-xr-x 0 0 0 1019 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/oem.py - - -rwxr-xr-x 0 0 0 13519 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/palmos.py - - -rwxr-xr-x 0 0 0 14015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/ptcp154.py - - -rwxr-xr-x 0 0 0 6883 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/punycode.py - - -rwxr-xr-x 0 0 0 1525 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/quopri_codec.py - - -rwxr-xr-x 0 0 0 1332 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/raw_unicode_escape.py - - -rwxr-xr-x 0 0 0 2448 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/rot_13.py - - -rwxr-xr-x 0 0 0 1039 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/shift_jis.py - - -rwxr-xr-x 0 0 0 1059 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/shift_jis_2004.py - - -rwxr-xr-x 0 0 0 1059 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/shift_jisx0213.py - - -rwxr-xr-x 0 0 0 12300 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/tis_620.py - - -rwxr-xr-x 0 0 0 1299 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/undefined.py - - -rwxr-xr-x 0 0 0 1304 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/unicode_escape.py - - -rwxr-xr-x 0 0 0 5236 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_16.py - - -rwxr-xr-x 0 0 0 1037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_16_be.py - - -rwxr-xr-x 0 0 0 1037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_16_le.py - - -rwxr-xr-x 0 0 0 5129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_32.py - - -rwxr-xr-x 0 0 0 930 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_32_be.py - - -rwxr-xr-x 0 0 0 930 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_32_le.py - - -rwxr-xr-x 0 0 0 946 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_7.py - - -rwxr-xr-x 0 0 0 1005 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_8.py - - -rwxr-xr-x 0 0 0 4133 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/utf_8_sig.py - - -rwxr-xr-x 0 0 0 2851 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/uu_codec.py - - -rwxr-xr-x 0 0 0 2204 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/encodings/zlib_codec.py - - -rwxr-xr-x 0 0 0 9445 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ensurepip/__init__.py - - -rwxr-xr-x 0 0 0 88 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ensurepip/__main__.py - - -rwxr-xr-x 0 0 0 1841526 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ensurepip/_bundled/pip-25.0.1-py3-none-any.whl - - -rwxr-xr-x 0 0 0 808 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ensurepip/_uninstall.py - - -rwxr-xr-x 0 0 0 81540 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/enum.py - - -rwxr-xr-x 0 0 0 10381 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/filecmp.py - - -rwxr-xr-x 0 0 0 15714 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/fileinput.py - - -rwxr-xr-x 0 0 0 5999 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/fnmatch.py - - -rwxr-xr-x 0 0 0 38147 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/fractions.py - - -rwxr-xr-x 0 0 0 34735 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ftplib.py - - -rwxr-xr-x 0 0 0 37940 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/functools.py - - -rwxr-xr-x 0 0 0 5572 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/genericpath.py - - -rwxr-xr-x 0 0 0 7488 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/getopt.py - - -rwxr-xr-x 0 0 0 5990 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/getpass.py - - -rwxr-xr-x 0 0 0 21320 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/gettext.py - - -rwxr-xr-x 0 0 0 8732 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/glob.py - - -rwxr-xr-x 0 0 0 9648 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/graphlib.py - - -rwxr-xr-x 0 0 0 25402 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/gzip.py - - -rwxr-xr-x 0 0 0 9349 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/hashlib.py - - -rwxr-xr-x 0 0 0 23024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/heapq.py - - -rwxr-xr-x 0 0 0 7716 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/hmac.py - - -rwxr-xr-x 0 0 0 4775 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/html/__init__.py - - -rwxr-xr-x 0 0 0 75512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/html/entities.py - - -rwxr-xr-x 0 0 0 20858 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/html/parser.py - - -rwxr-xr-x 0 0 0 8308 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/http/__init__.py - - -rwxr-xr-x 0 0 0 58041 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/http/client.py - - -rwxr-xr-x 0 0 0 77438 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/http/cookiejar.py - - -rwxr-xr-x 0 0 0 20854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/http/cookies.py - - -rwxr-xr-x 0 0 0 49202 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/http/server.py - - -rwxr-xr-x 0 0 0 2148 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/CREDITS.txt - - -rwxr-xr-x 0 0 0 56360 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/ChangeLog - - -rwxr-xr-x 0 0 0 10313 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/HISTORY.txt - - -rwxr-xr-x 0 0 0 1935 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/README.txt - - -rwxr-xr-x 0 0 0 120 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/folder.gif - - -rwxr-xr-x 0 0 0 57746 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle.ico - - -rwxr-xr-x 0 0 0 634 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_16.gif - - -rwxr-xr-x 0 0 0 1031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_16.png - - -rwxr-xr-x 0 0 0 39205 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_256.png - - -rwxr-xr-x 0 0 0 1019 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_32.gif - - -rwxr-xr-x 0 0 0 2036 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_32.png - - -rwxr-xr-x 0 0 0 1388 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_48.gif - - -rwxr-xr-x 0 0 0 3977 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_48.png - - -rwxr-xr-x 0 0 0 75 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/minusnode.gif - - -rwxr-xr-x 0 0 0 125 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/openfolder.gif - - -rwxr-xr-x 0 0 0 78 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/plusnode.gif - - -rwxr-xr-x 0 0 0 380 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/python.gif - - -rwxr-xr-x 0 0 0 72 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/tk.gif - - -rwxr-xr-x 0 0 0 27172 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/NEWS2x.txt - - -rwxr-xr-x 0 0 0 56500 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/News3.txt - - -rwxr-xr-x 0 0 0 11653 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/README.txt - - -rwxr-xr-x 0 0 0 8477 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/TODO.txt - - -rwxr-xr-x 0 0 0 396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/__init__.py - - -rwxr-xr-x 0 0 0 107 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/__main__.py - - -rwxr-xr-x 0 0 0 9354 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/autocomplete.py - - -rwxr-xr-x 0 0 0 20863 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/autocomplete_w.py - - -rwxr-xr-x 0 0 0 3216 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/autoexpand.py - - -rwxr-xr-x 0 0 0 8588 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/browser.py - - -rwxr-xr-x 0 0 0 7267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/calltip.py - - -rwxr-xr-x 0 0 0 7083 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/calltip_w.py - - -rwxr-xr-x 0 0 0 11420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/codecontext.py - - -rwxr-xr-x 0 0 0 14783 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/colorizer.py - - -rwxr-xr-x 0 0 0 2266 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/config-extensions.def - - -rwxr-xr-x 0 0 0 2864 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/config-highlight.def - - -rwxr-xr-x 0 0 0 10910 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/config-keys.def - - -rwxr-xr-x 0 0 0 3168 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/config-main.def - - -rwxr-xr-x 0 0 0 38403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/config.py - - -rwxr-xr-x 0 0 0 15230 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/config_key.py - - -rwxr-xr-x 0 0 0 105310 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/configdialog.py - - -rwxr-xr-x 0 0 0 20991 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/debugger.py - - -rwxr-xr-x 0 0 0 12115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/debugger_r.py - - -rwxr-xr-x 0 0 0 4177 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/debugobj.py - - -rwxr-xr-x 0 0 0 1082 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/debugobj_r.py - - -rwxr-xr-x 0 0 0 1044 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/delegator.py - - -rwxr-xr-x 0 0 0 1993 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/dynoption.py - - -rwxr-xr-x 0 0 0 69561 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/editor.py - - -rwxr-xr-x 0 0 0 3632 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/extend.txt - - -rwxr-xr-x 0 0 0 3871 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/filelist.py - - -rwxr-xr-x 0 0 0 15777 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/format.py - - -rwxr-xr-x 0 0 0 7521 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/grep.py - - -rwxr-xr-x 0 0 0 60566 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/help.html - - -rwxr-xr-x 0 0 0 11843 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/help.py - - -rwxr-xr-x 0 0 0 9023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/help_about.py - - -rwxr-xr-x 0 0 0 4065 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/history.py - - -rwxr-xr-x 0 0 0 12889 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/hyperparser.py - - -rwxr-xr-x 0 0 0 177 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/idle.bat - - -rwxr-xr-x 0 0 0 454 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/idle.py - - -rwxr-xr-x 0 0 0 570 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/idle.pyw - - -rwxr-xr-x 0 0 0 16159 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/iomenu.py - - -rwxr-xr-x 0 0 0 9290 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/macosx.py - - -rwxr-xr-x 0 0 0 3938 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/mainmenu.py - - -rwxr-xr-x 0 0 0 18652 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/multicall.py - - -rwxr-xr-x 0 0 0 5705 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/outwin.py - - -rwxr-xr-x 0 0 0 7204 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/parenmatch.py - - -rwxr-xr-x 0 0 0 3093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/pathbrowser.py - - -rwxr-xr-x 0 0 0 3568 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/percolator.py - - -rwxr-xr-x 0 0 0 19864 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/pyparse.py - - -rwxr-xr-x 0 0 0 62194 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/pyshell.py - - -rwxr-xr-x 0 0 0 15067 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/query.py - - -rwxr-xr-x 0 0 0 6777 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/redirector.py - - -rwxr-xr-x 0 0 0 9841 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/replace.py - - -rwxr-xr-x 0 0 0 21078 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/rpc.py - - -rwxr-xr-x 0 0 0 21654 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/run.py - - -rwxr-xr-x 0 0 0 8273 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/runscript.py - - -rwxr-xr-x 0 0 0 4478 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/scrolledlist.py - - -rwxr-xr-x 0 0 0 5567 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/search.py - - -rwxr-xr-x 0 0 0 7852 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/searchbase.py - - -rwxr-xr-x 0 0 0 7415 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/searchengine.py - - -rwxr-xr-x 0 0 0 20338 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/sidebar.py - - -rwxr-xr-x 0 0 0 12834 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/squeezer.py - - -rwxr-xr-x 0 0 0 4016 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/stackviewer.py - - -rwxr-xr-x 0 0 0 1474 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/statusbar.py - - -rwxr-xr-x 0 0 0 6808 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/textview.py - - -rwxr-xr-x 0 0 0 6665 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/tooltip.py - - -rwxr-xr-x 0 0 0 16773 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/tree.py - - -rwxr-xr-x 0 0 0 11016 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/undo.py - - -rwxr-xr-x 0 0 0 1312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/util.py - - -rwxr-xr-x 0 0 0 2616 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/window.py - - -rwxr-xr-x 0 0 0 4203 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/zoomheight.py - - -rwxr-xr-x 0 0 0 2005 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/idlelib/zzdummy.py - - -rwxr-xr-x 0 0 0 54040 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/imaplib.py - - -rwxr-xr-x 0 0 0 4398 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/imghdr.py - - -rwxr-xr-x 0 0 0 4784 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/__init__.py - - -rwxr-xr-x 0 0 0 1354 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/_abc.py - - -rwxr-xr-x 0 0 0 57057 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/_bootstrap.py - - -rwxr-xr-x 0 0 0 69406 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/_bootstrap_external.py - - -rwxr-xr-x 0 0 0 7612 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/abc.py - - -rwxr-xr-x 0 0 0 880 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/machinery.py - - -rwxr-xr-x 0 0 0 28757 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/metadata/__init__.py - - -rwxr-xr-x 0 0 0 2406 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_adapters.py - - -rwxr-xr-x 0 0 0 743 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_collections.py - - -rwxr-xr-x 0 0 0 2895 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_functools.py - - -rwxr-xr-x 0 0 0 2068 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_itertools.py - - -rwxr-xr-x 0 0 0 1590 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_meta.py - - -rwxr-xr-x 0 0 0 2166 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_text.py - - -rwxr-xr-x 0 0 0 327 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/readers.py - - -rwxr-xr-x 0 0 0 532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/resources/__init__.py - - -rwxr-xr-x 0 0 0 4482 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/resources/_adapters.py - - -rwxr-xr-x 0 0 0 5486 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/resources/_common.py - - -rwxr-xr-x 0 0 0 1277 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/resources/_itertools.py - - -rwxr-xr-x 0 0 0 2949 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/resources/_legacy.py - - -rwxr-xr-x 0 0 0 5203 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/resources/abc.py - - -rwxr-xr-x 0 0 0 4370 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/resources/readers.py - - -rwxr-xr-x 0 0 0 2584 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/resources/simple.py - - -rwxr-xr-x 0 0 0 354 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/simple.py - - -rwxr-xr-x 0 0 0 10994 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/importlib/util.py - - -rwxr-xr-x 0 0 0 127125 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/inspect.py - - -rwxr-xr-x 0 0 0 3582 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/io.py - - -rwxr-xr-x 0 0 0 81414 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ipaddress.py - - -rwxr-xr-x 0 0 0 14020 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/json/__init__.py - - -rwxr-xr-x 0 0 0 12525 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/json/decoder.py - - -rwxr-xr-x 0 0 0 16075 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/json/encoder.py - - -rwxr-xr-x 0 0 0 2434 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/json/scanner.py - - -rwxr-xr-x 0 0 0 3339 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/json/tool.py - - -rwxr-xr-x 0 0 0 1073 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/keyword.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib-dynload/.empty - - -rwxr-xr-x 0 0 0 36904 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib-dynload/_crypt.cpython-312-x86_64-linux-gnu.so - - -rwxr-xr-x 0 0 0 111512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib-dynload/_ctypes_test.cpython-312-x86_64-linux-gnu.so - - -rwxr-xr-x 0 0 0 2530960 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib-dynload/_dbm.cpython-312-x86_64-linux-gnu.so - - -rwxr-xr-x 0 0 0 593656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib-dynload/_tkinter.cpython-312-x86_64-linux-gnu.so - - -rwxr-xr-x 0 0 0 8696 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/Grammar.txt - - -rwxr-xr-x 0 0 0 15313 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/Grammar3.12.13.final.0.pickle - - -rwxr-xr-x 0 0 0 793 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/PatternGrammar.txt - - -rwxr-xr-x 0 0 0 1225 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/PatternGrammar3.12.13.final.0.pickle - - -rwxr-xr-x 0 0 0 156 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/__init__.py - - -rwxr-xr-x 0 0 0 67 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/__main__.py - - -rwxr-xr-x 0 0 0 6623 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/btm_matcher.py - - -rwxr-xr-x 0 0 0 9945 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/btm_utils.py - - -rwxr-xr-x 0 0 0 6690 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixer_base.py - - -rwxr-xr-x 0 0 0 15206 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixer_util.py - - -rwxr-xr-x 0 0 0 47 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/__init__.py - - -rwxr-xr-x 0 0 0 2346 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_apply.py - - -rwxr-xr-x 0 0 0 984 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_asserts.py - - -rwxr-xr-x 0 0 0 320 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_basestring.py - - -rwxr-xr-x 0 0 0 590 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_buffer.py - - -rwxr-xr-x 0 0 0 3760 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_dict.py - - -rwxr-xr-x 0 0 0 3344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_except.py - - -rwxr-xr-x 0 0 0 979 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_exec.py - - -rwxr-xr-x 0 0 0 2048 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_execfile.py - - -rwxr-xr-x 0 0 0 2495 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_exitfunc.py - - -rwxr-xr-x 0 0 0 2765 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_filter.py - - -rwxr-xr-x 0 0 0 644 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_funcattrs.py - - -rwxr-xr-x 0 0 0 547 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_future.py - - -rwxr-xr-x 0 0 0 451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_getcwdu.py - - -rwxr-xr-x 0 0 0 3196 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_has_key.py - - -rwxr-xr-x 0 0 0 4876 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_idioms.py - - -rwxr-xr-x 0 0 0 3256 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_import.py - - -rwxr-xr-x 0 0 0 5684 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_imports.py - - -rwxr-xr-x 0 0 0 289 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_imports2.py - - -rwxr-xr-x 0 0 0 708 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_input.py - - -rwxr-xr-x 0 0 0 1144 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_intern.py - - -rwxr-xr-x 0 0 0 1608 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_isinstance.py - - -rwxr-xr-x 0 0 0 1548 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_itertools.py - - -rwxr-xr-x 0 0 0 2086 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_itertools_imports.py - - -rwxr-xr-x 0 0 0 476 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_long.py - - -rwxr-xr-x 0 0 0 3640 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_map.py - - -rwxr-xr-x 0 0 0 8197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_metaclass.py - - -rwxr-xr-x 0 0 0 606 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_methodattrs.py - - -rwxr-xr-x 0 0 0 571 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_ne.py - - -rwxr-xr-x 0 0 0 3174 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_next.py - - -rwxr-xr-x 0 0 0 591 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_nonzero.py - - -rwxr-xr-x 0 0 0 768 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_numliterals.py - - -rwxr-xr-x 0 0 0 3426 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_operator.py - - -rwxr-xr-x 0 0 0 1226 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_paren.py - - -rwxr-xr-x 0 0 0 2844 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_print.py - - -rwxr-xr-x 0 0 0 2926 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_raise.py - - -rwxr-xr-x 0 0 0 454 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_raw_input.py - - -rwxr-xr-x 0 0 0 837 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_reduce.py - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_reload.py - - -rwxr-xr-x 0 0 0 2221 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_renames.py - - -rwxr-xr-x 0 0 0 613 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_repr.py - - -rwxr-xr-x 0 0 0 1697 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_set_literal.py - - -rwxr-xr-x 0 0 0 449 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_standarderror.py - - -rwxr-xr-x 0 0 0 1034 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_sys_exc.py - - -rwxr-xr-x 0 0 0 1582 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_throw.py - - -rwxr-xr-x 0 0 0 5565 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_tuple_params.py - - -rwxr-xr-x 0 0 0 1774 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_types.py - - -rwxr-xr-x 0 0 0 1256 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_unicode.py - - -rwxr-xr-x 0 0 0 8367 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_urllib.py - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_ws_comma.py - - -rwxr-xr-x 0 0 0 2694 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_xrange.py - - -rwxr-xr-x 0 0 0 689 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_xreadlines.py - - -rwxr-xr-x 0 0 0 1289 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_zip.py - - -rwxr-xr-x 0 0 0 11854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/main.py - - -rwxr-xr-x 0 0 0 7054 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/patcomp.py - - -rwxr-xr-x 0 0 0 143 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/__init__.py - - -rwxr-xr-x 0 0 0 9642 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/conv.py - - -rwxr-xr-x 0 0 0 5969 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/driver.py - - -rwxr-xr-x 0 0 0 5552 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/grammar.py - - -rwxr-xr-x 0 0 0 1635 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/literals.py - - -rwxr-xr-x 0 0 0 8155 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/parse.py - - -rwxr-xr-x 0 0 0 13830 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/pgen.py - - -rwxr-xr-x 0 0 0 1302 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/token.py - - -rwxr-xr-x 0 0 0 21119 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/tokenize.py - - -rwxr-xr-x 0 0 0 1305 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pygram.py - - -rwxr-xr-x 0 0 0 27974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/pytree.py - - -rwxr-xr-x 0 0 0 27507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lib2to3/refactor.py - - -rwxr-xr-x 0 0 0 5800 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/linecache.py - - -rwxr-xr-x 0 0 0 78599 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/locale.py - - -rwxr-xr-x 0 0 0 83437 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/logging/__init__.py - - -rwxr-xr-x 0 0 0 42798 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/logging/config.py - - -rwxr-xr-x 0 0 0 62596 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/logging/handlers.py - - -rwxr-xr-x 0 0 0 13277 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/lzma.py - - -rwxr-xr-x 0 0 0 78911 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/mailbox.py - - -rwxr-xr-x 0 0 0 9333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/mailcap.py - - -rwxr-xr-x 0 0 0 23037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/mimetypes.py - - -rwxr-xr-x 0 0 0 23699 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/modulefinder.py - - -rwxr-xr-x 0 0 0 916 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/__init__.py - - -rwxr-xr-x 0 0 0 41398 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/connection.py - - -rwxr-xr-x 0 0 0 11673 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/context.py - - -rwxr-xr-x 0 0 0 3061 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/dummy/__init__.py - - -rwxr-xr-x 0 0 0 1598 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/dummy/connection.py - - -rwxr-xr-x 0 0 0 12202 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/forkserver.py - - -rwxr-xr-x 0 0 0 11626 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/heap.py - - -rwxr-xr-x 0 0 0 47893 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/managers.py - - -rwxr-xr-x 0 0 0 32760 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/pool.py - - -rwxr-xr-x 0 0 0 2377 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/popen_fork.py - - -rwxr-xr-x 0 0 0 2230 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/popen_forkserver.py - - -rwxr-xr-x 0 0 0 2029 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/popen_spawn_posix.py - - -rwxr-xr-x 0 0 0 4515 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/popen_spawn_win32.py - - -rwxr-xr-x 0 0 0 12139 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/process.py - - -rwxr-xr-x 0 0 0 12693 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/queues.py - - -rwxr-xr-x 0 0 0 9512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/reduction.py - - -rwxr-xr-x 0 0 0 5145 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/resource_sharer.py - - -rwxr-xr-x 0 0 0 11077 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/resource_tracker.py - - -rwxr-xr-x 0 0 0 18458 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/shared_memory.py - - -rwxr-xr-x 0 0 0 6306 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/sharedctypes.py - - -rwxr-xr-x 0 0 0 9644 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/spawn.py - - -rwxr-xr-x 0 0 0 12272 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/synchronize.py - - -rwxr-xr-x 0 0 0 14261 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/multiprocessing/util.py - - -rwxr-xr-x 0 0 0 6922 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/netrc.py - - -rwxr-xr-x 0 0 0 41087 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/nntplib.py - - -rwxr-xr-x 0 0 0 30404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ntpath.py - - -rwxr-xr-x 0 0 0 2374 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/nturl2path.py - - -rwxr-xr-x 0 0 0 11467 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/numbers.py - - -rwxr-xr-x 0 0 0 13174 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/opcode.py - - -rwxr-xr-x 0 0 0 10965 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/operator.py - - -rwxr-xr-x 0 0 0 60369 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/optparse.py - - -rwxr-xr-x 0 0 0 40821 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/os.py - - -rwxr-xr-x 0 0 0 51052 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pathlib.py - - -rwxr-xr-x 0 0 0 70298 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pdb.py - - -rwxr-xr-x 0 0 0 66911 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pickle.py - - -rwxr-xr-x 0 0 0 94052 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pickletools.py - - -rwxr-xr-x 0 0 0 8978 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pipes.py - - -rwxr-xr-x 0 0 0 18281 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pkgutil.py - - -rwxr-xr-x 0 0 0 43388 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/platform.py - - -rwxr-xr-x 0 0 0 28582 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/plistlib.py - - -rwxr-xr-x 0 0 0 14619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/poplib.py - - -rwxr-xr-x 0 0 0 17356 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/posixpath.py - - -rwxr-xr-x 0 0 0 24158 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pprint.py - - -rwxr-xr-x 0 0 0 23093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/profile.py - - -rwxr-xr-x 0 0 0 29289 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pstats.py - - -rwxr-xr-x 0 0 0 6137 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pty.py - - -rwxr-xr-x 0 0 0 7837 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/py_compile.py - - -rwxr-xr-x 0 0 0 11396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pyclbr.py - - -rwxr-xr-x 0 0 0 113508 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pydoc.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pydoc_data/__init__.py - - -rwxr-xr-x 0 0 0 1325 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pydoc_data/_pydoc.css - - -rwxr-xr-x 0 0 0 519590 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/pydoc_data/topics.py - - -rwxr-xr-x 0 0 0 11496 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/queue.py - - -rwxr-xr-x 0 0 0 7184 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/quopri.py - - -rwxr-xr-x 0 0 0 34689 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/random.py - - -rwxr-xr-x 0 0 0 16315 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/re/__init__.py - - -rwxr-xr-x 0 0 0 5444 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/re/_casefix.py - - -rwxr-xr-x 0 0 0 26399 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/re/_compiler.py - - -rwxr-xr-x 0 0 0 5930 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/re/_constants.py - - -rwxr-xr-x 0 0 0 41201 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/re/_parser.py - - -rwxr-xr-x 0 0 0 7148 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/reprlib.py - - -rwxr-xr-x 0 0 0 7827 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/rlcompleter.py - - -rwxr-xr-x 0 0 0 12885 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/runpy.py - - -rwxr-xr-x 0 0 0 6351 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sched.py - - -rwxr-xr-x 0 0 0 1984 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/secrets.py - - -rwxr-xr-x 0 0 0 19671 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/selectors.py - - -rwxr-xr-x 0 0 0 8560 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/shelve.py - - -rwxr-xr-x 0 0 0 13353 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/shlex.py - - -rwxr-xr-x 0 0 0 56762 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/shutil.py - - -rwxr-xr-x 0 0 0 2495 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/signal.py - - -rwxr-xr-x 0 0 0 119 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/README.txt - - -rwxr-xr-x 0 0 0 4 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/INSTALLER - - -rwxr-xr-x 0 0 0 4675 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/METADATA - - -rwxr-xr-x 0 0 0 68854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/RECORD - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/REQUESTED - - -rwxr-xr-x 0 0 0 82 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/WHEEL - - -rwxr-xr-x 0 0 0 243 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/direct_url.json - - -rwxr-xr-x 0 0 0 84 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/entry_points.txt - - -rwxr-xr-x 0 0 0 11731 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/AUTHORS.txt - - -rwxr-xr-x 0 0 0 1093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/LICENSE.txt - - -rwxr-xr-x 0 0 0 558 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt - - -rwxr-xr-x 0 0 0 989 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE - - -rwxr-xr-x 0 0 0 1099 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt - - -rwxr-xr-x 0 0 0 14531 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt - - -rwxr-xr-x 0 0 0 11325 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE - - -rwxr-xr-x 0 0 0 1541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md - - -rwxr-xr-x 0 0 0 614 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING - - -rwxr-xr-x 0 0 0 197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE - - -rwxr-xr-x 0 0 0 10174 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE - - -rwxr-xr-x 0 0 0 1344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE - - -rwxr-xr-x 0 0 0 1089 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE - - -rwxr-xr-x 0 0 0 1331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE - - -rwxr-xr-x 0 0 0 10142 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE - - -rwxr-xr-x 0 0 0 751 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE - - -rwxr-xr-x 0 0 0 1056 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE - - -rwxr-xr-x 0 0 0 1072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE - - -rwxr-xr-x 0 0 0 1072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE - - -rwxr-xr-x 0 0 0 1086 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE - - -rwxr-xr-x 0 0 0 1115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt - - -rwxr-xr-x 0 0 0 355 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/__init__.py - - -rwxr-xr-x 0 0 0 854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/__main__.py - - -rwxr-xr-x 0 0 0 1450 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/__pip-runner__.py - - -rwxr-xr-x 0 0 0 511 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/__init__.py - - -rwxr-xr-x 0 0 0 21911 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/build_env.py - - -rwxr-xr-x 0 0 0 10345 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cache.py - - -rwxr-xr-x 0 0 0 131 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/__init__.py - - -rwxr-xr-x 0 0 0 7193 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py - - -rwxr-xr-x 0 0 0 9168 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/base_command.py - - -rwxr-xr-x 0 0 0 36164 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py - - -rwxr-xr-x 0 0 0 817 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/command_context.py - - -rwxr-xr-x 0 0 0 6484 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/index_command.py - - -rwxr-xr-x 0 0 0 3137 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/main.py - - -rwxr-xr-x 0 0 0 4403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py - - -rwxr-xr-x 0 0 0 13827 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/parser.py - - -rwxr-xr-x 0 0 0 4706 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py - - -rwxr-xr-x 0 0 0 16482 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/req_command.py - - -rwxr-xr-x 0 0 0 7362 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/spinners.py - - -rwxr-xr-x 0 0 0 116 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py - - -rwxr-xr-x 0 0 0 4026 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/__init__.py - - -rwxr-xr-x 0 0 0 9142 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/cache.py - - -rwxr-xr-x 0 0 0 2244 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/check.py - - -rwxr-xr-x 0 0 0 4565 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/completion.py - - -rwxr-xr-x 0 0 0 10105 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/configuration.py - - -rwxr-xr-x 0 0 0 6805 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/debug.py - - -rwxr-xr-x 0 0 0 5178 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/download.py - - -rwxr-xr-x 0 0 0 3099 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/freeze.py - - -rwxr-xr-x 0 0 0 1679 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/hash.py - - -rwxr-xr-x 0 0 0 1108 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/help.py - - -rwxr-xr-x 0 0 0 5520 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/index.py - - -rwxr-xr-x 0 0 0 3177 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/inspect.py - - -rwxr-xr-x 0 0 0 30588 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/install.py - - -rwxr-xr-x 0 0 0 13497 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/list.py - - -rwxr-xr-x 0 0 0 6027 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/lock.py - - -rwxr-xr-x 0 0 0 5782 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/search.py - - -rwxr-xr-x 0 0 0 8066 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/show.py - - -rwxr-xr-x 0 0 0 3868 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py - - -rwxr-xr-x 0 0 0 5880 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/wheel.py - - -rwxr-xr-x 0 0 0 14568 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/configuration.py - - -rwxr-xr-x 0 0 0 858 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py - - -rwxr-xr-x 0 0 0 1830 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/base.py - - -rwxr-xr-x 0 0 0 929 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/installed.py - - -rwxr-xr-x 0 0 0 6627 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py - - -rwxr-xr-x 0 0 0 1364 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py - - -rwxr-xr-x 0 0 0 32165 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/exceptions.py - - -rwxr-xr-x 0 0 0 29 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/index/__init__.py - - -rwxr-xr-x 0 0 0 16144 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/index/collector.py - - -rwxr-xr-x 0 0 0 41776 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/index/package_finder.py - - -rwxr-xr-x 0 0 0 8639 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/index/sources.py - - -rwxr-xr-x 0 0 0 14157 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/locations/__init__.py - - -rwxr-xr-x 0 0 0 5975 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py - - -rwxr-xr-x 0 0 0 7779 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py - - -rwxr-xr-x 0 0 0 2550 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/locations/base.py - - -rwxr-xr-x 0 0 0 338 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/main.py - - -rwxr-xr-x 0 0 0 5824 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py - - -rwxr-xr-x 0 0 0 2711 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/_json.py - - -rwxr-xr-x 0 0 0 25420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/base.py - - -rwxr-xr-x 0 0 0 135 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py - - -rwxr-xr-x 0 0 0 2804 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py - - -rwxr-xr-x 0 0 0 8420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py - - -rwxr-xr-x 0 0 0 5333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py - - -rwxr-xr-x 0 0 0 10544 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py - - -rwxr-xr-x 0 0 0 62 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/__init__.py - - -rwxr-xr-x 0 0 0 753 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/candidate.py - - -rwxr-xr-x 0 0 0 6555 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/direct_url.py - - -rwxr-xr-x 0 0 0 2471 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/format_control.py - - -rwxr-xr-x 0 0 0 1030 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/index.py - - -rwxr-xr-x 0 0 0 2839 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/installation_report.py - - -rwxr-xr-x 0 0 0 21992 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/link.py - - -rwxr-xr-x 0 0 0 3403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/release_control.py - - -rwxr-xr-x 0 0 0 575 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/scheme.py - - -rwxr-xr-x 0 0 0 4507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/search_scope.py - - -rwxr-xr-x 0 0 0 2221 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py - - -rwxr-xr-x 0 0 0 4243 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/target_python.py - - -rwxr-xr-x 0 0 0 2920 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/wheel.py - - -rwxr-xr-x 0 0 0 49 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/__init__.py - - -rwxr-xr-x 0 0 0 20806 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/auth.py - - -rwxr-xr-x 0 0 0 4862 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/cache.py - - -rwxr-xr-x 0 0 0 12667 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/download.py - - -rwxr-xr-x 0 0 0 7646 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py - - -rwxr-xr-x 0 0 0 19555 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/session.py - - -rwxr-xr-x 0 0 0 4091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/utils.py - - -rwxr-xr-x 0 0 0 1830 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/__init__.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py - - -rwxr-xr-x 0 0 0 4771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py - - -rwxr-xr-x 0 0 0 1421 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py - - -rwxr-xr-x 0 0 0 1509 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py - - -rwxr-xr-x 0 0 0 1136 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py - - -rwxr-xr-x 0 0 0 1478 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py - - -rwxr-xr-x 0 0 0 5894 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/check.py - - -rwxr-xr-x 0 0 0 9854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/freeze.py - - -rwxr-xr-x 0 0 0 50 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py - - -rwxr-xr-x 0 0 0 27923 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py - - -rwxr-xr-x 0 0 0 28830 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/prepare.py - - -rwxr-xr-x 0 0 0 4555 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/pyproject.py - - -rwxr-xr-x 0 0 0 3041 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/__init__.py - - -rwxr-xr-x 0 0 0 18688 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/constructors.py - - -rwxr-xr-x 0 0 0 1225 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/pep723.py - - -rwxr-xr-x 0 0 0 2618 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_dependency_group.py - - -rwxr-xr-x 0 0 0 20685 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_file.py - - -rwxr-xr-x 0 0 0 31273 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_install.py - - -rwxr-xr-x 0 0 0 2828 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_set.py - - -rwxr-xr-x 0 0 0 24099 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py - - -rwxr-xr-x 0 0 0 577 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/base.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py - - -rwxr-xr-x 0 0 0 24060 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py - - -rwxr-xr-x 0 0 0 5047 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py - - -rwxr-xr-x 0 0 0 20454 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py - - -rwxr-xr-x 0 0 0 34028 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py - - -rwxr-xr-x 0 0 0 6018 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py - - -rwxr-xr-x 0 0 0 11441 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py - - -rwxr-xr-x 0 0 0 3909 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py - - -rwxr-xr-x 0 0 0 8239 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py - - -rwxr-xr-x 0 0 0 13437 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py - - -rwxr-xr-x 0 0 0 8284 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/__init__.py - - -rwxr-xr-x 0 0 0 3350 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py - - -rwxr-xr-x 0 0 0 1015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/_log.py - - -rwxr-xr-x 0 0 0 1681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py - - -rwxr-xr-x 0 0 0 2514 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/compat.py - - -rwxr-xr-x 0 0 0 6630 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py - - -rwxr-xr-x 0 0 0 868 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/datetime.py - - -rwxr-xr-x 0 0 0 3696 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py - - -rwxr-xr-x 0 0 0 3200 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py - - -rwxr-xr-x 0 0 0 2459 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py - - -rwxr-xr-x 0 0 0 3324 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py - - -rwxr-xr-x 0 0 0 6892 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py - - -rwxr-xr-x 0 0 0 689 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py - - -rwxr-xr-x 0 0 0 3726 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/glibc.py - - -rwxr-xr-x 0 0 0 4998 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/hashes.py - - -rwxr-xr-x 0 0 0 13414 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/logging.py - - -rwxr-xr-x 0 0 0 23722 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/misc.py - - -rwxr-xr-x 0 0 0 1601 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/packaging.py - - -rwxr-xr-x 0 0 0 3817 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/pylock.py - - -rwxr-xr-x 0 0 0 1461 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/retry.py - - -rwxr-xr-x 0 0 0 8983 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py - - -rwxr-xr-x 0 0 0 9307 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py - - -rwxr-xr-x 0 0 0 12972 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py - - -rwxr-xr-x 0 0 0 1601 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/urls.py - - -rwxr-xr-x 0 0 0 3455 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py - - -rwxr-xr-x 0 0 0 4468 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/wheel.py - - -rwxr-xr-x 0 0 0 596 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py - - -rwxr-xr-x 0 0 0 3734 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py - - -rwxr-xr-x 0 0 0 19144 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/git.py - - -rwxr-xr-x 0 0 0 5575 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py - - -rwxr-xr-x 0 0 0 11787 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py - - -rwxr-xr-x 0 0 0 22599 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py - - -rwxr-xr-x 0 0 0 9010 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/wheel_builder.py - - -rwxr-xr-x 0 0 0 9394 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/README.rst - - -rwxr-xr-x 0 0 0 4907 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/__init__.py - - -rwxr-xr-x 0 0 0 558 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/LICENSE.txt - - -rwxr-xr-x 0 0 0 820 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py - - -rwxr-xr-x 0 0 0 1737 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py - - -rwxr-xr-x 0 0 0 6586 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py - - -rwxr-xr-x 0 0 0 1953 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py - - -rwxr-xr-x 0 0 0 303 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py - - -rwxr-xr-x 0 0 0 4117 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py - - -rwxr-xr-x 0 0 0 1386 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py - - -rwxr-xr-x 0 0 0 19102 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py - - -rwxr-xr-x 0 0 0 4354 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py - - -rwxr-xr-x 0 0 0 4881 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed - - -rwxr-xr-x 0 0 0 5163 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py - - -rwxr-xr-x 0 0 0 1417 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py - - -rwxr-xr-x 0 0 0 989 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/LICENSE - - -rwxr-xr-x 0 0 0 94 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py - - -rwxr-xr-x 0 0 0 255 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py - - -rwxr-xr-x 0 0 0 270954 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem - - -rwxr-xr-x 0 0 0 3442 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/core.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/py.typed - - -rwxr-xr-x 0 0 0 1099 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/LICENSE.txt - - -rwxr-xr-x 0 0 0 250 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__init__.py - - -rwxr-xr-x 0 0 0 1709 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__main__.py - - -rwxr-xr-x 0 0 0 8041 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_implementation.py - - -rwxr-xr-x 0 0 0 1710 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py - - -rwxr-xr-x 0 0 0 1865 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py - - -rwxr-xr-x 0 0 0 285 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_toml_compat.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/py.typed - - -rwxr-xr-x 0 0 0 14531 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/LICENSE.txt - - -rwxr-xr-x 0 0 0 625 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py - - -rwxr-xr-x 0 0 0 41467 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py - - -rwxr-xr-x 0 0 0 10820 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py - - -rwxr-xr-x 0 0 0 18612 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py - - -rwxr-xr-x 0 0 0 97792 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe - - -rwxr-xr-x 0 0 0 182784 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe - - -rwxr-xr-x 0 0 0 108032 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe - - -rwxr-xr-x 0 0 0 66682 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/util.py - - -rwxr-xr-x 0 0 0 91648 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe - - -rwxr-xr-x 0 0 0 168448 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe - - -rwxr-xr-x 0 0 0 101888 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe - - -rwxr-xr-x 0 0 0 11325 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/LICENSE - - -rwxr-xr-x 0 0 0 981 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py - - -rwxr-xr-x 0 0 0 64 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py - - -rwxr-xr-x 0 0 0 49430 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/distro.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/py.typed - - -rwxr-xr-x 0 0 0 1541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/LICENSE.md - - -rwxr-xr-x 0 0 0 868 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py - - -rwxr-xr-x 0 0 0 3438 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/codec.py - - -rwxr-xr-x 0 0 0 316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/compat.py - - -rwxr-xr-x 0 0 0 13246 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/core.py - - -rwxr-xr-x 0 0 0 79623 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py - - -rwxr-xr-x 0 0 0 1898 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py - - -rwxr-xr-x 0 0 0 21 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/py.typed - - -rwxr-xr-x 0 0 0 243725 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py - - -rwxr-xr-x 0 0 0 614 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/COPYING - - -rwxr-xr-x 0 0 0 1109 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py - - -rwxr-xr-x 0 0 0 5726 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py - - -rwxr-xr-x 0 0 0 32390 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py - - -rwxr-xr-x 0 0 0 197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/LICENSE - - -rwxr-xr-x 0 0 0 10174 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/LICENSE.APACHE - - -rwxr-xr-x 0 0 0 1344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/LICENSE.BSD - - -rwxr-xr-x 0 0 0 494 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py - - -rwxr-xr-x 0 0 0 3211 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py - - -rwxr-xr-x 0 0 0 9559 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py - - -rwxr-xr-x 0 0 0 2707 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py - - -rwxr-xr-x 0 0 0 10518 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py - - -rwxr-xr-x 0 0 0 1514 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py - - -rwxr-xr-x 0 0 0 5421 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py - - -rwxr-xr-x 0 0 0 5819 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__init__.py - - -rwxr-xr-x 0 0 0 51122 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/_spdx.py - - -rwxr-xr-x 0 0 0 12771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py - - -rwxr-xr-x 0 0 0 39360 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/py.typed - - -rwxr-xr-x 0 0 0 22537 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/pylock.py - - -rwxr-xr-x 0 0 0 2870 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py - - -rwxr-xr-x 0 0 0 40821 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py - - -rwxr-xr-x 0 0 0 22856 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py - - -rwxr-xr-x 0 0 0 5040 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py - - -rwxr-xr-x 0 0 0 23284 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/version.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pkg_resources/LICENSE - - -rwxr-xr-x 0 0 0 124451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py - - -rwxr-xr-x 0 0 0 1089 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/LICENSE - - -rwxr-xr-x 0 0 0 22344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py - - -rwxr-xr-x 0 0 0 1505 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py - - -rwxr-xr-x 0 0 0 9013 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py - - -rwxr-xr-x 0 0 0 9281 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py - - -rwxr-xr-x 0 0 0 6322 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed - - -rwxr-xr-x 0 0 0 10458 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py - - -rwxr-xr-x 0 0 0 704 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py - - -rwxr-xr-x 0 0 0 10362 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py - - -rwxr-xr-x 0 0 0 1331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/LICENSE - - -rwxr-xr-x 0 0 0 2983 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py - - -rwxr-xr-x 0 0 0 353 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py - - -rwxr-xr-x 0 0 0 1718 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/console.py - - -rwxr-xr-x 0 0 0 1910 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py - - -rwxr-xr-x 0 0 0 40392 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py - - -rwxr-xr-x 0 0 0 4390 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py - - -rwxr-xr-x 0 0 0 5385 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py - - -rwxr-xr-x 0 0 0 4176 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py - - -rwxr-xr-x 0 0 0 35349 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py - - -rwxr-xr-x 0 0 0 12115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py - - -rwxr-xr-x 0 0 0 77602 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py - - -rwxr-xr-x 0 0 0 53853 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py - - -rwxr-xr-x 0 0 0 1005 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py - - -rwxr-xr-x 0 0 0 1891 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py - - -rwxr-xr-x 0 0 0 3072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py - - -rwxr-xr-x 0 0 0 3092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py - - -rwxr-xr-x 0 0 0 7981 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py - - -rwxr-xr-x 0 0 0 6420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/style.py - - -rwxr-xr-x 0 0 0 2042 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py - - -rwxr-xr-x 0 0 0 3312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py - - -rwxr-xr-x 0 0 0 6226 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/token.py - - -rwxr-xr-x 0 0 0 63208 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py - - -rwxr-xr-x 0 0 0 10031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/util.py - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/LICENSE - - -rwxr-xr-x 0 0 0 691 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py - - -rwxr-xr-x 0 0 0 14936 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py - - -rwxr-xr-x 0 0 0 557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py - - -rwxr-xr-x 0 0 0 12216 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/py.typed - - -rwxr-xr-x 0 0 0 10142 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/LICENSE - - -rwxr-xr-x 0 0 0 5057 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py - - -rwxr-xr-x 0 0 0 435 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py - - -rwxr-xr-x 0 0 0 1495 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py - - -rwxr-xr-x 0 0 0 26429 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py - - -rwxr-xr-x 0 0 0 6449 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/api.py - - -rwxr-xr-x 0 0 0 10186 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/auth.py - - -rwxr-xr-x 0 0 0 441 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/certs.py - - -rwxr-xr-x 0 0 0 1822 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/compat.py - - -rwxr-xr-x 0 0 0 18590 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py - - -rwxr-xr-x 0 0 0 4272 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py - - -rwxr-xr-x 0 0 0 3813 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/help.py - - -rwxr-xr-x 0 0 0 733 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py - - -rwxr-xr-x 0 0 0 35575 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/models.py - - -rwxr-xr-x 0 0 0 1057 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/packages.py - - -rwxr-xr-x 0 0 0 30503 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py - - -rwxr-xr-x 0 0 0 4322 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py - - -rwxr-xr-x 0 0 0 2912 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/structures.py - - -rwxr-xr-x 0 0 0 33225 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/utils.py - - -rwxr-xr-x 0 0 0 751 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/LICENSE - - -rwxr-xr-x 0 0 0 541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py - - -rwxr-xr-x 0 0 0 8914 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/py.typed - - -rwxr-xr-x 0 0 0 2037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py - - -rwxr-xr-x 0 0 0 640 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py - - -rwxr-xr-x 0 0 0 1543 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py - - -rwxr-xr-x 0 0 0 1768 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py - - -rwxr-xr-x 0 0 0 1768 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py - - -rwxr-xr-x 0 0 0 24212 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py - - -rwxr-xr-x 0 0 0 6420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py - - -rwxr-xr-x 0 0 0 1056 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/LICENSE - - -rwxr-xr-x 0 0 0 6090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py - - -rwxr-xr-x 0 0 0 7896 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py - - -rwxr-xr-x 0 0 0 10209 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py - - -rwxr-xr-x 0 0 0 140235 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py - - -rwxr-xr-x 0 0 0 1064 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py - - -rwxr-xr-x 0 0 0 2128 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py - - -rwxr-xr-x 0 0 0 265 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py - - -rwxr-xr-x 0 0 0 799 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py - - -rwxr-xr-x 0 0 0 9656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py - - -rwxr-xr-x 0 0 0 3225 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py - - -rwxr-xr-x 0 0 0 1236 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py - - -rwxr-xr-x 0 0 0 1394 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py - - -rwxr-xr-x 0 0 0 7063 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py - - -rwxr-xr-x 0 0 0 423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py - - -rwxr-xr-x 0 0 0 5325 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py - - -rwxr-xr-x 0 0 0 19919 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py - - -rwxr-xr-x 0 0 0 351 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py - - -rwxr-xr-x 0 0 0 417 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py - - -rwxr-xr-x 0 0 0 22755 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py - - -rwxr-xr-x 0 0 0 1925 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py - - -rwxr-xr-x 0 0 0 2783 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py - - -rwxr-xr-x 0 0 0 3404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py - - -rwxr-xr-x 0 0 0 890 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/abc.py - - -rwxr-xr-x 0 0 0 10324 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/align.py - - -rwxr-xr-x 0 0 0 6921 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py - - -rwxr-xr-x 0 0 0 3263 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/bar.py - - -rwxr-xr-x 0 0 0 10686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/box.py - - -rwxr-xr-x 0 0 0 5130 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/cells.py - - -rwxr-xr-x 0 0 0 18211 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/color.py - - -rwxr-xr-x 0 0 0 1054 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py - - -rwxr-xr-x 0 0 0 7131 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/columns.py - - -rwxr-xr-x 0 0 0 100849 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/console.py - - -rwxr-xr-x 0 0 0 1288 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py - - -rwxr-xr-x 0 0 0 5502 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/containers.py - - -rwxr-xr-x 0 0 0 6487 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/control.py - - -rwxr-xr-x 0 0 0 8257 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py - - -rwxr-xr-x 0 0 0 1025 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py - - -rwxr-xr-x 0 0 0 2367 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py - - -rwxr-xr-x 0 0 0 642 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/errors.py - - -rwxr-xr-x 0 0 0 1683 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py - - -rwxr-xr-x 0 0 0 2484 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py - - -rwxr-xr-x 0 0 0 9586 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py - - -rwxr-xr-x 0 0 0 5031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/json.py - - -rwxr-xr-x 0 0 0 3252 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py - - -rwxr-xr-x 0 0 0 14004 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/layout.py - - -rwxr-xr-x 0 0 0 15180 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/live.py - - -rwxr-xr-x 0 0 0 3521 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py - - -rwxr-xr-x 0 0 0 12468 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/logging.py - - -rwxr-xr-x 0 0 0 8451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/markup.py - - -rwxr-xr-x 0 0 0 5305 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/measure.py - - -rwxr-xr-x 0 0 0 4908 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/padding.py - - -rwxr-xr-x 0 0 0 828 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/pager.py - - -rwxr-xr-x 0 0 0 3396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/palette.py - - -rwxr-xr-x 0 0 0 11157 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/panel.py - - -rwxr-xr-x 0 0 0 36391 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py - - -rwxr-xr-x 0 0 0 60408 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/progress.py - - -rwxr-xr-x 0 0 0 8162 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py - - -rwxr-xr-x 0 0 0 12447 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py - - -rwxr-xr-x 0 0 0 1391 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/py.typed - - -rwxr-xr-x 0 0 0 166 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/region.py - - -rwxr-xr-x 0 0 0 4431 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/repr.py - - -rwxr-xr-x 0 0 0 4602 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/rule.py - - -rwxr-xr-x 0 0 0 2843 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/scope.py - - -rwxr-xr-x 0 0 0 1591 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/screen.py - - -rwxr-xr-x 0 0 0 24743 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/segment.py - - -rwxr-xr-x 0 0 0 4214 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py - - -rwxr-xr-x 0 0 0 4424 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/status.py - - -rwxr-xr-x 0 0 0 26990 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/style.py - - -rwxr-xr-x 0 0 0 1258 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/styled.py - - -rwxr-xr-x 0 0 0 36371 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py - - -rwxr-xr-x 0 0 0 40049 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/table.py - - -rwxr-xr-x 0 0 0 3370 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py - - -rwxr-xr-x 0 0 0 47552 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/text.py - - -rwxr-xr-x 0 0 0 3771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/theme.py - - -rwxr-xr-x 0 0 0 102 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/themes.py - - -rwxr-xr-x 0 0 0 35861 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py - - -rwxr-xr-x 0 0 0 9451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/tree.py - - -rwxr-xr-x 0 0 0 1072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/LICENSE - - -rwxr-xr-x 0 0 0 314 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py - - -rwxr-xr-x 0 0 0 25778 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py - - -rwxr-xr-x 0 0 0 3235 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py - - -rwxr-xr-x 0 0 0 254 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py - - -rwxr-xr-x 0 0 0 26 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/py.typed - - -rwxr-xr-x 0 0 0 1072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli_w/LICENSE - - -rwxr-xr-x 0 0 0 169 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli_w/__init__.py - - -rwxr-xr-x 0 0 0 6961 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli_w/_writer.py - - -rwxr-xr-x 0 0 0 26 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli_w/py.typed - - -rwxr-xr-x 0 0 0 1086 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/LICENSE - - -rwxr-xr-x 0 0 0 1320 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py - - -rwxr-xr-x 0 0 0 11413 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py - - -rwxr-xr-x 0 0 0 20503 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py - - -rwxr-xr-x 0 0 0 2412 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py - - -rwxr-xr-x 0 0 0 1130 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py - - -rwxr-xr-x 0 0 0 17993 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/py.typed - - -rwxr-xr-x 0 0 0 1115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/LICENSE.txt - - -rwxr-xr-x 0 0 0 3333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py - - -rwxr-xr-x 0 0 0 11372 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py - - -rwxr-xr-x 0 0 0 64 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py - - -rwxr-xr-x 0 0 0 20314 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py - - -rwxr-xr-x 0 0 0 40408 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py - - -rwxr-xr-x 0 0 0 957 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py - - -rwxr-xr-x 0 0 0 17632 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py - - -rwxr-xr-x 0 0 0 13922 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py - - -rwxr-xr-x 0 0 0 11036 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py - - -rwxr-xr-x 0 0 0 4528 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py - - -rwxr-xr-x 0 0 0 17081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py - - -rwxr-xr-x 0 0 0 34446 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py - - -rwxr-xr-x 0 0 0 7097 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py - - -rwxr-xr-x 0 0 0 8217 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py - - -rwxr-xr-x 0 0 0 8579 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py - - -rwxr-xr-x 0 0 0 2440 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py - - -rwxr-xr-x 0 0 0 1417 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py - - -rwxr-xr-x 0 0 0 5343 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py - - -rwxr-xr-x 0 0 0 34665 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py - - -rwxr-xr-x 0 0 0 19990 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py - - -rwxr-xr-x 0 0 0 6691 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py - - -rwxr-xr-x 0 0 0 30641 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py - - -rwxr-xr-x 0 0 0 1155 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py - - -rwxr-xr-x 0 0 0 4901 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py - - -rwxr-xr-x 0 0 0 1605 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py - - -rwxr-xr-x 0 0 0 498 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py - - -rwxr-xr-x 0 0 0 3997 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py - - -rwxr-xr-x 0 0 0 3510 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py - - -rwxr-xr-x 0 0 0 22050 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py - - -rwxr-xr-x 0 0 0 17460 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py - - -rwxr-xr-x 0 0 0 5758 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py - - -rwxr-xr-x 0 0 0 6895 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py - - -rwxr-xr-x 0 0 0 10168 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py - - -rwxr-xr-x 0 0 0 14296 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py - - -rwxr-xr-x 0 0 0 5403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py - - -rwxr-xr-x 0 0 0 342 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/vendor.txt - - -rwxr-xr-x 0 0 0 286 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site-packages/pip/py.typed - - -rwxr-xr-x 0 0 0 23198 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/site.py - - -rwxr-xr-x 0 0 0 43532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/smtplib.py - - -rwxr-xr-x 0 0 0 7448 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sndhdr.py - - -rwxr-xr-x 0 0 0 37815 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/socket.py - - -rwxr-xr-x 0 0 0 28065 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/socketserver.py - - -rwxr-xr-x 0 0 0 2501 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sqlite3/__init__.py - - -rwxr-xr-x 0 0 0 3855 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sqlite3/__main__.py - - -rwxr-xr-x 0 0 0 3631 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sqlite3/dbapi2.py - - -rwxr-xr-x 0 0 0 3538 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sqlite3/dump.py - - -rwxr-xr-x 0 0 0 231 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sre_compile.py - - -rwxr-xr-x 0 0 0 232 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sre_constants.py - - -rwxr-xr-x 0 0 0 229 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sre_parse.py - - -rwxr-xr-x 0 0 0 50904 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/ssl.py - - -rwxr-xr-x 0 0 0 5485 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/stat.py - - -rwxr-xr-x 0 0 0 50227 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/statistics.py - - -rwxr-xr-x 0 0 0 11786 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/string.py - - -rwxr-xr-x 0 0 0 12917 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/stringprep.py - - -rwxr-xr-x 0 0 0 257 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/struct.py - - -rwxr-xr-x 0 0 0 88747 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/subprocess.py - - -rwxr-xr-x 0 0 0 18478 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sunau.py - - -rwxr-xr-x 0 0 0 12477 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/symtable.py - - -rwxr-xr-x 0 0 0 31850 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/sysconfig.py - - -rwxr-xr-x 0 0 0 11532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tabnanny.py - - -rwxr-xr-x 0 0 0 112569 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tarfile.py - - -rwxr-xr-x 0 0 0 23334 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/telnetlib.py - - -rwxr-xr-x 0 0 0 32386 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tempfile.py - - -rwxr-xr-x 0 0 0 19718 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/textwrap.py - - -rwxr-xr-x 0 0 0 1003 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/this.py - - -rwxr-xr-x 0 0 0 60200 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/threading.py - - -rwxr-xr-x 0 0 0 13464 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/timeit.py - - -rwxr-xr-x 0 0 0 173168 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/__init__.py - - -rwxr-xr-x 0 0 0 148 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/__main__.py - - -rwxr-xr-x 0 0 0 2660 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/colorchooser.py - - -rwxr-xr-x 0 0 0 1289 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/commondialog.py - - -rwxr-xr-x 0 0 0 1493 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/constants.py - - -rwxr-xr-x 0 0 0 1535 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/dialog.py - - -rwxr-xr-x 0 0 0 11644 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/dnd.py - - -rwxr-xr-x 0 0 0 14939 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/filedialog.py - - -rwxr-xr-x 0 0 0 7000 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/font.py - - -rwxr-xr-x 0 0 0 3861 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/messagebox.py - - -rwxr-xr-x 0 0 0 1816 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/scrolledtext.py - - -rwxr-xr-x 0 0 0 11753 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/simpledialog.py - - -rwxr-xr-x 0 0 0 77032 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/tix.py - - -rwxr-xr-x 0 0 0 56318 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tkinter/ttk.py - - -rwxr-xr-x 0 0 0 2511 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/token.py - - -rwxr-xr-x 0 0 0 21570 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tokenize.py - - -rwxr-xr-x 0 0 0 308 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tomllib/__init__.py - - -rwxr-xr-x 0 0 0 22631 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tomllib/_parser.py - - -rwxr-xr-x 0 0 0 2943 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tomllib/_re.py - - -rwxr-xr-x 0 0 0 254 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tomllib/_types.py - - -rwxr-xr-x 0 0 0 29352 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/trace.py - - -rwxr-xr-x 0 0 0 46393 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/traceback.py - - -rwxr-xr-x 0 0 0 18047 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tracemalloc.py - - -rwxr-xr-x 0 0 0 2035 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/tty.py - - -rwxr-xr-x 0 0 0 146363 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtle.py - - -rwxr-xr-x 0 0 0 314 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/__init__.py - - -rwxr-xr-x 0 0 0 15375 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/__main__.py - - -rwxr-xr-x 0 0 0 4248 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/bytedesign.py - - -rwxr-xr-x 0 0 0 951 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/chaos.py - - -rwxr-xr-x 0 0 0 3304 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/clock.py - - -rwxr-xr-x 0 0 0 1339 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/colormixer.py - - -rwxr-xr-x 0 0 0 2966 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/forest.py - - -rwxr-xr-x 0 0 0 3473 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/fractalcurves.py - - -rwxr-xr-x 0 0 0 2434 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/lindenmayer.py - - -rwxr-xr-x 0 0 0 2051 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/minimal_hanoi.py - - -rwxr-xr-x 0 0 0 6513 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/nim.py - - -rwxr-xr-x 0 0 0 1291 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/paint.py - - -rwxr-xr-x 0 0 0 1066 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/peace.py - - -rwxr-xr-x 0 0 0 3380 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/penrose.py - - -rwxr-xr-x 0 0 0 2825 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/planet_and_moon.py - - -rwxr-xr-x 0 0 0 1361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/rosette.py - - -rwxr-xr-x 0 0 0 1804 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/round_dance.py - - -rwxr-xr-x 0 0 0 5053 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/sorting_animate.py - - -rwxr-xr-x 0 0 0 1401 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/tree.py - - -rwxr-xr-x 0 0 0 160 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/turtle.cfg - - -rwxr-xr-x 0 0 0 1119 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/two_canvases.py - - -rwxr-xr-x 0 0 0 821 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/turtledemo/yinyang.py - - -rwxr-xr-x 0 0 0 10993 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/types.py - - -rwxr-xr-x 0 0 0 118836 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/typing.py - - -rwxr-xr-x 0 0 0 3487 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/__init__.py - - -rwxr-xr-x 0 0 0 472 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/__main__.py - - -rwxr-xr-x 0 0 0 2746 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/_log.py - - -rwxr-xr-x 0 0 0 5483 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/async_case.py - - -rwxr-xr-x 0 0 0 57531 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/case.py - - -rwxr-xr-x 0 0 0 21116 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/loader.py - - -rwxr-xr-x 0 0 0 11991 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/main.py - - -rwxr-xr-x 0 0 0 106317 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/mock.py - - -rwxr-xr-x 0 0 0 9130 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/result.py - - -rwxr-xr-x 0 0 0 10368 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/runner.py - - -rwxr-xr-x 0 0 0 2403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/signals.py - - -rwxr-xr-x 0 0 0 13512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/suite.py - - -rwxr-xr-x 0 0 0 5215 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/unittest/util.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/urllib/__init__.py - - -rwxr-xr-x 0 0 0 2415 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/urllib/error.py - - -rwxr-xr-x 0 0 0 45676 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/urllib/parse.py - - -rwxr-xr-x 0 0 0 103724 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/urllib/request.py - - -rwxr-xr-x 0 0 0 2361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/urllib/response.py - - -rwxr-xr-x 0 0 0 9468 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/urllib/robotparser.py - - -rwxr-xr-x 0 0 0 7365 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/uu.py - - -rwxr-xr-x 0 0 0 29656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/uuid.py - - -rwxr-xr-x 0 0 0 26750 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/venv/__init__.py - - -rwxr-xr-x 0 0 0 145 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/venv/__main__.py - - -rwxr-xr-x 0 0 0 9033 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/venv/scripts/common/Activate.ps1 - - -rwxr-xr-x 0 0 0 2170 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/venv/scripts/common/activate - - -rwxr-xr-x 0 0 0 934 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/venv/scripts/posix/activate.csh - - -rwxr-xr-x 0 0 0 2209 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/venv/scripts/posix/activate.fish - - -rwxr-xr-x 0 0 0 21909 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/warnings.py - - -rwxr-xr-x 0 0 0 22769 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/wave.py - - -rwxr-xr-x 0 0 0 21513 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/weakref.py - - -rwxr-xr-x 0 0 0 23733 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/webbrowser.py - - -rwxr-xr-x 0 0 0 657 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/wsgiref/__init__.py - - -rwxr-xr-x 0 0 0 21664 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/wsgiref/handlers.py - - -rwxr-xr-x 0 0 0 7370 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/wsgiref/headers.py - - -rwxr-xr-x 0 0 0 5171 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/wsgiref/simple_server.py - - -rwxr-xr-x 0 0 0 1717 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/wsgiref/types.py - - -rwxr-xr-x 0 0 0 5472 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/wsgiref/util.py - - -rwxr-xr-x 0 0 0 15036 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/wsgiref/validate.py - - -rwxr-xr-x 0 0 0 5942 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xdrlib.py - - -rwxr-xr-x 0 0 0 557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/__init__.py - - -rwxr-xr-x 0 0 0 936 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/dom/NodeFilter.py - - -rwxr-xr-x 0 0 0 4019 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/dom/__init__.py - - -rwxr-xr-x 0 0 0 3451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/dom/domreg.py - - -rwxr-xr-x 0 0 0 35693 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/dom/expatbuilder.py - - -rwxr-xr-x 0 0 0 3367 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/dom/minicompat.py - - -rwxr-xr-x 0 0 0 67982 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/dom/minidom.py - - -rwxr-xr-x 0 0 0 11637 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/dom/pulldom.py - - -rwxr-xr-x 0 0 0 12420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/dom/xmlbuilder.py - - -rwxr-xr-x 0 0 0 6952 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/etree/ElementInclude.py - - -rwxr-xr-x 0 0 0 13997 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/etree/ElementPath.py - - -rwxr-xr-x 0 0 0 74017 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/etree/ElementTree.py - - -rwxr-xr-x 0 0 0 1605 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/etree/__init__.py - - -rwxr-xr-x 0 0 0 82 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/etree/cElementTree.py - - -rwxr-xr-x 0 0 0 167 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/parsers/__init__.py - - -rwxr-xr-x 0 0 0 248 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/parsers/expat.py - - -rwxr-xr-x 0 0 0 3238 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/sax/__init__.py - - -rwxr-xr-x 0 0 0 4699 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/sax/_exceptions.py - - -rwxr-xr-x 0 0 0 16034 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/sax/expatreader.py - - -rwxr-xr-x 0 0 0 15617 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/sax/handler.py - - -rwxr-xr-x 0 0 0 12255 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/sax/saxutils.py - - -rwxr-xr-x 0 0 0 12624 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xml/sax/xmlreader.py - - -rwxr-xr-x 0 0 0 38 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xmlrpc/__init__.py - - -rwxr-xr-x 0 0 0 49331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xmlrpc/client.py - - -rwxr-xr-x 0 0 0 36822 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/xmlrpc/server.py - - -rwxr-xr-x 0 0 0 7543 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zipapp.py - - -rwxr-xr-x 0 0 0 88998 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zipfile/__init__.py - - -rwxr-xr-x 0 0 0 58 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zipfile/__main__.py - - -rwxr-xr-x 0 0 0 10860 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zipfile/_path/__init__.py - - -rwxr-xr-x 0 0 0 1158 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zipfile/_path/glob.py - - -rwxr-xr-x 0 0 0 27840 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zipimport.py - - -rwxr-xr-x 0 0 0 703 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zoneinfo/__init__.py - - -rwxr-xr-x 0 0 0 5294 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zoneinfo/_common.py - - -rwxr-xr-x 0 0 0 5388 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zoneinfo/_tzpath.py - - -rwxr-xr-x 0 0 0 24674 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/python3.12/zoneinfo/_zoneinfo.py - - -rwxr-xr-x 0 0 0 22932 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/auto.tcl - - -rwxr-xr-x 0 0 0 60997 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/clock.tcl - - -rwxr-xr-x 0 0 0 21330 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/cookiejar0.2/cookiejar.tcl - - -rwxr-xr-x 0 0 0 7453 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/cookiejar0.2/idna.tcl - - -rwxr-xr-x 0 0 0 214 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/cookiejar0.2/pkgIndex.tcl - - -rwxr-xr-x 0 0 0 70835 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/cookiejar0.2/public_suffix_list.dat.gz - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/ascii.enc - - -rwxr-xr-x 0 0 0 92873 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/big5.enc - - -rwxr-xr-x 0 0 0 97050 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cns11643.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1250.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1251.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1252.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1253.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1254.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1255.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1256.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1257.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1258.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp165.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp437.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp737.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp775.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp850.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp852.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp855.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp857.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp860.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp861.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp862.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp863.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp864.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp865.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp866.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp869.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp874.enc - - -rwxr-xr-x 0 0 0 48207 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp932.enc - - -rwxr-xr-x 0 0 0 132509 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp936.enc - - -rwxr-xr-x 0 0 0 130423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp949.enc - - -rwxr-xr-x 0 0 0 91831 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/cp950.enc - - -rwxr-xr-x 0 0 0 1093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/dingbats.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/ebcdic.enc - - -rwxr-xr-x 0 0 0 85574 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/euc-cn.enc - - -rwxr-xr-x 0 0 0 82537 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/euc-jp.enc - - -rwxr-xr-x 0 0 0 93918 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/euc-kr.enc - - -rwxr-xr-x 0 0 0 86619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/gb12345.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/gb1988.enc - - -rwxr-xr-x 0 0 0 84532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/gb2312-raw.enc - - -rwxr-xr-x 0 0 0 85574 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/gb2312.enc - - -rwxr-xr-x 0 0 0 192 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso2022-jp.enc - - -rwxr-xr-x 0 0 0 115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso2022-kr.enc - - -rwxr-xr-x 0 0 0 226 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso2022.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-1.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-10.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-11.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-13.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-14.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-15.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-16.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-2.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-3.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-4.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-5.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-6.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-7.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-8.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-9.enc - - -rwxr-xr-x 0 0 0 1092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/jis0201.enc - - -rwxr-xr-x 0 0 0 80453 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/jis0208.enc - - -rwxr-xr-x 0 0 0 70974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/jis0212.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/koi8-r.enc - - -rwxr-xr-x 0 0 0 1092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/koi8-ru.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/koi8-t.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/koi8-u.enc - - -rwxr-xr-x 0 0 0 92877 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/ksc5601.enc - - -rwxr-xr-x 0 0 0 1096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macCentEuro.enc - - -rwxr-xr-x 0 0 0 1096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macCroatian.enc - - -rwxr-xr-x 0 0 0 1096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macCyrillic.enc - - -rwxr-xr-x 0 0 0 1096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macDingbats.enc - - -rwxr-xr-x 0 0 0 1093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macGreek.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macIceland.enc - - -rwxr-xr-x 0 0 0 48028 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macJapan.enc - - -rwxr-xr-x 0 0 0 1093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macRoman.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macRomania.enc - - -rwxr-xr-x 0 0 0 1092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macThai.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macTurkish.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/macUkraine.enc - - -rwxr-xr-x 0 0 0 41862 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/shiftjis.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/symbol.enc - - -rwxr-xr-x 0 0 0 1092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/encoding/tis-620.enc - - -rwxr-xr-x 0 0 0 608 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/foreachline.tcl - - -rwxr-xr-x 0 0 0 7899 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/history.tcl - - -rwxr-xr-x 0 0 0 3861 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/icu.tcl - - -rwxr-xr-x 0 0 0 23575 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/init.tcl - - -rwxr-xr-x 0 0 0 7313 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/install.tcl - - -rwxr-xr-x 0 0 0 989 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/af.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/af_za.msg - - -rwxr-xr-x 0 0 0 1340 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ar.msg - - -rwxr-xr-x 0 0 0 259 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ar_in.msg - - -rwxr-xr-x 0 0 0 1024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ar_jo.msg - - -rwxr-xr-x 0 0 0 1024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ar_lb.msg - - -rwxr-xr-x 0 0 0 1024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ar_sy.msg - - -rwxr-xr-x 0 0 0 1345 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/be.msg - - -rwxr-xr-x 0 0 0 1267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/bg.msg - - -rwxr-xr-x 0 0 0 1545 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/bn.msg - - -rwxr-xr-x 0 0 0 259 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/bn_in.msg - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ca.msg - - -rwxr-xr-x 0 0 0 1212 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/cs.msg - - -rwxr-xr-x 0 0 0 1140 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/da.msg - - -rwxr-xr-x 0 0 0 1218 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/de.msg - - -rwxr-xr-x 0 0 0 796 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/de_at.msg - - -rwxr-xr-x 0 0 0 1215 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/de_be.msg - - -rwxr-xr-x 0 0 0 1396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/el.msg - - -rwxr-xr-x 0 0 0 300 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_au.msg - - -rwxr-xr-x 0 0 0 305 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_be.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_bw.msg - - -rwxr-xr-x 0 0 0 288 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_ca.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_gb.msg - - -rwxr-xr-x 0 0 0 321 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_hk.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_ie.msg - - -rwxr-xr-x 0 0 0 310 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_in.msg - - -rwxr-xr-x 0 0 0 300 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_nz.msg - - -rwxr-xr-x 0 0 0 321 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_ph.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_sg.msg - - -rwxr-xr-x 0 0 0 245 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_za.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/en_zw.msg - - -rwxr-xr-x 0 0 0 1207 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/eo.msg - - -rwxr-xr-x 0 0 0 1164 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es.msg - - -rwxr-xr-x 0 0 0 242 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_ar.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_bo.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_cl.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_co.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_cr.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_do.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_ec.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_gt.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_hn.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_mx.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_ni.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_pa.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_pe.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_pr.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_py.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_sv.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_uy.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/es_ve.msg - - -rwxr-xr-x 0 0 0 1170 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/et.msg - - -rwxr-xr-x 0 0 0 985 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/eu.msg - - -rwxr-xr-x 0 0 0 287 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/eu_es.msg - - -rwxr-xr-x 0 0 0 1062 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fa.msg - - -rwxr-xr-x 0 0 0 1331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fa_in.msg - - -rwxr-xr-x 0 0 0 381 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fa_ir.msg - - -rwxr-xr-x 0 0 0 1129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fi.msg - - -rwxr-xr-x 0 0 0 950 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fo.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fo_fo.msg - - -rwxr-xr-x 0 0 0 1181 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fr.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fr_be.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fr_ca.msg - - -rwxr-xr-x 0 0 0 281 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/fr_ch.msg - - -rwxr-xr-x 0 0 0 1029 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ga.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ga_ie.msg - - -rwxr-xr-x 0 0 0 926 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/gl.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/gl_es.msg - - -rwxr-xr-x 0 0 0 1037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/gv.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/gv_gb.msg - - -rwxr-xr-x 0 0 0 1288 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/he.msg - - -rwxr-xr-x 0 0 0 1192 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/hi.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/hi_in.msg - - -rwxr-xr-x 0 0 0 1097 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/hr.msg - - -rwxr-xr-x 0 0 0 1247 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/hu.msg - - -rwxr-xr-x 0 0 0 914 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/id.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/id_id.msg - - -rwxr-xr-x 0 0 0 1147 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/is.msg - - -rwxr-xr-x 0 0 0 1220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/it.msg - - -rwxr-xr-x 0 0 0 244 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/it_ch.msg - - -rwxr-xr-x 0 0 0 1426 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ja.msg - - -rwxr-xr-x 0 0 0 978 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/kl.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/kl_gl.msg - - -rwxr-xr-x 0 0 0 1368 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ko.msg - - -rwxr-xr-x 0 0 0 331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ko_kr.msg - - -rwxr-xr-x 0 0 0 1304 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/kok.msg - - -rwxr-xr-x 0 0 0 254 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/kok_in.msg - - -rwxr-xr-x 0 0 0 966 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/kw.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/kw_gb.msg - - -rwxr-xr-x 0 0 0 1203 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/lt.msg - - -rwxr-xr-x 0 0 0 1175 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/lv.msg - - -rwxr-xr-x 0 0 0 1361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/mk.msg - - -rwxr-xr-x 0 0 0 1228 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/mr.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/mr_in.msg - - -rwxr-xr-x 0 0 0 910 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ms.msg - - -rwxr-xr-x 0 0 0 259 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ms_my.msg - - -rwxr-xr-x 0 0 0 674 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/mt.msg - - -rwxr-xr-x 0 0 0 1141 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/nb.msg - - -rwxr-xr-x 0 0 0 1079 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/nl.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/nl_be.msg - - -rwxr-xr-x 0 0 0 1140 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/nn.msg - - -rwxr-xr-x 0 0 0 1167 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/pl.msg - - -rwxr-xr-x 0 0 0 1111 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/pt.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/pt_br.msg - - -rwxr-xr-x 0 0 0 1148 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ro.msg - - -rwxr-xr-x 0 0 0 1323 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ru.msg - - -rwxr-xr-x 0 0 0 242 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ru_ua.msg - - -rwxr-xr-x 0 0 0 1152 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/sh.msg - - -rwxr-xr-x 0 0 0 1151 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/sk.msg - - -rwxr-xr-x 0 0 0 1152 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/sl.msg - - -rwxr-xr-x 0 0 0 1227 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/sq.msg - - -rwxr-xr-x 0 0 0 1323 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/sr.msg - - -rwxr-xr-x 0 0 0 1143 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/sv.msg - - -rwxr-xr-x 0 0 0 991 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/sw.msg - - -rwxr-xr-x 0 0 0 1241 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ta.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/ta_in.msg - - -rwxr-xr-x 0 0 0 1424 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/te.msg - - -rwxr-xr-x 0 0 0 363 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/te_in.msg - - -rwxr-xr-x 0 0 0 1678 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/th.msg - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/tr.msg - - -rwxr-xr-x 0 0 0 1349 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/uk.msg - - -rwxr-xr-x 0 0 0 1221 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/vi.msg - - -rwxr-xr-x 0 0 0 2256 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/zh.msg - - -rwxr-xr-x 0 0 0 303 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/zh_cn.msg - - -rwxr-xr-x 0 0 0 677 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/zh_hk.msg - - -rwxr-xr-x 0 0 0 327 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/zh_sg.msg - - -rwxr-xr-x 0 0 0 331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/msgs/zh_tw.msg - - -rwxr-xr-x 0 0 0 30422 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/opt0.4/optparse.tcl - - -rwxr-xr-x 0 0 0 625 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/opt0.4/pkgIndex.tcl - - -rwxr-xr-x 0 0 0 23749 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/package.tcl - - -rwxr-xr-x 0 0 0 814 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/parray.tcl - - -rwxr-xr-x 0 0 0 599 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/readfile.tcl - - -rwxr-xr-x 0 0 0 46997 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/safe.tcl - - -rwxr-xr-x 0 0 0 4852 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/tclAppInit.c - - -rwxr-xr-x 0 0 0 9866 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/tclIndex - - -rwxr-xr-x 0 0 0 11904 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/tm.tcl - - -rwxr-xr-x 0 0 0 4764 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/word.tcl - - -rwxr-xr-x 0 0 0 911 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9.0/writefile.tcl - - -rwxr-xr-x 0 0 0 180267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9/9.0/http-2.10.1.tm - - -rwxr-xr-x 0 0 0 37407 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9/9.0/msgcat-1.7.1.tm - - -rwxr-xr-x 0 0 0 11053 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9/9.0/platform-1.1.0.tm - - -rwxr-xr-x 0 0 0 5975 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9/9.0/platform/shell-1.1.4.tm - - -rwxr-xr-x 0 0 0 104783 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tcl9/9.0/tcltest-2.5.10.tm - - -rwxr-xr-x 0 0 0 110144 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/thread3.0.4/libtcl9thread3.0.4.so - - -rwxr-xr-x 0 0 0 2151 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/thread3.0.4/pkgIndex.tcl - - -rwxr-xr-x 0 0 0 24364 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/thread3.0.4/ttrace.tcl - - -rwxr-xr-x 0 0 0 8924 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/bgerror.tcl - - -rwxr-xr-x 0 0 0 20834 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/button.tcl - - -rwxr-xr-x 0 0 0 9681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/choosedir.tcl - - -rwxr-xr-x 0 0 0 21550 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/clrpick.tcl - - -rwxr-xr-x 0 0 0 8355 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/comdlg.tcl - - -rwxr-xr-x 0 0 0 32084 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/console.tcl - - -rwxr-xr-x 0 0 0 2082 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/README - - -rwxr-xr-x 0 0 0 7127 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/anilabel.tcl - - -rwxr-xr-x 0 0 0 3608 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/aniwave.tcl - - -rwxr-xr-x 0 0 0 8715 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/arrow.tcl - - -rwxr-xr-x 0 0 0 3075 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/bind.tcl - - -rwxr-xr-x 0 0 0 1411 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/bitmap.tcl - - -rwxr-xr-x 0 0 0 1756 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/browse - - -rwxr-xr-x 0 0 0 1507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/button.tcl - - -rwxr-xr-x 0 0 0 2317 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/check.tcl - - -rwxr-xr-x 0 0 0 1431 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/clrpick.tcl - - -rwxr-xr-x 0 0 0 5009 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/colors.tcl - - -rwxr-xr-x 0 0 0 2064 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/combo.tcl - - -rwxr-xr-x 0 0 0 4015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/cscroll.tcl - - -rwxr-xr-x 0 0 0 6312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ctext.tcl - - -rwxr-xr-x 0 0 0 974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/dialog1.tcl - - -rwxr-xr-x 0 0 0 828 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/dialog2.tcl - - -rwxr-xr-x 0 0 0 4402 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/en.msg - - -rwxr-xr-x 0 0 0 1465 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/entry1.tcl - - -rwxr-xr-x 0 0 0 2197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/entry2.tcl - - -rwxr-xr-x 0 0 0 6146 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/entry3.tcl - - -rwxr-xr-x 0 0 0 2384 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/filebox.tcl - - -rwxr-xr-x 0 0 0 81247 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/floor.tcl - - -rwxr-xr-x 0 0 0 1692 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/fontchoose.tcl - - -rwxr-xr-x 0 0 0 1046 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/form.tcl - - -rwxr-xr-x 0 0 0 61196 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/goldberg.tcl - - -rwxr-xr-x 0 0 0 512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/hello - - -rwxr-xr-x 0 0 0 1656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/hscale.tcl - - -rwxr-xr-x 0 0 0 2065 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/icon.tcl - - -rwxr-xr-x 0 0 0 1408 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/image1.tcl - - -rwxr-xr-x 0 0 0 3535 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/image2.tcl - - -rwxr-xr-x 0 0 0 6497 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/Tcl.svg - - -rwxr-xr-x 0 0 0 11700 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/Tk_feather.png - - -rwxr-xr-x 0 0 0 51559 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/earth.gif - - -rwxr-xr-x 0 0 0 8157 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/earthmenu.png - - -rwxr-xr-x 0 0 0 6343 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/earthris.gif - - -rwxr-xr-x 0 0 0 1886 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/flagdown.xbm - - -rwxr-xr-x 0 0 0 1880 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/flagup.xbm - - -rwxr-xr-x 0 0 0 275 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/gray25.xbm - - -rwxr-xr-x 0 0 0 1883 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/letters.xbm - - -rwxr-xr-x 0 0 0 1889 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/noletter.xbm - - -rwxr-xr-x 0 0 0 54257 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/ouster.png - - -rwxr-xr-x 0 0 0 272 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/pattern.xbm - - -rwxr-xr-x 0 0 0 68476 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/plowed_field.png - - -rwxr-xr-x 0 0 0 82214 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/starry_night.png - - -rwxr-xr-x 0 0 0 2341 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/tcllogo.gif - - -rwxr-xr-x 0 0 0 196623 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/images/teapot.ppm - - -rwxr-xr-x 0 0 0 10571 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/items.tcl - - -rwxr-xr-x 0 0 0 8083 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ixset - - -rwxr-xr-x 0 0 0 8806 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/knightstour.tcl - - -rwxr-xr-x 0 0 0 1721 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/label.tcl - - -rwxr-xr-x 0 0 0 1809 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/labelframe.tcl - - -rwxr-xr-x 0 0 0 2267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/license.terms - - -rwxr-xr-x 0 0 0 10926 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/mac_styles.tcl - - -rwxr-xr-x 0 0 0 2293 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/mac_tabs.tcl - - -rwxr-xr-x 0 0 0 8746 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/mac_wm.tcl - - -rwxr-xr-x 0 0 0 5743 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/mclist.tcl - - -rwxr-xr-x 0 0 0 7607 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/menu.tcl - - -rwxr-xr-x 0 0 0 4429 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/menubu.tcl - - -rwxr-xr-x 0 0 0 2004 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/msgbox.tcl - - -rwxr-xr-x 0 0 0 7398 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/nl.msg - - -rwxr-xr-x 0 0 0 1149 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/paned1.tcl - - -rwxr-xr-x 0 0 0 2263 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/paned2.tcl - - -rwxr-xr-x 0 0 0 8256 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/pendulum.tcl - - -rwxr-xr-x 0 0 0 2918 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/plot.tcl - - -rwxr-xr-x 0 0 0 4687 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/print.tcl - - -rwxr-xr-x 0 0 0 2605 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/puzzle.tcl - - -rwxr-xr-x 0 0 0 2784 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/radio.tcl - - -rwxr-xr-x 0 0 0 5316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/rmt - - -rwxr-xr-x 0 0 0 8316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/rolodex - - -rwxr-xr-x 0 0 0 5333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ruler.tcl - - -rwxr-xr-x 0 0 0 2275 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/sayings.tcl - - -rwxr-xr-x 0 0 0 4406 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/search.tcl - - -rwxr-xr-x 0 0 0 1541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/spin.tcl - - -rwxr-xr-x 0 0 0 2030 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/states.tcl - - -rwxr-xr-x 0 0 0 6938 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/style.tcl - - -rwxr-xr-x 0 0 0 2668 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/systray.tcl - - -rwxr-xr-x 0 0 0 5471 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/tclIndex - - -rwxr-xr-x 0 0 0 11253 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/tcolor - - -rwxr-xr-x 0 0 0 4277 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/text.tcl - - -rwxr-xr-x 0 0 0 2188 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/textpeer.tcl - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/timer - - -rwxr-xr-x 0 0 0 3271 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/toolbar.tcl - - -rwxr-xr-x 0 0 0 3178 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/tree.tcl - - -rwxr-xr-x 0 0 0 3421 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ttkbut.tcl - - -rwxr-xr-x 0 0 0 2420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ttkmenu.tcl - - -rwxr-xr-x 0 0 0 2343 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ttknote.tcl - - -rwxr-xr-x 0 0 0 4180 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ttkpane.tcl - - -rwxr-xr-x 0 0 0 1533 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ttkprogress.tcl - - -rwxr-xr-x 0 0 0 1422 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ttkscale.tcl - - -rwxr-xr-x 0 0 0 1631 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/ttkspin.tcl - - -rwxr-xr-x 0 0 0 11980 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/twind.tcl - - -rwxr-xr-x 0 0 0 3969 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/unicodeout.tcl - - -rwxr-xr-x 0 0 0 1640 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/vscale.tcl - - -rwxr-xr-x 0 0 0 23966 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/widget - - -rwxr-xr-x 0 0 0 5771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/demos/windowicons.tcl - - -rwxr-xr-x 0 0 0 5800 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/dialog.tcl - - -rwxr-xr-x 0 0 0 18658 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/entry.tcl - - -rwxr-xr-x 0 0 0 4856 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/focus.tcl - - -rwxr-xr-x 0 0 0 15648 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/fontchooser.tcl - - -rwxr-xr-x 0 0 0 13074 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/iconbadges.tcl - - -rwxr-xr-x 0 0 0 16403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/iconlist.tcl - - -rwxr-xr-x 0 0 0 2380 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/icons.tcl - - -rwxr-xr-x 0 0 0 322 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/README - - -rwxr-xr-x 0 0 0 32891 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/logo.eps - - -rwxr-xr-x 0 0 0 2341 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/logo100.gif - - -rwxr-xr-x 0 0 0 1670 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/logo64.gif - - -rwxr-xr-x 0 0 0 11000 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/logoLarge.gif - - -rwxr-xr-x 0 0 0 3889 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/logoMed.gif - - -rwxr-xr-x 0 0 0 27800 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo.eps - - -rwxr-xr-x 0 0 0 1615 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo100.gif - - -rwxr-xr-x 0 0 0 2489 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo150.gif - - -rwxr-xr-x 0 0 0 2981 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo175.gif - - -rwxr-xr-x 0 0 0 3491 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo200.gif - - -rwxr-xr-x 0 0 0 1171 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo75.gif - - -rwxr-xr-x 0 0 0 5473 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/images/tai-ku.gif - - -rwxr-xr-x 0 0 0 13771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/listbox.tcl - - -rwxr-xr-x 0 0 0 9570 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/megawidget.tcl - - -rwxr-xr-x 0 0 0 38199 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/menu.tcl - - -rwxr-xr-x 0 0 0 29352 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/mkpsenc.tcl - - -rwxr-xr-x 0 0 0 17249 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgbox.tcl - - -rwxr-xr-x 0 0 0 4632 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/cs.msg - - -rwxr-xr-x 0 0 0 4604 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/da.msg - - -rwxr-xr-x 0 0 0 5495 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/de.msg - - -rwxr-xr-x 0 0 0 6249 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/el.msg - - -rwxr-xr-x 0 0 0 3882 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/en.msg - - -rwxr-xr-x 0 0 0 63 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/en_gb.msg - - -rwxr-xr-x 0 0 0 4643 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/eo.msg - - -rwxr-xr-x 0 0 0 4611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/es.msg - - -rwxr-xr-x 0 0 0 5649 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/fi.msg - - -rwxr-xr-x 0 0 0 4491 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/fr.msg - - -rwxr-xr-x 0 0 0 4871 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/hu.msg - - -rwxr-xr-x 0 0 0 4423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/it.msg - - -rwxr-xr-x 0 0 0 5196 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/nl.msg - - -rwxr-xr-x 0 0 0 5419 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/pl.msg - - -rwxr-xr-x 0 0 0 4578 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/pt.msg - - -rwxr-xr-x 0 0 0 6260 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/ru.msg - - -rwxr-xr-x 0 0 0 4471 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/sv.msg - - -rwxr-xr-x 0 0 0 5920 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/msgs/zh_cn.msg - - -rwxr-xr-x 0 0 0 1580 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/optMenu.tcl - - -rwxr-xr-x 0 0 0 9491 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/palette.tcl - - -rwxr-xr-x 0 0 0 5162 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/panedwindow.tcl - - -rwxr-xr-x 0 0 0 220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/pkgIndex.tcl - - -rwxr-xr-x 0 0 0 42564 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/print.tcl - - -rwxr-xr-x 0 0 0 7372 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/safetk.tcl - - -rwxr-xr-x 0 0 0 7928 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/scale.tcl - - -rwxr-xr-x 0 0 0 6496 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/scaling.tcl - - -rwxr-xr-x 0 0 0 14049 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/scrlbar.tcl - - -rwxr-xr-x 0 0 0 15637 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/spinbox.tcl - - -rwxr-xr-x 0 0 0 14520 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/systray.tcl - - -rwxr-xr-x 0 0 0 20142 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/tclIndex - - -rwxr-xr-x 0 0 0 4439 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/tearoff.tcl - - -rwxr-xr-x 0 0 0 36150 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/text.tcl - - -rwxr-xr-x 0 0 0 26717 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/tk.tcl - - -rwxr-xr-x 0 0 0 5543 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/tkAppInit.c - - -rwxr-xr-x 0 0 0 37326 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/tkfbox.tcl - - -rwxr-xr-x 0 0 0 5338 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/altTheme.tcl - - -rwxr-xr-x 0 0 0 5342 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/aquaTheme.tcl - - -rwxr-xr-x 0 0 0 2916 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/button.tcl - - -rwxr-xr-x 0 0 0 6619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/clamTheme.tcl - - -rwxr-xr-x 0 0 0 4739 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/classicTheme.tcl - - -rwxr-xr-x 0 0 0 15488 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/combobox.tcl - - -rwxr-xr-x 0 0 0 4439 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/cursors.tcl - - -rwxr-xr-x 0 0 0 7477 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/defaults.tcl - - -rwxr-xr-x 0 0 0 18034 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/entry.tcl - - -rwxr-xr-x 0 0 0 5031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/fonts.tcl - - -rwxr-xr-x 0 0 0 6202 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/menubutton.tcl - - -rwxr-xr-x 0 0 0 7242 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/notebook.tcl - - -rwxr-xr-x 0 0 0 2028 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/panedwindow.tcl - - -rwxr-xr-x 0 0 0 1218 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/progress.tcl - - -rwxr-xr-x 0 0 0 2580 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/scale.tcl - - -rwxr-xr-x 0 0 0 2956 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/scrollbar.tcl - - -rwxr-xr-x 0 0 0 2353 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/sizegrip.tcl - - -rwxr-xr-x 0 0 0 5309 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/spinbox.tcl - - -rwxr-xr-x 0 0 0 11898 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/treeview.tcl - - -rwxr-xr-x 0 0 0 6444 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/ttk.tcl - - -rwxr-xr-x 0 0 0 7293 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/utils.tcl - - -rwxr-xr-x 0 0 0 9358 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/vistaTheme.tcl - - -rwxr-xr-x 0 0 0 3894 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/winTheme.tcl - - -rwxr-xr-x 0 0 0 3139 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/ttk/xpTheme.tcl - - -rwxr-xr-x 0 0 0 25855 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/lib/tk9.0/xmfbox.tcl - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/share/man/man1/python3.1 -> python3.12.1 - - -rwxr-xr-x 0 0 0 20124 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_x86_64_unknown_linux_gnu/share/man/man1/python3.12.1 diff --git a/e2e/cases/uv-deps-650/crossbuild/snapshots/app_arm64_layers_listing.yaml b/e2e/cases/uv-deps-650/crossbuild/snapshots/app_arm64_layers_listing.yaml deleted file mode 100644 index 5f09c82d8..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/snapshots/app_arm64_layers_listing.yaml +++ /dev/null @@ -1,1943 +0,0 @@ ---- -layer: 0 -files: - - -rwxr-xr-x 0 0 0 4768 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/__init__.py - - -rwxr-xr-x 0 0 0 2922 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/_ipaddress.py - - -rwxr-xr-x 0 0 0 7153 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/_json.py - - -rwxr-xr-x 0 0 0 470249 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/_psycopg.cpython-312-aarch64-linux-gnu.so - - -rwxr-xr-x 0 0 0 18494 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/_range.py - - -rwxr-xr-x 0 0 0 14512 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/errorcodes.py - - -rwxr-xr-x 0 0 0 1425 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/errors.py - - -rwxr-xr-x 0 0 0 6797 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/extensions.py - - -rwxr-xr-x 0 0 0 44215 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/extras.py - - -rwxr-xr-x 0 0 0 6316 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/pool.py - - -rwxr-xr-x 0 0 0 14779 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/sql.py - - -rwxr-xr-x 0 0 0 4870 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2/tz.py - - -rwxr-xr-x 0 0 0 4936 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info/METADATA - - -rwxr-xr-x 0 0 0 2238 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info/licenses/LICENSE - - -rwxr-xr-x 0 0 0 9 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info/top_level.txt - - -rwxr-xr-x 0 0 0 132193 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libcom_err-057ba42b.so.2.1 - - -rwxr-xr-x 0 0 0 6067905 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libcrypto-88e3da85.so.3 - - -rwxr-xr-x 0 0 0 468081 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libgssapi_krb5-fec99a71.so.2.2 - - -rwxr-xr-x 0 0 0 396073 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libk5crypto-47ac5e52.so.3.1 - - -rwxr-xr-x 0 0 0 67145 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libkeyutils-19c64d08.so.1.5 - - -rwxr-xr-x 0 0 0 1133617 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libkrb5-90a0ef7c.so.3.3 - - -rwxr-xr-x 0 0 0 199737 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libkrb5support-73f3f43d.so.0.1 - - -rwxr-xr-x 0 0 0 134681 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/liblber-33741b08.so.2.0.200 - - -rwxr-xr-x 0 0 0 607017 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libldap-e13ca69f.so.2.0.200 - - -rwxr-xr-x 0 0 0 329017 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libpcre-6b975b27.so.1.2.0 - - -rwxr-xr-x 0 0 0 596369 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libpq-320873a1.so.5.17 - - -rwxr-xr-x 0 0 0 201129 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libsasl2-68c9cb0a.so.3.0.0 - - -rwxr-xr-x 0 0 0 333953 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libselinux-ae24b712.so.1 - - -rwxr-xr-x 0 0 0 1204537 Jan 1 2023 ./app.runfiles/aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs/libssl-92369ee6.so.3 ---- -layer: 1 -files: - - -rwxr-xr-x 0 0 0 17808 Jan 1 2023 ./app - - -rwxr-xr-x 0 0 0 2100 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/bin/activate - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/bin/python -> ../../../../../aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/python3 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/bin/python3 -> python - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/bin/python3.12 -> python - - -rwxr-xr-x 0 0 0 331 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/lib/python3.12/site-packages/_app_bin.venv.pth - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/lib/python3.12/site-packages/psycopg2 -> ../../../../../../../aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info -> ../../../../../../../aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary-2.9.11.dist-info - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/lib/python3.12/site-packages/psycopg2_binary.libs -> ../../../../../../../aspect_rules_py++uv+whl_install__crossbuild__psycopg2_binary__2_9_11/actual_install.install/lib/python3.12/site-packages/psycopg2_binary.libs - - -rwxr-xr-x 0 0 0 111 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/._app_bin.venv/pyvenv.cfg - - -rwxr-xr-x 0 0 0 66 Jan 1 2023 ./app.runfiles/_main/uv-deps-650/crossbuild/__main__.py - - -rwxr-xr-x 0 0 0 * Jan 1 2023 ./app.runfiles/_repo_mapping - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/2to3 -> 2to3-3.12 - - -rwxr-xr-x 0 0 0 158 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/2to3-3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/idle3 -> idle3.12 - - -rwxr-xr-x 0 0 0 156 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/idle3.12 - - -rwxr-xr-x 0 0 0 234 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/pip - - -rwxr-xr-x 0 0 0 234 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/pip3 - - -rwxr-xr-x 0 0 0 234 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/pip3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/pydoc3 -> pydoc3.12 - - -rwxr-xr-x 0 0 0 141 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/pydoc3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/python -> python3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/python3 -> python3.12 - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/python3-config -> python3.12-config - - -rwxr-xr-x 0 0 0 91873488 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/python3.12 - - -rwxr-xr-x 0 0 0 3084 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/bin/python3.12-config - - -rwxr-xr-x 0 0 0 2854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/Python.h - - -rwxr-xr-x 0 0 0 32616 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/abstract.h - - -rwxr-xr-x 0 0 0 264 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/bltinmodule.h - - -rwxr-xr-x 0 0 0 1136 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/boolobject.h - - -rwxr-xr-x 0 0 0 1466 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/bytearrayobject.h - - -rwxr-xr-x 0 0 0 2619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/bytesobject.h - - -rwxr-xr-x 0 0 0 6267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/ceval.h - - -rwxr-xr-x 0 0 0 7071 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/codecs.h - - -rwxr-xr-x 0 0 0 448 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/compile.h - - -rwxr-xr-x 0 0 0 728 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/complexobject.h - - -rwxr-xr-x 0 0 0 7870 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/abstract.h - - -rwxr-xr-x 0 0 0 1163 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/bytearrayobject.h - - -rwxr-xr-x 0 0 0 4660 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/bytesobject.h - - -rwxr-xr-x 0 0 0 1076 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/cellobject.h - - -rwxr-xr-x 0 0 0 1650 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/ceval.h - - -rwxr-xr-x 0 0 0 2245 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/classobject.h - - -rwxr-xr-x 0 0 0 16188 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/code.h - - -rwxr-xr-x 0 0 0 2660 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/compile.h - - -rwxr-xr-x 0 0 0 1248 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/complexobject.h - - -rwxr-xr-x 0 0 0 1965 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/context.h - - -rwxr-xr-x 0 0 0 1642 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/descrobject.h - - -rwxr-xr-x 0 0 0 4686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/dictobject.h - - -rwxr-xr-x 0 0 0 818 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/fileobject.h - - -rwxr-xr-x 0 0 0 232 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/fileutils.h - - -rwxr-xr-x 0 0 0 900 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/floatobject.h - - -rwxr-xr-x 0 0 0 1108 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/frameobject.h - - -rwxr-xr-x 0 0 0 7188 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/funcobject.h - - -rwxr-xr-x 0 0 0 3316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/genobject.h - - -rwxr-xr-x 0 0 0 1623 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/import.h - - -rwxr-xr-x 0 0 0 7820 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/initconfig.h - - -rwxr-xr-x 0 0 0 387 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/interpreteridobject.h - - -rwxr-xr-x 0 0 0 1633 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/listobject.h - - -rwxr-xr-x 0 0 0 4889 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/longintrepr.h - - -rwxr-xr-x 0 0 0 4679 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/longobject.h - - -rwxr-xr-x 0 0 0 2272 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/memoryobject.h - - -rwxr-xr-x 0 0 0 2276 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/methodobject.h - - -rwxr-xr-x 0 0 0 4336 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/modsupport.h - - -rwxr-xr-x 0 0 0 21212 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/object.h - - -rwxr-xr-x 0 0 0 3316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/objimpl.h - - -rwxr-xr-x 0 0 0 1311 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/odictobject.h - - -rwxr-xr-x 0 0 0 848 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/picklebufobject.h - - -rwxr-xr-x 0 0 0 3505 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pthread_stubs.h - - -rwxr-xr-x 0 0 0 1387 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pyctype.h - - -rwxr-xr-x 0 0 0 1413 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pydebug.h - - -rwxr-xr-x 0 0 0 4276 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pyerrors.h - - -rwxr-xr-x 0 0 0 444 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pyfpe.h - - -rwxr-xr-x 0 0 0 1479 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pyframe.h - - -rwxr-xr-x 0 0 0 3423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pylifecycle.h - - -rwxr-xr-x 0 0 0 3379 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pymem.h - - -rwxr-xr-x 0 0 0 17228 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pystate.h - - -rwxr-xr-x 0 0 0 4903 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pythonrun.h - - -rwxr-xr-x 0 0 0 1418 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pythread.h - - -rwxr-xr-x 0 0 0 12402 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/pytime.h - - -rwxr-xr-x 0 0 0 2146 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/setobject.h - - -rwxr-xr-x 0 0 0 489 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/sysmodule.h - - -rwxr-xr-x 0 0 0 444 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/traceback.h - - -rwxr-xr-x 0 0 0 1377 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/tupleobject.h - - -rwxr-xr-x 0 0 0 35296 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/unicodeobject.h - - -rwxr-xr-x 0 0 0 564 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/warnings.h - - -rwxr-xr-x 0 0 0 2032 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/cpython/weakrefobject.h - - -rwxr-xr-x 0 0 0 9769 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/datetime.h - - -rwxr-xr-x 0 0 0 3080 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/descrobject.h - - -rwxr-xr-x 0 0 0 3860 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/dictobject.h - - -rwxr-xr-x 0 0 0 22471 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/dynamic_annotations.h - - -rwxr-xr-x 0 0 0 253 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/enumobject.h - - -rwxr-xr-x 0 0 0 1779 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/errcode.h - - -rwxr-xr-x 0 0 0 1267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/exports.h - - -rwxr-xr-x 0 0 0 1650 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/fileobject.h - - -rwxr-xr-x 0 0 0 507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/fileutils.h - - -rwxr-xr-x 0 0 0 1532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/floatobject.h - - -rwxr-xr-x 0 0 0 336 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/frameobject.h - - -rwxr-xr-x 0 0 0 334 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/genericaliasobject.h - - -rwxr-xr-x 0 0 0 3033 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/import.h - - -rwxr-xr-x 0 0 0 611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_abstract.h - - -rwxr-xr-x 0 0 0 3035 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_asdl.h - - -rwxr-xr-x 0 0 0 31288 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_ast.h - - -rwxr-xr-x 0 0 0 6749 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_ast_state.h - - -rwxr-xr-x 0 0 0 1149 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_atexit.h - - -rwxr-xr-x 0 0 0 16979 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_atomic.h - - -rwxr-xr-x 0 0 0 2438 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_atomic_funcs.h - - -rwxr-xr-x 0 0 0 6062 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_bitutils.h - - -rwxr-xr-x 0 0 0 8688 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_blocks_output_buffer.h - - -rwxr-xr-x 0 0 0 3384 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_bytes_methods.h - - -rwxr-xr-x 0 0 0 1339 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_bytesobject.h - - -rwxr-xr-x 0 0 0 3920 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_call.h - - -rwxr-xr-x 0 0 0 5265 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_ceval.h - - -rwxr-xr-x 0 0 0 2744 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_ceval_state.h - - -rwxr-xr-x 0 0 0 15835 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_code.h - - -rwxr-xr-x 0 0 0 3453 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_compile.h - - -rwxr-xr-x 0 0 0 2909 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_condvar.h - - -rwxr-xr-x 0 0 0 1301 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_context.h - - -rwxr-xr-x 0 0 0 499 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_descrobject.h - - -rwxr-xr-x 0 0 0 6384 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_dict.h - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_dict_state.h - - -rwxr-xr-x 0 0 0 1615 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_dtoa.h - - -rwxr-xr-x 0 0 0 562 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_emscripten_signal.h - - -rwxr-xr-x 0 0 0 842 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_exceptions.h - - -rwxr-xr-x 0 0 0 2220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_faulthandler.h - - -rwxr-xr-x 0 0 0 7910 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_fileutils.h - - -rwxr-xr-x 0 0 0 2724 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_fileutils_windows.h - - -rwxr-xr-x 0 0 0 1578 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_floatobject.h - - -rwxr-xr-x 0 0 0 4630 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_flowgraph.h - - -rwxr-xr-x 0 0 0 480 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_format.h - - -rwxr-xr-x 0 0 0 9255 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_frame.h - - -rwxr-xr-x 0 0 0 611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_function.h - - -rwxr-xr-x 0 0 0 7658 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_gc.h - - -rwxr-xr-x 0 0 0 1186 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_genobject.h - - -rwxr-xr-x 0 0 0 490 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_getopt.h - - -rwxr-xr-x 0 0 0 1565 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_gil.h - - -rwxr-xr-x 0 0 0 3035 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_global_objects.h - - -rwxr-xr-x 0 0 0 115361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_global_objects_fini_generated.h - - -rwxr-xr-x 0 0 0 25438 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_global_strings.h - - -rwxr-xr-x 0 0 0 3742 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_hamt.h - - -rwxr-xr-x 0 0 0 4286 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_hashtable.h - - -rwxr-xr-x 0 0 0 6358 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_import.h - - -rwxr-xr-x 0 0 0 5706 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_initconfig.h - - -rwxr-xr-x 0 0 0 2998 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_instruments.h - - -rwxr-xr-x 0 0 0 9086 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_interp.h - - -rwxr-xr-x 0 0 0 1397 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_intrinsics.h - - -rwxr-xr-x 0 0 0 1980 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_list.h - - -rwxr-xr-x 0 0 0 7805 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_long.h - - -rwxr-xr-x 0 0 0 383 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_memoryobject.h - - -rwxr-xr-x 0 0 0 1192 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_moduleobject.h - - -rwxr-xr-x 0 0 0 392 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_namespace.h - - -rwxr-xr-x 0 0 0 14917 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_object.h - - -rwxr-xr-x 0 0 0 1016 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_object_state.h - - -rwxr-xr-x 0 0 0 27284 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_obmalloc.h - - -rwxr-xr-x 0 0 0 2085 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_obmalloc_init.h - - -rwxr-xr-x 0 0 0 20081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_opcode.h - - -rwxr-xr-x 0 0 0 2686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_opcode_utils.h - - -rwxr-xr-x 0 0 0 1358 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_parser.h - - -rwxr-xr-x 0 0 0 606 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pathconfig.h - - -rwxr-xr-x 0 0 0 2733 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pyarena.h - - -rwxr-xr-x 0 0 0 3110 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pyerrors.h - - -rwxr-xr-x 0 0 0 709 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pyhash.h - - -rwxr-xr-x 0 0 0 3365 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pylifecycle.h - - -rwxr-xr-x 0 0 0 8600 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pymath.h - - -rwxr-xr-x 0 0 0 3040 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pymem.h - - -rwxr-xr-x 0 0 0 2654 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pymem_init.h - - -rwxr-xr-x 0 0 0 4982 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pystate.h - - -rwxr-xr-x 0 0 0 2075 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_pythread.h - - -rwxr-xr-x 0 0 0 346 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_range.h - - -rwxr-xr-x 0 0 0 8429 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_runtime.h - - -rwxr-xr-x 0 0 0 5912 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_runtime_init.h - - -rwxr-xr-x 0 0 0 45751 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_runtime_init_generated.h - - -rwxr-xr-x 0 0 0 2611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_signal.h - - -rwxr-xr-x 0 0 0 414 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_sliceobject.h - - -rwxr-xr-x 0 0 0 937 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_strhex.h - - -rwxr-xr-x 0 0 0 923 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_structseq.h - - -rwxr-xr-x 0 0 0 7035 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_symtable.h - - -rwxr-xr-x 0 0 0 999 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_sysmodule.h - - -rwxr-xr-x 0 0 0 388 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_time.h - - -rwxr-xr-x 0 0 0 3050 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_token.h - - -rwxr-xr-x 0 0 0 3501 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_traceback.h - - -rwxr-xr-x 0 0 0 3075 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_tracemalloc.h - - -rwxr-xr-x 0 0 0 2197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_tuple.h - - -rwxr-xr-x 0 0 0 4731 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_typeobject.h - - -rwxr-xr-x 0 0 0 763 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_typevarobject.h - - -rwxr-xr-x 0 0 0 898 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_ucnhash.h - - -rwxr-xr-x 0 0 0 2657 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_unicodeobject.h - - -rwxr-xr-x 0 0 0 125516 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_unicodeobject_generated.h - - -rwxr-xr-x 0 0 0 682 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_unionobject.h - - -rwxr-xr-x 0 0 0 740 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/internal/pycore_warnings.h - - -rwxr-xr-x 0 0 0 333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/interpreteridobject.h - - -rwxr-xr-x 0 0 0 772 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/intrcheck.h - - -rwxr-xr-x 0 0 0 597 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/iterobject.h - - -rwxr-xr-x 0 0 0 1782 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/listobject.h - - -rwxr-xr-x 0 0 0 3739 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/longobject.h - - -rwxr-xr-x 0 0 0 827 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/marshal.h - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/memoryobject.h - - -rwxr-xr-x 0 0 0 5076 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/methodobject.h - - -rwxr-xr-x 0 0 0 6515 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/modsupport.h - - -rwxr-xr-x 0 0 0 3559 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/moduleobject.h - - -rwxr-xr-x 0 0 0 37155 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/object.h - - -rwxr-xr-x 0 0 0 9238 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/objimpl.h - - -rwxr-xr-x 0 0 0 12808 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/opcode.h - - -rwxr-xr-x 0 0 0 737 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/osdefs.h - - -rwxr-xr-x 0 0 0 291 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/osmodule.h - - -rwxr-xr-x 0 0 0 1301 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/patchlevel.h - - -rwxr-xr-x 0 0 0 2473 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/py_curses.h - - -rwxr-xr-x 0 0 0 5282 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pybuffer.h - - -rwxr-xr-x 0 0 0 1727 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pycapsule.h - - -rwxr-xr-x 0 0 0 55942 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pyconfig.h - - -rwxr-xr-x 0 0 0 2404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pydtrace.h - - -rwxr-xr-x 0 0 0 13017 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pyerrors.h - - -rwxr-xr-x 0 0 0 2850 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pyexpat.h - - -rwxr-xr-x 0 0 0 551 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pyframe.h - - -rwxr-xr-x 0 0 0 4154 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pyhash.h - - -rwxr-xr-x 0 0 0 2249 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pylifecycle.h - - -rwxr-xr-x 0 0 0 2810 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pymacconfig.h - - -rwxr-xr-x 0 0 0 6656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pymacro.h - - -rwxr-xr-x 0 0 0 1688 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pymath.h - - -rwxr-xr-x 0 0 0 3914 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pymem.h - - -rwxr-xr-x 0 0 0 25593 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pyport.h - - -rwxr-xr-x 0 0 0 4635 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pystate.h - - -rwxr-xr-x 0 0 0 2741 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pystats.h - - -rwxr-xr-x 0 0 0 436 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pystrcmp.h - - -rwxr-xr-x 0 0 0 1557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pystrtod.h - - -rwxr-xr-x 0 0 0 1313 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pythonrun.h - - -rwxr-xr-x 0 0 0 4875 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pythread.h - - -rwxr-xr-x 0 0 0 851 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/pytypedefs.h - - -rwxr-xr-x 0 0 0 630 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/rangeobject.h - - -rwxr-xr-x 0 0 0 1557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/setobject.h - - -rwxr-xr-x 0 0 0 2518 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/sliceobject.h - - -rwxr-xr-x 0 0 0 1645 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/structmember.h - - -rwxr-xr-x 0 0 0 1398 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/structseq.h - - -rwxr-xr-x 0 0 0 1729 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/sysmodule.h - - -rwxr-xr-x 0 0 0 585 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/traceback.h - - -rwxr-xr-x 0 0 0 2285 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/tracemalloc.h - - -rwxr-xr-x 0 0 0 1615 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/tupleobject.h - - -rwxr-xr-x 0 0 0 2342 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/typeslots.h - - -rwxr-xr-x 0 0 0 35164 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/unicodeobject.h - - -rwxr-xr-x 0 0 0 1129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/warnings.h - - -rwxr-xr-x 0 0 0 1234 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/include/python3.12/weakrefobject.h - - -rwxr-xr-x 0 0 0 5162 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/itcl4.3.5/itcl.tcl - - -rwxr-xr-x 0 0 0 2886 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/itcl4.3.5/itclConfig.sh - - -rwxr-xr-x 0 0 0 19378 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/itcl4.3.5/itclHullCmds.tcl - - -rwxr-xr-x 0 0 0 12114 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/itcl4.3.5/itclWidget.tcl - - -rwxr-xr-x 0 0 0 2540 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/itcl4.3.5/libitclstub.a - - -rwxr-xr-x 0 0 0 2540 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/itcl4.3.5/libitclstub4.3.5.a - - -rwxr-xr-x 0 0 0 358640 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/itcl4.3.5/libtcl9itcl4.3.5.so - - -rwxr-xr-x 0 0 0 436 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/itcl4.3.5/pkgIndex.tcl - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/libpython3.12.so -> libpython3.12.so.1.0 - - -rwxr-xr-x 0 0 0 91870112 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/libpython3.12.so.1.0 - - -rwxr-xr-x 0 0 0 131536 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/libpython3.so - - -rwxr-xr-x 0 0 0 2372632 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/libtcl9.0.so - - -rwxr-xr-x 0 0 0 3149872 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/libtcl9tk9.0.so - - -rwxr-xr-x 0 0 0 312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/pkgconfig/python-3.12-embed.pc - - -rwxr-xr-x 0 0 0 298 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/pkgconfig/python-3.12.pc - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/pkgconfig/python3-embed.pc -> python-3.12-embed.pc - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/pkgconfig/python3.pc -> python-3.12.pc - - -rwxr-xr-x 0 0 0 13936 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/LICENSE.txt - - -rwxr-xr-x 0 0 0 5218 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/__future__.py - - -rwxr-xr-x 0 0 0 227 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/__hello__.py - - -rwxr-xr-x 0 0 0 97 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/__phello__/__init__.py - - -rwxr-xr-x 0 0 0 97 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/__phello__/spam.py - - -rwxr-xr-x 0 0 0 4021 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_aix_support.py - - -rwxr-xr-x 0 0 0 32089 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_collections_abc.py - - -rwxr-xr-x 0 0 0 8761 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_compat_pickle.py - - -rwxr-xr-x 0 0 0 5681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_compression.py - - -rwxr-xr-x 0 0 0 14653 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_markupbase.py - - -rwxr-xr-x 0 0 0 22023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_osx_support.py - - -rwxr-xr-x 0 0 0 6189 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_py_abc.py - - -rwxr-xr-x 0 0 0 92087 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_pydatetime.py - - -rwxr-xr-x 0 0 0 227283 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_pydecimal.py - - -rwxr-xr-x 0 0 0 93593 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_pyio.py - - -rwxr-xr-x 0 0 0 10790 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_pylong.py - - -rwxr-xr-x 0 0 0 3128 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_sitebuiltins.py - - -rwxr-xr-x 0 0 0 28393 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_strptime.py - - -rwxr-xr-x 0 0 0 43589 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_sysconfigdata__linux_aarch64-linux-gnu.py - - -rwxr-xr-x 0 0 0 7220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_threading_local.py - - -rwxr-xr-x 0 0 0 5893 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/_weakrefset.py - - -rwxr-xr-x 0 0 0 6538 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/abc.py - - -rwxr-xr-x 0 0 0 34211 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/aifc.py - - -rwxr-xr-x 0 0 0 500 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/antigravity.py - - -rwxr-xr-x 0 0 0 101155 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/argparse.py - - -rwxr-xr-x 0 0 0 64452 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ast.py - - -rwxr-xr-x 0 0 0 1220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/__init__.py - - -rwxr-xr-x 0 0 0 3491 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/__main__.py - - -rwxr-xr-x 0 0 0 78567 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/base_events.py - - -rwxr-xr-x 0 0 0 1974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/base_futures.py - - -rwxr-xr-x 0 0 0 8869 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/base_subprocess.py - - -rwxr-xr-x 0 0 0 2672 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/base_tasks.py - - -rwxr-xr-x 0 0 0 1413 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/constants.py - - -rwxr-xr-x 0 0 0 3342 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/coroutines.py - - -rwxr-xr-x 0 0 0 29339 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/events.py - - -rwxr-xr-x 0 0 0 1752 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/exceptions.py - - -rwxr-xr-x 0 0 0 2404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/format_helpers.py - - -rwxr-xr-x 0 0 0 14340 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/futures.py - - -rwxr-xr-x 0 0 0 18995 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/locks.py - - -rwxr-xr-x 0 0 0 124 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/log.py - - -rwxr-xr-x 0 0 0 481 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/mixins.py - - -rwxr-xr-x 0 0 0 33500 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/proactor_events.py - - -rwxr-xr-x 0 0 0 6957 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/protocols.py - - -rwxr-xr-x 0 0 0 7974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/queues.py - - -rwxr-xr-x 0 0 0 7230 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/runners.py - - -rwxr-xr-x 0 0 0 48332 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/selector_events.py - - -rwxr-xr-x 0 0 0 31899 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/sslproto.py - - -rwxr-xr-x 0 0 0 7077 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/staggered.py - - -rwxr-xr-x 0 0 0 27619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/streams.py - - -rwxr-xr-x 0 0 0 7737 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/subprocess.py - - -rwxr-xr-x 0 0 0 9559 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/taskgroups.py - - -rwxr-xr-x 0 0 0 37362 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/tasks.py - - -rwxr-xr-x 0 0 0 790 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/threads.py - - -rwxr-xr-x 0 0 0 5321 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/timeouts.py - - -rwxr-xr-x 0 0 0 10722 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/transports.py - - -rwxr-xr-x 0 0 0 2475 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/trsock.py - - -rwxr-xr-x 0 0 0 53124 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/unix_events.py - - -rwxr-xr-x 0 0 0 32587 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/windows_events.py - - -rwxr-xr-x 0 0 0 5060 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/asyncio/windows_utils.py - - -rwxr-xr-x 0 0 0 20635 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/base64.py - - -rwxr-xr-x 0 0 0 33573 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/bdb.py - - -rwxr-xr-x 0 0 0 3423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/bisect.py - - -rwxr-xr-x 0 0 0 11847 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/bz2.py - - -rwxr-xr-x 0 0 0 6556 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/cProfile.py - - -rwxr-xr-x 0 0 0 25864 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/calendar.py - - -rwxr-xr-x 0 0 0 34479 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/cgi.py - - -rwxr-xr-x 0 0 0 12421 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/cgitb.py - - -rwxr-xr-x 0 0 0 5500 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/chunk.py - - -rwxr-xr-x 0 0 0 14873 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/cmd.py - - -rwxr-xr-x 0 0 0 10962 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/code.py - - -rwxr-xr-x 0 0 0 36870 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/codecs.py - - -rwxr-xr-x 0 0 0 5908 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/codeop.py - - -rwxr-xr-x 0 0 0 52378 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/collections/__init__.py - - -rwxr-xr-x 0 0 0 119 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/collections/abc.py - - -rwxr-xr-x 0 0 0 4062 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/colorsys.py - - -rwxr-xr-x 0 0 0 20507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/compileall.py - - -rwxr-xr-x 0 0 0 38 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/concurrent/__init__.py - - -rwxr-xr-x 0 0 0 1583 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/concurrent/futures/__init__.py - - -rwxr-xr-x 0 0 0 22833 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/concurrent/futures/_base.py - - -rwxr-xr-x 0 0 0 35854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/concurrent/futures/process.py - - -rwxr-xr-x 0 0 0 8946 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/concurrent/futures/thread.py - - -rwxr-xr-x 0 0 0 167414 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/Makefile - - -rwxr-xr-x 0 0 0 11525 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/Setup - - -rwxr-xr-x 0 0 0 902 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/Setup.bootstrap - - -rwxr-xr-x 0 0 0 3335 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/Setup.local - - -rwxr-xr-x 0 0 0 6396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/Setup.stdlib - - -rwxr-xr-x 0 0 0 8716 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/config.c - - -rwxr-xr-x 0 0 0 1752 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/config.c.in - - -rwxr-xr-x 0 0 0 15358 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/install-sh - - -rwxr-xr-x 0 0 0 9312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/makesetup - - -rwxr-xr-x 0 0 0 2100 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/python-config.py - - -rwxr-xr-x 0 0 0 4132 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/config-3.12-aarch64-linux-gnu/python.o - - -rwxr-xr-x 0 0 0 53789 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/configparser.py - - -rwxr-xr-x 0 0 0 27637 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/contextlib.py - - -rwxr-xr-x 0 0 0 129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/contextvars.py - - -rwxr-xr-x 0 0 0 8412 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/copy.py - - -rwxr-xr-x 0 0 0 7614 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/copyreg.py - - -rwxr-xr-x 0 0 0 3913 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/crypt.py - - -rwxr-xr-x 0 0 0 16386 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/csv.py - - -rwxr-xr-x 0 0 0 18268 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/__init__.py - - -rwxr-xr-x 0 0 0 12505 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/_aix.py - - -rwxr-xr-x 0 0 0 2535 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/_endian.py - - -rwxr-xr-x 0 0 0 296 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/README.ctypes - - -rwxr-xr-x 0 0 0 154 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/__init__.py - - -rwxr-xr-x 0 0 0 5024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/dyld.py - - -rwxr-xr-x 0 0 0 960 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/dylib.py - - -rwxr-xr-x 0 0 0 84 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/fetch_macholib - - -rwxr-xr-x 0 0 0 75 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/fetch_macholib.bat - - -rwxr-xr-x 0 0 0 1105 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/macholib/framework.py - - -rwxr-xr-x 0 0 0 13959 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/util.py - - -rwxr-xr-x 0 0 0 5629 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ctypes/wintypes.py - - -rwxr-xr-x 0 0 0 3369 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/curses/__init__.py - - -rwxr-xr-x 0 0 0 2543 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/curses/ascii.py - - -rwxr-xr-x 0 0 0 5634 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/curses/has_key.py - - -rwxr-xr-x 0 0 0 87 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/curses/panel.py - - -rwxr-xr-x 0 0 0 7754 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/curses/textpad.py - - -rwxr-xr-x 0 0 0 62085 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/dataclasses.py - - -rwxr-xr-x 0 0 0 268 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/datetime.py - - -rwxr-xr-x 0 0 0 5882 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/dbm/__init__.py - - -rwxr-xr-x 0 0 0 11594 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/dbm/dumb.py - - -rwxr-xr-x 0 0 0 72 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/dbm/gnu.py - - -rwxr-xr-x 0 0 0 70 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/dbm/ndbm.py - - -rwxr-xr-x 0 0 0 2805 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/decimal.py - - -rwxr-xr-x 0 0 0 83368 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/difflib.py - - -rwxr-xr-x 0 0 0 30227 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/dis.py - - -rwxr-xr-x 0 0 0 106749 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/doctest.py - - -rwxr-xr-x 0 0 0 1764 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/__init__.py - - -rwxr-xr-x 0 0 0 8541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/_encoded_words.py - - -rwxr-xr-x 0 0 0 111685 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/_header_value_parser.py - - -rwxr-xr-x 0 0 0 17821 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/_parseaddr.py - - -rwxr-xr-x 0 0 0 15535 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/_policybase.py - - -rwxr-xr-x 0 0 0 9561 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/architecture.rst - - -rwxr-xr-x 0 0 0 3551 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/base64mime.py - - -rwxr-xr-x 0 0 0 17063 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/charset.py - - -rwxr-xr-x 0 0 0 10588 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/contentmanager.py - - -rwxr-xr-x 0 0 0 1778 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/encoders.py - - -rwxr-xr-x 0 0 0 3814 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/errors.py - - -rwxr-xr-x 0 0 0 22796 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/feedparser.py - - -rwxr-xr-x 0 0 0 21403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/generator.py - - -rwxr-xr-x 0 0 0 24092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/header.py - - -rwxr-xr-x 0 0 0 20819 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/headerregistry.py - - -rwxr-xr-x 0 0 0 2129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/iterators.py - - -rwxr-xr-x 0 0 0 48396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/message.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/__init__.py - - -rwxr-xr-x 0 0 0 1321 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/application.py - - -rwxr-xr-x 0 0 0 3094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/audio.py - - -rwxr-xr-x 0 0 0 914 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/base.py - - -rwxr-xr-x 0 0 0 3726 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/image.py - - -rwxr-xr-x 0 0 0 1315 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/message.py - - -rwxr-xr-x 0 0 0 1619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/multipart.py - - -rwxr-xr-x 0 0 0 689 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/nonmultipart.py - - -rwxr-xr-x 0 0 0 1394 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/mime/text.py - - -rwxr-xr-x 0 0 0 4975 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/parser.py - - -rwxr-xr-x 0 0 0 10614 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/policy.py - - -rwxr-xr-x 0 0 0 9864 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/quoprimime.py - - -rwxr-xr-x 0 0 0 16071 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/email/utils.py - - -rwxr-xr-x 0 0 0 5884 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/__init__.py - - -rwxr-xr-x 0 0 0 15677 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/aliases.py - - -rwxr-xr-x 0 0 0 1248 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/ascii.py - - -rwxr-xr-x 0 0 0 1533 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/base64_codec.py - - -rwxr-xr-x 0 0 0 1019 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/big5.py - - -rwxr-xr-x 0 0 0 1039 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/big5hkscs.py - - -rwxr-xr-x 0 0 0 2249 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/bz2_codec.py - - -rwxr-xr-x 0 0 0 2084 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/charmap.py - - -rwxr-xr-x 0 0 0 13121 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp037.py - - -rwxr-xr-x 0 0 0 13568 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1006.py - - -rwxr-xr-x 0 0 0 13113 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1026.py - - -rwxr-xr-x 0 0 0 34597 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1125.py - - -rwxr-xr-x 0 0 0 13105 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1140.py - - -rwxr-xr-x 0 0 0 13686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1250.py - - -rwxr-xr-x 0 0 0 13361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1251.py - - -rwxr-xr-x 0 0 0 13511 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1252.py - - -rwxr-xr-x 0 0 0 13094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1253.py - - -rwxr-xr-x 0 0 0 13502 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1254.py - - -rwxr-xr-x 0 0 0 12466 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1255.py - - -rwxr-xr-x 0 0 0 12814 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1256.py - - -rwxr-xr-x 0 0 0 13374 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1257.py - - -rwxr-xr-x 0 0 0 13364 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp1258.py - - -rwxr-xr-x 0 0 0 14132 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp273.py - - -rwxr-xr-x 0 0 0 12055 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp424.py - - -rwxr-xr-x 0 0 0 34564 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp437.py - - -rwxr-xr-x 0 0 0 13121 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp500.py - - -rwxr-xr-x 0 0 0 13686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp720.py - - -rwxr-xr-x 0 0 0 34681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp737.py - - -rwxr-xr-x 0 0 0 34476 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp775.py - - -rwxr-xr-x 0 0 0 34105 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp850.py - - -rwxr-xr-x 0 0 0 35002 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp852.py - - -rwxr-xr-x 0 0 0 33850 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp855.py - - -rwxr-xr-x 0 0 0 12423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp856.py - - -rwxr-xr-x 0 0 0 33908 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp857.py - - -rwxr-xr-x 0 0 0 34015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp858.py - - -rwxr-xr-x 0 0 0 34681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp860.py - - -rwxr-xr-x 0 0 0 34633 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp861.py - - -rwxr-xr-x 0 0 0 33370 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp862.py - - -rwxr-xr-x 0 0 0 34252 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp863.py - - -rwxr-xr-x 0 0 0 33663 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp864.py - - -rwxr-xr-x 0 0 0 34618 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp865.py - - -rwxr-xr-x 0 0 0 34396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp866.py - - -rwxr-xr-x 0 0 0 32965 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp869.py - - -rwxr-xr-x 0 0 0 12595 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp874.py - - -rwxr-xr-x 0 0 0 12854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp875.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp932.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp949.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/cp950.py - - -rwxr-xr-x 0 0 0 1051 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/euc_jis_2004.py - - -rwxr-xr-x 0 0 0 1051 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/euc_jisx0213.py - - -rwxr-xr-x 0 0 0 1027 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/euc_jp.py - - -rwxr-xr-x 0 0 0 1027 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/euc_kr.py - - -rwxr-xr-x 0 0 0 1031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/gb18030.py - - -rwxr-xr-x 0 0 0 1027 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/gb2312.py - - -rwxr-xr-x 0 0 0 1015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/gbk.py - - -rwxr-xr-x 0 0 0 1508 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/hex_codec.py - - -rwxr-xr-x 0 0 0 13475 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/hp_roman8.py - - -rwxr-xr-x 0 0 0 1011 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/hz.py - - -rwxr-xr-x 0 0 0 9710 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/idna.py - - -rwxr-xr-x 0 0 0 1053 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp.py - - -rwxr-xr-x 0 0 0 1061 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_1.py - - -rwxr-xr-x 0 0 0 1061 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_2.py - - -rwxr-xr-x 0 0 0 1073 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_2004.py - - -rwxr-xr-x 0 0 0 1061 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_3.py - - -rwxr-xr-x 0 0 0 1069 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_jp_ext.py - - -rwxr-xr-x 0 0 0 1053 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso2022_kr.py - - -rwxr-xr-x 0 0 0 13176 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_1.py - - -rwxr-xr-x 0 0 0 13589 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_10.py - - -rwxr-xr-x 0 0 0 12335 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_11.py - - -rwxr-xr-x 0 0 0 13271 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_13.py - - -rwxr-xr-x 0 0 0 13652 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_14.py - - -rwxr-xr-x 0 0 0 13212 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_15.py - - -rwxr-xr-x 0 0 0 13557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_16.py - - -rwxr-xr-x 0 0 0 13404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_2.py - - -rwxr-xr-x 0 0 0 13089 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_3.py - - -rwxr-xr-x 0 0 0 13376 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_4.py - - -rwxr-xr-x 0 0 0 13015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_5.py - - -rwxr-xr-x 0 0 0 10833 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_6.py - - -rwxr-xr-x 0 0 0 12844 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_7.py - - -rwxr-xr-x 0 0 0 11036 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_8.py - - -rwxr-xr-x 0 0 0 13156 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/iso8859_9.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/johab.py - - -rwxr-xr-x 0 0 0 13779 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/koi8_r.py - - -rwxr-xr-x 0 0 0 13193 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/koi8_t.py - - -rwxr-xr-x 0 0 0 13762 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/koi8_u.py - - -rwxr-xr-x 0 0 0 13723 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/kz1048.py - - -rwxr-xr-x 0 0 0 1264 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/latin_1.py - - -rwxr-xr-x 0 0 0 36467 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_arabic.py - - -rwxr-xr-x 0 0 0 13633 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_croatian.py - - -rwxr-xr-x 0 0 0 13454 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_cyrillic.py - - -rwxr-xr-x 0 0 0 15170 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_farsi.py - - -rwxr-xr-x 0 0 0 13721 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_greek.py - - -rwxr-xr-x 0 0 0 13498 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_iceland.py - - -rwxr-xr-x 0 0 0 14118 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_latin2.py - - -rwxr-xr-x 0 0 0 13480 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_roman.py - - -rwxr-xr-x 0 0 0 13661 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_romanian.py - - -rwxr-xr-x 0 0 0 13513 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mac_turkish.py - - -rwxr-xr-x 0 0 0 1211 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/mbcs.py - - -rwxr-xr-x 0 0 0 1019 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/oem.py - - -rwxr-xr-x 0 0 0 13519 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/palmos.py - - -rwxr-xr-x 0 0 0 14015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/ptcp154.py - - -rwxr-xr-x 0 0 0 6883 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/punycode.py - - -rwxr-xr-x 0 0 0 1525 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/quopri_codec.py - - -rwxr-xr-x 0 0 0 1332 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/raw_unicode_escape.py - - -rwxr-xr-x 0 0 0 2448 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/rot_13.py - - -rwxr-xr-x 0 0 0 1039 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/shift_jis.py - - -rwxr-xr-x 0 0 0 1059 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/shift_jis_2004.py - - -rwxr-xr-x 0 0 0 1059 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/shift_jisx0213.py - - -rwxr-xr-x 0 0 0 12300 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/tis_620.py - - -rwxr-xr-x 0 0 0 1299 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/undefined.py - - -rwxr-xr-x 0 0 0 1304 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/unicode_escape.py - - -rwxr-xr-x 0 0 0 5236 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_16.py - - -rwxr-xr-x 0 0 0 1037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_16_be.py - - -rwxr-xr-x 0 0 0 1037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_16_le.py - - -rwxr-xr-x 0 0 0 5129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_32.py - - -rwxr-xr-x 0 0 0 930 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_32_be.py - - -rwxr-xr-x 0 0 0 930 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_32_le.py - - -rwxr-xr-x 0 0 0 946 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_7.py - - -rwxr-xr-x 0 0 0 1005 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_8.py - - -rwxr-xr-x 0 0 0 4133 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/utf_8_sig.py - - -rwxr-xr-x 0 0 0 2851 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/uu_codec.py - - -rwxr-xr-x 0 0 0 2204 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/encodings/zlib_codec.py - - -rwxr-xr-x 0 0 0 9445 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ensurepip/__init__.py - - -rwxr-xr-x 0 0 0 88 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ensurepip/__main__.py - - -rwxr-xr-x 0 0 0 1841526 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ensurepip/_bundled/pip-25.0.1-py3-none-any.whl - - -rwxr-xr-x 0 0 0 808 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ensurepip/_uninstall.py - - -rwxr-xr-x 0 0 0 81540 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/enum.py - - -rwxr-xr-x 0 0 0 10381 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/filecmp.py - - -rwxr-xr-x 0 0 0 15714 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/fileinput.py - - -rwxr-xr-x 0 0 0 5999 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/fnmatch.py - - -rwxr-xr-x 0 0 0 38147 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/fractions.py - - -rwxr-xr-x 0 0 0 34735 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ftplib.py - - -rwxr-xr-x 0 0 0 37940 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/functools.py - - -rwxr-xr-x 0 0 0 5572 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/genericpath.py - - -rwxr-xr-x 0 0 0 7488 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/getopt.py - - -rwxr-xr-x 0 0 0 5990 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/getpass.py - - -rwxr-xr-x 0 0 0 21320 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/gettext.py - - -rwxr-xr-x 0 0 0 8732 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/glob.py - - -rwxr-xr-x 0 0 0 9648 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/graphlib.py - - -rwxr-xr-x 0 0 0 25402 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/gzip.py - - -rwxr-xr-x 0 0 0 9349 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/hashlib.py - - -rwxr-xr-x 0 0 0 23024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/heapq.py - - -rwxr-xr-x 0 0 0 7716 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/hmac.py - - -rwxr-xr-x 0 0 0 4775 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/html/__init__.py - - -rwxr-xr-x 0 0 0 75512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/html/entities.py - - -rwxr-xr-x 0 0 0 20858 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/html/parser.py - - -rwxr-xr-x 0 0 0 8308 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/http/__init__.py - - -rwxr-xr-x 0 0 0 58041 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/http/client.py - - -rwxr-xr-x 0 0 0 77438 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/http/cookiejar.py - - -rwxr-xr-x 0 0 0 20854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/http/cookies.py - - -rwxr-xr-x 0 0 0 49202 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/http/server.py - - -rwxr-xr-x 0 0 0 2148 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/CREDITS.txt - - -rwxr-xr-x 0 0 0 56360 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/ChangeLog - - -rwxr-xr-x 0 0 0 10313 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/HISTORY.txt - - -rwxr-xr-x 0 0 0 1935 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/README.txt - - -rwxr-xr-x 0 0 0 120 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/folder.gif - - -rwxr-xr-x 0 0 0 57746 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle.ico - - -rwxr-xr-x 0 0 0 634 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_16.gif - - -rwxr-xr-x 0 0 0 1031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_16.png - - -rwxr-xr-x 0 0 0 39205 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_256.png - - -rwxr-xr-x 0 0 0 1019 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_32.gif - - -rwxr-xr-x 0 0 0 2036 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_32.png - - -rwxr-xr-x 0 0 0 1388 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_48.gif - - -rwxr-xr-x 0 0 0 3977 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/idle_48.png - - -rwxr-xr-x 0 0 0 75 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/minusnode.gif - - -rwxr-xr-x 0 0 0 125 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/openfolder.gif - - -rwxr-xr-x 0 0 0 78 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/plusnode.gif - - -rwxr-xr-x 0 0 0 380 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/python.gif - - -rwxr-xr-x 0 0 0 72 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/Icons/tk.gif - - -rwxr-xr-x 0 0 0 27172 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/NEWS2x.txt - - -rwxr-xr-x 0 0 0 56500 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/News3.txt - - -rwxr-xr-x 0 0 0 11653 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/README.txt - - -rwxr-xr-x 0 0 0 8477 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/TODO.txt - - -rwxr-xr-x 0 0 0 396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/__init__.py - - -rwxr-xr-x 0 0 0 107 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/__main__.py - - -rwxr-xr-x 0 0 0 9354 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/autocomplete.py - - -rwxr-xr-x 0 0 0 20863 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/autocomplete_w.py - - -rwxr-xr-x 0 0 0 3216 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/autoexpand.py - - -rwxr-xr-x 0 0 0 8588 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/browser.py - - -rwxr-xr-x 0 0 0 7267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/calltip.py - - -rwxr-xr-x 0 0 0 7083 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/calltip_w.py - - -rwxr-xr-x 0 0 0 11420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/codecontext.py - - -rwxr-xr-x 0 0 0 14783 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/colorizer.py - - -rwxr-xr-x 0 0 0 2266 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/config-extensions.def - - -rwxr-xr-x 0 0 0 2864 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/config-highlight.def - - -rwxr-xr-x 0 0 0 10910 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/config-keys.def - - -rwxr-xr-x 0 0 0 3168 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/config-main.def - - -rwxr-xr-x 0 0 0 38403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/config.py - - -rwxr-xr-x 0 0 0 15230 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/config_key.py - - -rwxr-xr-x 0 0 0 105310 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/configdialog.py - - -rwxr-xr-x 0 0 0 20991 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/debugger.py - - -rwxr-xr-x 0 0 0 12115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/debugger_r.py - - -rwxr-xr-x 0 0 0 4177 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/debugobj.py - - -rwxr-xr-x 0 0 0 1082 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/debugobj_r.py - - -rwxr-xr-x 0 0 0 1044 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/delegator.py - - -rwxr-xr-x 0 0 0 1993 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/dynoption.py - - -rwxr-xr-x 0 0 0 69561 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/editor.py - - -rwxr-xr-x 0 0 0 3632 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/extend.txt - - -rwxr-xr-x 0 0 0 3871 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/filelist.py - - -rwxr-xr-x 0 0 0 15777 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/format.py - - -rwxr-xr-x 0 0 0 7521 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/grep.py - - -rwxr-xr-x 0 0 0 60566 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/help.html - - -rwxr-xr-x 0 0 0 11843 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/help.py - - -rwxr-xr-x 0 0 0 9023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/help_about.py - - -rwxr-xr-x 0 0 0 4065 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/history.py - - -rwxr-xr-x 0 0 0 12889 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/hyperparser.py - - -rwxr-xr-x 0 0 0 177 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/idle.bat - - -rwxr-xr-x 0 0 0 454 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/idle.py - - -rwxr-xr-x 0 0 0 570 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/idle.pyw - - -rwxr-xr-x 0 0 0 16159 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/iomenu.py - - -rwxr-xr-x 0 0 0 9290 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/macosx.py - - -rwxr-xr-x 0 0 0 3938 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/mainmenu.py - - -rwxr-xr-x 0 0 0 18652 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/multicall.py - - -rwxr-xr-x 0 0 0 5705 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/outwin.py - - -rwxr-xr-x 0 0 0 7204 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/parenmatch.py - - -rwxr-xr-x 0 0 0 3093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/pathbrowser.py - - -rwxr-xr-x 0 0 0 3568 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/percolator.py - - -rwxr-xr-x 0 0 0 19864 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/pyparse.py - - -rwxr-xr-x 0 0 0 62194 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/pyshell.py - - -rwxr-xr-x 0 0 0 15067 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/query.py - - -rwxr-xr-x 0 0 0 6777 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/redirector.py - - -rwxr-xr-x 0 0 0 9841 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/replace.py - - -rwxr-xr-x 0 0 0 21078 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/rpc.py - - -rwxr-xr-x 0 0 0 21654 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/run.py - - -rwxr-xr-x 0 0 0 8273 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/runscript.py - - -rwxr-xr-x 0 0 0 4478 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/scrolledlist.py - - -rwxr-xr-x 0 0 0 5567 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/search.py - - -rwxr-xr-x 0 0 0 7852 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/searchbase.py - - -rwxr-xr-x 0 0 0 7415 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/searchengine.py - - -rwxr-xr-x 0 0 0 20338 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/sidebar.py - - -rwxr-xr-x 0 0 0 12834 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/squeezer.py - - -rwxr-xr-x 0 0 0 4016 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/stackviewer.py - - -rwxr-xr-x 0 0 0 1474 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/statusbar.py - - -rwxr-xr-x 0 0 0 6808 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/textview.py - - -rwxr-xr-x 0 0 0 6665 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/tooltip.py - - -rwxr-xr-x 0 0 0 16773 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/tree.py - - -rwxr-xr-x 0 0 0 11016 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/undo.py - - -rwxr-xr-x 0 0 0 1312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/util.py - - -rwxr-xr-x 0 0 0 2616 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/window.py - - -rwxr-xr-x 0 0 0 4203 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/zoomheight.py - - -rwxr-xr-x 0 0 0 2005 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/idlelib/zzdummy.py - - -rwxr-xr-x 0 0 0 54040 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/imaplib.py - - -rwxr-xr-x 0 0 0 4398 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/imghdr.py - - -rwxr-xr-x 0 0 0 4784 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/__init__.py - - -rwxr-xr-x 0 0 0 1354 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/_abc.py - - -rwxr-xr-x 0 0 0 57057 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/_bootstrap.py - - -rwxr-xr-x 0 0 0 69406 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/_bootstrap_external.py - - -rwxr-xr-x 0 0 0 7612 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/abc.py - - -rwxr-xr-x 0 0 0 880 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/machinery.py - - -rwxr-xr-x 0 0 0 28757 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/metadata/__init__.py - - -rwxr-xr-x 0 0 0 2406 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_adapters.py - - -rwxr-xr-x 0 0 0 743 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_collections.py - - -rwxr-xr-x 0 0 0 2895 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_functools.py - - -rwxr-xr-x 0 0 0 2068 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_itertools.py - - -rwxr-xr-x 0 0 0 1590 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_meta.py - - -rwxr-xr-x 0 0 0 2166 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/metadata/_text.py - - -rwxr-xr-x 0 0 0 327 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/readers.py - - -rwxr-xr-x 0 0 0 532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/resources/__init__.py - - -rwxr-xr-x 0 0 0 4482 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/resources/_adapters.py - - -rwxr-xr-x 0 0 0 5486 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/resources/_common.py - - -rwxr-xr-x 0 0 0 1277 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/resources/_itertools.py - - -rwxr-xr-x 0 0 0 2949 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/resources/_legacy.py - - -rwxr-xr-x 0 0 0 5203 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/resources/abc.py - - -rwxr-xr-x 0 0 0 4370 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/resources/readers.py - - -rwxr-xr-x 0 0 0 2584 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/resources/simple.py - - -rwxr-xr-x 0 0 0 354 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/simple.py - - -rwxr-xr-x 0 0 0 10994 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/importlib/util.py - - -rwxr-xr-x 0 0 0 127125 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/inspect.py - - -rwxr-xr-x 0 0 0 3582 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/io.py - - -rwxr-xr-x 0 0 0 81414 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ipaddress.py - - -rwxr-xr-x 0 0 0 14020 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/json/__init__.py - - -rwxr-xr-x 0 0 0 12525 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/json/decoder.py - - -rwxr-xr-x 0 0 0 16075 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/json/encoder.py - - -rwxr-xr-x 0 0 0 2434 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/json/scanner.py - - -rwxr-xr-x 0 0 0 3339 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/json/tool.py - - -rwxr-xr-x 0 0 0 1073 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/keyword.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib-dynload/.empty - - -rwxr-xr-x 0 0 0 80840 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib-dynload/_crypt.cpython-312-aarch64-linux-gnu.so - - -rwxr-xr-x 0 0 0 191408 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib-dynload/_ctypes_test.cpython-312-aarch64-linux-gnu.so - - -rwxr-xr-x 0 0 0 1726872 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib-dynload/_dbm.cpython-312-aarch64-linux-gnu.so - - -rwxr-xr-x 0 0 0 327896 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib-dynload/_tkinter.cpython-312-aarch64-linux-gnu.so - - -rwxr-xr-x 0 0 0 8696 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/Grammar.txt - - -rwxr-xr-x 0 0 0 15313 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/Grammar3.12.13.final.0.pickle - - -rwxr-xr-x 0 0 0 793 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/PatternGrammar.txt - - -rwxr-xr-x 0 0 0 1225 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/PatternGrammar3.12.13.final.0.pickle - - -rwxr-xr-x 0 0 0 156 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/__init__.py - - -rwxr-xr-x 0 0 0 67 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/__main__.py - - -rwxr-xr-x 0 0 0 6623 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/btm_matcher.py - - -rwxr-xr-x 0 0 0 9945 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/btm_utils.py - - -rwxr-xr-x 0 0 0 6690 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixer_base.py - - -rwxr-xr-x 0 0 0 15206 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixer_util.py - - -rwxr-xr-x 0 0 0 47 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/__init__.py - - -rwxr-xr-x 0 0 0 2346 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_apply.py - - -rwxr-xr-x 0 0 0 984 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_asserts.py - - -rwxr-xr-x 0 0 0 320 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_basestring.py - - -rwxr-xr-x 0 0 0 590 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_buffer.py - - -rwxr-xr-x 0 0 0 3760 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_dict.py - - -rwxr-xr-x 0 0 0 3344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_except.py - - -rwxr-xr-x 0 0 0 979 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_exec.py - - -rwxr-xr-x 0 0 0 2048 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_execfile.py - - -rwxr-xr-x 0 0 0 2495 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_exitfunc.py - - -rwxr-xr-x 0 0 0 2765 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_filter.py - - -rwxr-xr-x 0 0 0 644 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_funcattrs.py - - -rwxr-xr-x 0 0 0 547 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_future.py - - -rwxr-xr-x 0 0 0 451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_getcwdu.py - - -rwxr-xr-x 0 0 0 3196 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_has_key.py - - -rwxr-xr-x 0 0 0 4876 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_idioms.py - - -rwxr-xr-x 0 0 0 3256 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_import.py - - -rwxr-xr-x 0 0 0 5684 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_imports.py - - -rwxr-xr-x 0 0 0 289 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_imports2.py - - -rwxr-xr-x 0 0 0 708 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_input.py - - -rwxr-xr-x 0 0 0 1144 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_intern.py - - -rwxr-xr-x 0 0 0 1608 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_isinstance.py - - -rwxr-xr-x 0 0 0 1548 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_itertools.py - - -rwxr-xr-x 0 0 0 2086 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_itertools_imports.py - - -rwxr-xr-x 0 0 0 476 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_long.py - - -rwxr-xr-x 0 0 0 3640 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_map.py - - -rwxr-xr-x 0 0 0 8197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_metaclass.py - - -rwxr-xr-x 0 0 0 606 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_methodattrs.py - - -rwxr-xr-x 0 0 0 571 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_ne.py - - -rwxr-xr-x 0 0 0 3174 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_next.py - - -rwxr-xr-x 0 0 0 591 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_nonzero.py - - -rwxr-xr-x 0 0 0 768 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_numliterals.py - - -rwxr-xr-x 0 0 0 3426 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_operator.py - - -rwxr-xr-x 0 0 0 1226 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_paren.py - - -rwxr-xr-x 0 0 0 2844 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_print.py - - -rwxr-xr-x 0 0 0 2926 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_raise.py - - -rwxr-xr-x 0 0 0 454 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_raw_input.py - - -rwxr-xr-x 0 0 0 837 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_reduce.py - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_reload.py - - -rwxr-xr-x 0 0 0 2221 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_renames.py - - -rwxr-xr-x 0 0 0 613 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_repr.py - - -rwxr-xr-x 0 0 0 1697 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_set_literal.py - - -rwxr-xr-x 0 0 0 449 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_standarderror.py - - -rwxr-xr-x 0 0 0 1034 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_sys_exc.py - - -rwxr-xr-x 0 0 0 1582 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_throw.py - - -rwxr-xr-x 0 0 0 5565 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_tuple_params.py - - -rwxr-xr-x 0 0 0 1774 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_types.py - - -rwxr-xr-x 0 0 0 1256 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_unicode.py - - -rwxr-xr-x 0 0 0 8367 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_urllib.py - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_ws_comma.py - - -rwxr-xr-x 0 0 0 2694 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_xrange.py - - -rwxr-xr-x 0 0 0 689 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_xreadlines.py - - -rwxr-xr-x 0 0 0 1289 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/fixes/fix_zip.py - - -rwxr-xr-x 0 0 0 11854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/main.py - - -rwxr-xr-x 0 0 0 7054 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/patcomp.py - - -rwxr-xr-x 0 0 0 143 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/__init__.py - - -rwxr-xr-x 0 0 0 9642 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/conv.py - - -rwxr-xr-x 0 0 0 5969 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/driver.py - - -rwxr-xr-x 0 0 0 5552 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/grammar.py - - -rwxr-xr-x 0 0 0 1635 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/literals.py - - -rwxr-xr-x 0 0 0 8155 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/parse.py - - -rwxr-xr-x 0 0 0 13830 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/pgen.py - - -rwxr-xr-x 0 0 0 1302 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/token.py - - -rwxr-xr-x 0 0 0 21119 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pgen2/tokenize.py - - -rwxr-xr-x 0 0 0 1305 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pygram.py - - -rwxr-xr-x 0 0 0 27974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/pytree.py - - -rwxr-xr-x 0 0 0 27507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lib2to3/refactor.py - - -rwxr-xr-x 0 0 0 5800 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/linecache.py - - -rwxr-xr-x 0 0 0 78599 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/locale.py - - -rwxr-xr-x 0 0 0 83437 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/logging/__init__.py - - -rwxr-xr-x 0 0 0 42798 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/logging/config.py - - -rwxr-xr-x 0 0 0 62596 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/logging/handlers.py - - -rwxr-xr-x 0 0 0 13277 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/lzma.py - - -rwxr-xr-x 0 0 0 78911 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/mailbox.py - - -rwxr-xr-x 0 0 0 9333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/mailcap.py - - -rwxr-xr-x 0 0 0 23037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/mimetypes.py - - -rwxr-xr-x 0 0 0 23699 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/modulefinder.py - - -rwxr-xr-x 0 0 0 916 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/__init__.py - - -rwxr-xr-x 0 0 0 41398 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/connection.py - - -rwxr-xr-x 0 0 0 11673 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/context.py - - -rwxr-xr-x 0 0 0 3061 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/dummy/__init__.py - - -rwxr-xr-x 0 0 0 1598 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/dummy/connection.py - - -rwxr-xr-x 0 0 0 12202 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/forkserver.py - - -rwxr-xr-x 0 0 0 11626 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/heap.py - - -rwxr-xr-x 0 0 0 47893 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/managers.py - - -rwxr-xr-x 0 0 0 32760 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/pool.py - - -rwxr-xr-x 0 0 0 2377 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/popen_fork.py - - -rwxr-xr-x 0 0 0 2230 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/popen_forkserver.py - - -rwxr-xr-x 0 0 0 2029 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/popen_spawn_posix.py - - -rwxr-xr-x 0 0 0 4515 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/popen_spawn_win32.py - - -rwxr-xr-x 0 0 0 12139 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/process.py - - -rwxr-xr-x 0 0 0 12693 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/queues.py - - -rwxr-xr-x 0 0 0 9512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/reduction.py - - -rwxr-xr-x 0 0 0 5145 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/resource_sharer.py - - -rwxr-xr-x 0 0 0 11077 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/resource_tracker.py - - -rwxr-xr-x 0 0 0 18458 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/shared_memory.py - - -rwxr-xr-x 0 0 0 6306 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/sharedctypes.py - - -rwxr-xr-x 0 0 0 9644 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/spawn.py - - -rwxr-xr-x 0 0 0 12272 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/synchronize.py - - -rwxr-xr-x 0 0 0 14261 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/multiprocessing/util.py - - -rwxr-xr-x 0 0 0 6922 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/netrc.py - - -rwxr-xr-x 0 0 0 41087 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/nntplib.py - - -rwxr-xr-x 0 0 0 30404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ntpath.py - - -rwxr-xr-x 0 0 0 2374 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/nturl2path.py - - -rwxr-xr-x 0 0 0 11467 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/numbers.py - - -rwxr-xr-x 0 0 0 13174 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/opcode.py - - -rwxr-xr-x 0 0 0 10965 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/operator.py - - -rwxr-xr-x 0 0 0 60369 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/optparse.py - - -rwxr-xr-x 0 0 0 40821 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/os.py - - -rwxr-xr-x 0 0 0 51052 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pathlib.py - - -rwxr-xr-x 0 0 0 70298 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pdb.py - - -rwxr-xr-x 0 0 0 66911 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pickle.py - - -rwxr-xr-x 0 0 0 94052 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pickletools.py - - -rwxr-xr-x 0 0 0 8978 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pipes.py - - -rwxr-xr-x 0 0 0 18281 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pkgutil.py - - -rwxr-xr-x 0 0 0 43388 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/platform.py - - -rwxr-xr-x 0 0 0 28582 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/plistlib.py - - -rwxr-xr-x 0 0 0 14619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/poplib.py - - -rwxr-xr-x 0 0 0 17356 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/posixpath.py - - -rwxr-xr-x 0 0 0 24158 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pprint.py - - -rwxr-xr-x 0 0 0 23093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/profile.py - - -rwxr-xr-x 0 0 0 29289 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pstats.py - - -rwxr-xr-x 0 0 0 6137 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pty.py - - -rwxr-xr-x 0 0 0 7837 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/py_compile.py - - -rwxr-xr-x 0 0 0 11396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pyclbr.py - - -rwxr-xr-x 0 0 0 113508 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pydoc.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pydoc_data/__init__.py - - -rwxr-xr-x 0 0 0 1325 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pydoc_data/_pydoc.css - - -rwxr-xr-x 0 0 0 519590 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/pydoc_data/topics.py - - -rwxr-xr-x 0 0 0 11496 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/queue.py - - -rwxr-xr-x 0 0 0 7184 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/quopri.py - - -rwxr-xr-x 0 0 0 34689 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/random.py - - -rwxr-xr-x 0 0 0 16315 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/re/__init__.py - - -rwxr-xr-x 0 0 0 5444 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/re/_casefix.py - - -rwxr-xr-x 0 0 0 26399 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/re/_compiler.py - - -rwxr-xr-x 0 0 0 5930 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/re/_constants.py - - -rwxr-xr-x 0 0 0 41201 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/re/_parser.py - - -rwxr-xr-x 0 0 0 7148 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/reprlib.py - - -rwxr-xr-x 0 0 0 7827 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/rlcompleter.py - - -rwxr-xr-x 0 0 0 12885 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/runpy.py - - -rwxr-xr-x 0 0 0 6351 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sched.py - - -rwxr-xr-x 0 0 0 1984 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/secrets.py - - -rwxr-xr-x 0 0 0 19671 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/selectors.py - - -rwxr-xr-x 0 0 0 8560 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/shelve.py - - -rwxr-xr-x 0 0 0 13353 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/shlex.py - - -rwxr-xr-x 0 0 0 56762 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/shutil.py - - -rwxr-xr-x 0 0 0 2495 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/signal.py - - -rwxr-xr-x 0 0 0 119 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/README.txt - - -rwxr-xr-x 0 0 0 4 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/INSTALLER - - -rwxr-xr-x 0 0 0 4675 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/METADATA - - -rwxr-xr-x 0 0 0 68854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/RECORD - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/REQUESTED - - -rwxr-xr-x 0 0 0 82 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/WHEEL - - -rwxr-xr-x 0 0 0 243 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/direct_url.json - - -rwxr-xr-x 0 0 0 84 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/entry_points.txt - - -rwxr-xr-x 0 0 0 11731 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/AUTHORS.txt - - -rwxr-xr-x 0 0 0 1093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/LICENSE.txt - - -rwxr-xr-x 0 0 0 558 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt - - -rwxr-xr-x 0 0 0 989 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE - - -rwxr-xr-x 0 0 0 1099 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt - - -rwxr-xr-x 0 0 0 14531 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt - - -rwxr-xr-x 0 0 0 11325 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE - - -rwxr-xr-x 0 0 0 1541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md - - -rwxr-xr-x 0 0 0 614 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING - - -rwxr-xr-x 0 0 0 197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE - - -rwxr-xr-x 0 0 0 10174 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE - - -rwxr-xr-x 0 0 0 1344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE - - -rwxr-xr-x 0 0 0 1089 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE - - -rwxr-xr-x 0 0 0 1331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE - - -rwxr-xr-x 0 0 0 10142 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE - - -rwxr-xr-x 0 0 0 751 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE - - -rwxr-xr-x 0 0 0 1056 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE - - -rwxr-xr-x 0 0 0 1072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE - - -rwxr-xr-x 0 0 0 1072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE - - -rwxr-xr-x 0 0 0 1086 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE - - -rwxr-xr-x 0 0 0 1115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip-26.0.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt - - -rwxr-xr-x 0 0 0 355 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/__init__.py - - -rwxr-xr-x 0 0 0 854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/__main__.py - - -rwxr-xr-x 0 0 0 1450 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/__pip-runner__.py - - -rwxr-xr-x 0 0 0 511 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/__init__.py - - -rwxr-xr-x 0 0 0 21911 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/build_env.py - - -rwxr-xr-x 0 0 0 10345 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cache.py - - -rwxr-xr-x 0 0 0 131 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/__init__.py - - -rwxr-xr-x 0 0 0 7193 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py - - -rwxr-xr-x 0 0 0 9168 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/base_command.py - - -rwxr-xr-x 0 0 0 36164 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py - - -rwxr-xr-x 0 0 0 817 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/command_context.py - - -rwxr-xr-x 0 0 0 6484 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/index_command.py - - -rwxr-xr-x 0 0 0 3137 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/main.py - - -rwxr-xr-x 0 0 0 4403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py - - -rwxr-xr-x 0 0 0 13827 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/parser.py - - -rwxr-xr-x 0 0 0 4706 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py - - -rwxr-xr-x 0 0 0 16482 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/req_command.py - - -rwxr-xr-x 0 0 0 7362 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/spinners.py - - -rwxr-xr-x 0 0 0 116 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py - - -rwxr-xr-x 0 0 0 4026 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/__init__.py - - -rwxr-xr-x 0 0 0 9142 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/cache.py - - -rwxr-xr-x 0 0 0 2244 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/check.py - - -rwxr-xr-x 0 0 0 4565 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/completion.py - - -rwxr-xr-x 0 0 0 10105 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/configuration.py - - -rwxr-xr-x 0 0 0 6805 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/debug.py - - -rwxr-xr-x 0 0 0 5178 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/download.py - - -rwxr-xr-x 0 0 0 3099 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/freeze.py - - -rwxr-xr-x 0 0 0 1679 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/hash.py - - -rwxr-xr-x 0 0 0 1108 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/help.py - - -rwxr-xr-x 0 0 0 5520 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/index.py - - -rwxr-xr-x 0 0 0 3177 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/inspect.py - - -rwxr-xr-x 0 0 0 30588 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/install.py - - -rwxr-xr-x 0 0 0 13497 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/list.py - - -rwxr-xr-x 0 0 0 6027 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/lock.py - - -rwxr-xr-x 0 0 0 5782 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/search.py - - -rwxr-xr-x 0 0 0 8066 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/show.py - - -rwxr-xr-x 0 0 0 3868 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py - - -rwxr-xr-x 0 0 0 5880 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/commands/wheel.py - - -rwxr-xr-x 0 0 0 14568 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/configuration.py - - -rwxr-xr-x 0 0 0 858 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py - - -rwxr-xr-x 0 0 0 1830 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/base.py - - -rwxr-xr-x 0 0 0 929 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/installed.py - - -rwxr-xr-x 0 0 0 6627 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py - - -rwxr-xr-x 0 0 0 1364 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py - - -rwxr-xr-x 0 0 0 32165 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/exceptions.py - - -rwxr-xr-x 0 0 0 29 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/index/__init__.py - - -rwxr-xr-x 0 0 0 16144 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/index/collector.py - - -rwxr-xr-x 0 0 0 41776 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/index/package_finder.py - - -rwxr-xr-x 0 0 0 8639 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/index/sources.py - - -rwxr-xr-x 0 0 0 14157 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/locations/__init__.py - - -rwxr-xr-x 0 0 0 5975 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py - - -rwxr-xr-x 0 0 0 7779 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py - - -rwxr-xr-x 0 0 0 2550 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/locations/base.py - - -rwxr-xr-x 0 0 0 338 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/main.py - - -rwxr-xr-x 0 0 0 5824 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py - - -rwxr-xr-x 0 0 0 2711 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/_json.py - - -rwxr-xr-x 0 0 0 25420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/base.py - - -rwxr-xr-x 0 0 0 135 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py - - -rwxr-xr-x 0 0 0 2804 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py - - -rwxr-xr-x 0 0 0 8420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py - - -rwxr-xr-x 0 0 0 5333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py - - -rwxr-xr-x 0 0 0 10544 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py - - -rwxr-xr-x 0 0 0 62 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/__init__.py - - -rwxr-xr-x 0 0 0 753 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/candidate.py - - -rwxr-xr-x 0 0 0 6555 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/direct_url.py - - -rwxr-xr-x 0 0 0 2471 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/format_control.py - - -rwxr-xr-x 0 0 0 1030 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/index.py - - -rwxr-xr-x 0 0 0 2839 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/installation_report.py - - -rwxr-xr-x 0 0 0 21992 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/link.py - - -rwxr-xr-x 0 0 0 3403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/release_control.py - - -rwxr-xr-x 0 0 0 575 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/scheme.py - - -rwxr-xr-x 0 0 0 4507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/search_scope.py - - -rwxr-xr-x 0 0 0 2221 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py - - -rwxr-xr-x 0 0 0 4243 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/target_python.py - - -rwxr-xr-x 0 0 0 2920 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/models/wheel.py - - -rwxr-xr-x 0 0 0 49 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/__init__.py - - -rwxr-xr-x 0 0 0 20806 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/auth.py - - -rwxr-xr-x 0 0 0 4862 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/cache.py - - -rwxr-xr-x 0 0 0 12667 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/download.py - - -rwxr-xr-x 0 0 0 7646 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py - - -rwxr-xr-x 0 0 0 19555 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/session.py - - -rwxr-xr-x 0 0 0 4091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/utils.py - - -rwxr-xr-x 0 0 0 1830 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/__init__.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py - - -rwxr-xr-x 0 0 0 4771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py - - -rwxr-xr-x 0 0 0 1421 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py - - -rwxr-xr-x 0 0 0 1509 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py - - -rwxr-xr-x 0 0 0 1136 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py - - -rwxr-xr-x 0 0 0 1478 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py - - -rwxr-xr-x 0 0 0 5894 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/check.py - - -rwxr-xr-x 0 0 0 9854 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/freeze.py - - -rwxr-xr-x 0 0 0 50 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py - - -rwxr-xr-x 0 0 0 27923 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py - - -rwxr-xr-x 0 0 0 28830 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/operations/prepare.py - - -rwxr-xr-x 0 0 0 4555 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/pyproject.py - - -rwxr-xr-x 0 0 0 3041 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/__init__.py - - -rwxr-xr-x 0 0 0 18688 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/constructors.py - - -rwxr-xr-x 0 0 0 1225 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/pep723.py - - -rwxr-xr-x 0 0 0 2618 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_dependency_group.py - - -rwxr-xr-x 0 0 0 20685 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_file.py - - -rwxr-xr-x 0 0 0 31273 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_install.py - - -rwxr-xr-x 0 0 0 2828 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_set.py - - -rwxr-xr-x 0 0 0 24099 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py - - -rwxr-xr-x 0 0 0 577 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/base.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py - - -rwxr-xr-x 0 0 0 24060 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py - - -rwxr-xr-x 0 0 0 5047 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py - - -rwxr-xr-x 0 0 0 20454 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py - - -rwxr-xr-x 0 0 0 34028 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py - - -rwxr-xr-x 0 0 0 6018 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py - - -rwxr-xr-x 0 0 0 11441 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py - - -rwxr-xr-x 0 0 0 3909 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py - - -rwxr-xr-x 0 0 0 8239 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py - - -rwxr-xr-x 0 0 0 13437 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py - - -rwxr-xr-x 0 0 0 8284 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/__init__.py - - -rwxr-xr-x 0 0 0 3350 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py - - -rwxr-xr-x 0 0 0 1015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/_log.py - - -rwxr-xr-x 0 0 0 1681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py - - -rwxr-xr-x 0 0 0 2514 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/compat.py - - -rwxr-xr-x 0 0 0 6630 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py - - -rwxr-xr-x 0 0 0 868 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/datetime.py - - -rwxr-xr-x 0 0 0 3696 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py - - -rwxr-xr-x 0 0 0 3200 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py - - -rwxr-xr-x 0 0 0 2459 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py - - -rwxr-xr-x 0 0 0 3324 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py - - -rwxr-xr-x 0 0 0 6892 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py - - -rwxr-xr-x 0 0 0 689 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py - - -rwxr-xr-x 0 0 0 3726 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/glibc.py - - -rwxr-xr-x 0 0 0 4998 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/hashes.py - - -rwxr-xr-x 0 0 0 13414 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/logging.py - - -rwxr-xr-x 0 0 0 23722 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/misc.py - - -rwxr-xr-x 0 0 0 1601 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/packaging.py - - -rwxr-xr-x 0 0 0 3817 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/pylock.py - - -rwxr-xr-x 0 0 0 1461 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/retry.py - - -rwxr-xr-x 0 0 0 8983 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py - - -rwxr-xr-x 0 0 0 9307 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py - - -rwxr-xr-x 0 0 0 12972 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py - - -rwxr-xr-x 0 0 0 1601 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/urls.py - - -rwxr-xr-x 0 0 0 3455 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py - - -rwxr-xr-x 0 0 0 4468 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/utils/wheel.py - - -rwxr-xr-x 0 0 0 596 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py - - -rwxr-xr-x 0 0 0 3734 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py - - -rwxr-xr-x 0 0 0 19144 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/git.py - - -rwxr-xr-x 0 0 0 5575 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py - - -rwxr-xr-x 0 0 0 11787 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py - - -rwxr-xr-x 0 0 0 22599 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py - - -rwxr-xr-x 0 0 0 9010 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_internal/wheel_builder.py - - -rwxr-xr-x 0 0 0 9394 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/README.rst - - -rwxr-xr-x 0 0 0 4907 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/__init__.py - - -rwxr-xr-x 0 0 0 558 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/LICENSE.txt - - -rwxr-xr-x 0 0 0 820 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py - - -rwxr-xr-x 0 0 0 1737 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py - - -rwxr-xr-x 0 0 0 6586 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py - - -rwxr-xr-x 0 0 0 1953 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py - - -rwxr-xr-x 0 0 0 303 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py - - -rwxr-xr-x 0 0 0 4117 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py - - -rwxr-xr-x 0 0 0 1386 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py - - -rwxr-xr-x 0 0 0 19102 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py - - -rwxr-xr-x 0 0 0 4354 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py - - -rwxr-xr-x 0 0 0 4881 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed - - -rwxr-xr-x 0 0 0 5163 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py - - -rwxr-xr-x 0 0 0 1417 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py - - -rwxr-xr-x 0 0 0 989 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/LICENSE - - -rwxr-xr-x 0 0 0 94 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py - - -rwxr-xr-x 0 0 0 255 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py - - -rwxr-xr-x 0 0 0 270954 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem - - -rwxr-xr-x 0 0 0 3442 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/core.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/certifi/py.typed - - -rwxr-xr-x 0 0 0 1099 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/LICENSE.txt - - -rwxr-xr-x 0 0 0 250 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__init__.py - - -rwxr-xr-x 0 0 0 1709 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__main__.py - - -rwxr-xr-x 0 0 0 8041 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_implementation.py - - -rwxr-xr-x 0 0 0 1710 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py - - -rwxr-xr-x 0 0 0 1865 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py - - -rwxr-xr-x 0 0 0 285 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_toml_compat.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/dependency_groups/py.typed - - -rwxr-xr-x 0 0 0 14531 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/LICENSE.txt - - -rwxr-xr-x 0 0 0 625 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py - - -rwxr-xr-x 0 0 0 41467 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py - - -rwxr-xr-x 0 0 0 10820 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py - - -rwxr-xr-x 0 0 0 18612 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py - - -rwxr-xr-x 0 0 0 97792 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe - - -rwxr-xr-x 0 0 0 182784 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe - - -rwxr-xr-x 0 0 0 108032 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe - - -rwxr-xr-x 0 0 0 66682 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/util.py - - -rwxr-xr-x 0 0 0 91648 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe - - -rwxr-xr-x 0 0 0 168448 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe - - -rwxr-xr-x 0 0 0 101888 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe - - -rwxr-xr-x 0 0 0 11325 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/LICENSE - - -rwxr-xr-x 0 0 0 981 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py - - -rwxr-xr-x 0 0 0 64 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py - - -rwxr-xr-x 0 0 0 49430 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/distro.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/distro/py.typed - - -rwxr-xr-x 0 0 0 1541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/LICENSE.md - - -rwxr-xr-x 0 0 0 868 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py - - -rwxr-xr-x 0 0 0 3438 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/codec.py - - -rwxr-xr-x 0 0 0 316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/compat.py - - -rwxr-xr-x 0 0 0 13246 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/core.py - - -rwxr-xr-x 0 0 0 79623 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py - - -rwxr-xr-x 0 0 0 1898 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py - - -rwxr-xr-x 0 0 0 21 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/py.typed - - -rwxr-xr-x 0 0 0 243725 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py - - -rwxr-xr-x 0 0 0 614 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/COPYING - - -rwxr-xr-x 0 0 0 1109 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py - - -rwxr-xr-x 0 0 0 5726 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py - - -rwxr-xr-x 0 0 0 32390 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py - - -rwxr-xr-x 0 0 0 197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/LICENSE - - -rwxr-xr-x 0 0 0 10174 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/LICENSE.APACHE - - -rwxr-xr-x 0 0 0 1344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/LICENSE.BSD - - -rwxr-xr-x 0 0 0 494 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py - - -rwxr-xr-x 0 0 0 3211 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py - - -rwxr-xr-x 0 0 0 9559 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py - - -rwxr-xr-x 0 0 0 2707 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py - - -rwxr-xr-x 0 0 0 10518 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py - - -rwxr-xr-x 0 0 0 1514 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py - - -rwxr-xr-x 0 0 0 5421 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py - - -rwxr-xr-x 0 0 0 5819 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__init__.py - - -rwxr-xr-x 0 0 0 51122 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/_spdx.py - - -rwxr-xr-x 0 0 0 12771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py - - -rwxr-xr-x 0 0 0 39360 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/py.typed - - -rwxr-xr-x 0 0 0 22537 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/pylock.py - - -rwxr-xr-x 0 0 0 2870 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py - - -rwxr-xr-x 0 0 0 40821 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py - - -rwxr-xr-x 0 0 0 22856 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py - - -rwxr-xr-x 0 0 0 5040 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py - - -rwxr-xr-x 0 0 0 23284 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/packaging/version.py - - -rwxr-xr-x 0 0 0 1023 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pkg_resources/LICENSE - - -rwxr-xr-x 0 0 0 124451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py - - -rwxr-xr-x 0 0 0 1089 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/LICENSE - - -rwxr-xr-x 0 0 0 22344 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py - - -rwxr-xr-x 0 0 0 1505 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py - - -rwxr-xr-x 0 0 0 9013 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py - - -rwxr-xr-x 0 0 0 9281 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py - - -rwxr-xr-x 0 0 0 6322 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed - - -rwxr-xr-x 0 0 0 10458 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py - - -rwxr-xr-x 0 0 0 704 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py - - -rwxr-xr-x 0 0 0 10362 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py - - -rwxr-xr-x 0 0 0 1331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/LICENSE - - -rwxr-xr-x 0 0 0 2983 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py - - -rwxr-xr-x 0 0 0 353 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py - - -rwxr-xr-x 0 0 0 1718 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/console.py - - -rwxr-xr-x 0 0 0 1910 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py - - -rwxr-xr-x 0 0 0 40392 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py - - -rwxr-xr-x 0 0 0 4390 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py - - -rwxr-xr-x 0 0 0 5385 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py - - -rwxr-xr-x 0 0 0 4176 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py - - -rwxr-xr-x 0 0 0 35349 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py - - -rwxr-xr-x 0 0 0 12115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py - - -rwxr-xr-x 0 0 0 77602 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py - - -rwxr-xr-x 0 0 0 53853 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py - - -rwxr-xr-x 0 0 0 1005 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py - - -rwxr-xr-x 0 0 0 1891 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py - - -rwxr-xr-x 0 0 0 3072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py - - -rwxr-xr-x 0 0 0 3092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py - - -rwxr-xr-x 0 0 0 7981 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py - - -rwxr-xr-x 0 0 0 6420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/style.py - - -rwxr-xr-x 0 0 0 2042 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py - - -rwxr-xr-x 0 0 0 3312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py - - -rwxr-xr-x 0 0 0 6226 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/token.py - - -rwxr-xr-x 0 0 0 63208 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py - - -rwxr-xr-x 0 0 0 10031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pygments/util.py - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/LICENSE - - -rwxr-xr-x 0 0 0 691 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py - - -rwxr-xr-x 0 0 0 14936 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py - - -rwxr-xr-x 0 0 0 557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py - - -rwxr-xr-x 0 0 0 12216 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/py.typed - - -rwxr-xr-x 0 0 0 10142 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/LICENSE - - -rwxr-xr-x 0 0 0 5057 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py - - -rwxr-xr-x 0 0 0 435 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py - - -rwxr-xr-x 0 0 0 1495 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py - - -rwxr-xr-x 0 0 0 26429 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py - - -rwxr-xr-x 0 0 0 6449 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/api.py - - -rwxr-xr-x 0 0 0 10186 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/auth.py - - -rwxr-xr-x 0 0 0 441 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/certs.py - - -rwxr-xr-x 0 0 0 1822 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/compat.py - - -rwxr-xr-x 0 0 0 18590 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py - - -rwxr-xr-x 0 0 0 4272 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py - - -rwxr-xr-x 0 0 0 3813 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/help.py - - -rwxr-xr-x 0 0 0 733 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py - - -rwxr-xr-x 0 0 0 35575 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/models.py - - -rwxr-xr-x 0 0 0 1057 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/packages.py - - -rwxr-xr-x 0 0 0 30503 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py - - -rwxr-xr-x 0 0 0 4322 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py - - -rwxr-xr-x 0 0 0 2912 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/structures.py - - -rwxr-xr-x 0 0 0 33225 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/requests/utils.py - - -rwxr-xr-x 0 0 0 751 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/LICENSE - - -rwxr-xr-x 0 0 0 541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py - - -rwxr-xr-x 0 0 0 8914 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/py.typed - - -rwxr-xr-x 0 0 0 2037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py - - -rwxr-xr-x 0 0 0 640 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py - - -rwxr-xr-x 0 0 0 1543 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py - - -rwxr-xr-x 0 0 0 1768 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py - - -rwxr-xr-x 0 0 0 1768 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py - - -rwxr-xr-x 0 0 0 24212 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py - - -rwxr-xr-x 0 0 0 6420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py - - -rwxr-xr-x 0 0 0 1056 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/LICENSE - - -rwxr-xr-x 0 0 0 6090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py - - -rwxr-xr-x 0 0 0 7896 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py - - -rwxr-xr-x 0 0 0 10209 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py - - -rwxr-xr-x 0 0 0 140235 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py - - -rwxr-xr-x 0 0 0 1064 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py - - -rwxr-xr-x 0 0 0 2128 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py - - -rwxr-xr-x 0 0 0 265 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py - - -rwxr-xr-x 0 0 0 799 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py - - -rwxr-xr-x 0 0 0 9656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py - - -rwxr-xr-x 0 0 0 3225 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py - - -rwxr-xr-x 0 0 0 1236 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py - - -rwxr-xr-x 0 0 0 1394 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py - - -rwxr-xr-x 0 0 0 7063 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py - - -rwxr-xr-x 0 0 0 423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py - - -rwxr-xr-x 0 0 0 5325 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py - - -rwxr-xr-x 0 0 0 19919 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py - - -rwxr-xr-x 0 0 0 351 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py - - -rwxr-xr-x 0 0 0 417 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py - - -rwxr-xr-x 0 0 0 22755 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py - - -rwxr-xr-x 0 0 0 1925 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py - - -rwxr-xr-x 0 0 0 2783 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py - - -rwxr-xr-x 0 0 0 3404 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py - - -rwxr-xr-x 0 0 0 890 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/abc.py - - -rwxr-xr-x 0 0 0 10324 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/align.py - - -rwxr-xr-x 0 0 0 6921 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py - - -rwxr-xr-x 0 0 0 3263 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/bar.py - - -rwxr-xr-x 0 0 0 10686 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/box.py - - -rwxr-xr-x 0 0 0 5130 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/cells.py - - -rwxr-xr-x 0 0 0 18211 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/color.py - - -rwxr-xr-x 0 0 0 1054 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py - - -rwxr-xr-x 0 0 0 7131 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/columns.py - - -rwxr-xr-x 0 0 0 100849 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/console.py - - -rwxr-xr-x 0 0 0 1288 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py - - -rwxr-xr-x 0 0 0 5502 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/containers.py - - -rwxr-xr-x 0 0 0 6487 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/control.py - - -rwxr-xr-x 0 0 0 8257 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py - - -rwxr-xr-x 0 0 0 1025 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py - - -rwxr-xr-x 0 0 0 2367 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py - - -rwxr-xr-x 0 0 0 642 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/errors.py - - -rwxr-xr-x 0 0 0 1683 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py - - -rwxr-xr-x 0 0 0 2484 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py - - -rwxr-xr-x 0 0 0 9586 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py - - -rwxr-xr-x 0 0 0 5031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/json.py - - -rwxr-xr-x 0 0 0 3252 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py - - -rwxr-xr-x 0 0 0 14004 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/layout.py - - -rwxr-xr-x 0 0 0 15180 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/live.py - - -rwxr-xr-x 0 0 0 3521 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py - - -rwxr-xr-x 0 0 0 12468 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/logging.py - - -rwxr-xr-x 0 0 0 8451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/markup.py - - -rwxr-xr-x 0 0 0 5305 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/measure.py - - -rwxr-xr-x 0 0 0 4908 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/padding.py - - -rwxr-xr-x 0 0 0 828 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/pager.py - - -rwxr-xr-x 0 0 0 3396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/palette.py - - -rwxr-xr-x 0 0 0 11157 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/panel.py - - -rwxr-xr-x 0 0 0 36391 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py - - -rwxr-xr-x 0 0 0 60408 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/progress.py - - -rwxr-xr-x 0 0 0 8162 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py - - -rwxr-xr-x 0 0 0 12447 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py - - -rwxr-xr-x 0 0 0 1391 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/py.typed - - -rwxr-xr-x 0 0 0 166 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/region.py - - -rwxr-xr-x 0 0 0 4431 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/repr.py - - -rwxr-xr-x 0 0 0 4602 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/rule.py - - -rwxr-xr-x 0 0 0 2843 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/scope.py - - -rwxr-xr-x 0 0 0 1591 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/screen.py - - -rwxr-xr-x 0 0 0 24743 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/segment.py - - -rwxr-xr-x 0 0 0 4214 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py - - -rwxr-xr-x 0 0 0 4424 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/status.py - - -rwxr-xr-x 0 0 0 26990 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/style.py - - -rwxr-xr-x 0 0 0 1258 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/styled.py - - -rwxr-xr-x 0 0 0 36371 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py - - -rwxr-xr-x 0 0 0 40049 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/table.py - - -rwxr-xr-x 0 0 0 3370 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py - - -rwxr-xr-x 0 0 0 47552 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/text.py - - -rwxr-xr-x 0 0 0 3771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/theme.py - - -rwxr-xr-x 0 0 0 102 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/themes.py - - -rwxr-xr-x 0 0 0 35861 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py - - -rwxr-xr-x 0 0 0 9451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/rich/tree.py - - -rwxr-xr-x 0 0 0 1072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/LICENSE - - -rwxr-xr-x 0 0 0 314 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py - - -rwxr-xr-x 0 0 0 25778 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py - - -rwxr-xr-x 0 0 0 3235 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py - - -rwxr-xr-x 0 0 0 254 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py - - -rwxr-xr-x 0 0 0 26 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli/py.typed - - -rwxr-xr-x 0 0 0 1072 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli_w/LICENSE - - -rwxr-xr-x 0 0 0 169 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli_w/__init__.py - - -rwxr-xr-x 0 0 0 6961 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli_w/_writer.py - - -rwxr-xr-x 0 0 0 26 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/tomli_w/py.typed - - -rwxr-xr-x 0 0 0 1086 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/LICENSE - - -rwxr-xr-x 0 0 0 1320 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py - - -rwxr-xr-x 0 0 0 11413 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py - - -rwxr-xr-x 0 0 0 20503 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py - - -rwxr-xr-x 0 0 0 2412 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py - - -rwxr-xr-x 0 0 0 1130 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py - - -rwxr-xr-x 0 0 0 17993 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/truststore/py.typed - - -rwxr-xr-x 0 0 0 1115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/LICENSE.txt - - -rwxr-xr-x 0 0 0 3333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py - - -rwxr-xr-x 0 0 0 11372 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py - - -rwxr-xr-x 0 0 0 64 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py - - -rwxr-xr-x 0 0 0 20314 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py - - -rwxr-xr-x 0 0 0 40408 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py - - -rwxr-xr-x 0 0 0 957 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py - - -rwxr-xr-x 0 0 0 17632 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py - - -rwxr-xr-x 0 0 0 13922 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py - - -rwxr-xr-x 0 0 0 11036 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py - - -rwxr-xr-x 0 0 0 4528 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py - - -rwxr-xr-x 0 0 0 17081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py - - -rwxr-xr-x 0 0 0 34446 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py - - -rwxr-xr-x 0 0 0 7097 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py - - -rwxr-xr-x 0 0 0 8217 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py - - -rwxr-xr-x 0 0 0 8579 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py - - -rwxr-xr-x 0 0 0 2440 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py - - -rwxr-xr-x 0 0 0 1417 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py - - -rwxr-xr-x 0 0 0 5343 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py - - -rwxr-xr-x 0 0 0 34665 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py - - -rwxr-xr-x 0 0 0 19990 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py - - -rwxr-xr-x 0 0 0 6691 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py - - -rwxr-xr-x 0 0 0 30641 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py - - -rwxr-xr-x 0 0 0 1155 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py - - -rwxr-xr-x 0 0 0 4901 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py - - -rwxr-xr-x 0 0 0 1605 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py - - -rwxr-xr-x 0 0 0 498 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py - - -rwxr-xr-x 0 0 0 3997 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py - - -rwxr-xr-x 0 0 0 3510 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py - - -rwxr-xr-x 0 0 0 22050 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py - - -rwxr-xr-x 0 0 0 17460 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py - - -rwxr-xr-x 0 0 0 5758 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py - - -rwxr-xr-x 0 0 0 6895 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py - - -rwxr-xr-x 0 0 0 10168 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py - - -rwxr-xr-x 0 0 0 14296 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py - - -rwxr-xr-x 0 0 0 5403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py - - -rwxr-xr-x 0 0 0 342 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/_vendor/vendor.txt - - -rwxr-xr-x 0 0 0 286 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site-packages/pip/py.typed - - -rwxr-xr-x 0 0 0 23198 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/site.py - - -rwxr-xr-x 0 0 0 43532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/smtplib.py - - -rwxr-xr-x 0 0 0 7448 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sndhdr.py - - -rwxr-xr-x 0 0 0 37815 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/socket.py - - -rwxr-xr-x 0 0 0 28065 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/socketserver.py - - -rwxr-xr-x 0 0 0 2501 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sqlite3/__init__.py - - -rwxr-xr-x 0 0 0 3855 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sqlite3/__main__.py - - -rwxr-xr-x 0 0 0 3631 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sqlite3/dbapi2.py - - -rwxr-xr-x 0 0 0 3538 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sqlite3/dump.py - - -rwxr-xr-x 0 0 0 231 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sre_compile.py - - -rwxr-xr-x 0 0 0 232 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sre_constants.py - - -rwxr-xr-x 0 0 0 229 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sre_parse.py - - -rwxr-xr-x 0 0 0 50904 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/ssl.py - - -rwxr-xr-x 0 0 0 5485 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/stat.py - - -rwxr-xr-x 0 0 0 50227 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/statistics.py - - -rwxr-xr-x 0 0 0 11786 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/string.py - - -rwxr-xr-x 0 0 0 12917 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/stringprep.py - - -rwxr-xr-x 0 0 0 257 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/struct.py - - -rwxr-xr-x 0 0 0 88747 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/subprocess.py - - -rwxr-xr-x 0 0 0 18478 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sunau.py - - -rwxr-xr-x 0 0 0 12477 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/symtable.py - - -rwxr-xr-x 0 0 0 31850 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/sysconfig.py - - -rwxr-xr-x 0 0 0 11532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tabnanny.py - - -rwxr-xr-x 0 0 0 112569 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tarfile.py - - -rwxr-xr-x 0 0 0 23334 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/telnetlib.py - - -rwxr-xr-x 0 0 0 32386 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tempfile.py - - -rwxr-xr-x 0 0 0 19718 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/textwrap.py - - -rwxr-xr-x 0 0 0 1003 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/this.py - - -rwxr-xr-x 0 0 0 60200 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/threading.py - - -rwxr-xr-x 0 0 0 13464 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/timeit.py - - -rwxr-xr-x 0 0 0 173168 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/__init__.py - - -rwxr-xr-x 0 0 0 148 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/__main__.py - - -rwxr-xr-x 0 0 0 2660 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/colorchooser.py - - -rwxr-xr-x 0 0 0 1289 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/commondialog.py - - -rwxr-xr-x 0 0 0 1493 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/constants.py - - -rwxr-xr-x 0 0 0 1535 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/dialog.py - - -rwxr-xr-x 0 0 0 11644 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/dnd.py - - -rwxr-xr-x 0 0 0 14939 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/filedialog.py - - -rwxr-xr-x 0 0 0 7000 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/font.py - - -rwxr-xr-x 0 0 0 3861 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/messagebox.py - - -rwxr-xr-x 0 0 0 1816 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/scrolledtext.py - - -rwxr-xr-x 0 0 0 11753 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/simpledialog.py - - -rwxr-xr-x 0 0 0 77032 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/tix.py - - -rwxr-xr-x 0 0 0 56318 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tkinter/ttk.py - - -rwxr-xr-x 0 0 0 2511 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/token.py - - -rwxr-xr-x 0 0 0 21570 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tokenize.py - - -rwxr-xr-x 0 0 0 308 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tomllib/__init__.py - - -rwxr-xr-x 0 0 0 22631 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tomllib/_parser.py - - -rwxr-xr-x 0 0 0 2943 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tomllib/_re.py - - -rwxr-xr-x 0 0 0 254 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tomllib/_types.py - - -rwxr-xr-x 0 0 0 29352 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/trace.py - - -rwxr-xr-x 0 0 0 46393 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/traceback.py - - -rwxr-xr-x 0 0 0 18047 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tracemalloc.py - - -rwxr-xr-x 0 0 0 2035 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/tty.py - - -rwxr-xr-x 0 0 0 146363 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtle.py - - -rwxr-xr-x 0 0 0 314 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/__init__.py - - -rwxr-xr-x 0 0 0 15375 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/__main__.py - - -rwxr-xr-x 0 0 0 4248 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/bytedesign.py - - -rwxr-xr-x 0 0 0 951 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/chaos.py - - -rwxr-xr-x 0 0 0 3304 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/clock.py - - -rwxr-xr-x 0 0 0 1339 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/colormixer.py - - -rwxr-xr-x 0 0 0 2966 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/forest.py - - -rwxr-xr-x 0 0 0 3473 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/fractalcurves.py - - -rwxr-xr-x 0 0 0 2434 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/lindenmayer.py - - -rwxr-xr-x 0 0 0 2051 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/minimal_hanoi.py - - -rwxr-xr-x 0 0 0 6513 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/nim.py - - -rwxr-xr-x 0 0 0 1291 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/paint.py - - -rwxr-xr-x 0 0 0 1066 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/peace.py - - -rwxr-xr-x 0 0 0 3380 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/penrose.py - - -rwxr-xr-x 0 0 0 2825 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/planet_and_moon.py - - -rwxr-xr-x 0 0 0 1361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/rosette.py - - -rwxr-xr-x 0 0 0 1804 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/round_dance.py - - -rwxr-xr-x 0 0 0 5053 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/sorting_animate.py - - -rwxr-xr-x 0 0 0 1401 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/tree.py - - -rwxr-xr-x 0 0 0 160 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/turtle.cfg - - -rwxr-xr-x 0 0 0 1119 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/two_canvases.py - - -rwxr-xr-x 0 0 0 821 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/turtledemo/yinyang.py - - -rwxr-xr-x 0 0 0 10993 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/types.py - - -rwxr-xr-x 0 0 0 118836 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/typing.py - - -rwxr-xr-x 0 0 0 3487 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/__init__.py - - -rwxr-xr-x 0 0 0 472 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/__main__.py - - -rwxr-xr-x 0 0 0 2746 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/_log.py - - -rwxr-xr-x 0 0 0 5483 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/async_case.py - - -rwxr-xr-x 0 0 0 57531 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/case.py - - -rwxr-xr-x 0 0 0 21116 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/loader.py - - -rwxr-xr-x 0 0 0 11991 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/main.py - - -rwxr-xr-x 0 0 0 106317 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/mock.py - - -rwxr-xr-x 0 0 0 9130 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/result.py - - -rwxr-xr-x 0 0 0 10368 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/runner.py - - -rwxr-xr-x 0 0 0 2403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/signals.py - - -rwxr-xr-x 0 0 0 13512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/suite.py - - -rwxr-xr-x 0 0 0 5215 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/unittest/util.py - - -rwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/urllib/__init__.py - - -rwxr-xr-x 0 0 0 2415 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/urllib/error.py - - -rwxr-xr-x 0 0 0 45676 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/urllib/parse.py - - -rwxr-xr-x 0 0 0 103724 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/urllib/request.py - - -rwxr-xr-x 0 0 0 2361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/urllib/response.py - - -rwxr-xr-x 0 0 0 9468 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/urllib/robotparser.py - - -rwxr-xr-x 0 0 0 7365 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/uu.py - - -rwxr-xr-x 0 0 0 29656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/uuid.py - - -rwxr-xr-x 0 0 0 26750 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/venv/__init__.py - - -rwxr-xr-x 0 0 0 145 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/venv/__main__.py - - -rwxr-xr-x 0 0 0 9033 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/venv/scripts/common/Activate.ps1 - - -rwxr-xr-x 0 0 0 2170 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/venv/scripts/common/activate - - -rwxr-xr-x 0 0 0 934 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/venv/scripts/posix/activate.csh - - -rwxr-xr-x 0 0 0 2209 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/venv/scripts/posix/activate.fish - - -rwxr-xr-x 0 0 0 21909 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/warnings.py - - -rwxr-xr-x 0 0 0 22769 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/wave.py - - -rwxr-xr-x 0 0 0 21513 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/weakref.py - - -rwxr-xr-x 0 0 0 23733 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/webbrowser.py - - -rwxr-xr-x 0 0 0 657 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/wsgiref/__init__.py - - -rwxr-xr-x 0 0 0 21664 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/wsgiref/handlers.py - - -rwxr-xr-x 0 0 0 7370 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/wsgiref/headers.py - - -rwxr-xr-x 0 0 0 5171 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/wsgiref/simple_server.py - - -rwxr-xr-x 0 0 0 1717 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/wsgiref/types.py - - -rwxr-xr-x 0 0 0 5472 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/wsgiref/util.py - - -rwxr-xr-x 0 0 0 15036 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/wsgiref/validate.py - - -rwxr-xr-x 0 0 0 5942 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xdrlib.py - - -rwxr-xr-x 0 0 0 557 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/__init__.py - - -rwxr-xr-x 0 0 0 936 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/dom/NodeFilter.py - - -rwxr-xr-x 0 0 0 4019 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/dom/__init__.py - - -rwxr-xr-x 0 0 0 3451 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/dom/domreg.py - - -rwxr-xr-x 0 0 0 35693 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/dom/expatbuilder.py - - -rwxr-xr-x 0 0 0 3367 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/dom/minicompat.py - - -rwxr-xr-x 0 0 0 67982 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/dom/minidom.py - - -rwxr-xr-x 0 0 0 11637 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/dom/pulldom.py - - -rwxr-xr-x 0 0 0 12420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/dom/xmlbuilder.py - - -rwxr-xr-x 0 0 0 6952 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/etree/ElementInclude.py - - -rwxr-xr-x 0 0 0 13997 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/etree/ElementPath.py - - -rwxr-xr-x 0 0 0 74017 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/etree/ElementTree.py - - -rwxr-xr-x 0 0 0 1605 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/etree/__init__.py - - -rwxr-xr-x 0 0 0 82 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/etree/cElementTree.py - - -rwxr-xr-x 0 0 0 167 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/parsers/__init__.py - - -rwxr-xr-x 0 0 0 248 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/parsers/expat.py - - -rwxr-xr-x 0 0 0 3238 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/sax/__init__.py - - -rwxr-xr-x 0 0 0 4699 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/sax/_exceptions.py - - -rwxr-xr-x 0 0 0 16034 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/sax/expatreader.py - - -rwxr-xr-x 0 0 0 15617 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/sax/handler.py - - -rwxr-xr-x 0 0 0 12255 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/sax/saxutils.py - - -rwxr-xr-x 0 0 0 12624 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xml/sax/xmlreader.py - - -rwxr-xr-x 0 0 0 38 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xmlrpc/__init__.py - - -rwxr-xr-x 0 0 0 49331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xmlrpc/client.py - - -rwxr-xr-x 0 0 0 36822 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/xmlrpc/server.py - - -rwxr-xr-x 0 0 0 7543 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zipapp.py - - -rwxr-xr-x 0 0 0 88998 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zipfile/__init__.py - - -rwxr-xr-x 0 0 0 58 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zipfile/__main__.py - - -rwxr-xr-x 0 0 0 10860 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zipfile/_path/__init__.py - - -rwxr-xr-x 0 0 0 1158 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zipfile/_path/glob.py - - -rwxr-xr-x 0 0 0 27840 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zipimport.py - - -rwxr-xr-x 0 0 0 703 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zoneinfo/__init__.py - - -rwxr-xr-x 0 0 0 5294 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zoneinfo/_common.py - - -rwxr-xr-x 0 0 0 5388 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zoneinfo/_tzpath.py - - -rwxr-xr-x 0 0 0 24674 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/python3.12/zoneinfo/_zoneinfo.py - - -rwxr-xr-x 0 0 0 22932 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/auto.tcl - - -rwxr-xr-x 0 0 0 60997 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/clock.tcl - - -rwxr-xr-x 0 0 0 21330 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/cookiejar0.2/cookiejar.tcl - - -rwxr-xr-x 0 0 0 7453 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/cookiejar0.2/idna.tcl - - -rwxr-xr-x 0 0 0 214 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/cookiejar0.2/pkgIndex.tcl - - -rwxr-xr-x 0 0 0 70835 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/cookiejar0.2/public_suffix_list.dat.gz - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/ascii.enc - - -rwxr-xr-x 0 0 0 92873 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/big5.enc - - -rwxr-xr-x 0 0 0 97050 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cns11643.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1250.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1251.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1252.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1253.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1254.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1255.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1256.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1257.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp1258.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp165.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp437.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp737.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp775.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp850.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp852.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp855.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp857.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp860.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp861.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp862.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp863.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp864.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp865.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp866.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp869.enc - - -rwxr-xr-x 0 0 0 1090 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp874.enc - - -rwxr-xr-x 0 0 0 48207 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp932.enc - - -rwxr-xr-x 0 0 0 132509 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp936.enc - - -rwxr-xr-x 0 0 0 130423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp949.enc - - -rwxr-xr-x 0 0 0 91831 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/cp950.enc - - -rwxr-xr-x 0 0 0 1093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/dingbats.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/ebcdic.enc - - -rwxr-xr-x 0 0 0 85574 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/euc-cn.enc - - -rwxr-xr-x 0 0 0 82537 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/euc-jp.enc - - -rwxr-xr-x 0 0 0 93918 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/euc-kr.enc - - -rwxr-xr-x 0 0 0 86619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/gb12345.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/gb1988.enc - - -rwxr-xr-x 0 0 0 84532 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/gb2312-raw.enc - - -rwxr-xr-x 0 0 0 85574 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/gb2312.enc - - -rwxr-xr-x 0 0 0 192 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso2022-jp.enc - - -rwxr-xr-x 0 0 0 115 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso2022-kr.enc - - -rwxr-xr-x 0 0 0 226 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso2022.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-1.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-10.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-11.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-13.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-14.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-15.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-16.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-2.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-3.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-4.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-5.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-6.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-7.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-8.enc - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/iso8859-9.enc - - -rwxr-xr-x 0 0 0 1092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/jis0201.enc - - -rwxr-xr-x 0 0 0 80453 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/jis0208.enc - - -rwxr-xr-x 0 0 0 70974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/jis0212.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/koi8-r.enc - - -rwxr-xr-x 0 0 0 1092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/koi8-ru.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/koi8-t.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/koi8-u.enc - - -rwxr-xr-x 0 0 0 92877 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/ksc5601.enc - - -rwxr-xr-x 0 0 0 1096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macCentEuro.enc - - -rwxr-xr-x 0 0 0 1096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macCroatian.enc - - -rwxr-xr-x 0 0 0 1096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macCyrillic.enc - - -rwxr-xr-x 0 0 0 1096 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macDingbats.enc - - -rwxr-xr-x 0 0 0 1093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macGreek.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macIceland.enc - - -rwxr-xr-x 0 0 0 48028 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macJapan.enc - - -rwxr-xr-x 0 0 0 1093 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macRoman.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macRomania.enc - - -rwxr-xr-x 0 0 0 1092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macThai.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macTurkish.enc - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/macUkraine.enc - - -rwxr-xr-x 0 0 0 41862 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/shiftjis.enc - - -rwxr-xr-x 0 0 0 1091 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/symbol.enc - - -rwxr-xr-x 0 0 0 1092 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/encoding/tis-620.enc - - -rwxr-xr-x 0 0 0 608 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/foreachline.tcl - - -rwxr-xr-x 0 0 0 7899 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/history.tcl - - -rwxr-xr-x 0 0 0 3861 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/icu.tcl - - -rwxr-xr-x 0 0 0 23575 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/init.tcl - - -rwxr-xr-x 0 0 0 7313 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/install.tcl - - -rwxr-xr-x 0 0 0 989 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/af.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/af_za.msg - - -rwxr-xr-x 0 0 0 1340 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ar.msg - - -rwxr-xr-x 0 0 0 259 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ar_in.msg - - -rwxr-xr-x 0 0 0 1024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ar_jo.msg - - -rwxr-xr-x 0 0 0 1024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ar_lb.msg - - -rwxr-xr-x 0 0 0 1024 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ar_sy.msg - - -rwxr-xr-x 0 0 0 1345 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/be.msg - - -rwxr-xr-x 0 0 0 1267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/bg.msg - - -rwxr-xr-x 0 0 0 1545 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/bn.msg - - -rwxr-xr-x 0 0 0 259 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/bn_in.msg - - -rwxr-xr-x 0 0 0 1094 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ca.msg - - -rwxr-xr-x 0 0 0 1212 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/cs.msg - - -rwxr-xr-x 0 0 0 1140 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/da.msg - - -rwxr-xr-x 0 0 0 1218 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/de.msg - - -rwxr-xr-x 0 0 0 796 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/de_at.msg - - -rwxr-xr-x 0 0 0 1215 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/de_be.msg - - -rwxr-xr-x 0 0 0 1396 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/el.msg - - -rwxr-xr-x 0 0 0 300 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_au.msg - - -rwxr-xr-x 0 0 0 305 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_be.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_bw.msg - - -rwxr-xr-x 0 0 0 288 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_ca.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_gb.msg - - -rwxr-xr-x 0 0 0 321 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_hk.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_ie.msg - - -rwxr-xr-x 0 0 0 310 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_in.msg - - -rwxr-xr-x 0 0 0 300 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_nz.msg - - -rwxr-xr-x 0 0 0 321 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_ph.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_sg.msg - - -rwxr-xr-x 0 0 0 245 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_za.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/en_zw.msg - - -rwxr-xr-x 0 0 0 1207 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/eo.msg - - -rwxr-xr-x 0 0 0 1164 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es.msg - - -rwxr-xr-x 0 0 0 242 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_ar.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_bo.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_cl.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_co.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_cr.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_do.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_ec.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_gt.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_hn.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_mx.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_ni.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_pa.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_pe.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_pr.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_py.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_sv.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_uy.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/es_ve.msg - - -rwxr-xr-x 0 0 0 1170 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/et.msg - - -rwxr-xr-x 0 0 0 985 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/eu.msg - - -rwxr-xr-x 0 0 0 287 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/eu_es.msg - - -rwxr-xr-x 0 0 0 1062 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fa.msg - - -rwxr-xr-x 0 0 0 1331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fa_in.msg - - -rwxr-xr-x 0 0 0 381 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fa_ir.msg - - -rwxr-xr-x 0 0 0 1129 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fi.msg - - -rwxr-xr-x 0 0 0 950 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fo.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fo_fo.msg - - -rwxr-xr-x 0 0 0 1181 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fr.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fr_be.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fr_ca.msg - - -rwxr-xr-x 0 0 0 281 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/fr_ch.msg - - -rwxr-xr-x 0 0 0 1029 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ga.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ga_ie.msg - - -rwxr-xr-x 0 0 0 926 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/gl.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/gl_es.msg - - -rwxr-xr-x 0 0 0 1037 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/gv.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/gv_gb.msg - - -rwxr-xr-x 0 0 0 1288 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/he.msg - - -rwxr-xr-x 0 0 0 1192 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/hi.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/hi_in.msg - - -rwxr-xr-x 0 0 0 1097 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/hr.msg - - -rwxr-xr-x 0 0 0 1247 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/hu.msg - - -rwxr-xr-x 0 0 0 914 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/id.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/id_id.msg - - -rwxr-xr-x 0 0 0 1147 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/is.msg - - -rwxr-xr-x 0 0 0 1220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/it.msg - - -rwxr-xr-x 0 0 0 244 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/it_ch.msg - - -rwxr-xr-x 0 0 0 1426 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ja.msg - - -rwxr-xr-x 0 0 0 978 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/kl.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/kl_gl.msg - - -rwxr-xr-x 0 0 0 1368 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ko.msg - - -rwxr-xr-x 0 0 0 331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ko_kr.msg - - -rwxr-xr-x 0 0 0 1304 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/kok.msg - - -rwxr-xr-x 0 0 0 254 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/kok_in.msg - - -rwxr-xr-x 0 0 0 966 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/kw.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/kw_gb.msg - - -rwxr-xr-x 0 0 0 1203 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/lt.msg - - -rwxr-xr-x 0 0 0 1175 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/lv.msg - - -rwxr-xr-x 0 0 0 1361 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/mk.msg - - -rwxr-xr-x 0 0 0 1228 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/mr.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/mr_in.msg - - -rwxr-xr-x 0 0 0 910 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ms.msg - - -rwxr-xr-x 0 0 0 259 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ms_my.msg - - -rwxr-xr-x 0 0 0 674 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/mt.msg - - -rwxr-xr-x 0 0 0 1141 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/nb.msg - - -rwxr-xr-x 0 0 0 1079 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/nl.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/nl_be.msg - - -rwxr-xr-x 0 0 0 1140 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/nn.msg - - -rwxr-xr-x 0 0 0 1167 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/pl.msg - - -rwxr-xr-x 0 0 0 1111 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/pt.msg - - -rwxr-xr-x 0 0 0 279 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/pt_br.msg - - -rwxr-xr-x 0 0 0 1148 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ro.msg - - -rwxr-xr-x 0 0 0 1323 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ru.msg - - -rwxr-xr-x 0 0 0 242 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ru_ua.msg - - -rwxr-xr-x 0 0 0 1152 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/sh.msg - - -rwxr-xr-x 0 0 0 1151 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/sk.msg - - -rwxr-xr-x 0 0 0 1152 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/sl.msg - - -rwxr-xr-x 0 0 0 1227 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/sq.msg - - -rwxr-xr-x 0 0 0 1323 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/sr.msg - - -rwxr-xr-x 0 0 0 1143 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/sv.msg - - -rwxr-xr-x 0 0 0 991 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/sw.msg - - -rwxr-xr-x 0 0 0 1241 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ta.msg - - -rwxr-xr-x 0 0 0 251 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/ta_in.msg - - -rwxr-xr-x 0 0 0 1424 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/te.msg - - -rwxr-xr-x 0 0 0 363 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/te_in.msg - - -rwxr-xr-x 0 0 0 1678 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/th.msg - - -rwxr-xr-x 0 0 0 1081 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/tr.msg - - -rwxr-xr-x 0 0 0 1349 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/uk.msg - - -rwxr-xr-x 0 0 0 1221 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/vi.msg - - -rwxr-xr-x 0 0 0 2256 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/zh.msg - - -rwxr-xr-x 0 0 0 303 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/zh_cn.msg - - -rwxr-xr-x 0 0 0 677 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/zh_hk.msg - - -rwxr-xr-x 0 0 0 327 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/zh_sg.msg - - -rwxr-xr-x 0 0 0 331 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/msgs/zh_tw.msg - - -rwxr-xr-x 0 0 0 30422 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/opt0.4/optparse.tcl - - -rwxr-xr-x 0 0 0 625 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/opt0.4/pkgIndex.tcl - - -rwxr-xr-x 0 0 0 23749 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/package.tcl - - -rwxr-xr-x 0 0 0 814 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/parray.tcl - - -rwxr-xr-x 0 0 0 599 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/readfile.tcl - - -rwxr-xr-x 0 0 0 46997 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/safe.tcl - - -rwxr-xr-x 0 0 0 4852 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/tclAppInit.c - - -rwxr-xr-x 0 0 0 9866 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/tclIndex - - -rwxr-xr-x 0 0 0 11904 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/tm.tcl - - -rwxr-xr-x 0 0 0 4764 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/word.tcl - - -rwxr-xr-x 0 0 0 911 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9.0/writefile.tcl - - -rwxr-xr-x 0 0 0 180267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9/9.0/http-2.10.1.tm - - -rwxr-xr-x 0 0 0 37407 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9/9.0/msgcat-1.7.1.tm - - -rwxr-xr-x 0 0 0 11053 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9/9.0/platform-1.1.0.tm - - -rwxr-xr-x 0 0 0 5975 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9/9.0/platform/shell-1.1.4.tm - - -rwxr-xr-x 0 0 0 104783 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tcl9/9.0/tcltest-2.5.10.tm - - -rwxr-xr-x 0 0 0 144968 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/thread3.0.4/libtcl9thread3.0.4.so - - -rwxr-xr-x 0 0 0 2151 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/thread3.0.4/pkgIndex.tcl - - -rwxr-xr-x 0 0 0 24364 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/thread3.0.4/ttrace.tcl - - -rwxr-xr-x 0 0 0 8924 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/bgerror.tcl - - -rwxr-xr-x 0 0 0 20834 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/button.tcl - - -rwxr-xr-x 0 0 0 9681 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/choosedir.tcl - - -rwxr-xr-x 0 0 0 21550 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/clrpick.tcl - - -rwxr-xr-x 0 0 0 8355 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/comdlg.tcl - - -rwxr-xr-x 0 0 0 32084 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/console.tcl - - -rwxr-xr-x 0 0 0 2082 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/README - - -rwxr-xr-x 0 0 0 7127 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/anilabel.tcl - - -rwxr-xr-x 0 0 0 3608 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/aniwave.tcl - - -rwxr-xr-x 0 0 0 8715 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/arrow.tcl - - -rwxr-xr-x 0 0 0 3075 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/bind.tcl - - -rwxr-xr-x 0 0 0 1411 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/bitmap.tcl - - -rwxr-xr-x 0 0 0 1756 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/browse - - -rwxr-xr-x 0 0 0 1507 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/button.tcl - - -rwxr-xr-x 0 0 0 2317 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/check.tcl - - -rwxr-xr-x 0 0 0 1431 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/clrpick.tcl - - -rwxr-xr-x 0 0 0 5009 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/colors.tcl - - -rwxr-xr-x 0 0 0 2064 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/combo.tcl - - -rwxr-xr-x 0 0 0 4015 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/cscroll.tcl - - -rwxr-xr-x 0 0 0 6312 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ctext.tcl - - -rwxr-xr-x 0 0 0 974 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/dialog1.tcl - - -rwxr-xr-x 0 0 0 828 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/dialog2.tcl - - -rwxr-xr-x 0 0 0 4402 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/en.msg - - -rwxr-xr-x 0 0 0 1465 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/entry1.tcl - - -rwxr-xr-x 0 0 0 2197 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/entry2.tcl - - -rwxr-xr-x 0 0 0 6146 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/entry3.tcl - - -rwxr-xr-x 0 0 0 2384 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/filebox.tcl - - -rwxr-xr-x 0 0 0 81247 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/floor.tcl - - -rwxr-xr-x 0 0 0 1692 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/fontchoose.tcl - - -rwxr-xr-x 0 0 0 1046 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/form.tcl - - -rwxr-xr-x 0 0 0 61196 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/goldberg.tcl - - -rwxr-xr-x 0 0 0 512 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/hello - - -rwxr-xr-x 0 0 0 1656 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/hscale.tcl - - -rwxr-xr-x 0 0 0 2065 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/icon.tcl - - -rwxr-xr-x 0 0 0 1408 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/image1.tcl - - -rwxr-xr-x 0 0 0 3535 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/image2.tcl - - -rwxr-xr-x 0 0 0 6497 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/Tcl.svg - - -rwxr-xr-x 0 0 0 11700 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/Tk_feather.png - - -rwxr-xr-x 0 0 0 51559 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/earth.gif - - -rwxr-xr-x 0 0 0 8157 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/earthmenu.png - - -rwxr-xr-x 0 0 0 6343 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/earthris.gif - - -rwxr-xr-x 0 0 0 1886 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/flagdown.xbm - - -rwxr-xr-x 0 0 0 1880 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/flagup.xbm - - -rwxr-xr-x 0 0 0 275 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/gray25.xbm - - -rwxr-xr-x 0 0 0 1883 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/letters.xbm - - -rwxr-xr-x 0 0 0 1889 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/noletter.xbm - - -rwxr-xr-x 0 0 0 54257 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/ouster.png - - -rwxr-xr-x 0 0 0 272 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/pattern.xbm - - -rwxr-xr-x 0 0 0 68476 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/plowed_field.png - - -rwxr-xr-x 0 0 0 82214 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/starry_night.png - - -rwxr-xr-x 0 0 0 2341 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/tcllogo.gif - - -rwxr-xr-x 0 0 0 196623 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/images/teapot.ppm - - -rwxr-xr-x 0 0 0 10571 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/items.tcl - - -rwxr-xr-x 0 0 0 8083 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ixset - - -rwxr-xr-x 0 0 0 8806 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/knightstour.tcl - - -rwxr-xr-x 0 0 0 1721 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/label.tcl - - -rwxr-xr-x 0 0 0 1809 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/labelframe.tcl - - -rwxr-xr-x 0 0 0 2267 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/license.terms - - -rwxr-xr-x 0 0 0 10926 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/mac_styles.tcl - - -rwxr-xr-x 0 0 0 2293 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/mac_tabs.tcl - - -rwxr-xr-x 0 0 0 8746 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/mac_wm.tcl - - -rwxr-xr-x 0 0 0 5743 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/mclist.tcl - - -rwxr-xr-x 0 0 0 7607 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/menu.tcl - - -rwxr-xr-x 0 0 0 4429 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/menubu.tcl - - -rwxr-xr-x 0 0 0 2004 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/msgbox.tcl - - -rwxr-xr-x 0 0 0 7398 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/nl.msg - - -rwxr-xr-x 0 0 0 1149 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/paned1.tcl - - -rwxr-xr-x 0 0 0 2263 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/paned2.tcl - - -rwxr-xr-x 0 0 0 8256 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/pendulum.tcl - - -rwxr-xr-x 0 0 0 2918 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/plot.tcl - - -rwxr-xr-x 0 0 0 4687 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/print.tcl - - -rwxr-xr-x 0 0 0 2605 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/puzzle.tcl - - -rwxr-xr-x 0 0 0 2784 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/radio.tcl - - -rwxr-xr-x 0 0 0 5316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/rmt - - -rwxr-xr-x 0 0 0 8316 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/rolodex - - -rwxr-xr-x 0 0 0 5333 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ruler.tcl - - -rwxr-xr-x 0 0 0 2275 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/sayings.tcl - - -rwxr-xr-x 0 0 0 4406 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/search.tcl - - -rwxr-xr-x 0 0 0 1541 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/spin.tcl - - -rwxr-xr-x 0 0 0 2030 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/states.tcl - - -rwxr-xr-x 0 0 0 6938 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/style.tcl - - -rwxr-xr-x 0 0 0 2668 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/systray.tcl - - -rwxr-xr-x 0 0 0 5471 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/tclIndex - - -rwxr-xr-x 0 0 0 11253 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/tcolor - - -rwxr-xr-x 0 0 0 4277 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/text.tcl - - -rwxr-xr-x 0 0 0 2188 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/textpeer.tcl - - -rwxr-xr-x 0 0 0 1095 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/timer - - -rwxr-xr-x 0 0 0 3271 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/toolbar.tcl - - -rwxr-xr-x 0 0 0 3178 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/tree.tcl - - -rwxr-xr-x 0 0 0 3421 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ttkbut.tcl - - -rwxr-xr-x 0 0 0 2420 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ttkmenu.tcl - - -rwxr-xr-x 0 0 0 2343 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ttknote.tcl - - -rwxr-xr-x 0 0 0 4180 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ttkpane.tcl - - -rwxr-xr-x 0 0 0 1533 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ttkprogress.tcl - - -rwxr-xr-x 0 0 0 1422 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ttkscale.tcl - - -rwxr-xr-x 0 0 0 1631 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/ttkspin.tcl - - -rwxr-xr-x 0 0 0 11980 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/twind.tcl - - -rwxr-xr-x 0 0 0 3969 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/unicodeout.tcl - - -rwxr-xr-x 0 0 0 1640 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/vscale.tcl - - -rwxr-xr-x 0 0 0 23966 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/widget - - -rwxr-xr-x 0 0 0 5771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/demos/windowicons.tcl - - -rwxr-xr-x 0 0 0 5800 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/dialog.tcl - - -rwxr-xr-x 0 0 0 18658 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/entry.tcl - - -rwxr-xr-x 0 0 0 4856 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/focus.tcl - - -rwxr-xr-x 0 0 0 15648 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/fontchooser.tcl - - -rwxr-xr-x 0 0 0 13074 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/iconbadges.tcl - - -rwxr-xr-x 0 0 0 16403 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/iconlist.tcl - - -rwxr-xr-x 0 0 0 2380 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/icons.tcl - - -rwxr-xr-x 0 0 0 322 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/README - - -rwxr-xr-x 0 0 0 32891 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/logo.eps - - -rwxr-xr-x 0 0 0 2341 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/logo100.gif - - -rwxr-xr-x 0 0 0 1670 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/logo64.gif - - -rwxr-xr-x 0 0 0 11000 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/logoLarge.gif - - -rwxr-xr-x 0 0 0 3889 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/logoMed.gif - - -rwxr-xr-x 0 0 0 27800 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo.eps - - -rwxr-xr-x 0 0 0 1615 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo100.gif - - -rwxr-xr-x 0 0 0 2489 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo150.gif - - -rwxr-xr-x 0 0 0 2981 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo175.gif - - -rwxr-xr-x 0 0 0 3491 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo200.gif - - -rwxr-xr-x 0 0 0 1171 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/pwrdLogo75.gif - - -rwxr-xr-x 0 0 0 5473 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/images/tai-ku.gif - - -rwxr-xr-x 0 0 0 13771 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/listbox.tcl - - -rwxr-xr-x 0 0 0 9570 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/megawidget.tcl - - -rwxr-xr-x 0 0 0 38199 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/menu.tcl - - -rwxr-xr-x 0 0 0 29352 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/mkpsenc.tcl - - -rwxr-xr-x 0 0 0 17249 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgbox.tcl - - -rwxr-xr-x 0 0 0 4632 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/cs.msg - - -rwxr-xr-x 0 0 0 4604 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/da.msg - - -rwxr-xr-x 0 0 0 5495 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/de.msg - - -rwxr-xr-x 0 0 0 6249 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/el.msg - - -rwxr-xr-x 0 0 0 3882 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/en.msg - - -rwxr-xr-x 0 0 0 63 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/en_gb.msg - - -rwxr-xr-x 0 0 0 4643 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/eo.msg - - -rwxr-xr-x 0 0 0 4611 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/es.msg - - -rwxr-xr-x 0 0 0 5649 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/fi.msg - - -rwxr-xr-x 0 0 0 4491 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/fr.msg - - -rwxr-xr-x 0 0 0 4871 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/hu.msg - - -rwxr-xr-x 0 0 0 4423 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/it.msg - - -rwxr-xr-x 0 0 0 5196 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/nl.msg - - -rwxr-xr-x 0 0 0 5419 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/pl.msg - - -rwxr-xr-x 0 0 0 4578 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/pt.msg - - -rwxr-xr-x 0 0 0 6260 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/ru.msg - - -rwxr-xr-x 0 0 0 4471 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/sv.msg - - -rwxr-xr-x 0 0 0 5920 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/msgs/zh_cn.msg - - -rwxr-xr-x 0 0 0 1580 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/optMenu.tcl - - -rwxr-xr-x 0 0 0 9491 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/palette.tcl - - -rwxr-xr-x 0 0 0 5162 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/panedwindow.tcl - - -rwxr-xr-x 0 0 0 220 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/pkgIndex.tcl - - -rwxr-xr-x 0 0 0 42564 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/print.tcl - - -rwxr-xr-x 0 0 0 7372 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/safetk.tcl - - -rwxr-xr-x 0 0 0 7928 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/scale.tcl - - -rwxr-xr-x 0 0 0 6496 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/scaling.tcl - - -rwxr-xr-x 0 0 0 14049 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/scrlbar.tcl - - -rwxr-xr-x 0 0 0 15637 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/spinbox.tcl - - -rwxr-xr-x 0 0 0 14520 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/systray.tcl - - -rwxr-xr-x 0 0 0 20142 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/tclIndex - - -rwxr-xr-x 0 0 0 4439 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/tearoff.tcl - - -rwxr-xr-x 0 0 0 36150 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/text.tcl - - -rwxr-xr-x 0 0 0 26717 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/tk.tcl - - -rwxr-xr-x 0 0 0 5543 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/tkAppInit.c - - -rwxr-xr-x 0 0 0 37326 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/tkfbox.tcl - - -rwxr-xr-x 0 0 0 5338 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/altTheme.tcl - - -rwxr-xr-x 0 0 0 5342 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/aquaTheme.tcl - - -rwxr-xr-x 0 0 0 2916 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/button.tcl - - -rwxr-xr-x 0 0 0 6619 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/clamTheme.tcl - - -rwxr-xr-x 0 0 0 4739 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/classicTheme.tcl - - -rwxr-xr-x 0 0 0 15488 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/combobox.tcl - - -rwxr-xr-x 0 0 0 4439 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/cursors.tcl - - -rwxr-xr-x 0 0 0 7477 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/defaults.tcl - - -rwxr-xr-x 0 0 0 18034 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/entry.tcl - - -rwxr-xr-x 0 0 0 5031 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/fonts.tcl - - -rwxr-xr-x 0 0 0 6202 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/menubutton.tcl - - -rwxr-xr-x 0 0 0 7242 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/notebook.tcl - - -rwxr-xr-x 0 0 0 2028 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/panedwindow.tcl - - -rwxr-xr-x 0 0 0 1218 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/progress.tcl - - -rwxr-xr-x 0 0 0 2580 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/scale.tcl - - -rwxr-xr-x 0 0 0 2956 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/scrollbar.tcl - - -rwxr-xr-x 0 0 0 2353 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/sizegrip.tcl - - -rwxr-xr-x 0 0 0 5309 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/spinbox.tcl - - -rwxr-xr-x 0 0 0 11898 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/treeview.tcl - - -rwxr-xr-x 0 0 0 6444 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/ttk.tcl - - -rwxr-xr-x 0 0 0 7293 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/utils.tcl - - -rwxr-xr-x 0 0 0 9358 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/vistaTheme.tcl - - -rwxr-xr-x 0 0 0 3894 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/winTheme.tcl - - -rwxr-xr-x 0 0 0 3139 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/ttk/xpTheme.tcl - - -rwxr-xr-x 0 0 0 25855 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/lib/tk9.0/xmfbox.tcl - - lrwxr-xr-x 0 0 0 0 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/share/man/man1/python3.1 -> python3.12.1 - - -rwxr-xr-x 0 0 0 20124 Jan 1 2023 ./app.runfiles/aspect_rules_py++python_interpreters+python_3_12_aarch64_unknown_linux_gnu/share/man/man1/python3.12.1 diff --git a/e2e/cases/uv-deps-650/crossbuild/test_crossbuild_pyc.sh b/e2e/cases/uv-deps-650/crossbuild/test_crossbuild_pyc.sh deleted file mode 100755 index 88e8415e4..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/test_crossbuild_pyc.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -# Verifies that cross-arch whl_install with compile_pyc succeeds. -# -# Regression test for the exec-platform interpreter fix: when building -# arm64 Linux packages on an amd64 host with compile_pyc=True, the -# compileall action must use the exec-platform (amd64) interpreter. -# If the wrong interpreter is selected, the action fails with -# "Exec format error" at build time, which Bazel surfaces as a test failure. -# -# The fact that this test builds at all (its data deps are built before the -# test runs) is the assertion. No runtime logic is needed. -set -euo pipefail - -DIR="${TEST_SRCDIR}/_main/uv-deps-650/crossbuild" - -# Confirm the arm64 layer tarballs were produced. The build of these targets -# exercises whl_install with compile_pyc=True against an arm64 target platform -# on whatever host this test runs on. -if ! ls "$DIR"/app_layers_*.tar.gz >/dev/null 2>&1; then - echo "FAIL: arm64 layer outputs not found in $DIR" - echo " This likely means the cross-arch whl_install build failed." - exit 1 -fi - -echo "PASS: cross-arch whl_install with compile_pyc succeeded (arm64 layers built on $(uname -m) host)" diff --git a/e2e/cases/uv-deps-650/crossbuild/test_exec_toolchain.sh b/e2e/cases/uv-deps-650/crossbuild/test_exec_toolchain.sh deleted file mode 100755 index 1ad332a18..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/test_exec_toolchain.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash -# Verifies that EXEC_TOOLS_TOOLCHAIN always resolves the exec-platform Python -# interpreter, even when the target platform is arm64. -# -# The whl_install and py_unpacked_wheel rules use ctx.toolchains[EXEC_TOOLS_TOOLCHAIN] -# to run unpack.py. That toolchain is registered with exec_compatible_with, so Bazel -# must always select the interpreter that runs on the build host — never an arm64 -# binary that would fail with "Exec format error" on an amd64 host. -# -# This test confirms that: when we transition to an arm64 target platform on -# an amd64 exec host, the resolved Python interpreter path still refers to an -# amd64 (host) binary. -set -euo pipefail - -DIR="${TEST_SRCDIR}/_main/uv-deps-650/crossbuild" - -native_path_file="$DIR/unpack_path.txt" -arm64_path_file="$DIR/unpack_path_for_arm64.txt" - -if [[ ! -f "$native_path_file" ]]; then - echo "FAIL: $native_path_file not found" - exit 1 -fi - -if [[ ! -f "$arm64_path_file" ]]; then - echo "FAIL: $arm64_path_file not found" - exit 1 -fi - -native_path=$(cat "$native_path_file") -arm64_path=$(cat "$arm64_path_file") - -echo "Native exec Python path: $native_path" -echo "Arm64-target exec Python path: $arm64_path" - -# The arm64 platform transition changes the configuration fingerprint (the -# ST-* hash in the output path) even when the resolved interpreter is the same -# exec-platform tool. Path equality is therefore not a valid assertion. -# -# What matters is that neither build resolved an arm64/aarch64 interpreter. If -# toolchain resolution used the target platform instead of the exec platform, -# the path would contain "arm64" or "aarch64" and the interpreter would fail at -# runtime with "Exec format error". -if [[ "$arm64_path" == *"arm64"* ]] || [[ "$arm64_path" == *"aarch64"* ]]; then - echo "FAIL: arm64-target exec Python path contains arm64/aarch64 — exec platform not honoured." - echo " Path: $arm64_path" - exit 1 -fi - -if [[ "$native_path" == *"arm64"* ]] || [[ "$native_path" == *"aarch64"* ]]; then - echo "FAIL: native exec Python path unexpectedly contains arm64/aarch64." - echo " Path: $native_path" - exit 1 -fi - -echo "PASS: EXEC_TOOLS_TOOLCHAIN resolved exec-platform Python for arm64 target ($(uname -m) host)" \ No newline at end of file diff --git a/e2e/cases/uv-deps-650/setup.MODULE.bazel b/e2e/cases/uv-deps-650/setup.MODULE.bazel index 6326b4590..843e5a375 100644 --- a/e2e/cases/uv-deps-650/setup.MODULE.bazel +++ b/e2e/cases/uv-deps-650/setup.MODULE.bazel @@ -16,23 +16,6 @@ uv.project( lock = "//uv-deps-650/airflow:uv.lock", pyproject = "//uv-deps-650/airflow:pyproject.toml", ) -uv.project( - default_build_dependencies = [ - "build", - "cffi", - "setuptools", - ], - hub_name = "pypi_uv_deps_650", - lock = "//uv-deps-650/crossbuild:uv.lock", - pyproject = "//uv-deps-650/crossbuild:pyproject.toml", -) -uv.override_package( - name = "python-geohash", - lock = "//uv-deps-650/crossbuild:uv.lock", - pre_build_patch_strip = 1, - pre_build_patches = ["//uv-deps-650/crossbuild:require_cxx_driver.patch"], - resource_set = "mem_4g", -) uv.project( hub_name = "pypi_uv_deps_650", lock = "//uv-deps-650/extras:uv.lock", diff --git a/e2e/cases/uv-gazelle-778/BUILD.bazel b/e2e/cases/uv-gazelle-778/BUILD.bazel index df6d049b7..5fb4556f5 100644 --- a/e2e/cases/uv-gazelle-778/BUILD.bazel +++ b/e2e/cases/uv-gazelle-778/BUILD.bazel @@ -1,7 +1,7 @@ load("@aspect_rules_py//uv:defs.bzl", "gazelle_python_manifest") # Exercise generating a Gazelle manifest covering a ton of venvs. Reads -# from the //uv-deps-650 hub which already has the 4-project shape +# from the //uv-deps-650 hub which already has the 3-project shape # this case needs to exercise. # # Documented exception to per-case isolation: this test applies Gazelle to @@ -16,7 +16,6 @@ gazelle_python_manifest( # Note that we _merge_ the package mappings from several configurations. venvs = [ "airflow", - "crossbuild", "extras", "say", ], diff --git a/e2e/cases/uv-sdist-jdk-build/BUILD.bazel b/e2e/cases/uv-sdist-jdk-build/BUILD.bazel index 7d36ea4af..6064e0bb3 100644 --- a/e2e/cases/uv-sdist-jdk-build/BUILD.bazel +++ b/e2e/cases/uv-sdist-jdk-build/BUILD.bazel @@ -1,15 +1,16 @@ # Regression test for the JDK toolchain wiring in pep517_native_whl, # layered with the `uv.override_package(toolchains = [...], env = {...})` -# plumbing (see setup.MODULE.bazel). The test target is tagged `manual` — -# jpype1's scikit-build-core / cmake / ninja chain doesn't actually -# compile inside the Bazel sandbox today, so the regression coverage -# lives in: -# -# - //uv/private/pep517_whl:toolchain_env_test (analysis-level) -# - //:snapshots_*_test (BUILD-template output) -# -# This target stays in the repo as the entry point for any future work -# to make the full sdist compile succeed end-to-end. +# plumbing (see setup.MODULE.bazel). The test target is tagged `manual` here +# specifically because this hub's JAVA_HOME points at rules_java's default +# remotejdk (Azul Zulu), which gets jpype1's CMake configure past Java/JNI +# detection but then fails needing `ant` on PATH — this hub has no Ant +# vendored. The full, working end-to-end version (real Eclipse Temurin JDK, +# hermetically vendored Apache Ant, actual cross-compile + QEMU execution) +# lives in `//e2e/crossbuild/jpype1`; that's the real regression coverage +# for this toolchain combination now. This target and its analysis-level +# siblings (//uv/private/pep517_whl:toolchain_env_test, //:snapshots_*_test) +# stay for the narrower "does the env/toolchain plumbing reach the action" +# check, which doesn't need Ant to answer. load("@aspect_rules_py//py:defs.bzl", "py_test") From 884fc56c49e10d42683194632a53db43da4e5eb5 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 7 Aug 2026 12:08:20 -0600 Subject: [PATCH 019/103] typing e2e --- e2e/README.md | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/e2e/README.md b/e2e/README.md index d1aa5fa26..a88516e7d 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -35,15 +35,34 @@ workspace above must not carry: its `.bazelrc` turns on the rules_python provide compatibility layer, so rules_python `py_*` targets can depend on a rules_py `py_library`. Its `test.sh` asserts the same dependency is rejected with the flag off. -`crossbuild` hosts the rules_pycross ports (`pycross-*`): suites that force -packages to build from their sdists — pure-Python backends, setuptools C -extensions, pre/post-install patch phases, the distutils probe — and assert -properties of the resulting wheels, including rebuilding them under non-host -target platforms via `collect_wheels`. They live apart from `cases/` because -this workspace is where the cross-compilation test matrix grows, and their -sdist hubs carry package-specific overrides (`default_build_dependencies`, -patches, `resource_set`) that shouldn't leak onto unrelated cases sharing a -module — see its `MODULE.bazel` docstring. +`crossbuild` covers `pep517_native_whl`'s cross-compilation path across five +PEP 517 backends, each with more than one real, popular package so no +backend's cross support rests on a single lucky case: two plain +setuptools/distutils C extensions (`geohash`, `psutil`), `contourpy` +(meson-python), two scikit-build-core/CMake packages (`awkward_cpp`, +`jpype1` — the latter also needing a real Eclipse Temurin JDK and a +hermetically vendored Apache Ant, both fetched directly rather than relying +on rules_java's default remotejdk, which is actually Azul Zulu, or a system +`ant`), two maturin/PyO3 Rust packages (`rpds_py`, `pydantic_core`), and +`bcrypt` (setuptools-rust — a different real-world Rust-in-Python +integration than maturin, with no build-backend value of its own to detect +it by). Every case is built and packaged for linux/amd64 and linux/arm64 +from the same amd64 exec host and actually executed — QEMU for the Linux +targets — not just inspected. The same workspace hosts the rules_pycross +ports (`pycross-*`), which force packages to build from their sdists and +assert properties of the resulting wheels, including rebuilding them under +non-host target platforms via `collect_wheels`. One more package +(`zstandard`) also ships official prebuilt wheels; its case diffs our +cross-compiled output against theirs byte-for-byte instead of checking +against a hardcoded expected value. These suites are isolated rather than +packages under `e2e/cases` because their pip hubs need package-specific +configuration (`default_build_dependencies`, pre-build patches, a larger +`resource_set`) that would otherwise leak onto unrelated packages sharing +the hub — see the module docstring in its `MODULE.bazel`. On a macOS runner +(the `smoke` job, see below) it additionally builds and runs for +arm64/amd64 macOS via the Xcode SDK, executing the amd64 one under +Rosetta 2 — see its `test.sh` for why that half can't just be more +`platform_transition_filegroup` targets under `//...`. Each isolated workspace points back at repo-root rules_py with `local_path_override(path = "../..")`. From 751c00b6630c32460b371ce57531f79f379c6c7d Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Mon, 10 Aug 2026 00:19:01 -0600 Subject: [PATCH 020/103] =?UTF-8?q?sdists=20darwin=E2=86=92linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/uv.md | 27 +++-- e2e/cases/uv-deps-650/test.sh | 76 ++++++++++++ e2e/crossbuild/.bazelversion | 2 +- e2e/crossbuild/MODULE.bazel | 16 ++- e2e/crossbuild/MODULE.bazel.lock | 17 ++- e2e/crossbuild/awkward_cpp/BUILD.bazel | 11 +- e2e/crossbuild/contourpy/BUILD.bazel | 4 +- e2e/crossbuild/geohash/BUILD.bazel | 6 +- e2e/crossbuild/tools/BUILD.bazel | 16 ++- e2e/crossbuild/tools/rust_layer.bzl | 34 ++++-- uv/private/pep517_whl/build_helper.py | 158 ++++++++++++++++++++++--- uv/private/pep517_whl/rule.bzl | 16 +-- 12 files changed, 313 insertions(+), 70 deletions(-) create mode 100755 e2e/cases/uv-deps-650/test.sh diff --git a/docs/uv.md b/docs/uv.md index 70a8d47d4..cd3713577 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -295,7 +295,12 @@ Under cross mode the build action: 1. Extracts the C++ toolchain selected for the target platform (compiler, compile/link flags, sysroot) and re-materializes it as compiler wrapper scripts, so flags such as `-target` / `--sysroot` survive the PEP 517 - backend's own command construction. + backend's own command construction. Per backend it also generates the + cross artifact the backend requires: a meson cross file plus exe_wrapper + (meson-python only auto-synthesizes cross files on macOS), a CMake + toolchain file (scikit-build-core's cross detection likewise only covers + macOS), and a `rustc --sysroot` wrapper plus sandboxed `CARGO_HOME` for + cargo-based backends (maturin, setuptools-rust). 2. Overrides the target interpreter's sysconfig for the build (`_PYTHON_SYSCONFIGDATA_NAME` pointing at the target runtime's `_sysconfigdata_*.py`, `_PYTHON_HOST_PLATFORM`, and the target's @@ -308,16 +313,22 @@ Under cross mode the build action: 4. Validates the produced wheel's platform tag against the target OS/CPU and fails the action if the backend leaked the exec platform into the tag. -A working end-to-end example (Darwin → Linux arm64/amd64, `python-geohash` -built from sdist, with architecture and `EXT_SUFFIX` assertions) lives in -`e2e/cases/uv-deps-650/crossbuild/`. +A working end-to-end suite lives in `e2e/crossbuild/`: real packages forced +to build from sdist (`[tool.uv] no-binary-package`) and cross-compiled for +linux/amd64 and linux/arm64, covering setuptools (`python-geohash`, +`msgpack`, `psutil`), setuptools+CFFI (`zstandard`), setuptools-rust +(`tiktoken`, `bcrypt`), maturin/PyO3 (`pydantic_core`, `rpds_py`), +meson-python (`contourpy`, `numpy`), and scikit-build-core/CMake +(`awkward_cpp`, `jpype1`). Each case asserts the ELF architecture of the +produced `.so` (and its `EXT_SUFFIX`, where the filename carries one) and +then actually runs the resulting container image (QEMU for arm64). `//geohash` additionally covers a +macOS arm64 → macOS amd64 cross target when run from a macOS host (see +`e2e/crossbuild/test.sh`). Current limitations: -- Only setuptools-style PEP 517 backends are exercised in cross mode. meson / - meson-python, cmake, and maturin/PyO3 packages may build but are not yet - covered; CPU-feature detection that runs compiled binaries cannot work in - cross mode and needs per-package baselines. +- CPU-feature detection that runs compiled binaries cannot work in cross + mode and needs per-package baselines. - No shared-library "repair" (auditwheel/delocate style bundling) is performed yet; wheels linking against Bazel-provided native libraries need care. - Windows targets and MSVC are not supported. diff --git a/e2e/cases/uv-deps-650/test.sh b/e2e/cases/uv-deps-650/test.sh new file mode 100755 index 000000000..9ba171612 --- /dev/null +++ b/e2e/cases/uv-deps-650/test.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# +# Runtime smoke for the cross-built geohash images. +# +# The ELF checks in crossbuild/BUILD.bazel prove the cross-compiled extension +# has the right architecture bytes; this proves it imports and executes on the +# target architecture. dlopen resolves the symbols an ELF shared link is +# allowed to leave undefined, so a wheel that "linked fine" without its C++ +# runtime fails here and nowhere else. Needs a real `bazel run` (oci_load) +# plus a container daemon, so it cannot be an sh_test under //.... +set -uo pipefail + +cd "$(dirname "$0")/.." || exit 1 + +BAZEL="${BAZEL:-bazel}" +PKG="//uv-deps-650/crossbuild" + +if ! command -v docker >/dev/null 2>&1 || ! docker info >/dev/null 2>&1; then + echo "SKIP: no usable container daemon; cross-arch runtime smoke not run" + exit 0 +fi + +status=0 + +smoke() { + local leg="$1" expected_machine="$2" + local tag="rules-py/geohash-crossbuild:${leg}" + local platform="linux/${leg}" + + echo "== ${leg}: build and load image ==" + if ! "$BAZEL" run "${PKG}:geohash_${leg}_image_load"; then + echo "FAIL: ${leg}: building/loading the image failed" >&2 + status=1 + return 0 + fi + + # Infra probe, separate from the product check: /bin/true comes from the + # ubuntu base layer, so if even that cannot exec, this host lacks binfmt + # emulation for ${platform} — an environment gap, not a product bug. + # GitHub's ubuntu runners ship no handlers; install them once. + if ! docker run --rm --platform "${platform}" --entrypoint /bin/true "${tag}" >/dev/null 2>&1; then + if [ "$(uname -s)" = "Linux" ]; then + docker run --privileged --rm tonistiigi/binfmt --install "${leg}" >/dev/null 2>&1 || true + fi + if ! docker run --rm --platform "${platform}" --entrypoint /bin/true "${tag}" >/dev/null 2>&1; then + echo "SKIP: ${leg}: no ${platform} emulation available on this host" + return 0 + fi + fi + + echo "== ${leg}: run the extension on ${platform} ==" + local output + if ! output="$(docker run --rm --platform "${platform}" "${tag}" 2>&1)"; then + echo "${output}" >&2 + echo "FAIL: ${leg}: geohash smoke exited nonzero" >&2 + status=1 + return 0 + fi + echo "${output}" + if ! grep -q "GEOHASH_SMOKE_OK" <<<"${output}"; then + echo "FAIL: ${leg}: smoke ran but did not report GEOHASH_SMOKE_OK" >&2 + status=1 + return 0 + fi + if ! grep -q "machine=${expected_machine}" <<<"${output}"; then + echo "FAIL: ${leg}: expected machine=${expected_machine} in output" >&2 + status=1 + return 0 + fi + echo "PASS: ${leg} extension executed on ${platform}" +} + +smoke arm64 aarch64 +smoke amd64 x86_64 + +exit "${status}" diff --git a/e2e/crossbuild/.bazelversion b/e2e/crossbuild/.bazelversion index 6adf95a25..074c37b76 100644 --- a/e2e/crossbuild/.bazelversion +++ b/e2e/crossbuild/.bazelversion @@ -1,4 +1,4 @@ -8.5.1 +8.6.0 # The first line of this file is used by Bazelisk and Bazel to be sure # the right version of Bazel is used to build and test this repo. # This also defines which version is used on CI. diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index bbac0109a..380726581 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -106,6 +106,7 @@ bazel_dep(name = "rules_cc", version = "0.2.16") bazel_dep(name = "tar.bzl", version = "0.10.1") bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "gcc_toolchain", version = "0.11.0") +bazel_dep(name = "llvm", version = "0.8.3") bazel_dep(name = "rules_oci", version = "2.2.7") bazel_dep(name = "rules_shell", version = "0.4.1") bazel_dep(name = "container_structure_test", version = "1.22.1") @@ -160,10 +161,23 @@ register_toolchains( "@gcc_toolchain_aarch64//:cc_toolchain", ) +# Registered AFTER gcc_toolchain on purpose: on the Linux CI runner both can +# satisfy exec=linux → target=linux and registration order makes strict GCC +# win, preserving the sysroot/flag-propagation guarantees documented above. +# llvm only ever resolves for the edge gcc_toolchain cannot fill — a macOS +# host cross-building the linux cases locally (exec=darwin → target=linux). +register_toolchains("@llvm//toolchain:all") + rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") rust.toolchain( edition = "2021", - extra_target_triples = ["aarch64-unknown-linux-gnu"], + # Both linux triples: on the linux/amd64 CI runner x86_64 is the host + # triple (redundant there), but a darwin host needs it as an explicit + # cross target for the amd64 cases. + extra_target_triples = [ + "aarch64-unknown-linux-gnu", + "x86_64-unknown-linux-gnu", + ], versions = ["1.90.0"], ) use_repo(rust, "rust_toolchains") diff --git a/e2e/crossbuild/MODULE.bazel.lock b/e2e/crossbuild/MODULE.bazel.lock index e93959739..f196b3cd8 100644 --- a/e2e/crossbuild/MODULE.bazel.lock +++ b/e2e/crossbuild/MODULE.bazel.lock @@ -33,11 +33,13 @@ "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.42.0/MODULE.bazel": "e8ca15cb2639c5f12183db6dcb678735555d0cdd739b32a0418b6532b5e565f8", "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", + "https://bcr.bazel.build/modules/bazel_lib/3.2.2/MODULE.bazel": "e2c890c8a515d6bca9c66d47718aa9e44b458fde64ec7204b8030bf2d349058c", "https://bcr.bazel.build/modules/bazel_lib/3.3.1/MODULE.bazel": "732a0d516cf6400d9b3136e4356258aef1bf91de8d5240f87f0112f098920c1d", "https://bcr.bazel.build/modules/bazel_lib/3.3.1/source.json": "8e5175d7b4125a39b8941d01e38039934d058e03804f46a2b8fd7ae6316b1ce2", "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", @@ -78,6 +80,8 @@ "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/llvm/0.8.3/MODULE.bazel": "dbc1bc13171f8f9980a75524883abef1c491613e8d8d805cd4ffa3767ba9708e", + "https://bcr.bazel.build/modules/llvm/0.8.3/source.json": "4b11874c26a9de53c03a25a517ebc36dee6b458c920fe9ed65e3ca279ff19775", "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92", "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", @@ -176,6 +180,7 @@ "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", + "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", "https://bcr.bazel.build/modules/rules_rust/0.68.0/MODULE.bazel": "dcb4fe4396b49d3b2d72bccf634d27499dd2a58dcdfccfe8e17ba15c4bd150ae", @@ -192,9 +197,11 @@ "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", + "https://bcr.bazel.build/modules/tar.bzl/0.10.4/MODULE.bazel": "e8f9ff79199e8d9eaad7f1b0a77ad74b30bb82d794b87d8ca942bead5de83ae9", + "https://bcr.bazel.build/modules/tar.bzl/0.10.4/source.json": "20143442376c03426f6135292ba02d825cb75308aa47e6bf42dd4cc5a435c2ff", "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/MODULE.bazel": "b573395fe63aef4299ba095173e2f62ccfee5ad9bbf7acaa95dba73af9fc2b38", "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/MODULE.bazel": "6b6c543e415d2a502954766e50c6a6144a131687f2751b62157a9250e2b04982", "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/source.json": "12363ac76d821f6c7dabfebbd673615391da06e2e33f576402d31a96a7b56532", "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", @@ -240,7 +247,7 @@ }, "@@container_structure_test+//:repositories.bzl%extension": { "general": { - "bzlTransitiveDigest": "jyF1qaqe3SV7GOwa1PtIiJk04CPKLgKbWZoD1aX28NU=", + "bzlTransitiveDigest": "Yi2XrRCMXgBjN02PBU8hDqf505D+o2Tr5jihM3CNIE4=", "usagesDigest": "uXk1ym4ketE3OMAHoR5fUuuv8pOmi0aSyCe28koTwfA=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -351,7 +358,7 @@ }, "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { - "bzlTransitiveDigest": "rL/34P1aFDq2GqVC2zCFgQ8nTuOC6ziogocpvG50Qz8=", + "bzlTransitiveDigest": "nvW/NrBXlAmiQw99EMGKkLaD2KbNp2mQDlxdfpr+0Ls=", "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -415,7 +422,7 @@ }, "@@rules_oci+//oci:extensions.bzl%oci": { "general": { - "bzlTransitiveDigest": "btafL5urts9jH0gR3UVdsG7OprxGfLk14aFXX/G5FdU=", + "bzlTransitiveDigest": "jW3m6/g1MkuVCrNHyiZ4EJQOvAUToDirFFftOvDpfYs=", "usagesDigest": "9ABtbohz+3s6dpNBjutox5VF5aRBXAiiB40cBGEQvYM=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -619,7 +626,7 @@ }, "@@rules_python+//python/uv:uv.bzl%uv": { "general": { - "bzlTransitiveDigest": "xMgnVVV6SeyGCaYQT+4rYddx63q6+JXtyCrlLeA8OLM=", + "bzlTransitiveDigest": "yG9F6L2IZXKRbD/aIUa6sU7uITLUTBKOMWPbIvl1VdM=", "usagesDigest": "6MjoD3H+netDdhklgMWks3NARpHVXxy8kfsMe9XXPa8=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, diff --git a/e2e/crossbuild/awkward_cpp/BUILD.bazel b/e2e/crossbuild/awkward_cpp/BUILD.bazel index 727d55038..14ddd346e 100644 --- a/e2e/crossbuild/awkward_cpp/BUILD.bazel +++ b/e2e/crossbuild/awkward_cpp/BUILD.bazel @@ -1,9 +1,12 @@ # awkward-cpp ships official prebuilt wheels for linux/amd64 and # linux/arm64, but [tool.uv] no-binary-package forces it to build from -# sdist here. scikit-build-core (CMake) backend — pep517_native_whl doesn't -# support it yet. Its compiled libraries (libawkward*.so) are loaded via -# ctypes at runtime, not imported as CPython extension modules, so unlike -# //contourpy there's no EXT_SUFFIX/SOABI to check — only ELF arch. +# sdist here. scikit-build-core (CMake) backend: cross mode must supply a +# CMake toolchain file, since scikit-build-core's own cross-compile +# detection only covers macOS (see build_helper.py's +# _generate_cmake_toolchain_file). Its compiled libraries (libawkward*.so) +# are loaded via ctypes at runtime, not imported as CPython extension +# modules, so unlike //contourpy there's no EXT_SUFFIX/SOABI to check — +# only ELF arch. load("//tools:cross_case.bzl", "pep517_cross_case") diff --git a/e2e/crossbuild/contourpy/BUILD.bazel b/e2e/crossbuild/contourpy/BUILD.bazel index 40fd8143f..489789a36 100644 --- a/e2e/crossbuild/contourpy/BUILD.bazel +++ b/e2e/crossbuild/contourpy/BUILD.bazel @@ -1,7 +1,9 @@ # contourpy ships official prebuilt wheels for linux/amd64 and linux/arm64, # but [tool.uv] no-binary-package forces it to build from sdist here. Unlike # //geohash (setuptools) and //zstandard (setuptools+CFFI), this is a -# meson-python backend — pep517_native_whl doesn't support it yet. +# meson-python backend: cross mode must generate a meson cross file and +# exe_wrapper for it, since meson-python only auto-synthesizes cross files +# on macOS (see build_helper.py's _generate_meson_cross_file). load("//tools:cross_case.bzl", "pep517_cross_case") diff --git a/e2e/crossbuild/geohash/BUILD.bazel b/e2e/crossbuild/geohash/BUILD.bazel index 63b21f86c..ac33223cc 100644 --- a/e2e/crossbuild/geohash/BUILD.bazel +++ b/e2e/crossbuild/geohash/BUILD.bazel @@ -4,7 +4,7 @@ # platform-transition-only packaging coverage. load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") -load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") +load("@bazel_lib//lib:transitions.bzl", "platform_transition_binary", "platform_transition_filegroup") load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@container_structure_test//:defs.bzl", "container_structure_test") load("@rules_oci//oci:defs.bzl", "oci_image") @@ -142,9 +142,9 @@ sh_test( # to os:macos regardless of the real host, so target_compatible_with can't # tell Linux apart from macOS here. test.sh invokes both by label after # checking uname. -platform_transition_filegroup( +platform_transition_binary( name = "geohash_amd64_macos_bin", - srcs = [":geohash_bin"], + binary = ":geohash_bin", tags = ["manual"], target_platform = "//:amd64_macos", ) diff --git a/e2e/crossbuild/tools/BUILD.bazel b/e2e/crossbuild/tools/BUILD.bazel index 6c332822a..43e6c78c8 100644 --- a/e2e/crossbuild/tools/BUILD.bazel +++ b/e2e/crossbuild/tools/BUILD.bazel @@ -3,7 +3,7 @@ load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") load("@rules_shell//shell:sh_test.bzl", "sh_test") load(":ant_layer.bzl", "ant_home") -load(":rust_layer.bzl", "rust_pinned_sysroot") +load(":rust_layer.bzl", "rust_host_sysroot") load(":toolchain_test.bzl", "exec_python_path") exports_files([ @@ -12,15 +12,13 @@ exports_files([ "check_so_suffix.sh", ]) -# The exec-platform (x86_64) rust_toolchain's sysroot, pinned by label so it's -# available even when the rest of the build is transitioned to arm64 — see -# rust_layer.bzl for why current_rust_toolchain alone isn't enough. -rust_pinned_sysroot( +# The host-targeting rust_toolchain's sysroot, re-resolved under the exec +# transition so it stays correct even when the rest of the build is +# transitioned to another platform — see rust_layer.bzl for why plain +# current_rust_toolchain alone isn't enough. +rust_host_sysroot( name = "rust_host_sysroot", - # rust_linux_x86_64__x86_64-unknown-linux-gnu__stable (in @rust_toolchains) - # is the toolchain() *resolution* wrapper; the actual rust_toolchain rule - # instance (the one with ToolchainInfo/TemplateVariableInfo) is this repo. - actual = "@@rules_rust++rust+rust_linux_x86_64__x86_64-unknown-linux-gnu__stable_tools//:rust_toolchain", + actual = "@rules_rust//rust/toolchain:current_rust_toolchain", visibility = ["//visibility:public"], ) diff --git a/e2e/crossbuild/tools/rust_layer.bzl b/e2e/crossbuild/tools/rust_layer.bzl index 0cae5a4d0..82fbc8550 100644 --- a/e2e/crossbuild/tools/rust_layer.bzl +++ b/e2e/crossbuild/tools/rust_layer.bzl @@ -1,17 +1,23 @@ -"""Exposes a specific (non-ambient-resolved) rust_toolchain's sysroot. +"""Exposes the host-targeting rust_toolchain's sysroot. `@rules_rust//rust/toolchain:current_rust_toolchain` resolves against the build's ambient --platforms, so under a cross (arm64) transition it returns the arm64-*targeting* toolchain — whose sysroot only carries LLVM's shared -libs for x86_64, not the x86_64 rust-std a build script/proc-macro (always -compiled for the exec platform) needs. This rule instead pins to a specific -`rust_toolchain` target by label, bypassing toolchain resolution entirely, -so a package can also pull in the plain x86_64-targeting toolchain's sysroot -regardless of which platform the rest of the build is transitioned to. +libs for the exec platform, not the exec platform's rust-std a build +script/proc-macro (always compiled for the exec platform) needs. This rule +re-resolves it under rules_py's exec_transition (--platforms := the host +platform), which hands back the host-*targeting* toolchain on any host — +x86_64-linux on the CI runner, aarch64-darwin on a macOS workstation — +without hardcoding either repository's label. """ -def _rust_pinned_sysroot_impl(ctx): - toolchain = ctx.attr.actual[platform_common.ToolchainInfo] +load("@aspect_rules_py//uv/private/pep517_whl:exec_transition.bzl", "exec_transition") + +def _rust_host_sysroot_impl(ctx): + actual = ctx.attr.actual + if type(actual) == "list": + actual = actual[0] + toolchain = actual[platform_common.ToolchainInfo] return [ DefaultInfo(files = toolchain.all_files), platform_common.TemplateVariableInfo({ @@ -19,13 +25,17 @@ def _rust_pinned_sysroot_impl(ctx): }), ] -rust_pinned_sysroot = rule( - implementation = _rust_pinned_sysroot_impl, +rust_host_sysroot = rule( + implementation = _rust_host_sysroot_impl, attrs = { "actual": attr.label( - doc = "A rust_toolchain target (not a toolchain_type alias) to pin to.", + cfg = exec_transition, + doc = "current_rust_toolchain, re-resolved with --platforms set to the host.", mandatory = True, ), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), }, - doc = "Exposes `actual`'s sysroot as $(RUST_HOST_SYSROOT), bypassing toolchain resolution.", + doc = "Exposes the host-targeting rust_toolchain's sysroot as $(RUST_HOST_SYSROOT).", ) diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index 97df4e73b..fbac63009 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -92,6 +92,7 @@ "-Wl,-start_group", "-Wl,-end_group", "-bundle", + "STRIP_DEBUG_SYMBOLS", }) _DROP_LINKER_PAIRS = frozenset({ @@ -120,6 +121,7 @@ is_cxx = {is_cxx!r} is_darwin = {is_darwin!r} static_libstdcxx_flags = {static_libstdcxx_flags!r} +exe_link_flags = {exe_link_flags!r} is_link = "-c" not in args filtered = [] @@ -153,10 +155,35 @@ # bug — and full static linking already covers libstdc++ too, making that # partial trick redundant for a binary that's never shipped anyway. is_shared = "-shared" in filtered -if is_link and not is_shared and not is_darwin: +if is_link and exe_link_flags: + # LLVM-style toolchain (nonempty exe_link_flags, see the "-nostdlib++" + # detection in build_helper): clang only reaches its crt objects and + # glibc/libc++ archives through the link action's -B/-L/--sysroot flags + # (no self-contained GCC-like prefix layout), and not every caller + # threads $LDSHARED through — rustc invokes this wrapper as "-C linker" + # with its own args, meson links its probe executables bare. Bake the + # flags into every link; duplicates from the $LDSHARED path are + # harmless to clang. No "-static" for probe executables here: the QEMU + # ld.so bug that motivates it is only reachable via gcc_toolchain on + # the Linux CI runner. + # rustc hardcodes "-lgcc_s" for its unwinder on *-linux-gnu targets; + # this toolchain ships no libgcc at all — statically fold in its + # libunwind instead (cargo-zigbuild's trick, same ABI surface). + filtered = ["-lunwind" if a == "-lgcc_s" else a for a in filtered] + filtered.extend(exe_link_flags) + if is_cxx: + # No implicit C++ stdlib under -nostdlib++; statically embed + # libc++ so the produced .so has no host-libstdc++ dependency + # (only static archives exist on the toolchain's search path). + filtered.extend(["-lc++", "-lc++abi"]) +elif is_link and not is_shared and not is_darwin: filtered.append("-static") elif is_cxx and is_link and not is_darwin: filtered.extend(static_libstdcxx_flags) +elif is_darwin and is_link and is_shared: + # Extension modules leave _Py* unresolved until dlopen; ld64 errors on + # them by default (ELF linkers don't), so mirror CPython's own LDSHARED. + filtered.append("-Wl,-undefined,dynamic_lookup") if is_link and lld_path: os.environ.setdefault("PATH", "") @@ -179,6 +206,14 @@ def _darwin_sysroot() -> Optional[str]: return None +def _xcode_developer_dir() -> Optional[str]: + """Return the active Xcode Developer directory, or None if unavailable.""" + try: + return check_output(["xcode-select", "-p"], text=True).strip() + except Exception: + return None + + def _absolutize_path(value: str) -> str: """Resolve a relative path to absolute, leaving absolute/empty values untouched. @@ -304,21 +339,34 @@ def _make_cross_compiler_wrapper( lld_path: Optional[str] = None, is_cxx: bool = False, is_darwin: bool = False, + exe_link_flags: Optional[list[str]] = None, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) + + # "-bundle" and "-undefined dynamic_lookup" leak from a macOS *host* + # sysconfig and break ELF linkers, but when the *target* is darwin they + # are exactly how extension modules must link (unresolved _Py* symbols + # bind at dlopen time) — keep them there. + drop_exact = set(_DROP_LINKER_FLAGS) + drop_pairs = set(_DROP_LINKER_PAIRS) + if is_darwin: + drop_exact.discard("-bundle") + drop_pairs.discard("-undefined") + return _write_generated_file( wrapper, _CROSS_COMPILER_WRAPPER.format( compiler_path=compiler_path, wrapper_flags=wrapper_flags, - drop_exact=sorted(_DROP_LINKER_FLAGS), - drop_pairs=sorted(_DROP_LINKER_PAIRS), + drop_exact=sorted(drop_exact), + drop_pairs=sorted(drop_pairs), drop_prefixes=list(_DROP_LINKER_PREFIXES), lld_path=lld_path, debug_flag=_DEBUG_FLAG, is_cxx=is_cxx, is_darwin=is_darwin, static_libstdcxx_flags=list(_STATIC_LIBSTDCXX_FLAGS), + exe_link_flags=list(exe_link_flags or []), ), executable=True, ) @@ -433,8 +481,19 @@ def _compiler_env( if cross: wrapper_flags = _get_wrapper_flags(env.get("CFLAGS", "")) lld_path = _find_lld(cc_path) - cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path, is_darwin=is_darwin) - cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path, is_cxx=True, is_darwin=is_darwin) + + # An LLVM-style toolchain (BCR `llvm` module) reaches its crt objects + # and runtime archives only through the link action's flags; detect it + # by its "-nostdlib++" marker and bake those flags (sans "-shared") + # into the wrappers for probe-executable links. gcc_toolchain's driver + # is self-contained — it gets an empty list and keeps its "-static". + ldshared_flag_list = env.get("LDSHAREDFLAGS", "").split() + exe_link_flags = ( + [f for f in ldshared_flag_list if f != "-shared"] if "-nostdlib++" in ldshared_flag_list else [] + ) + + cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path, is_darwin=is_darwin, exe_link_flags=exe_link_flags) + cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path, is_cxx=True, is_darwin=is_darwin, exe_link_flags=exe_link_flags) # gcc_toolchain's own layout (/xbin/gcc, /sysroot/...): # a target-arch binary linked by this compiler needs ITS glibc/loader @@ -444,6 +503,29 @@ def _compiler_env( target_gcc_sysroot = path.join(path.dirname(path.dirname(cc_path)), "sysroot") if not is_darwin and path.isdir(target_gcc_sysroot): env["RULES_PY_TARGET_GCC_SYSROOT"] = target_gcc_sysroot + + # The llvm toolchain on a darwin exec host reports llvm-libtool-darwin + # as its static archiver — a Mach-O-only tool that meson then invokes + # with ar-style args ("csr ...") for the target's static libs. For ELF + # targets swap in the sibling llvm-ar, which is what those args and + # the target format actually require. + ar_path = env.get("AR", "") + if not is_darwin and path.basename(ar_path) == "llvm-libtool-darwin": + llvm_ar = path.join(path.dirname(ar_path), "llvm-ar") + if path.exists(llvm_ar): + env["AR"] = llvm_ar + + # apple_support's wrapped_clang substitutes __BAZEL_XCODE_DEVELOPER_DIR__ + # and __BAZEL_XCODE_SDKROOT__ in its arguments from these variables and + # hard-fails without DEVELOPER_DIR. Bazel injects them only into actions + # with Xcode execution requirements, which this PEP 517 action is not. + if is_darwin and _platform.system() == "Darwin": + if "DEVELOPER_DIR" not in env: + developer_dir = _xcode_developer_dir() + if developer_dir: + env["DEVELOPER_DIR"] = developer_dir + if sysroot and "SDKROOT" not in env: + env["SDKROOT"] = sysroot else: cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot, is_darwin=is_darwin) cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot, is_cxx=True, is_darwin=is_darwin) @@ -533,6 +615,7 @@ def _load_pyproject_data(worktree: str) -> Optional[Dict[str, object]]: # spelling: CMAKE_SYSTEM_NAME and the faked platform.system()/os.uname() # sysname both use it. _TITLECASE_OS = {"linux": "Linux", "darwin": "Darwin", "windows": "Windows"} +_SYS_PLATFORM = {"linux": "linux", "darwin": "darwin", "windows": "win32"} def _generate_cmake_toolchain_file( @@ -613,11 +696,21 @@ def _generate_meson_cross_file( different failure mode than the earlier "not runnable" one, but the same root cause of not telling qemu-user which glibc actually matches. """ - exe_wrapper = _write_generated_file( - path.join(tmpdir, "meson_exe_wrapper.py"), - _MESON_EXE_WRAPPER.format(qemu_ld_prefix=build_env.get("RULES_PY_TARGET_GCC_SYSROOT", "")), - executable=True, - ) + # The passthrough wrapper relies on the exec host transparently running + # target-arch ELFs (binfmt_misc + qemu-user) — a Linux-host capability. + # A darwin host cannot execute ELF at all, and an exe_wrapper that fails + # makes meson's sanity check fail outright; with needs_exe_wrapper=true + # and NO exe_wrapper, meson skips running its own checks instead, and + # projects calling cc.run() get meson's own explicit "can not run test + # applications" error — an honest host limitation, not a masked one. + exe_wrapper_line = "" + if _platform.system() == "Linux": + exe_wrapper = _write_generated_file( + path.join(tmpdir, "meson_exe_wrapper.py"), + _MESON_EXE_WRAPPER.format(qemu_ld_prefix=build_env.get("RULES_PY_TARGET_GCC_SYSROOT", "")), + executable=True, + ) + exe_wrapper_line = "exe_wrapper = ['{}']\n".format(exe_wrapper) return _write_generated_file( path.join(tmpdir, "cross_file.ini"), textwrap.dedent("""\ @@ -626,8 +719,7 @@ def _generate_meson_cross_file( cpp = '{cxx}' ar = '{ar}' strip = '{strip}' - exe_wrapper = ['{exe_wrapper}'] - + {exe_wrapper_line} [host_machine] system = '{system}' cpu_family = '{cpu_family}' @@ -639,7 +731,7 @@ def _generate_meson_cross_file( """).format( cc=build_env["CC"], cxx=build_env["CXX"], - exe_wrapper=exe_wrapper, + exe_wrapper_line=exe_wrapper_line, ar=build_env.get("AR", "ar"), strip=build_env.get("STRIP", "strip"), system=target_os, @@ -744,12 +836,27 @@ def _configure_cargo_cross_env(build_env: Dict[str, str], tmpdir: str, target_os _SITECUSTOMIZE_TEMPLATE = """\ import os import platform +import sys import collections +# ctypes parses os.uname().release at import time when the *host* is Darwin. +# Import it while uname and sys.platform are still real so the target's +# faked values never reach that parse. +try: + import ctypes +except ImportError: + pass + _machine = {machine!r} _sysname = {sysname!r} +_release = {release!r} + +# setup.py scripts routinely branch on sys.platform to decide which sources +# to even compile (psutil picks _psutil_osx.c vs _psutil_linux.c this way), +# and distutils keys its host-specific compiler customization on it too. +sys.platform = {sys_platform!r} -os.uname = lambda: os.uname_result((_sysname, "build", "", "", _machine)) +os.uname = lambda: os.uname_result((_sysname, "build", _release, "", _machine)) # CS_GLIBC_LIB_VERSION otherwise leaks the *host's* glibc version, which # feeds manylinux-tag determination in pip/packaging/subprocess. @@ -767,7 +874,7 @@ def _confstr(name): # back to the real host on this field, so build our own namedtuple instead # of the real type (mirrors crossenv's platform-patch.py). _PlatformUname = collections.namedtuple("uname_result", "system node release version machine processor") -_platform_uname = _PlatformUname(_sysname, "build", "", "", _machine, _machine) +_platform_uname = _PlatformUname(_sysname, "build", _release, "", _machine, _machine) platform.uname = lambda: _platform_uname platform.system = lambda: _sysname @@ -809,9 +916,20 @@ def _generate_cross_site(tmpdir: str, target_os: str, target_cpu: str) -> str: need (dual venvs, distutils.sysconfig, importlib.machinery interception). """ site_dir = path.join(tmpdir, ".cross_site") + + # ctypes' own import does int(os.uname().release.split(".")[0]) on Darwin, + # so the faked release must parse as a Darwin kernel version there. 20.0.0 + # is Darwin 20 = macOS 11.0, matching _derive_python_host_platform's + # macosx-11.0 baseline. Linux keeps "": nothing on that path parses it. + release = "20.0.0" if target_os == "darwin" else "" _write_generated_file( path.join(site_dir, "sitecustomize.py"), - _SITECUSTOMIZE_TEMPLATE.format(machine=target_cpu, sysname=_TITLECASE_OS.get(target_os, target_os)), + _SITECUSTOMIZE_TEMPLATE.format( + machine=target_cpu, + sysname=_TITLECASE_OS.get(target_os, target_os), + release=release, + sys_platform=_SYS_PLATFORM.get(target_os, target_os), + ), ) _write_generated_file(path.join(site_dir, "_manylinux.py"), _MANYLINUX_HOOK) return site_dir @@ -923,8 +1041,12 @@ def _validate_wheel_platform(wheel_filename: str) -> None: opts, _ = PARSER.parse_known_args() tmp_root = path.abspath(opts.outdir) + ".tmp" -# Sandboxed/remote actions get a fresh root each run, so we don't expect a stale tmp_root to exist. -makedirs(tmp_root, exist_ok=False) +# Sandboxed/remote actions get a fresh root each run, but a failed run under +# --spawn_strategy=standalone leaves tmp_root behind and would mask the real +# error with FileExistsError on retry — reclaim our own scratch dir instead. +if path.isdir(tmp_root): + shutil.rmtree(tmp_root) +makedirs(tmp_root) t = path.join(tmp_root, "worktree") diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index d27c857fe..d8d82e47d 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -276,19 +276,19 @@ def _pep517_native_whl(ctx): if cc_toolchain_raw == None: if cross: fail( - "Cross-compilation of sdist '{}' requires a CC toolchain " + - "registered for the target platform. No toolchain of type {} " + - "resolved against the current exec/target platform combination.\n" + - "Register a cross CC toolchain (e.g., toolchains_llvm with " + - "matching target_compatible_with) via register_toolchains.".format( + ("Cross-compilation of sdist '{}' requires a CC toolchain " + + "registered for the target platform. No toolchain of type {} " + + "resolved against the current exec/target platform combination.\n" + + "Register a cross CC toolchain (e.g., toolchains_llvm with " + + "matching target_compatible_with) via register_toolchains.").format( ctx.attr.src.label, _CC_TOOLCHAIN_TYPE, ), ) fail( - "sdist '{}' requires a CC toolchain but none resolved. " + - "Register a CC toolchain (e.g., rules_cc, toolchains_llvm) " + - "via register_toolchains.".format(ctx.attr.src.label), + ("sdist '{}' requires a CC toolchain but none resolved. " + + "Register a CC toolchain (e.g., rules_cc, toolchains_llvm) " + + "via register_toolchains.").format(ctx.attr.src.label), ) cc_toolchain = cc_toolchain_raw From 18b57f0bb104a929b710011d1a71c6d71e17542b Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 19:12:31 -0600 Subject: [PATCH 021/103] e2e for cross sdist build --- .../uv-deps-650/crossbuild/geohash_main.py | 5 ++++ .../crossbuild/require_cxx_driver.patch | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 e2e/cases/uv-deps-650/crossbuild/geohash_main.py create mode 100644 e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch diff --git a/e2e/cases/uv-deps-650/crossbuild/geohash_main.py b/e2e/cases/uv-deps-650/crossbuild/geohash_main.py new file mode 100644 index 000000000..4e3f98f27 --- /dev/null +++ b/e2e/cases/uv-deps-650/crossbuild/geohash_main.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 + +import geohash + +print(geohash.encode(37.7749, -122.4194)) diff --git a/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch b/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch new file mode 100644 index 000000000..87e257707 --- /dev/null +++ b/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch @@ -0,0 +1,25 @@ +diff --git a/src/geohash.cpp b/src/geohash.cpp +--- a/src/geohash.cpp ++++ b/src/geohash.cpp +@@ -0,0 +1,21 @@ ++#include ++ ++class RulesPyBase { ++public: ++ virtual ~RulesPyBase() {} ++}; ++ ++class RulesPyValue : public RulesPyBase { ++public: ++ std::string value; ++ ++ RulesPyValue(const char *value) : value(value) {} ++}; ++ ++extern "C" const char *rules_py_cxx_runtime_probe(void) { ++ static RulesPyValue value("rules_py_cxx_runtime_probe"); ++ RulesPyBase *base = &value; ++ RulesPyValue *derived = dynamic_cast(base); ++ return derived ? derived->value.c_str() : "dynamic_cast failed"; ++} ++ From 90272dc3e1875fec52dd09dcd4821aa5f24bba78 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 21:36:27 -0600 Subject: [PATCH 022/103] check so arch in e2e --- .../uv-deps-650/crossbuild/check_so_arch.sh | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100755 e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh diff --git a/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh b/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh new file mode 100755 index 000000000..6b1569373 --- /dev/null +++ b/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# Check that _geohash.so inside a py_image_layer tar is ELF for the expected arch. +# +# Uses only POSIX utilities (tar, od, find) — no Python dependency. +# +# Usage: check_so_arch.sh +# expected_machine_le_hex: ELF e_machine as little-endian hex bytes +# x86_64 (EM_X86_64 = 62 = 0x3e) → "3e00" +# aarch64 (EM_AARCH64 = 183 = 0xb7) → "b700" +set -euo pipefail + +tar_file="${1:?usage: check_so_arch.sh }" +expected="${2:?expected ELF machine as little-endian hex}" + +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT +tar xf "$tar_file" -C "$tmp" 2>/dev/null || true + +so="$(find "$tmp" -name '_geohash*.so' -type f | head -1)" +if [ -z "$so" ]; then + echo "FAIL: no _geohash*.so found in $tar_file" + exit 1 +fi + +magic="$(od -A n -t x1 -N 4 "$so" | tr -d ' ')" +if [ "$magic" != "7f454c46" ]; then + echo "FAIL: $(basename "$so") is not ELF (magic=0x${magic})" + exit 1 +fi + +machine="$(od -A n -t x1 -j 18 -N 2 "$so" | tr -d ' ')" +if [ "$machine" != "$expected" ]; then + echo "FAIL: $(basename "$so") ELF machine=0x${machine} expected=0x${expected}" + exit 1 +fi + +echo "PASS: $(basename "$so") is ELF machine=0x${machine}" From d98b72095a03a44322d1a6677f1bcca668c2caa0 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 22 Jul 2026 22:18:09 -0600 Subject: [PATCH 023/103] check EXT_SUFFIX and SOABI --- .../uv-deps-650/crossbuild/check_so_suffix.sh | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh diff --git a/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh b/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh new file mode 100755 index 000000000..d3df61ed3 --- /dev/null +++ b/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Check that _geohash.so inside a py_image_layer tar has the correct platform +# suffix in its filename — i.e. EXT_SUFFIX and SOABI reflect the target +# platform, not the exec host. +# +# Usage: check_so_suffix.sh +set -euo pipefail + +tar_file="${1:?usage: check_so_suffix.sh }" +expected="${2:?expected suffix substring, e.g. cpython-312-x86_64-linux-gnu}" + +so_name=$(tar tf "$tar_file" | grep '_geohash.*\.so$' | head -1) +if [ -z "$so_name" ]; then + echo "FAIL: no _geohash*.so in tar $tar_file" + exit 1 +fi + +echo ".so: $so_name" + +if ! echo "$so_name" | grep -q "$expected"; then + echo "FAIL: expected suffix '$expected' not found in filename" + exit 1 +fi + +echo "PASS: $so_name contains '$expected'" From 6d521f8c038ce519fa5933cf24e4552d7efd7e5f Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 6 Aug 2026 11:57:46 -0600 Subject: [PATCH 024/103] crossbuild test cases --- .../uv-deps-650/crossbuild/check_so_arch.sh | 37 ------------------- .../uv-deps-650/crossbuild/geohash_main.py | 5 --- .../crossbuild/require_cxx_driver.patch | 25 ------------- e2e/crossbuild/awkward_cpp/BUILD.bazel | 2 +- e2e/crossbuild/contourpy/BUILD.bazel | 2 +- 5 files changed, 2 insertions(+), 69 deletions(-) delete mode 100755 e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh delete mode 100644 e2e/cases/uv-deps-650/crossbuild/geohash_main.py delete mode 100644 e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch diff --git a/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh b/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh deleted file mode 100755 index 6b1569373..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/check_so_arch.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash -# Check that _geohash.so inside a py_image_layer tar is ELF for the expected arch. -# -# Uses only POSIX utilities (tar, od, find) — no Python dependency. -# -# Usage: check_so_arch.sh -# expected_machine_le_hex: ELF e_machine as little-endian hex bytes -# x86_64 (EM_X86_64 = 62 = 0x3e) → "3e00" -# aarch64 (EM_AARCH64 = 183 = 0xb7) → "b700" -set -euo pipefail - -tar_file="${1:?usage: check_so_arch.sh }" -expected="${2:?expected ELF machine as little-endian hex}" - -tmp="$(mktemp -d)" -trap 'rm -rf "$tmp"' EXIT -tar xf "$tar_file" -C "$tmp" 2>/dev/null || true - -so="$(find "$tmp" -name '_geohash*.so' -type f | head -1)" -if [ -z "$so" ]; then - echo "FAIL: no _geohash*.so found in $tar_file" - exit 1 -fi - -magic="$(od -A n -t x1 -N 4 "$so" | tr -d ' ')" -if [ "$magic" != "7f454c46" ]; then - echo "FAIL: $(basename "$so") is not ELF (magic=0x${magic})" - exit 1 -fi - -machine="$(od -A n -t x1 -j 18 -N 2 "$so" | tr -d ' ')" -if [ "$machine" != "$expected" ]; then - echo "FAIL: $(basename "$so") ELF machine=0x${machine} expected=0x${expected}" - exit 1 -fi - -echo "PASS: $(basename "$so") is ELF machine=0x${machine}" diff --git a/e2e/cases/uv-deps-650/crossbuild/geohash_main.py b/e2e/cases/uv-deps-650/crossbuild/geohash_main.py deleted file mode 100644 index 4e3f98f27..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/geohash_main.py +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env python3 - -import geohash - -print(geohash.encode(37.7749, -122.4194)) diff --git a/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch b/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch deleted file mode 100644 index 87e257707..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/require_cxx_driver.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/src/geohash.cpp b/src/geohash.cpp ---- a/src/geohash.cpp -+++ b/src/geohash.cpp -@@ -0,0 +1,21 @@ -+#include -+ -+class RulesPyBase { -+public: -+ virtual ~RulesPyBase() {} -+}; -+ -+class RulesPyValue : public RulesPyBase { -+public: -+ std::string value; -+ -+ RulesPyValue(const char *value) : value(value) {} -+}; -+ -+extern "C" const char *rules_py_cxx_runtime_probe(void) { -+ static RulesPyValue value("rules_py_cxx_runtime_probe"); -+ RulesPyBase *base = &value; -+ RulesPyValue *derived = dynamic_cast(base); -+ return derived ? derived->value.c_str() : "dynamic_cast failed"; -+} -+ diff --git a/e2e/crossbuild/awkward_cpp/BUILD.bazel b/e2e/crossbuild/awkward_cpp/BUILD.bazel index 14ddd346e..90ee5971d 100644 --- a/e2e/crossbuild/awkward_cpp/BUILD.bazel +++ b/e2e/crossbuild/awkward_cpp/BUILD.bazel @@ -13,6 +13,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "awkward_cpp", check_so_suffix = False, - deps = ["@pypi_crossbuild_awkward_cpp//awkward_cpp"], so_pattern = "whl_install__crossbuild_awkward_cpp.*awkward_cpp/lib/libawkward-cpu-kernels\\.so$$", + deps = ["@pypi_crossbuild_awkward_cpp//awkward_cpp"], ) diff --git a/e2e/crossbuild/contourpy/BUILD.bazel b/e2e/crossbuild/contourpy/BUILD.bazel index 489789a36..771f93d80 100644 --- a/e2e/crossbuild/contourpy/BUILD.bazel +++ b/e2e/crossbuild/contourpy/BUILD.bazel @@ -9,6 +9,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "contourpy", - deps = ["@pypi_crossbuild_contourpy//contourpy"], so_pattern = "whl_install__crossbuild_contourpy.*_contourpy.*\\.so$$", + deps = ["@pypi_crossbuild_contourpy//contourpy"], ) From 60a5c5ec5e1dc0a16a8cc10f9bd2217d8673332c Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 7 Aug 2026 11:37:12 -0600 Subject: [PATCH 025/103] typing e2e --- .../uv-deps-650/crossbuild/check_so_suffix.sh | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100755 e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh diff --git a/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh b/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh deleted file mode 100755 index d3df61ed3..000000000 --- a/e2e/cases/uv-deps-650/crossbuild/check_so_suffix.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -# Check that _geohash.so inside a py_image_layer tar has the correct platform -# suffix in its filename — i.e. EXT_SUFFIX and SOABI reflect the target -# platform, not the exec host. -# -# Usage: check_so_suffix.sh -set -euo pipefail - -tar_file="${1:?usage: check_so_suffix.sh }" -expected="${2:?expected suffix substring, e.g. cpython-312-x86_64-linux-gnu}" - -so_name=$(tar tf "$tar_file" | grep '_geohash.*\.so$' | head -1) -if [ -z "$so_name" ]; then - echo "FAIL: no _geohash*.so in tar $tar_file" - exit 1 -fi - -echo ".so: $so_name" - -if ! echo "$so_name" | grep -q "$expected"; then - echo "FAIL: expected suffix '$expected' not found in filename" - exit 1 -fi - -echo "PASS: $so_name contains '$expected'" From 6ea0cb45d8230bf866d6db963bf7cdcf9cf0d0a2 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Mon, 10 Aug 2026 11:55:10 -0600 Subject: [PATCH 026/103] fixing ci --- e2e/cases/uv-deps-650/test.sh | 76 ------------------------ e2e/crossbuild/bcrypt/BUILD.bazel | 2 +- e2e/crossbuild/jpype1/BUILD.bazel | 2 +- e2e/crossbuild/msgpack/BUILD.bazel | 2 +- e2e/crossbuild/numpy/BUILD.bazel | 2 +- e2e/crossbuild/psutil/BUILD.bazel | 2 +- e2e/crossbuild/pydantic_core/BUILD.bazel | 2 +- e2e/crossbuild/rpds_py/BUILD.bazel | 2 +- e2e/crossbuild/tiktoken/BUILD.bazel | 2 +- 9 files changed, 8 insertions(+), 84 deletions(-) delete mode 100755 e2e/cases/uv-deps-650/test.sh diff --git a/e2e/cases/uv-deps-650/test.sh b/e2e/cases/uv-deps-650/test.sh deleted file mode 100755 index 9ba171612..000000000 --- a/e2e/cases/uv-deps-650/test.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env bash -# -# Runtime smoke for the cross-built geohash images. -# -# The ELF checks in crossbuild/BUILD.bazel prove the cross-compiled extension -# has the right architecture bytes; this proves it imports and executes on the -# target architecture. dlopen resolves the symbols an ELF shared link is -# allowed to leave undefined, so a wheel that "linked fine" without its C++ -# runtime fails here and nowhere else. Needs a real `bazel run` (oci_load) -# plus a container daemon, so it cannot be an sh_test under //.... -set -uo pipefail - -cd "$(dirname "$0")/.." || exit 1 - -BAZEL="${BAZEL:-bazel}" -PKG="//uv-deps-650/crossbuild" - -if ! command -v docker >/dev/null 2>&1 || ! docker info >/dev/null 2>&1; then - echo "SKIP: no usable container daemon; cross-arch runtime smoke not run" - exit 0 -fi - -status=0 - -smoke() { - local leg="$1" expected_machine="$2" - local tag="rules-py/geohash-crossbuild:${leg}" - local platform="linux/${leg}" - - echo "== ${leg}: build and load image ==" - if ! "$BAZEL" run "${PKG}:geohash_${leg}_image_load"; then - echo "FAIL: ${leg}: building/loading the image failed" >&2 - status=1 - return 0 - fi - - # Infra probe, separate from the product check: /bin/true comes from the - # ubuntu base layer, so if even that cannot exec, this host lacks binfmt - # emulation for ${platform} — an environment gap, not a product bug. - # GitHub's ubuntu runners ship no handlers; install them once. - if ! docker run --rm --platform "${platform}" --entrypoint /bin/true "${tag}" >/dev/null 2>&1; then - if [ "$(uname -s)" = "Linux" ]; then - docker run --privileged --rm tonistiigi/binfmt --install "${leg}" >/dev/null 2>&1 || true - fi - if ! docker run --rm --platform "${platform}" --entrypoint /bin/true "${tag}" >/dev/null 2>&1; then - echo "SKIP: ${leg}: no ${platform} emulation available on this host" - return 0 - fi - fi - - echo "== ${leg}: run the extension on ${platform} ==" - local output - if ! output="$(docker run --rm --platform "${platform}" "${tag}" 2>&1)"; then - echo "${output}" >&2 - echo "FAIL: ${leg}: geohash smoke exited nonzero" >&2 - status=1 - return 0 - fi - echo "${output}" - if ! grep -q "GEOHASH_SMOKE_OK" <<<"${output}"; then - echo "FAIL: ${leg}: smoke ran but did not report GEOHASH_SMOKE_OK" >&2 - status=1 - return 0 - fi - if ! grep -q "machine=${expected_machine}" <<<"${output}"; then - echo "FAIL: ${leg}: expected machine=${expected_machine} in output" >&2 - status=1 - return 0 - fi - echo "PASS: ${leg} extension executed on ${platform}" -} - -smoke arm64 aarch64 -smoke amd64 x86_64 - -exit "${status}" diff --git a/e2e/crossbuild/bcrypt/BUILD.bazel b/e2e/crossbuild/bcrypt/BUILD.bazel index 2df8ac7c3..4001b3ba3 100644 --- a/e2e/crossbuild/bcrypt/BUILD.bazel +++ b/e2e/crossbuild/bcrypt/BUILD.bazel @@ -11,6 +11,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "bcrypt", check_so_suffix = False, - deps = ["@pypi_crossbuild_bcrypt//bcrypt"], so_pattern = "whl_install__crossbuild_bcrypt.*_bcrypt.*\\.so$$", + deps = ["@pypi_crossbuild_bcrypt//bcrypt"], ) diff --git a/e2e/crossbuild/jpype1/BUILD.bazel b/e2e/crossbuild/jpype1/BUILD.bazel index c29d5c161..29199436d 100644 --- a/e2e/crossbuild/jpype1/BUILD.bazel +++ b/e2e/crossbuild/jpype1/BUILD.bazel @@ -12,6 +12,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "jpype1", check_so_suffix = False, - deps = ["@pypi_crossbuild_jpype1//jpype1"], so_pattern = "whl_install__crossbuild_jpype1.*_jpype.*\\.so$$", + deps = ["@pypi_crossbuild_jpype1//jpype1"], ) diff --git a/e2e/crossbuild/msgpack/BUILD.bazel b/e2e/crossbuild/msgpack/BUILD.bazel index 7a4b78219..d9d9b8e81 100644 --- a/e2e/crossbuild/msgpack/BUILD.bazel +++ b/e2e/crossbuild/msgpack/BUILD.bazel @@ -11,6 +11,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "msgpack", check_so_suffix = False, - deps = ["@pypi_crossbuild_msgpack//msgpack"], so_pattern = "whl_install__crossbuild_msgpack.*_cmsgpack.*\\.so$$", + deps = ["@pypi_crossbuild_msgpack//msgpack"], ) diff --git a/e2e/crossbuild/numpy/BUILD.bazel b/e2e/crossbuild/numpy/BUILD.bazel index f19890073..7d6b37b57 100644 --- a/e2e/crossbuild/numpy/BUILD.bazel +++ b/e2e/crossbuild/numpy/BUILD.bazel @@ -11,6 +11,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "numpy", - deps = ["@pypi_crossbuild_numpy//numpy"], so_pattern = "whl_install__crossbuild_numpy.*_multiarray_umath.*\\.so$$", + deps = ["@pypi_crossbuild_numpy//numpy"], ) diff --git a/e2e/crossbuild/psutil/BUILD.bazel b/e2e/crossbuild/psutil/BUILD.bazel index d737c7933..c409dd585 100644 --- a/e2e/crossbuild/psutil/BUILD.bazel +++ b/e2e/crossbuild/psutil/BUILD.bazel @@ -9,6 +9,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "psutil", check_so_suffix = False, - deps = ["@pypi_crossbuild_psutil//psutil"], so_pattern = "whl_install__crossbuild_psutil.*_psutil_linux.*\\.so$$", + deps = ["@pypi_crossbuild_psutil//psutil"], ) diff --git a/e2e/crossbuild/pydantic_core/BUILD.bazel b/e2e/crossbuild/pydantic_core/BUILD.bazel index ae8dfd4f5..85c0b6c1a 100644 --- a/e2e/crossbuild/pydantic_core/BUILD.bazel +++ b/e2e/crossbuild/pydantic_core/BUILD.bazel @@ -9,6 +9,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "pydantic_core", - deps = ["@pypi_crossbuild_pydantic_core//pydantic_core"], so_pattern = "whl_install__crossbuild_pydantic_core.*_pydantic_core.*\\.so$$", + deps = ["@pypi_crossbuild_pydantic_core//pydantic_core"], ) diff --git a/e2e/crossbuild/rpds_py/BUILD.bazel b/e2e/crossbuild/rpds_py/BUILD.bazel index 7ece315d2..716753a84 100644 --- a/e2e/crossbuild/rpds_py/BUILD.bazel +++ b/e2e/crossbuild/rpds_py/BUILD.bazel @@ -11,6 +11,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "rpds_py", - deps = ["@pypi_crossbuild_rpds_py//rpds_py"], so_pattern = "whl_install__crossbuild_rpds_py.*rpds/rpds.*\\.so$$", + deps = ["@pypi_crossbuild_rpds_py//rpds_py"], ) diff --git a/e2e/crossbuild/tiktoken/BUILD.bazel b/e2e/crossbuild/tiktoken/BUILD.bazel index 29c102b22..7d65b5916 100644 --- a/e2e/crossbuild/tiktoken/BUILD.bazel +++ b/e2e/crossbuild/tiktoken/BUILD.bazel @@ -11,6 +11,6 @@ load("//tools:cross_case.bzl", "pep517_cross_case") pep517_cross_case( name = "tiktoken", check_so_suffix = False, - deps = ["@pypi_crossbuild_tiktoken//tiktoken"], so_pattern = "whl_install__crossbuild_tiktoken.*_tiktoken.*\\.so$$", + deps = ["@pypi_crossbuild_tiktoken//tiktoken"], ) From 9de528f9796c30a278bcf8c8b54141be7be7f3b0 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Mon, 10 Aug 2026 22:39:28 -0600 Subject: [PATCH 027/103] enable macos --- uv/private/pep517_whl/build_helper.py | 118 ++++++++++++++++++++++++-- uv/private/pep517_whl/rule.bzl | 6 +- 2 files changed, 116 insertions(+), 8 deletions(-) diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index fbac63009..60df11481 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -214,6 +214,46 @@ def _xcode_developer_dir() -> Optional[str]: return None +_MACOSX_DEPLOYMENT_TARGET_RE = re.compile( + r"[\"']MACOSX_DEPLOYMENT_TARGET[\"']\s*:\s*[\"']?([0-9][0-9.]*)" +) + + +def _macosx_deployment_target(sysconfigdata_path: str) -> Optional[str]: + """The target interpreter's deployment target, from its sysconfigdata. + + The deployment version in wheel/platform tags is a property of the target + interpreter's build, not a constant — regex the build_time_vars literal + rather than importing it, since the file belongs to a foreign-platform + interpreter this process must not execute code from. + """ + try: + with open(sysconfigdata_path, encoding="utf-8") as f: + match = _MACOSX_DEPLOYMENT_TARGET_RE.search(f.read()) + except OSError: + return None + return match.group(1) if match else None + + +def _darwin_kernel_release(macos_deployment_target: Optional[str]) -> str: + """Fake os.uname() release consistent with the macOS deployment target. + + Darwin kernel majors track macOS marketing versions as 11→20 … 15→24; + from the year-based scheme (26 = Darwin 25) it's major−1. Only consumers + parsing a plausible kernel version matter here (ctypes' import does), + so unknown/missing values fall back to the macOS 11 baseline. + """ + try: + major = int((macos_deployment_target or "").split(".")[0]) + except ValueError: + major = 0 + if 11 <= major <= 15: + return "{}.0.0".format(major + 9) + if major >= 26: + return "{}.0.0".format(major - 1) + return "20.0.0" + + def _absolutize_path(value: str) -> str: """Resolve a relative path to absolute, leaving absolute/empty values untouched. @@ -297,6 +337,36 @@ def _make_compiler_wrapper( ) +_SYSROOT_FLAG_PREFIXES = ("--sysroot", "-isysroot") + + +def _absolutize_sysroot_flags(flags: str) -> str: + """Absolutize sysroot values inside a flag string (CFLAGS, LDSHAREDFLAGS). + + Must run while the process is still in the execroot; the backend splices + these env strings into commands it runs from inside the unpacked sdist, + where an execroot-relative sysroot no longer resolves. A later relative + "--sysroot" would also silently override the wrapper's absolute one — + the clang driver honors the last occurrence. + """ + parts = shlex.split(flags) + result = [] + i = 0 + while i < len(parts): + p = parts[i] + flag, sep, value = p.partition("=") + if sep and flag in _SYSROOT_FLAG_PREFIXES: + p = "{}={}".format(flag, _absolutize_path(value)) + elif p in _SYSROOT_FLAG_PREFIXES and i + 1 < len(parts): + result.append(p) + result.append(_absolutize_path(parts[i + 1])) + i += 2 + continue + result.append(p) + i += 1 + return shlex.join(result) + + def _get_wrapper_flags(cflags: str) -> list[str]: """Extract identity flags (-target, --sysroot, -isysroot, ...) from CFLAGS. @@ -304,6 +374,12 @@ def _get_wrapper_flags(cflags: str) -> list[str]: constructing its own compile commands. The cross wrapper re-injects them on every invocation to guarantee the real compiler targets the correct platform. + + Sysroot values are absolutized while this still runs from the execroot: + toolchains hand out execroot-relative paths (e.g. the llvm module's + external/…/macos_sdk/sysroot), which stop resolving once the backend + chdirs into the unpacked sdist — the compiler then silently falls back + to default header search paths and the linker finds no libraries at all. """ parts = shlex.split(cflags) result = [] @@ -311,9 +387,16 @@ def _get_wrapper_flags(cflags: str) -> list[str]: while i < len(parts): p = parts[i] if any(p == prefix or p.startswith(prefix + "=") for prefix in _IDENTITY_FLAG_PREFIXES): + if "=" in p: + flag, _, value = p.partition("=") + if flag in _SYSROOT_FLAG_PREFIXES: + p = "{}={}".format(flag, _absolutize_path(value)) result.append(p) if "=" not in p and i + 1 < len(parts) and not parts[i + 1].startswith("-"): - result.append(parts[i + 1]) + value = parts[i + 1] + if p in _SYSROOT_FLAG_PREFIXES: + value = _absolutize_path(value) + result.append(value) i += 1 i += 1 return result @@ -479,6 +562,10 @@ def _compiler_env( is_darwin = target_os == "darwin" if cross else _platform.system() == "Darwin" if cross: + for key in ("CFLAGS", "CXXFLAGS", "CPPFLAGS", "LDSHAREDFLAGS"): + if env.get(key): + env[key] = _absolutize_sysroot_flags(env[key]) + wrapper_flags = _get_wrapper_flags(env.get("CFLAGS", "")) lld_path = _find_lld(cc_path) @@ -538,6 +625,7 @@ def _compiler_env( env["LDSHARED"] = cc + (" " + ldshared_flags if ldshared_flags else "") env["LDCXXSHARED"] = cxx + (" " + ldshared_flags if ldshared_flags else "") + deployment_target = None target_sysconfig = env.get("RULES_PY_TARGET_SYSCONFIGDATA") if target_sysconfig and path.exists(target_sysconfig): sysconfig_dir = path.join(tmpdir, ".target_sysconfig") @@ -547,8 +635,19 @@ def _compiler_env( env["_PYTHON_SYSCONFIGDATA_NAME"] = module_name env["PYTHONPATH"] = sysconfig_dir + pathsep + env.get("PYTHONPATH", "") + # The analysis-time _PYTHON_HOST_PLATFORM (rule.bzl) can only + # guess macosx-11.0; the target interpreter's sysconfig knows the + # real deployment version its wheel tags must carry. distutils' + # get_platform() also honors $MACOSX_DEPLOYMENT_TARGET directly. + if target_os == "darwin": + deployment_target = _macosx_deployment_target(target_sysconfig) + if deployment_target: + env.setdefault("MACOSX_DEPLOYMENT_TARGET", deployment_target) + cpu = "arm64" if target_cpu == "aarch64" else target_cpu + env["_PYTHON_HOST_PLATFORM"] = "macosx-{}-{}".format(deployment_target, cpu) + if target_os and target_cpu: - site_dir = _generate_cross_site(tmpdir, target_os, target_cpu) + site_dir = _generate_cross_site(tmpdir, target_os, target_cpu, deployment_target) env["PYTHONPATH"] = site_dir + pathsep + env.get("PYTHONPATH", "") # MPI builds (e.g. mpi4py) consult $MPICC before searching PATH, so a @@ -901,7 +1000,12 @@ def manylinux_compatible(tag_major, tag_minor, tag_arch): """ -def _generate_cross_site(tmpdir: str, target_os: str, target_cpu: str) -> str: +def _generate_cross_site( + tmpdir: str, + target_os: str, + target_cpu: str, + macos_deployment_target: Optional[str] = None, +) -> str: """sitecustomize + _manylinux hook faking the target's runtime identity. sysconfig.get_platform()/_get_sysconfigdata_name() are already faked via @@ -918,10 +1022,10 @@ def _generate_cross_site(tmpdir: str, target_os: str, target_cpu: str) -> str: site_dir = path.join(tmpdir, ".cross_site") # ctypes' own import does int(os.uname().release.split(".")[0]) on Darwin, - # so the faked release must parse as a Darwin kernel version there. 20.0.0 - # is Darwin 20 = macOS 11.0, matching _derive_python_host_platform's - # macosx-11.0 baseline. Linux keeps "": nothing on that path parses it. - release = "20.0.0" if target_os == "darwin" else "" + # so the faked release must parse as a Darwin kernel version there — + # derived from the target's deployment target so both stay consistent. + # Linux keeps "": nothing on that path parses it. + release = _darwin_kernel_release(macos_deployment_target) if target_os == "darwin" else "" _write_generated_file( path.join(site_dir, "sitecustomize.py"), _SITECUSTOMIZE_TEMPLATE.format( diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/rule.bzl index d8d82e47d..896d44a50 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/rule.bzl @@ -187,7 +187,11 @@ def _derive_python_host_platform(target_os, target_cpu): """Derive _PYTHON_HOST_PLATFORM from target platform constraints. Linux: libc does not affect the platform string — always linux-{cpu}. - macOS: uses arm64 (not aarch64) and requires a version component. + macOS: uses arm64 (not aarch64) and requires a version component. The + version here is only an analysis-time fallback: the deployment target is + a property of the target interpreter, which analysis can't read, so + build_helper re-derives it at build time from the target sysconfigdata's + MACOSX_DEPLOYMENT_TARGET whenever that file is available. """ if target_os == "linux": return "linux-" + _PYTHON_CPU_MAP.get(target_cpu, target_cpu) From d96690a1bf0eabc57306d88162c16dd5180fb00d Mon Sep 17 00:00:00 2001 From: xangcastle Date: Mon, 10 Aug 2026 23:32:18 -0600 Subject: [PATCH 028/103] test(e2e): defer the e2e/cases cross matrix to a follow-up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pycross-setuptools' native_wheels matrix duplicates e2e/crossbuild/zstandard (same package, and crossbuild goes further: QEMU execution plus a byte-for-byte diff against the official wheel). Its marginal value — the cross path under e2e/cases' own CC toolchain and shared-hub setup — lands as its own small PR after this one. Recoverable from commit 2273078a. --- e2e/crossbuild/pycross-setuptools/BUILD.bazel | 74 +-------------- .../pycross-setuptools/setup.MODULE.bazel | 6 +- e2e/crossbuild/tools/check_wheel_native.py | 92 ------------------- 3 files changed, 3 insertions(+), 169 deletions(-) delete mode 100644 e2e/crossbuild/tools/check_wheel_native.py diff --git a/e2e/crossbuild/pycross-setuptools/BUILD.bazel b/e2e/crossbuild/pycross-setuptools/BUILD.bazel index db8890bb6..e2c54e19c 100644 --- a/e2e/crossbuild/pycross-setuptools/BUILD.bazel +++ b/e2e/crossbuild/pycross-setuptools/BUILD.bazel @@ -1,11 +1,9 @@ # Ported from rules_pycross tests/e2e/build_setuptools. # -# Three setuptools C-extension sdists built by `pep517_native_whl`, imported at -# runtime for the host, then rebuilt through rules_pycross's `collect_wheels` -# matrix for two non-host Linux platforms — the cross path this branch adds. +# Three setuptools C-extension sdists built by `pep517_native_whl` and +# imported at runtime for the host. load("@aspect_rules_py//py:defs.bzl", "py_test") -load("//tools:collect_wheels.bzl", "collect_wheels") exports_files(["require_extension.patch"]) @@ -13,36 +11,6 @@ _PY = "3.12" _DEP_GROUP = "pycross_setuptools" -# The libc/version flags are what the wheel resolver keys platform-specific -# wheel selection off; a bare constraint_values platform would leave build -# dependencies unresolvable. Same shape as the e2e/crossbuild workspace. The -# dep_group flag rides along because the wheel targets under `collect_wheels` -# are reached through a platform transition, not through a py_venv. -_PLATFORM_FLAGS = [ - "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", - "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", - "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, - "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, -] - -platform( - name = "amd64_linux", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:x86_64", - ], - flags = _PLATFORM_FLAGS, -) - -platform( - name = "arm64_linux", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:aarch64", - ], - flags = _PLATFORM_FLAGS, -) - py_test( name = "test_setproctitle", srcs = ["test_setproctitle.py"], @@ -69,41 +37,3 @@ py_test( python_version = _PY, deps = ["@pypi_pycross_setuptools//pyyaml"], ) - -# rules_pycross's cross matrix, restricted to zstandard. -# -# pyyaml is excluded because `PYYAML_FORCE_LIBYAML=0` makes it anyarch — there -# is nothing platform-specific left to assert. -# -# setproctitle is excluded because it cannot cross-build here at all: its -# setup.py picks sources and macros off `sys.platform`, which reports the -# *exec* interpreter's platform. Cross mode overrides `_PYTHON_HOST_PLATFORM` -# and `_PYTHON_SYSCONFIGDATA_NAME`, neither of which moves `sys.platform`, so a -# darwin exec host compiles `src/darwin_set_process_name.c` with -# `-D__darwin__=1` against a linux target and fails on -# `CoreFoundation/CoreFoundation.h`. rules_pycross handles this with a real -# crossenv (`pycross/private/build/tools/crossenv/`) that patches `sys.platform` -# in the build interpreter. `require_extension.patch` keeps that failure loud -# rather than letting setproctitle fall back to an anyarch wheel. -collect_wheels( - name = "native_wheels", - expected_tags = [ - "linux_x86_64", - "linux_aarch64", - ], - platforms = [ - ":amd64_linux", - ":arm64_linux", - ], - wheels = ["@sdist_build__pycross_setuptools__zstandard__0_22_0//:whl"], -) - -py_test( - name = "native_wheels_elf_test", - srcs = ["//tools:check_wheel_native.py"], - args = ["$(rootpath :native_wheels)"], - data = [":native_wheels"], - dep_group = _DEP_GROUP, - main = "//tools:check_wheel_native.py", - python_version = _PY, -) diff --git a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel index 2270925ae..6a4ba7ee6 100644 --- a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel @@ -67,8 +67,4 @@ uv.override_package( lock = "//pycross-setuptools:uv.lock", resource_set = "mem_4g", ) -use_repo( - uv, - "pypi_pycross_setuptools", - "sdist_build__pycross_setuptools__zstandard__0_22_0", -) +use_repo(uv, "pypi_pycross_setuptools") diff --git a/e2e/crossbuild/tools/check_wheel_native.py b/e2e/crossbuild/tools/check_wheel_native.py deleted file mode 100644 index 0bc1211d5..000000000 --- a/e2e/crossbuild/tools/check_wheel_native.py +++ /dev/null @@ -1,92 +0,0 @@ -"""Assert cross-built wheels really contain extensions for the tagged platform. - -Usage: check_wheel_native.py - -For every Linux-tagged wheel in the directory, every extension module inside it -must be an ELF object whose `e_machine` matches the wheel's architecture tag, -and whose filename ABI tag names the same architecture. A cross build that -fell back to the exec platform's compiler or sysconfig produces a correctly -named wheel holding host-architecture objects — which the wheel-tag check -alone cannot see. - -rules_pycross's cross coverage stops at "the wheel builds for both platforms" -(tests/e2e/shared/collect_wheels.bzl feeding a build target); this is the -assertion that makes that matrix meaningful. -""" - -import os -import struct -import sys -import zipfile - -# ELF e_machine values, from elf.h. -_EM_X86_64 = 0x3E -_EM_AARCH64 = 0xB7 - -_ARCH_TAGS = { - "x86_64": _EM_X86_64, - "aarch64": _EM_AARCH64, -} - - -def _wheel_arch(name: str) -> str: - for arch in _ARCH_TAGS: - if arch in name: - return arch - raise AssertionError("cannot determine architecture from wheel name {}".format(name)) - - -def _elf_machine(data: bytes) -> int: - assert data[:4] == b"\x7fELF", "not an ELF object" - little_endian = data[5] == 1 - return struct.unpack_from("H", data, 18)[0] - - -def _check(wheel_path: str) -> int: - name = os.path.basename(wheel_path) - arch = _wheel_arch(name) - expected_machine = _ARCH_TAGS[arch] - checked = 0 - - with zipfile.ZipFile(wheel_path) as zf: - for entry in zf.namelist(): - if not entry.endswith(".so"): - continue - machine = _elf_machine(zf.read(entry)) - if machine != expected_machine: - raise AssertionError( - "{}: {} is ELF machine {:#x}, expected {:#x} for '{}'".format( - name, entry, machine, expected_machine, arch - ) - ) - base = os.path.basename(entry) - if "." in base[:-3] and arch not in base: - raise AssertionError( - "{}: extension filename '{}' does not name architecture '{}'".format( - name, base, arch - ) - ) - print(" {} -> {} (ELF {:#x})".format(name, base, machine)) - checked += 1 - - return checked - - -def main() -> None: - wheel_dir = sys.argv[1] - wheels = sorted( - f - for f in os.listdir(wheel_dir) - if f.endswith(".whl") and "linux" in f and not f.endswith("-none-any.whl") - ) - assert wheels, "no Linux-tagged native wheels collected under {}".format(wheel_dir) - - total = 0 - for wheel in wheels: - total += _check(os.path.join(wheel_dir, wheel)) - - assert total, "collected native wheels contain no extension modules: {}".format(wheels) - - -if __name__ == "__main__": - main() From a4741c89401efa9027a31243a7e731fe21e3892b Mon Sep 17 00:00:00 2001 From: xangcastle Date: Tue, 11 Aug 2026 02:15:37 -0600 Subject: [PATCH 029/103] refactor(e2e): normalize geohash onto the per-case hub layout geohash was the workspace's first case and kept its pyproject/uv.lock at the root under a bare pypi_crossbuild hub while every later case adopted the one-dir-one-hub pattern. Move the pair into geohash/, rename the hub to pypi_crossbuild_geohash, and align the project name and dep_group with the crossbuild_ convention. --- e2e/crossbuild/MODULE.bazel | 12 ++++++------ e2e/crossbuild/geohash/BUILD.bazel | 4 ++-- e2e/crossbuild/{ => geohash}/pyproject.toml | 2 +- e2e/crossbuild/{ => geohash}/uv.lock | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) rename e2e/crossbuild/{ => geohash}/pyproject.toml (85%) rename e2e/crossbuild/{ => geohash}/uv.lock (99%) diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 380726581..294bdfd8b 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -206,25 +206,25 @@ uv_bin.toolchain(version = "0.11.6") use_repo(uv_bin, "uv") uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") -uv.declare_hub(hub_name = "pypi_crossbuild") +uv.declare_hub(hub_name = "pypi_crossbuild_geohash") uv.project( default_build_dependencies = [ "build", "cffi", "setuptools", ], - hub_name = "pypi_crossbuild", - lock = "//:uv.lock", - pyproject = "//:pyproject.toml", + hub_name = "pypi_crossbuild_geohash", + lock = "//geohash:uv.lock", + pyproject = "//geohash:pyproject.toml", ) uv.override_package( name = "python-geohash", - lock = "//:uv.lock", + lock = "//geohash:uv.lock", pre_build_patch_strip = 1, pre_build_patches = ["//geohash:require_cxx_driver.patch"], resource_set = "mem_4g", ) -use_repo(uv, "pypi_crossbuild") +use_repo(uv, "pypi_crossbuild_geohash") # Plain setuptools/meson-python/scikit-build-core hubs: no rust/jdk toolchain # wiring, so each is fully described by (hub dir, its build deps). diff --git a/e2e/crossbuild/geohash/BUILD.bazel b/e2e/crossbuild/geohash/BUILD.bazel index ac33223cc..a31ea998e 100644 --- a/e2e/crossbuild/geohash/BUILD.bazel +++ b/e2e/crossbuild/geohash/BUILD.bazel @@ -21,11 +21,11 @@ exports_files(["require_cxx_driver.patch"]) py_binary( name = "geohash_bin", srcs = ["geohash_main.py"], - dep_group = "crossbuild", + dep_group = "crossbuild_geohash", main = "geohash_main.py", python_version = "3.12", deps = [ - "@pypi_crossbuild//python_geohash", + "@pypi_crossbuild_geohash//python_geohash", ], ) diff --git a/e2e/crossbuild/pyproject.toml b/e2e/crossbuild/geohash/pyproject.toml similarity index 85% rename from e2e/crossbuild/pyproject.toml rename to e2e/crossbuild/geohash/pyproject.toml index 648b141a7..4bec70f2a 100644 --- a/e2e/crossbuild/pyproject.toml +++ b/e2e/crossbuild/geohash/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "crossbuild" +name = "crossbuild_geohash" version = "0.0.0" requires-python = ">=3.11" authors = [] diff --git a/e2e/crossbuild/uv.lock b/e2e/crossbuild/geohash/uv.lock similarity index 99% rename from e2e/crossbuild/uv.lock rename to e2e/crossbuild/geohash/uv.lock index 0aed06f66..363b35f42 100644 --- a/e2e/crossbuild/uv.lock +++ b/e2e/crossbuild/geohash/uv.lock @@ -124,7 +124,7 @@ wheels = [ ] [[package]] -name = "crossbuild" +name = "crossbuild-geohash" version = "0.0.0" source = { virtual = "." } dependencies = [ From 7bb1c03f754f60350b1b65cb49e27e02af04e7f5 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Sun, 26 Jul 2026 11:34:40 -0700 Subject: [PATCH 030/103] test(e2e): add pycross tests under e2e/crossbuild Port of rules_pycross's e2e suite (build_setuptools, patches_and_hooks, build_pure_python and the distutils probe), relocated into the crossbuild workspace. (originally commit 4869b33a259c864285491e116fd0938a9508462c, merged to main squashed in #1413 / 05504acc; re-homed here with the content of the original port) --- e2e/crossbuild/MODULE.bazel | 7 ++ .../pycross-distutils-probe/__test__.py | 13 +-- .../pycross-distutils-probe/pyproject.toml | 2 + .../setup.MODULE.bazel | 2 +- .../patches/setproctitle-postinstall.patch | 6 ++ .../pycross-patches/setup.MODULE.bazel | 11 +-- .../test_setproctitle_patched.py | 12 +-- .../pycross-pure-python/BUILD.bazel | 8 +- .../pycross-pure-python/pyproject.toml | 6 ++ .../pycross-pure-python/setup.MODULE.bazel | 27 +++--- .../pycross-pure-python/test_filelock.py | 2 +- .../test_pyproject_metadata.py | 2 +- .../pycross-pure-python/test_tomli.py | 2 +- .../test_top_level_packages.py | 28 +++--- e2e/crossbuild/pycross-setuptools/BUILD.bazel | 74 ++++++++++++++- .../pycross-setuptools/pyproject.toml | 2 + .../pycross-setuptools/setup.MODULE.bazel | 48 ++++------ .../pycross-setuptools/test_pyyaml.py | 17 ++-- .../pycross-setuptools/test_setproctitle.py | 10 +- .../pycross-setuptools/test_zstandard.py | 13 +-- e2e/crossbuild/tools/BUILD.bazel | 10 ++ e2e/crossbuild/tools/check_wheel_native.py | 92 +++++++++++++++++++ e2e/crossbuild/tools/collect_wheels.bzl | 27 +++--- e2e/crossbuild/tools/collect_wheels.py | 35 ++++--- 24 files changed, 312 insertions(+), 144 deletions(-) create mode 100644 e2e/crossbuild/tools/check_wheel_native.py diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 294bdfd8b..5da8aba15 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -226,6 +226,13 @@ uv.override_package( ) use_repo(uv, "pypi_crossbuild_geohash") +# rules_pycross e2e ports: per-suite hubs, each self-described by its own +# setup.MODULE.bazel (same include() layout as e2e/cases). +include("//pycross-distutils-probe:setup.MODULE.bazel") +include("//pycross-patches:setup.MODULE.bazel") +include("//pycross-pure-python:setup.MODULE.bazel") +include("//pycross-setuptools:setup.MODULE.bazel") + # Plain setuptools/meson-python/scikit-build-core hubs: no rust/jdk toolchain # wiring, so each is fully described by (hub dir, its build deps). _SIMPLE_CROSSBUILD_PACKAGES = [ diff --git a/e2e/crossbuild/pycross-distutils-probe/__test__.py b/e2e/crossbuild/pycross-distutils-probe/__test__.py index 9504d667c..c2c35940e 100644 --- a/e2e/crossbuild/pycross-distutils-probe/__test__.py +++ b/e2e/crossbuild/pycross-distutils-probe/__test__.py @@ -4,16 +4,13 @@ `build_distutils_probe_sdist.py`, `test_distutils_probe.py`). The sdist's `build_py` command shells out to a *fresh* interpreter and imports `distutils.util`; on Python 3.12+ that only resolves when setuptools' -`_distutils_hack` is reachable from the child. A build action that leaks a -stale `PYTHONPATH`/`PYTHONHOME` — exactly what rule.bzl's -`_INHERITED_PYTHON_ENV` filter strips — poisons the child while the parent -backend keeps working, so the failure is invisible to a plain "does it -build" check. +`_distutils_hack` is reachable from the child. A build action that exported a +stale `PYTHONPATH`/`PYTHONHOME` — the case build_helper.py's +`_INHERITED_PYTHON_ENV` filter exists for — breaks the child, not the parent, +so the failure is invisible to a plain "does it build" check. Structured like `uv-sdist-mpicc`: the sdist is assembled in-process and -build_helper.py runs as a subprocess with a minimal env (bare PATH, no -PYTHON* variables), so nothing is fetched from the network and nothing -leaks in from the test's own environment. +build_helper.py is invoked directly, so nothing is fetched from the network. """ import os diff --git a/e2e/crossbuild/pycross-distutils-probe/pyproject.toml b/e2e/crossbuild/pycross-distutils-probe/pyproject.toml index e452dbd88..2c635b7a9 100644 --- a/e2e/crossbuild/pycross-distutils-probe/pyproject.toml +++ b/e2e/crossbuild/pycross-distutils-probe/pyproject.toml @@ -3,6 +3,8 @@ name = "pycross_distutils_probe" version = "0.0.0" requires-python = ">=3.11" dependencies = [ + # The test drives build_helper.py directly, which shells out to + # `python -m build` with setuptools as the backend. "build", "setuptools", "wheel", diff --git a/e2e/crossbuild/pycross-distutils-probe/setup.MODULE.bazel b/e2e/crossbuild/pycross-distutils-probe/setup.MODULE.bazel index d017c53aa..5cffad2d5 100644 --- a/e2e/crossbuild/pycross-distutils-probe/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-distutils-probe/setup.MODULE.bazel @@ -4,7 +4,7 @@ rules_pycross ships a synthetic sdist whose `build_py` command shells out to a fresh interpreter and imports `distutils.util`, guarding against a build environment that leaves the backend's child processes unable to find distutils (`SETUPTOOLS_USE_DISTUTILS`, a stale `PYTHONPATH`, or a stripped `PATH`). -rule.bzl filters `PYTHONHOME`/`PYTHONPATH`/`PYTHONPLATLIBDIR` out of the +build_helper.py filters `PYTHONHOME`/`PYTHONPATH`/`PYTHONPLATLIBDIR` out of the action env for exactly this reason, so the probe is worth keeping. Driven the same way as `uv-sdist-mpicc`: the test invokes build_helper.py diff --git a/e2e/crossbuild/pycross-patches/patches/setproctitle-postinstall.patch b/e2e/crossbuild/pycross-patches/patches/setproctitle-postinstall.patch index 62714ffa8..e242ee4ae 100644 --- a/e2e/crossbuild/pycross-patches/patches/setproctitle-postinstall.patch +++ b/e2e/crossbuild/pycross-patches/patches/setproctitle-postinstall.patch @@ -1,3 +1,9 @@ +Ported from rules_pycross tests/e2e/patches_and_hooks. Retargeted at the +installed venv layout: rules_py applies post-install patches with `patch -d` +rooted at the install tree, so paths are `lib/python/site-packages/...` +rather than the wheel-relative paths rules_pycross uses. The `PATCHED = True` +context line comes from the pre-build patch, so this hunk only applies when +the two phases ran in order. --- a/lib/python3.12/site-packages/setproctitle/__init__.py +++ b/lib/python3.12/site-packages/setproctitle/__init__.py @@ -56,3 +56,4 @@ diff --git a/e2e/crossbuild/pycross-patches/setup.MODULE.bazel b/e2e/crossbuild/pycross-patches/setup.MODULE.bazel index 018c5151c..62b442065 100644 --- a/e2e/crossbuild/pycross-patches/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-patches/setup.MODULE.bazel @@ -3,15 +3,8 @@ setproctitle is forced to build from its sdist with both patch phases applied: a pre-build patch that lands in the source tree before the PEP 517 backend runs, and a post-install patch that rewrites the already-unpacked wheel. The -two patches stack — the post-install hunk carries the pre-build patch's -`PATCHED = True` line as context, so it only applies when the phases ran in -order and an ordering regression fails the build itself, not just the -runtime test. - -The post-install patch is written against the installed venv layout -(`lib/python/site-packages/...`): rules_py applies post-install patches -with `patch -d` rooted at the install tree, unlike rules_pycross's -wheel-relative paths. +two patches stack — the post-install one applies against the pre-build +patch's output — so an ordering regression fails the runtime test. Uses its own hub: the patched setproctitle must not be shared with `pycross-setuptools`, which builds the same version unpatched. diff --git a/e2e/crossbuild/pycross-patches/test_setproctitle_patched.py b/e2e/crossbuild/pycross-patches/test_setproctitle_patched.py index c05a2152b..a32362199 100644 --- a/e2e/crossbuild/pycross-patches/test_setproctitle_patched.py +++ b/e2e/crossbuild/pycross-patches/test_setproctitle_patched.py @@ -1,18 +1,12 @@ -"""Assert both patch phases reached the installed setproctitle. - -Ported from rules_pycross tests/e2e/patches_and_hooks/tests/test_setproctitle.py. -`PATCHED` comes from the pre-build patch, `POST_PATCHED` from the post-install -patch. The upstream `SITE_HOOK_RAN` assertion is dropped: rules_py has no -`site_hooks` equivalent. -""" - +# Ported from rules_pycross tests/e2e/patches_and_hooks/tests/test_setproctitle.py. +# `SITE_HOOK_RAN` is dropped: rules_py has no `site_hooks` equivalent. import unittest import setproctitle class TestSetproctitle(unittest.TestCase): - def test_import(self) -> None: + def test_import(self): title = setproctitle.getproctitle() self.assertIsNotNone(title) self.assertTrue(setproctitle.PATCHED) diff --git a/e2e/crossbuild/pycross-pure-python/BUILD.bazel b/e2e/crossbuild/pycross-pure-python/BUILD.bazel index 868bfe668..71ca35f5c 100644 --- a/e2e/crossbuild/pycross-pure-python/BUILD.bazel +++ b/e2e/crossbuild/pycross-pure-python/BUILD.bazel @@ -85,10 +85,10 @@ py_test( ) # An anyarch build uses no CC toolchain, so what differs per platform here is -# the configuration the build *tool* is resolved in: the PEP 517 frontend and -# its wheels must resolve for the exec platform. If the target configuration -# leaked into them, these builds would try to run a non-host interpreter on -# the exec host. +# the configuration the build *tool* is resolved in: `pep517_whl`'s +# `exec_transition` has to pin the frontend and its wheels to the exec +# platform. If it leaked the target configuration, these builds would try to +# run a Linux interpreter on the exec host. collect_wheels( name = "pure_python_wheels", expected_tags = ["-none-any.whl"], diff --git a/e2e/crossbuild/pycross-pure-python/pyproject.toml b/e2e/crossbuild/pycross-pure-python/pyproject.toml index 4681134ee..075a72500 100644 --- a/e2e/crossbuild/pycross-pure-python/pyproject.toml +++ b/e2e/crossbuild/pycross-pure-python/pyproject.toml @@ -5,6 +5,9 @@ requires-python = ">=3.11" dependencies = [ "build", "setuptools", + # Build backends the three sdists below declare in [build-system]. + # The configure tool resolves them out of this lock, so they have to be + # reachable from the project's dependency graph. "flit-core", "hatchling", "hatch-vcs", @@ -13,6 +16,9 @@ dependencies = [ "tomli==2.2.1", ] +# All three ship `-none-any` wheels; forcing the source build exercises +# pep517_whl's `--validate-anyarch` path for three different PEP 517 +# backends (hatchling, flit-core). [tool.uv] no-binary-package = [ "filelock", diff --git a/e2e/crossbuild/pycross-pure-python/setup.MODULE.bazel b/e2e/crossbuild/pycross-pure-python/setup.MODULE.bazel index eb9350165..cffc227a6 100644 --- a/e2e/crossbuild/pycross-pure-python/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-pure-python/setup.MODULE.bazel @@ -1,21 +1,14 @@ """Port of rules_pycross's `tests/e2e/build_pure_python` workspace. -filelock, tomli and pyproject-metadata are pinned as `no-binary-package`, so -the anyarch `pep517_whl` path builds each sdist with a PEP 517 backend other -than setuptools — hatchling for filelock, flit-core for tomli and -pyproject-metadata — and every resulting wheel must import from -site-packages at runtime. +Three pure-Python packages are forced to build from their sdists so the +`pep517_whl` (anyarch) path runs against two different PEP 517 backends — +hatchling (filelock) and flit-core (tomli, pyproject-metadata). Each package +still has to import from site-packages afterwards. -The backends are named in `default_build_dependencies` so they resolve -through the project repo's `py_library` targets, which carry their transitive -closure (hatchling alone needs pathspec, pluggy, trove-classifiers, …); the -configure tool's `[build-system] requires` resolution would yield bare -`whl_install` targets instead. - -The `sdist_build` repos are exposed so BUILD.bazel can rebuild the same -wheels under non-host target platforms. An anyarch build uses no CC -toolchain, so that matrix isolates a single property: the build tooling -(frontend and backend) must resolve for the exec platform even when the +The `sdist_build` repos are exposed so BUILD.bazel can rebuild the same wheels +under non-host target platforms: an anyarch build carries no CC toolchain, so +what that matrix exercises is `pep517_whl`'s exec transition — build tooling +(`build`, the backend) must resolve for the exec platform even when the configuration targets another one. """ @@ -25,6 +18,10 @@ uv.project( default_build_dependencies = [ "build", "setuptools", + # The backends have to come through the project repo, not through the + # configure tool's `[build-system] requires` resolution: that path + # yields bare `whl_install` targets, and hatchling needs its own + # transitive closure (pathspec, pluggy, trove-classifiers, …). "flit-core", "hatch-vcs", "hatchling", diff --git a/e2e/crossbuild/pycross-pure-python/test_filelock.py b/e2e/crossbuild/pycross-pure-python/test_filelock.py index 388192caa..cffa86ad3 100644 --- a/e2e/crossbuild/pycross-pure-python/test_filelock.py +++ b/e2e/crossbuild/pycross-pure-python/test_filelock.py @@ -4,7 +4,7 @@ class TestFileLock(unittest.TestCase): - def test_import(self) -> None: + def test_import(self): lock = filelock.FileLock("dummy.lock") self.assertIsNotNone(lock) diff --git a/e2e/crossbuild/pycross-pure-python/test_pyproject_metadata.py b/e2e/crossbuild/pycross-pure-python/test_pyproject_metadata.py index c388bc95f..739d34ff7 100644 --- a/e2e/crossbuild/pycross-pure-python/test_pyproject_metadata.py +++ b/e2e/crossbuild/pycross-pure-python/test_pyproject_metadata.py @@ -4,7 +4,7 @@ class TestPyprojectMetadata(unittest.TestCase): - def test_import(self) -> None: + def test_import(self): self.assertIsNotNone(pyproject_metadata.__version__) diff --git a/e2e/crossbuild/pycross-pure-python/test_tomli.py b/e2e/crossbuild/pycross-pure-python/test_tomli.py index 7d48c36ed..48bdea076 100644 --- a/e2e/crossbuild/pycross-pure-python/test_tomli.py +++ b/e2e/crossbuild/pycross-pure-python/test_tomli.py @@ -4,7 +4,7 @@ class TestTomli(unittest.TestCase): - def test_parse(self) -> None: + def test_parse(self): d = tomli.loads("a = 1") self.assertEqual(d["a"], 1) diff --git a/e2e/crossbuild/pycross-pure-python/test_top_level_packages.py b/e2e/crossbuild/pycross-pure-python/test_top_level_packages.py index f26573a1c..d77fc3d65 100644 --- a/e2e/crossbuild/pycross-pure-python/test_top_level_packages.py +++ b/e2e/crossbuild/pycross-pure-python/test_top_level_packages.py @@ -1,10 +1,11 @@ -"""Assert that source-built wheels land their top-level packages in site-packages. +"""Verify that installed wheels have their top-level packages in site-packages. -Ported from rules_pycross's shared top-level-packages check. The packages to -verify come from the comma-separated `PYCROSS_TEST_PACKAGES` env var, set by -the consuming py_test. Three invariants per package: it imports, its module -spec resolves inside site-packages rather than a leaked source tree or -`PYTHONPATH` entry, and no dist-info directory ends up on `sys.path`. +This test works in two modes: +1. If PYCROSS_TEST_PACKAGES env var is set, it tests those packages (comma-separated). +2. Otherwise, it tests hardcoded packages (regex, IPython) for + the requirements e2e workspace. + +Packages are tested for importability and correct site-packages placement. """ import importlib @@ -15,16 +16,20 @@ class TopLevelPackagesTest(unittest.TestCase): - def _get_packages(self) -> list[str]: - return [p.strip() for p in os.environ["PYCROSS_TEST_PACKAGES"].split(",") if p.strip()] + """Check that top_level_paths from wheel inspection actually show up.""" + + def _get_packages(self): + return [p.strip() for p in os.environ.get("PYCROSS_TEST_PACKAGES", "regex,IPython").split(",") if p.strip()] - def test_packages_importable(self) -> None: + def test_packages_importable(self): + """All expected packages should be importable.""" for pkg in self._get_packages(): with self.subTest(package=pkg): mod = importlib.import_module(pkg) self.assertIsNotNone(mod, f"{pkg} imported as None") - def test_packages_resolve_to_site_packages(self) -> None: + def test_packages_resolve_to_site_packages(self): + """All expected packages should resolve to files within site-packages.""" for pkg in self._get_packages(): with self.subTest(package=pkg): spec = importlib.util.find_spec(pkg) @@ -36,7 +41,8 @@ def test_packages_resolve_to_site_packages(self) -> None: f"{pkg} origin not in site-packages: {spec.origin}", ) - def test_no_dist_info_on_sys_path(self) -> None: + def test_no_dist_info_on_sys_path(self): + """dist-info directories should not be added as sys.path entries.""" for path in sys.path: basename = os.path.basename(path) self.assertFalse( diff --git a/e2e/crossbuild/pycross-setuptools/BUILD.bazel b/e2e/crossbuild/pycross-setuptools/BUILD.bazel index e2c54e19c..df7c2a63b 100644 --- a/e2e/crossbuild/pycross-setuptools/BUILD.bazel +++ b/e2e/crossbuild/pycross-setuptools/BUILD.bazel @@ -1,9 +1,11 @@ # Ported from rules_pycross tests/e2e/build_setuptools. # -# Three setuptools C-extension sdists built by `pep517_native_whl` and -# imported at runtime for the host. +# Three setuptools C-extension sdists built by `pep517_native_whl`, imported at +# runtime for the host, then rebuilt through rules_pycross's `collect_wheels` +# matrix for two non-host Linux platforms — the cross path this branch adds. load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") exports_files(["require_extension.patch"]) @@ -11,6 +13,36 @@ _PY = "3.12" _DEP_GROUP = "pycross_setuptools" +# The libc/version flags are what the wheel resolver keys platform-specific +# wheel selection off; a bare constraint_values platform would leave build +# dependencies unresolvable. Same shape as //uv-deps-650/crossbuild. The +# dep_group flag rides along because the wheel targets under `collect_wheels` +# are reached through a platform transition, not through a py_venv. +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + py_test( name = "test_setproctitle", srcs = ["test_setproctitle.py"], @@ -37,3 +69,41 @@ py_test( python_version = _PY, deps = ["@pypi_pycross_setuptools//pyyaml"], ) + +# rules_pycross's cross matrix, restricted to zstandard. +# +# pyyaml is excluded because `PYYAML_FORCE_LIBYAML=0` makes it anyarch — there +# is nothing platform-specific left to assert. +# +# setproctitle is excluded because it cannot cross-build here at all: its +# setup.py picks sources and macros off `sys.platform`, which reports the +# *exec* interpreter's platform. Cross mode overrides `_PYTHON_HOST_PLATFORM` +# and `_PYTHON_SYSCONFIGDATA_NAME`, neither of which moves `sys.platform`, so a +# darwin exec host compiles `src/darwin_set_process_name.c` with +# `-D__darwin__=1` against a linux target and fails on +# `CoreFoundation/CoreFoundation.h`. rules_pycross handles this with a real +# crossenv (`pycross/private/build/tools/crossenv/`) that patches `sys.platform` +# in the build interpreter. `require_extension.patch` keeps that failure loud +# rather than letting setproctitle fall back to an anyarch wheel. +collect_wheels( + name = "native_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = ["@sdist_build__pycross_setuptools__zstandard__0_22_0//:whl"], +) + +py_test( + name = "native_wheels_elf_test", + srcs = ["//tools:check_wheel_native.py"], + args = ["$(rootpath :native_wheels)"], + data = [":native_wheels"], + dep_group = _DEP_GROUP, + main = "//tools:check_wheel_native.py", + python_version = _PY, +) diff --git a/e2e/crossbuild/pycross-setuptools/pyproject.toml b/e2e/crossbuild/pycross-setuptools/pyproject.toml index 292a3927f..c4e3838f3 100644 --- a/e2e/crossbuild/pycross-setuptools/pyproject.toml +++ b/e2e/crossbuild/pycross-setuptools/pyproject.toml @@ -6,7 +6,9 @@ dependencies = [ "build", "setuptools", "wheel", + # zstandard's setup.py builds a cffi backend when cffi is importable. "cffi", + # PyYAML 6.0.x cannot be cythonized by Cython 3. "cython<3.0", "pyyaml==6.0.1", "setproctitle==1.3.2", diff --git a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel index 6a4ba7ee6..012261ca9 100644 --- a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel @@ -1,36 +1,14 @@ """Port of rules_pycross's `tests/e2e/build_setuptools` workspace. Three setuptools-backed C-extension packages are forced to build from their -sdists (`[tool.uv] no-binary-package` in pyproject.toml), covering the -`pep517_native_whl` path for three distinct build shapes: +sdists: PyYAML (Cython-generated extension), setproctitle (plain C) and +zstandard (vendored libzstd). Together they cover the `pep517_native_whl` +path for a Cython pipeline, a trivial extension and a large vendored-C build. -- PyYAML 6.0.1: Cython-generated extension (sdist → cythonize → C → .so). - The lock pins `cython<3.0` because PyYAML 6.0.x cannot be cythonized by - Cython 3. -- setproctitle 1.3.2: a plain C extension, the minimal native case. -- zstandard 0.22.0: a large vendored-libzstd build, plus an optional cffi - backend its setup.py compiles whenever cffi is importable at build time. - -Each override exercises a different `uv.override_package` feature: - -- `env` on PyYAML ports rules_pycross's per-package `build_env` override - (`setuptools.override(name = "pyyaml", build_env = ...)`) and is observable - at runtime: with `PYYAML_FORCE_LIBYAML=0` the built wheel must not carry - the libyaml-backed `CLoader` (asserted by test_pyyaml.py). -- `pre_build_patches` on setproctitle removes its silent fallback to a pure - `py3-none-any` wheel when the extension fails to compile; see - require_extension.patch for why the fallback would mask a broken build. -- `resource_set` on zstandard declares the vendored-C compile's real memory - footprint so Bazel does not over-parallelize it. - -`default_build_dependencies` names cffi explicitly: zstandard's cffi backend -imports pycparser through cffi, and only the project repo's py_library carries -that transitive closure — the configure tool's `[build-system] requires` -resolution would yield a bare `whl_install` target without it. - -No cross-platform `collect_wheels` matrix here (unlike pycross-pure-python): -rebuilding these wheels for non-host targets would require a cross CC -toolchain this workspace does not set up. +`env` on PyYAML ports rules_pycross's per-package `build_env` override +(`setuptools.override(name = "pyyaml", build_env = ...)`), and is observable +at runtime: with `PYYAML_FORCE_LIBYAML=0` the built wheel must not carry the +libyaml-backed `CLoader`. Not ported: rules_pycross builds psycopg2 with a `pg_config` tool dep and zstandard against a Bazel-built system libzstd. Both need `rules_foreign_cc` @@ -45,6 +23,10 @@ uv.project( "build", "setuptools", "wheel", + # zstandard's cffi backend imports pycparser through cffi. Naming cffi + # here routes it through the project repo's py_library, which carries + # that transitive closure; the configure tool's `[build-system] + # requires` resolution yields a bare `whl_install` target instead. "cffi", ], hub_name = "pypi_pycross_setuptools", @@ -67,4 +49,10 @@ uv.override_package( lock = "//pycross-setuptools:uv.lock", resource_set = "mem_4g", ) -use_repo(uv, "pypi_pycross_setuptools") +use_repo( + uv, + "pypi_pycross_setuptools", + "sdist_build__pycross_setuptools__pyyaml__6_0_1", + "sdist_build__pycross_setuptools__setproctitle__1_3_2", + "sdist_build__pycross_setuptools__zstandard__0_22_0", +) diff --git a/e2e/crossbuild/pycross-setuptools/test_pyyaml.py b/e2e/crossbuild/pycross-setuptools/test_pyyaml.py index b6460a4e1..1853f0771 100644 --- a/e2e/crossbuild/pycross-setuptools/test_pyyaml.py +++ b/e2e/crossbuild/pycross-setuptools/test_pyyaml.py @@ -1,17 +1,12 @@ -"""Assert PyYAML built from sdist without the libyaml `CLoader` backend. - -Ported from rules_pycross tests/e2e/build_setuptools/tests/test_pyyaml.py, -with the `CLoader` assertion added: rules_pycross's version tolerates either -backend, which leaves its `build_env` override untested. The build sets -`PYYAML_FORCE_LIBYAML=0` via `uv.override_package(env = ...)`, so the source -build must have produced the pure-Python backend — if the override never -reached the build action, `CLoader` is importable and this test fails. -""" - +# Ported from rules_pycross tests/e2e/build_setuptools/tests/test_pyyaml.py. +# The `CLoader` assertion is added: rules_pycross's version tolerates either +# backend, which leaves its `build_env` override untested. The build sets +# PYYAML_FORCE_LIBYAML=0, so the source build must have produced the pure-Python +# backend — if the override never reached the build action, CLoader is present. import yaml -def test_pyyaml_import() -> None: +def test_pyyaml_import(): try: from yaml import CLoader as Loader except ImportError: diff --git a/e2e/crossbuild/pycross-setuptools/test_setproctitle.py b/e2e/crossbuild/pycross-setuptools/test_setproctitle.py index cb2cef063..44541f3a7 100644 --- a/e2e/crossbuild/pycross-setuptools/test_setproctitle.py +++ b/e2e/crossbuild/pycross-setuptools/test_setproctitle.py @@ -1,18 +1,10 @@ -"""Smoke test for setproctitle built from its sdist. - -Ported from rules_pycross tests/e2e/build_setuptools/tests/test_setproctitle.py. -require_extension.patch makes the C extension mandatory, so a passing import -here means the native build ran — the upstream pure-Python fallback cannot -have papered over a compile failure. -""" - import unittest import setproctitle class TestSetproctitle(unittest.TestCase): - def test_import(self) -> None: + def test_import(self): title = setproctitle.getproctitle() self.assertIsNotNone(title) diff --git a/e2e/crossbuild/pycross-setuptools/test_zstandard.py b/e2e/crossbuild/pycross-setuptools/test_zstandard.py index 691192062..c944a74d9 100644 --- a/e2e/crossbuild/pycross-setuptools/test_zstandard.py +++ b/e2e/crossbuild/pycross-setuptools/test_zstandard.py @@ -1,10 +1,3 @@ -"""Round-trip compress/decompress through zstandard built from its sdist. - -Ported from rules_pycross tests/e2e/build_setuptools/tests/test_zstandard.py. -A successful round trip proves the extension compiled against the vendored -libzstd actually works, not merely that the module imports. -""" - import unittest import zstandard @@ -35,13 +28,17 @@ class TestZstandard(unittest.TestCase): - def test_roundtrip(self) -> None: + def test_roundtrip(self): cctx = zstandard.ZstdCompressor() compressed = cctx.compress(ZEN) + + # Make sure we actually compressed assert len(compressed) < len(ZEN) dctx = zstandard.ZstdDecompressor() decompressed = dctx.decompress(compressed) + + # Check the round trip assert decompressed == ZEN diff --git a/e2e/crossbuild/tools/BUILD.bazel b/e2e/crossbuild/tools/BUILD.bazel index 43e6c78c8..33490867f 100644 --- a/e2e/crossbuild/tools/BUILD.bazel +++ b/e2e/crossbuild/tools/BUILD.bazel @@ -1,5 +1,6 @@ # Shared helpers consumed via load("//tools:..."). +load("@aspect_rules_py//py:defs.bzl", "py_binary") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") load("@rules_shell//shell:sh_test.bzl", "sh_test") load(":ant_layer.bzl", "ant_home") @@ -10,8 +11,17 @@ exports_files([ "assert_absent.py", "check_so_arch.sh", "check_so_suffix.sh", + "check_wheel_native.py", + "check_wheel_tags.py", ]) +py_binary( + name = "collect_wheels_tool", + srcs = ["collect_wheels.py"], + main = "collect_wheels.py", + visibility = ["//visibility:public"], +) + # The host-targeting rust_toolchain's sysroot, re-resolved under the exec # transition so it stays correct even when the rest of the build is # transitioned to another platform — see rust_layer.bzl for why plain diff --git a/e2e/crossbuild/tools/check_wheel_native.py b/e2e/crossbuild/tools/check_wheel_native.py new file mode 100644 index 000000000..0bc1211d5 --- /dev/null +++ b/e2e/crossbuild/tools/check_wheel_native.py @@ -0,0 +1,92 @@ +"""Assert cross-built wheels really contain extensions for the tagged platform. + +Usage: check_wheel_native.py + +For every Linux-tagged wheel in the directory, every extension module inside it +must be an ELF object whose `e_machine` matches the wheel's architecture tag, +and whose filename ABI tag names the same architecture. A cross build that +fell back to the exec platform's compiler or sysconfig produces a correctly +named wheel holding host-architecture objects — which the wheel-tag check +alone cannot see. + +rules_pycross's cross coverage stops at "the wheel builds for both platforms" +(tests/e2e/shared/collect_wheels.bzl feeding a build target); this is the +assertion that makes that matrix meaningful. +""" + +import os +import struct +import sys +import zipfile + +# ELF e_machine values, from elf.h. +_EM_X86_64 = 0x3E +_EM_AARCH64 = 0xB7 + +_ARCH_TAGS = { + "x86_64": _EM_X86_64, + "aarch64": _EM_AARCH64, +} + + +def _wheel_arch(name: str) -> str: + for arch in _ARCH_TAGS: + if arch in name: + return arch + raise AssertionError("cannot determine architecture from wheel name {}".format(name)) + + +def _elf_machine(data: bytes) -> int: + assert data[:4] == b"\x7fELF", "not an ELF object" + little_endian = data[5] == 1 + return struct.unpack_from("H", data, 18)[0] + + +def _check(wheel_path: str) -> int: + name = os.path.basename(wheel_path) + arch = _wheel_arch(name) + expected_machine = _ARCH_TAGS[arch] + checked = 0 + + with zipfile.ZipFile(wheel_path) as zf: + for entry in zf.namelist(): + if not entry.endswith(".so"): + continue + machine = _elf_machine(zf.read(entry)) + if machine != expected_machine: + raise AssertionError( + "{}: {} is ELF machine {:#x}, expected {:#x} for '{}'".format( + name, entry, machine, expected_machine, arch + ) + ) + base = os.path.basename(entry) + if "." in base[:-3] and arch not in base: + raise AssertionError( + "{}: extension filename '{}' does not name architecture '{}'".format( + name, base, arch + ) + ) + print(" {} -> {} (ELF {:#x})".format(name, base, machine)) + checked += 1 + + return checked + + +def main() -> None: + wheel_dir = sys.argv[1] + wheels = sorted( + f + for f in os.listdir(wheel_dir) + if f.endswith(".whl") and "linux" in f and not f.endswith("-none-any.whl") + ) + assert wheels, "no Linux-tagged native wheels collected under {}".format(wheel_dir) + + total = 0 + for wheel in wheels: + total += _check(os.path.join(wheel_dir, wheel)) + + assert total, "collected native wheels contain no extension modules: {}".format(wheels) + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/tools/collect_wheels.bzl b/e2e/crossbuild/tools/collect_wheels.bzl index 53d19df76..defa15f69 100644 --- a/e2e/crossbuild/tools/collect_wheels.bzl +++ b/e2e/crossbuild/tools/collect_wheels.bzl @@ -11,7 +11,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("@bazel_lib//lib:run_binary.bzl", "run_binary") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") -def collect_wheels(name, wheels, platforms, expected_tags): +def collect_wheels(name, wheels, platforms, expected_tags = None, **kwargs): """Builds `wheels` once per entry in `platforms` and collects them. Args: @@ -19,13 +19,12 @@ def collect_wheels(name, wheels, platforms, expected_tags): wheels: Wheel labels, e.g. `["@sdist_build__x__y__1_0//:whl"]`. platforms: Platform labels to build each wheel for. expected_tags: Substrings that must each appear in at least one - collected wheel filename, asserted by `_tags_test`. - - The inner `_wheels` filegroup is tagged manual: it is only reachable - through the platform transitions declared here, which are what supply the - dep_group and libc flags the wheel targets select on. + collected wheel filename. When set, declares `_tags_test`. + **kwargs: Forwarded to the collecting `run_binary`. """ + # Manual: only reachable through the platform transitions below, which are + # what supply the dep_group and libc flags the wheel targets select on. native.filegroup( name = name + "_wheels", srcs = wheels, @@ -57,12 +56,14 @@ def collect_wheels(name, wheels, platforms, expected_tags): ], out_dirs = [name], tool = "//tools:collect_wheels_tool", + **kwargs ) - py_test( - name = name + "_tags_test", - srcs = ["//tools:check_wheel_tags.py"], - main = "//tools:check_wheel_tags.py", - args = ["$(rootpath :{})".format(name)] + expected_tags, - data = [name], - ) + if expected_tags: + py_test( + name = name + "_tags_test", + srcs = ["//tools:check_wheel_tags.py"], + main = "//tools:check_wheel_tags.py", + args = ["$(rootpath :{})".format(name)] + expected_tags, + data = [name], + ) diff --git a/e2e/crossbuild/tools/collect_wheels.py b/e2e/crossbuild/tools/collect_wheels.py index a834aa256..9dc094881 100644 --- a/e2e/crossbuild/tools/collect_wheels.py +++ b/e2e/crossbuild/tools/collect_wheels.py @@ -1,9 +1,8 @@ """Copy every .whl reachable from the given paths into one output directory. -Ported from rules_pycross (tests/e2e/shared/collect_wheels.py). Inputs are -tree artifacts holding wheels — pep517_whl/pep517_native_whl declare a -directory output. The same anyarch wheel can arrive through more than one -platform transition, so first copy wins. +Ported from rules_pycross (tests/e2e/shared/collect_wheels.py). Inputs are a +mix of plain wheel files and tree artifacts holding wheels, because +pep517_whl/pep517_native_whl declare a directory output. """ import argparse @@ -11,10 +10,10 @@ from pathlib import Path -def main() -> None: +def main(): parser = argparse.ArgumentParser() parser.add_argument("--out-dir", required=True) - parser.add_argument("wheel", nargs="*") + parser.add_argument("wheel", nargs="*", default=[]) args = parser.parse_args() out_dir = Path(args.out_dir) @@ -22,11 +21,25 @@ def main() -> None: for wheel_str in args.wheel: for p in wheel_str.split(" "): - for whl in Path(p).glob("*.whl"): - real_path = whl.resolve() - target_path = out_dir / real_path.name - if not target_path.exists(): - shutil.copy2(real_path, target_path) + wheel_path = Path(p) + + if wheel_path.is_dir(): + for whl in wheel_path.glob("*.whl"): + real_path = whl.resolve() + target_path = out_dir / real_path.name + if not target_path.exists(): + shutil.copy2(real_path, target_path) + continue + + if not wheel_path.name.endswith(".whl"): + continue + + real_path = wheel_path.resolve() + target_path = out_dir / real_path.name + if target_path.exists(): + continue + + shutil.copy2(real_path, target_path) if __name__ == "__main__": From 20f1125537268bc3a3e666c4fef2c968d1d23cbe Mon Sep 17 00:00:00 2001 From: xangcastle Date: Tue, 11 Aug 2026 17:39:10 -0600 Subject: [PATCH 031/103] test(e2e): consolidate the pycross suites in e2e/crossbuild MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The four rules_pycross ports moved from e2e/cases into the crossbuild workspace, where the cross toolchains they exercise actually live: - restore the pycross-setuptools native_wheels matrix deferred out of #1413 (zstandard rebuilt for amd64/arm64 with ELF and wheel-tag assertions) — under this workspace's registered cross CC toolchain it runs where it couldn't on main - carry the reviewed refinements from #1413 over the original port - pin setproctitle to -std=gnu17: gcc_toolchain's GCC defaults to C23, where `bool` is a keyword and 1.3.2's `typedef char bool` breaks — coverage the e2e/cases host toolchain never gave us - drop the cases, their MODULE includes and the collect_wheels tooling from e2e/cases --- .../pycross-distutils-probe/__test__.py | 13 ++++-- .../pycross-distutils-probe/pyproject.toml | 2 - .../setup.MODULE.bazel | 2 +- .../patches/setproctitle-postinstall.patch | 6 --- .../pycross-patches/setup.MODULE.bazel | 15 +++++- .../test_setproctitle_patched.py | 12 +++-- .../pycross-pure-python/BUILD.bazel | 8 ++-- .../pycross-pure-python/pyproject.toml | 6 --- .../pycross-pure-python/setup.MODULE.bazel | 27 ++++++----- .../pycross-pure-python/test_filelock.py | 2 +- .../test_pyproject_metadata.py | 2 +- .../pycross-pure-python/test_tomli.py | 2 +- .../test_top_level_packages.py | 28 +++++------ e2e/crossbuild/pycross-setuptools/BUILD.bazel | 2 +- .../pycross-setuptools/pyproject.toml | 2 - .../pycross-setuptools/setup.MODULE.bazel | 46 +++++++++++++------ .../pycross-setuptools/test_pyyaml.py | 17 ++++--- .../pycross-setuptools/test_setproctitle.py | 10 +++- .../pycross-setuptools/test_zstandard.py | 13 ++++-- e2e/crossbuild/tools/collect_wheels.bzl | 27 ++++++----- e2e/crossbuild/tools/collect_wheels.py | 35 +++++--------- 21 files changed, 150 insertions(+), 127 deletions(-) diff --git a/e2e/crossbuild/pycross-distutils-probe/__test__.py b/e2e/crossbuild/pycross-distutils-probe/__test__.py index c2c35940e..9504d667c 100644 --- a/e2e/crossbuild/pycross-distutils-probe/__test__.py +++ b/e2e/crossbuild/pycross-distutils-probe/__test__.py @@ -4,13 +4,16 @@ `build_distutils_probe_sdist.py`, `test_distutils_probe.py`). The sdist's `build_py` command shells out to a *fresh* interpreter and imports `distutils.util`; on Python 3.12+ that only resolves when setuptools' -`_distutils_hack` is reachable from the child. A build action that exported a -stale `PYTHONPATH`/`PYTHONHOME` — the case build_helper.py's -`_INHERITED_PYTHON_ENV` filter exists for — breaks the child, not the parent, -so the failure is invisible to a plain "does it build" check. +`_distutils_hack` is reachable from the child. A build action that leaks a +stale `PYTHONPATH`/`PYTHONHOME` — exactly what rule.bzl's +`_INHERITED_PYTHON_ENV` filter strips — poisons the child while the parent +backend keeps working, so the failure is invisible to a plain "does it +build" check. Structured like `uv-sdist-mpicc`: the sdist is assembled in-process and -build_helper.py is invoked directly, so nothing is fetched from the network. +build_helper.py runs as a subprocess with a minimal env (bare PATH, no +PYTHON* variables), so nothing is fetched from the network and nothing +leaks in from the test's own environment. """ import os diff --git a/e2e/crossbuild/pycross-distutils-probe/pyproject.toml b/e2e/crossbuild/pycross-distutils-probe/pyproject.toml index 2c635b7a9..e452dbd88 100644 --- a/e2e/crossbuild/pycross-distutils-probe/pyproject.toml +++ b/e2e/crossbuild/pycross-distutils-probe/pyproject.toml @@ -3,8 +3,6 @@ name = "pycross_distutils_probe" version = "0.0.0" requires-python = ">=3.11" dependencies = [ - # The test drives build_helper.py directly, which shells out to - # `python -m build` with setuptools as the backend. "build", "setuptools", "wheel", diff --git a/e2e/crossbuild/pycross-distutils-probe/setup.MODULE.bazel b/e2e/crossbuild/pycross-distutils-probe/setup.MODULE.bazel index 5cffad2d5..d017c53aa 100644 --- a/e2e/crossbuild/pycross-distutils-probe/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-distutils-probe/setup.MODULE.bazel @@ -4,7 +4,7 @@ rules_pycross ships a synthetic sdist whose `build_py` command shells out to a fresh interpreter and imports `distutils.util`, guarding against a build environment that leaves the backend's child processes unable to find distutils (`SETUPTOOLS_USE_DISTUTILS`, a stale `PYTHONPATH`, or a stripped `PATH`). -build_helper.py filters `PYTHONHOME`/`PYTHONPATH`/`PYTHONPLATLIBDIR` out of the +rule.bzl filters `PYTHONHOME`/`PYTHONPATH`/`PYTHONPLATLIBDIR` out of the action env for exactly this reason, so the probe is worth keeping. Driven the same way as `uv-sdist-mpicc`: the test invokes build_helper.py diff --git a/e2e/crossbuild/pycross-patches/patches/setproctitle-postinstall.patch b/e2e/crossbuild/pycross-patches/patches/setproctitle-postinstall.patch index e242ee4ae..62714ffa8 100644 --- a/e2e/crossbuild/pycross-patches/patches/setproctitle-postinstall.patch +++ b/e2e/crossbuild/pycross-patches/patches/setproctitle-postinstall.patch @@ -1,9 +1,3 @@ -Ported from rules_pycross tests/e2e/patches_and_hooks. Retargeted at the -installed venv layout: rules_py applies post-install patches with `patch -d` -rooted at the install tree, so paths are `lib/python/site-packages/...` -rather than the wheel-relative paths rules_pycross uses. The `PATCHED = True` -context line comes from the pre-build patch, so this hunk only applies when -the two phases ran in order. --- a/lib/python3.12/site-packages/setproctitle/__init__.py +++ b/lib/python3.12/site-packages/setproctitle/__init__.py @@ -56,3 +56,4 @@ diff --git a/e2e/crossbuild/pycross-patches/setup.MODULE.bazel b/e2e/crossbuild/pycross-patches/setup.MODULE.bazel index 62b442065..099b1395c 100644 --- a/e2e/crossbuild/pycross-patches/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-patches/setup.MODULE.bazel @@ -3,8 +3,15 @@ setproctitle is forced to build from its sdist with both patch phases applied: a pre-build patch that lands in the source tree before the PEP 517 backend runs, and a post-install patch that rewrites the already-unpacked wheel. The -two patches stack — the post-install one applies against the pre-build -patch's output — so an ordering regression fails the runtime test. +two patches stack — the post-install hunk carries the pre-build patch's +`PATCHED = True` line as context, so it only applies when the phases ran in +order and an ordering regression fails the build itself, not just the +runtime test. + +The post-install patch is written against the installed venv layout +(`lib/python/site-packages/...`): rules_py applies post-install patches +with `patch -d` rooted at the install tree, unlike rules_pycross's +wheel-relative paths. Uses its own hub: the patched setproctitle must not be shared with `pycross-setuptools`, which builds the same version unpatched. @@ -30,6 +37,10 @@ uv.project( ) uv.override_package( name = "setproctitle", + # gcc_toolchain's GCC defaults to C23, where `bool` is a keyword; + # setproctitle 1.3.2's src/c.h still does `typedef char bool`. distutils + # appends $CFLAGS after its own flags, so the -std override wins. + env = {"CFLAGS": "-std=gnu17"}, lock = "//pycross-patches:uv.lock", post_install_patch_strip = 1, post_install_patches = ["//pycross-patches:patches/setproctitle-postinstall.patch"], diff --git a/e2e/crossbuild/pycross-patches/test_setproctitle_patched.py b/e2e/crossbuild/pycross-patches/test_setproctitle_patched.py index a32362199..c05a2152b 100644 --- a/e2e/crossbuild/pycross-patches/test_setproctitle_patched.py +++ b/e2e/crossbuild/pycross-patches/test_setproctitle_patched.py @@ -1,12 +1,18 @@ -# Ported from rules_pycross tests/e2e/patches_and_hooks/tests/test_setproctitle.py. -# `SITE_HOOK_RAN` is dropped: rules_py has no `site_hooks` equivalent. +"""Assert both patch phases reached the installed setproctitle. + +Ported from rules_pycross tests/e2e/patches_and_hooks/tests/test_setproctitle.py. +`PATCHED` comes from the pre-build patch, `POST_PATCHED` from the post-install +patch. The upstream `SITE_HOOK_RAN` assertion is dropped: rules_py has no +`site_hooks` equivalent. +""" + import unittest import setproctitle class TestSetproctitle(unittest.TestCase): - def test_import(self): + def test_import(self) -> None: title = setproctitle.getproctitle() self.assertIsNotNone(title) self.assertTrue(setproctitle.PATCHED) diff --git a/e2e/crossbuild/pycross-pure-python/BUILD.bazel b/e2e/crossbuild/pycross-pure-python/BUILD.bazel index 71ca35f5c..868bfe668 100644 --- a/e2e/crossbuild/pycross-pure-python/BUILD.bazel +++ b/e2e/crossbuild/pycross-pure-python/BUILD.bazel @@ -85,10 +85,10 @@ py_test( ) # An anyarch build uses no CC toolchain, so what differs per platform here is -# the configuration the build *tool* is resolved in: `pep517_whl`'s -# `exec_transition` has to pin the frontend and its wheels to the exec -# platform. If it leaked the target configuration, these builds would try to -# run a Linux interpreter on the exec host. +# the configuration the build *tool* is resolved in: the PEP 517 frontend and +# its wheels must resolve for the exec platform. If the target configuration +# leaked into them, these builds would try to run a non-host interpreter on +# the exec host. collect_wheels( name = "pure_python_wheels", expected_tags = ["-none-any.whl"], diff --git a/e2e/crossbuild/pycross-pure-python/pyproject.toml b/e2e/crossbuild/pycross-pure-python/pyproject.toml index 075a72500..4681134ee 100644 --- a/e2e/crossbuild/pycross-pure-python/pyproject.toml +++ b/e2e/crossbuild/pycross-pure-python/pyproject.toml @@ -5,9 +5,6 @@ requires-python = ">=3.11" dependencies = [ "build", "setuptools", - # Build backends the three sdists below declare in [build-system]. - # The configure tool resolves them out of this lock, so they have to be - # reachable from the project's dependency graph. "flit-core", "hatchling", "hatch-vcs", @@ -16,9 +13,6 @@ dependencies = [ "tomli==2.2.1", ] -# All three ship `-none-any` wheels; forcing the source build exercises -# pep517_whl's `--validate-anyarch` path for three different PEP 517 -# backends (hatchling, flit-core). [tool.uv] no-binary-package = [ "filelock", diff --git a/e2e/crossbuild/pycross-pure-python/setup.MODULE.bazel b/e2e/crossbuild/pycross-pure-python/setup.MODULE.bazel index cffc227a6..eb9350165 100644 --- a/e2e/crossbuild/pycross-pure-python/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-pure-python/setup.MODULE.bazel @@ -1,14 +1,21 @@ """Port of rules_pycross's `tests/e2e/build_pure_python` workspace. -Three pure-Python packages are forced to build from their sdists so the -`pep517_whl` (anyarch) path runs against two different PEP 517 backends — -hatchling (filelock) and flit-core (tomli, pyproject-metadata). Each package -still has to import from site-packages afterwards. +filelock, tomli and pyproject-metadata are pinned as `no-binary-package`, so +the anyarch `pep517_whl` path builds each sdist with a PEP 517 backend other +than setuptools — hatchling for filelock, flit-core for tomli and +pyproject-metadata — and every resulting wheel must import from +site-packages at runtime. -The `sdist_build` repos are exposed so BUILD.bazel can rebuild the same wheels -under non-host target platforms: an anyarch build carries no CC toolchain, so -what that matrix exercises is `pep517_whl`'s exec transition — build tooling -(`build`, the backend) must resolve for the exec platform even when the +The backends are named in `default_build_dependencies` so they resolve +through the project repo's `py_library` targets, which carry their transitive +closure (hatchling alone needs pathspec, pluggy, trove-classifiers, …); the +configure tool's `[build-system] requires` resolution would yield bare +`whl_install` targets instead. + +The `sdist_build` repos are exposed so BUILD.bazel can rebuild the same +wheels under non-host target platforms. An anyarch build uses no CC +toolchain, so that matrix isolates a single property: the build tooling +(frontend and backend) must resolve for the exec platform even when the configuration targets another one. """ @@ -18,10 +25,6 @@ uv.project( default_build_dependencies = [ "build", "setuptools", - # The backends have to come through the project repo, not through the - # configure tool's `[build-system] requires` resolution: that path - # yields bare `whl_install` targets, and hatchling needs its own - # transitive closure (pathspec, pluggy, trove-classifiers, …). "flit-core", "hatch-vcs", "hatchling", diff --git a/e2e/crossbuild/pycross-pure-python/test_filelock.py b/e2e/crossbuild/pycross-pure-python/test_filelock.py index cffa86ad3..388192caa 100644 --- a/e2e/crossbuild/pycross-pure-python/test_filelock.py +++ b/e2e/crossbuild/pycross-pure-python/test_filelock.py @@ -4,7 +4,7 @@ class TestFileLock(unittest.TestCase): - def test_import(self): + def test_import(self) -> None: lock = filelock.FileLock("dummy.lock") self.assertIsNotNone(lock) diff --git a/e2e/crossbuild/pycross-pure-python/test_pyproject_metadata.py b/e2e/crossbuild/pycross-pure-python/test_pyproject_metadata.py index 739d34ff7..c388bc95f 100644 --- a/e2e/crossbuild/pycross-pure-python/test_pyproject_metadata.py +++ b/e2e/crossbuild/pycross-pure-python/test_pyproject_metadata.py @@ -4,7 +4,7 @@ class TestPyprojectMetadata(unittest.TestCase): - def test_import(self): + def test_import(self) -> None: self.assertIsNotNone(pyproject_metadata.__version__) diff --git a/e2e/crossbuild/pycross-pure-python/test_tomli.py b/e2e/crossbuild/pycross-pure-python/test_tomli.py index 48bdea076..7d48c36ed 100644 --- a/e2e/crossbuild/pycross-pure-python/test_tomli.py +++ b/e2e/crossbuild/pycross-pure-python/test_tomli.py @@ -4,7 +4,7 @@ class TestTomli(unittest.TestCase): - def test_parse(self): + def test_parse(self) -> None: d = tomli.loads("a = 1") self.assertEqual(d["a"], 1) diff --git a/e2e/crossbuild/pycross-pure-python/test_top_level_packages.py b/e2e/crossbuild/pycross-pure-python/test_top_level_packages.py index d77fc3d65..f26573a1c 100644 --- a/e2e/crossbuild/pycross-pure-python/test_top_level_packages.py +++ b/e2e/crossbuild/pycross-pure-python/test_top_level_packages.py @@ -1,11 +1,10 @@ -"""Verify that installed wheels have their top-level packages in site-packages. +"""Assert that source-built wheels land their top-level packages in site-packages. -This test works in two modes: -1. If PYCROSS_TEST_PACKAGES env var is set, it tests those packages (comma-separated). -2. Otherwise, it tests hardcoded packages (regex, IPython) for - the requirements e2e workspace. - -Packages are tested for importability and correct site-packages placement. +Ported from rules_pycross's shared top-level-packages check. The packages to +verify come from the comma-separated `PYCROSS_TEST_PACKAGES` env var, set by +the consuming py_test. Three invariants per package: it imports, its module +spec resolves inside site-packages rather than a leaked source tree or +`PYTHONPATH` entry, and no dist-info directory ends up on `sys.path`. """ import importlib @@ -16,20 +15,16 @@ class TopLevelPackagesTest(unittest.TestCase): - """Check that top_level_paths from wheel inspection actually show up.""" - - def _get_packages(self): - return [p.strip() for p in os.environ.get("PYCROSS_TEST_PACKAGES", "regex,IPython").split(",") if p.strip()] + def _get_packages(self) -> list[str]: + return [p.strip() for p in os.environ["PYCROSS_TEST_PACKAGES"].split(",") if p.strip()] - def test_packages_importable(self): - """All expected packages should be importable.""" + def test_packages_importable(self) -> None: for pkg in self._get_packages(): with self.subTest(package=pkg): mod = importlib.import_module(pkg) self.assertIsNotNone(mod, f"{pkg} imported as None") - def test_packages_resolve_to_site_packages(self): - """All expected packages should resolve to files within site-packages.""" + def test_packages_resolve_to_site_packages(self) -> None: for pkg in self._get_packages(): with self.subTest(package=pkg): spec = importlib.util.find_spec(pkg) @@ -41,8 +36,7 @@ def test_packages_resolve_to_site_packages(self): f"{pkg} origin not in site-packages: {spec.origin}", ) - def test_no_dist_info_on_sys_path(self): - """dist-info directories should not be added as sys.path entries.""" + def test_no_dist_info_on_sys_path(self) -> None: for path in sys.path: basename = os.path.basename(path) self.assertFalse( diff --git a/e2e/crossbuild/pycross-setuptools/BUILD.bazel b/e2e/crossbuild/pycross-setuptools/BUILD.bazel index df7c2a63b..db8890bb6 100644 --- a/e2e/crossbuild/pycross-setuptools/BUILD.bazel +++ b/e2e/crossbuild/pycross-setuptools/BUILD.bazel @@ -15,7 +15,7 @@ _DEP_GROUP = "pycross_setuptools" # The libc/version flags are what the wheel resolver keys platform-specific # wheel selection off; a bare constraint_values platform would leave build -# dependencies unresolvable. Same shape as //uv-deps-650/crossbuild. The +# dependencies unresolvable. Same shape as the e2e/crossbuild workspace. The # dep_group flag rides along because the wheel targets under `collect_wheels` # are reached through a platform transition, not through a py_venv. _PLATFORM_FLAGS = [ diff --git a/e2e/crossbuild/pycross-setuptools/pyproject.toml b/e2e/crossbuild/pycross-setuptools/pyproject.toml index c4e3838f3..292a3927f 100644 --- a/e2e/crossbuild/pycross-setuptools/pyproject.toml +++ b/e2e/crossbuild/pycross-setuptools/pyproject.toml @@ -6,9 +6,7 @@ dependencies = [ "build", "setuptools", "wheel", - # zstandard's setup.py builds a cffi backend when cffi is importable. "cffi", - # PyYAML 6.0.x cannot be cythonized by Cython 3. "cython<3.0", "pyyaml==6.0.1", "setproctitle==1.3.2", diff --git a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel index 012261ca9..74f51fb32 100644 --- a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel @@ -1,14 +1,36 @@ """Port of rules_pycross's `tests/e2e/build_setuptools` workspace. Three setuptools-backed C-extension packages are forced to build from their -sdists: PyYAML (Cython-generated extension), setproctitle (plain C) and -zstandard (vendored libzstd). Together they cover the `pep517_native_whl` -path for a Cython pipeline, a trivial extension and a large vendored-C build. +sdists (`[tool.uv] no-binary-package` in pyproject.toml), covering the +`pep517_native_whl` path for three distinct build shapes: -`env` on PyYAML ports rules_pycross's per-package `build_env` override -(`setuptools.override(name = "pyyaml", build_env = ...)`), and is observable -at runtime: with `PYYAML_FORCE_LIBYAML=0` the built wheel must not carry the -libyaml-backed `CLoader`. +- PyYAML 6.0.1: Cython-generated extension (sdist → cythonize → C → .so). + The lock pins `cython<3.0` because PyYAML 6.0.x cannot be cythonized by + Cython 3. +- setproctitle 1.3.2: a plain C extension, the minimal native case. +- zstandard 0.22.0: a large vendored-libzstd build, plus an optional cffi + backend its setup.py compiles whenever cffi is importable at build time. + +Each override exercises a different `uv.override_package` feature: + +- `env` on PyYAML ports rules_pycross's per-package `build_env` override + (`setuptools.override(name = "pyyaml", build_env = ...)`) and is observable + at runtime: with `PYYAML_FORCE_LIBYAML=0` the built wheel must not carry + the libyaml-backed `CLoader` (asserted by test_pyyaml.py). +- `pre_build_patches` on setproctitle removes its silent fallback to a pure + `py3-none-any` wheel when the extension fails to compile; see + require_extension.patch for why the fallback would mask a broken build. +- `resource_set` on zstandard declares the vendored-C compile's real memory + footprint so Bazel does not over-parallelize it. + +`default_build_dependencies` names cffi explicitly: zstandard's cffi backend +imports pycparser through cffi, and only the project repo's py_library carries +that transitive closure — the configure tool's `[build-system] requires` +resolution would yield a bare `whl_install` target without it. + +No cross-platform `collect_wheels` matrix here (unlike pycross-pure-python): +rebuilding these wheels for non-host targets would require a cross CC +toolchain this workspace does not set up. Not ported: rules_pycross builds psycopg2 with a `pg_config` tool dep and zstandard against a Bazel-built system libzstd. Both need `rules_foreign_cc` @@ -23,10 +45,6 @@ uv.project( "build", "setuptools", "wheel", - # zstandard's cffi backend imports pycparser through cffi. Naming cffi - # here routes it through the project repo's py_library, which carries - # that transitive closure; the configure tool's `[build-system] - # requires` resolution yields a bare `whl_install` target instead. "cffi", ], hub_name = "pypi_pycross_setuptools", @@ -40,6 +58,10 @@ uv.override_package( ) uv.override_package( name = "setproctitle", + # gcc_toolchain's GCC defaults to C23, where `bool` is a keyword; + # setproctitle 1.3.2's src/c.h still does `typedef char bool`. distutils + # appends $CFLAGS after its own flags, so the -std override wins. + env = {"CFLAGS": "-std=gnu17"}, lock = "//pycross-setuptools:uv.lock", pre_build_patch_strip = 1, pre_build_patches = ["//pycross-setuptools:require_extension.patch"], @@ -52,7 +74,5 @@ uv.override_package( use_repo( uv, "pypi_pycross_setuptools", - "sdist_build__pycross_setuptools__pyyaml__6_0_1", - "sdist_build__pycross_setuptools__setproctitle__1_3_2", "sdist_build__pycross_setuptools__zstandard__0_22_0", ) diff --git a/e2e/crossbuild/pycross-setuptools/test_pyyaml.py b/e2e/crossbuild/pycross-setuptools/test_pyyaml.py index 1853f0771..b6460a4e1 100644 --- a/e2e/crossbuild/pycross-setuptools/test_pyyaml.py +++ b/e2e/crossbuild/pycross-setuptools/test_pyyaml.py @@ -1,12 +1,17 @@ -# Ported from rules_pycross tests/e2e/build_setuptools/tests/test_pyyaml.py. -# The `CLoader` assertion is added: rules_pycross's version tolerates either -# backend, which leaves its `build_env` override untested. The build sets -# PYYAML_FORCE_LIBYAML=0, so the source build must have produced the pure-Python -# backend — if the override never reached the build action, CLoader is present. +"""Assert PyYAML built from sdist without the libyaml `CLoader` backend. + +Ported from rules_pycross tests/e2e/build_setuptools/tests/test_pyyaml.py, +with the `CLoader` assertion added: rules_pycross's version tolerates either +backend, which leaves its `build_env` override untested. The build sets +`PYYAML_FORCE_LIBYAML=0` via `uv.override_package(env = ...)`, so the source +build must have produced the pure-Python backend — if the override never +reached the build action, `CLoader` is importable and this test fails. +""" + import yaml -def test_pyyaml_import(): +def test_pyyaml_import() -> None: try: from yaml import CLoader as Loader except ImportError: diff --git a/e2e/crossbuild/pycross-setuptools/test_setproctitle.py b/e2e/crossbuild/pycross-setuptools/test_setproctitle.py index 44541f3a7..cb2cef063 100644 --- a/e2e/crossbuild/pycross-setuptools/test_setproctitle.py +++ b/e2e/crossbuild/pycross-setuptools/test_setproctitle.py @@ -1,10 +1,18 @@ +"""Smoke test for setproctitle built from its sdist. + +Ported from rules_pycross tests/e2e/build_setuptools/tests/test_setproctitle.py. +require_extension.patch makes the C extension mandatory, so a passing import +here means the native build ran — the upstream pure-Python fallback cannot +have papered over a compile failure. +""" + import unittest import setproctitle class TestSetproctitle(unittest.TestCase): - def test_import(self): + def test_import(self) -> None: title = setproctitle.getproctitle() self.assertIsNotNone(title) diff --git a/e2e/crossbuild/pycross-setuptools/test_zstandard.py b/e2e/crossbuild/pycross-setuptools/test_zstandard.py index c944a74d9..691192062 100644 --- a/e2e/crossbuild/pycross-setuptools/test_zstandard.py +++ b/e2e/crossbuild/pycross-setuptools/test_zstandard.py @@ -1,3 +1,10 @@ +"""Round-trip compress/decompress through zstandard built from its sdist. + +Ported from rules_pycross tests/e2e/build_setuptools/tests/test_zstandard.py. +A successful round trip proves the extension compiled against the vendored +libzstd actually works, not merely that the module imports. +""" + import unittest import zstandard @@ -28,17 +35,13 @@ class TestZstandard(unittest.TestCase): - def test_roundtrip(self): + def test_roundtrip(self) -> None: cctx = zstandard.ZstdCompressor() compressed = cctx.compress(ZEN) - - # Make sure we actually compressed assert len(compressed) < len(ZEN) dctx = zstandard.ZstdDecompressor() decompressed = dctx.decompress(compressed) - - # Check the round trip assert decompressed == ZEN diff --git a/e2e/crossbuild/tools/collect_wheels.bzl b/e2e/crossbuild/tools/collect_wheels.bzl index defa15f69..53d19df76 100644 --- a/e2e/crossbuild/tools/collect_wheels.bzl +++ b/e2e/crossbuild/tools/collect_wheels.bzl @@ -11,7 +11,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("@bazel_lib//lib:run_binary.bzl", "run_binary") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") -def collect_wheels(name, wheels, platforms, expected_tags = None, **kwargs): +def collect_wheels(name, wheels, platforms, expected_tags): """Builds `wheels` once per entry in `platforms` and collects them. Args: @@ -19,12 +19,13 @@ def collect_wheels(name, wheels, platforms, expected_tags = None, **kwargs): wheels: Wheel labels, e.g. `["@sdist_build__x__y__1_0//:whl"]`. platforms: Platform labels to build each wheel for. expected_tags: Substrings that must each appear in at least one - collected wheel filename. When set, declares `_tags_test`. - **kwargs: Forwarded to the collecting `run_binary`. + collected wheel filename, asserted by `_tags_test`. + + The inner `_wheels` filegroup is tagged manual: it is only reachable + through the platform transitions declared here, which are what supply the + dep_group and libc flags the wheel targets select on. """ - # Manual: only reachable through the platform transitions below, which are - # what supply the dep_group and libc flags the wheel targets select on. native.filegroup( name = name + "_wheels", srcs = wheels, @@ -56,14 +57,12 @@ def collect_wheels(name, wheels, platforms, expected_tags = None, **kwargs): ], out_dirs = [name], tool = "//tools:collect_wheels_tool", - **kwargs ) - if expected_tags: - py_test( - name = name + "_tags_test", - srcs = ["//tools:check_wheel_tags.py"], - main = "//tools:check_wheel_tags.py", - args = ["$(rootpath :{})".format(name)] + expected_tags, - data = [name], - ) + py_test( + name = name + "_tags_test", + srcs = ["//tools:check_wheel_tags.py"], + main = "//tools:check_wheel_tags.py", + args = ["$(rootpath :{})".format(name)] + expected_tags, + data = [name], + ) diff --git a/e2e/crossbuild/tools/collect_wheels.py b/e2e/crossbuild/tools/collect_wheels.py index 9dc094881..a834aa256 100644 --- a/e2e/crossbuild/tools/collect_wheels.py +++ b/e2e/crossbuild/tools/collect_wheels.py @@ -1,8 +1,9 @@ """Copy every .whl reachable from the given paths into one output directory. -Ported from rules_pycross (tests/e2e/shared/collect_wheels.py). Inputs are a -mix of plain wheel files and tree artifacts holding wheels, because -pep517_whl/pep517_native_whl declare a directory output. +Ported from rules_pycross (tests/e2e/shared/collect_wheels.py). Inputs are +tree artifacts holding wheels — pep517_whl/pep517_native_whl declare a +directory output. The same anyarch wheel can arrive through more than one +platform transition, so first copy wins. """ import argparse @@ -10,10 +11,10 @@ from pathlib import Path -def main(): +def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--out-dir", required=True) - parser.add_argument("wheel", nargs="*", default=[]) + parser.add_argument("wheel", nargs="*") args = parser.parse_args() out_dir = Path(args.out_dir) @@ -21,25 +22,11 @@ def main(): for wheel_str in args.wheel: for p in wheel_str.split(" "): - wheel_path = Path(p) - - if wheel_path.is_dir(): - for whl in wheel_path.glob("*.whl"): - real_path = whl.resolve() - target_path = out_dir / real_path.name - if not target_path.exists(): - shutil.copy2(real_path, target_path) - continue - - if not wheel_path.name.endswith(".whl"): - continue - - real_path = wheel_path.resolve() - target_path = out_dir / real_path.name - if target_path.exists(): - continue - - shutil.copy2(real_path, target_path) + for whl in Path(p).glob("*.whl"): + real_path = whl.resolve() + target_path = out_dir / real_path.name + if not target_path.exists(): + shutil.copy2(real_path, target_path) if __name__ == "__main__": From 8d67ac23075991a064ef6f1d40c8fd90c71ac43d Mon Sep 17 00:00:00 2001 From: xangcastle Date: Tue, 11 Aug 2026 22:48:28 -0600 Subject: [PATCH 032/103] test(e2e): restore the cross-arch pyc precompilation regression guard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit uv-deps-650/crossbuild's test_crossbuild_pyc.sh guarded whl_install's compileall picking the exec-platform interpreter under a cross transition; its removal left that regression uncovered. The restored guard is stronger than the original "it builds" check: - the platform pins //uv/private/pyc:precompile=True, so the coverage survives a future default flip instead of silently draining - the sh_test asserts .pyc files actually exist in the cross-built install tree, catching exec_matches_target silently skipping compileall — verified to fail when precompile is off Asserted over the binary's runfiles rather than an image layer: py_image_layer deliberately drops __pycache__ from layer mtrees. --- e2e/crossbuild/compile_pyc/BUILD.bazel | 61 +++++++++++++++++++ .../compile_pyc/compile_pyc_main.py | 3 + .../compile_pyc/test_compile_pyc.sh | 24 ++++++++ 3 files changed, 88 insertions(+) create mode 100644 e2e/crossbuild/compile_pyc/BUILD.bazel create mode 100644 e2e/crossbuild/compile_pyc/compile_pyc_main.py create mode 100755 e2e/crossbuild/compile_pyc/test_compile_pyc.sh diff --git a/e2e/crossbuild/compile_pyc/BUILD.bazel b/e2e/crossbuild/compile_pyc/BUILD.bazel new file mode 100644 index 000000000..7f60afe8c --- /dev/null +++ b/e2e/crossbuild/compile_pyc/BUILD.bazel @@ -0,0 +1,61 @@ +# Regression guard for cross-arch whl_install pyc precompilation. +# +# Ported from uv-deps-650/crossbuild's test_crossbuild_pyc.sh, strengthened: +# building the arm64 binary on an amd64 host runs whl_install's compileall +# for a non-host wheel, which must use the exec-platform interpreter (the +# original regression was "Exec format error" from selecting the arm64 one). +# Two silent-decay modes the original "it builds" check missed are covered: +# +# - the //uv/private/pyc:precompile default flipping to False would drain +# this coverage from every other case in the workspace without a failure, +# so the platform pins the flag True regardless of the default; +# - whl_install skips compileall without failing when exec_matches_target +# misdetects (see uv/private/whl_install/rule.bzl), so the assertion is +# ".pyc files exist in the install tree", not "the build succeeded". +# +# The assertion walks the binary's runfiles rather than an image layer: +# py_image_layer deliberately drops __pycache__ from layer mtrees (see +# _should_skip_pkg_path in py/private/py_image_layer.bzl), so layers can +# never witness this. +# +# filelock rides along from the pycross-pure-python hub: anyarch, built from +# sdist, no CC toolchain — the cheapest wheel in the workspace. + +load("@aspect_rules_py//py:defs.bzl", "py_binary") +load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") +load("@rules_shell//shell:sh_test.bzl", "sh_test") + +platform( + name = "arm64_linux_precompile", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/pyc:precompile=True", + ], +) + +py_binary( + name = "pyc_probe_bin", + srcs = ["compile_pyc_main.py"], + dep_group = "pycross_pure_python", + main = "compile_pyc_main.py", + python_version = "3.12", + deps = ["@pypi_pycross_pure_python//filelock"], +) + +platform_transition_filegroup( + name = "arm64_pyc_probe", + srcs = [":pyc_probe_bin"], + target_platform = ":arm64_linux_precompile", +) + +sh_test( + name = "compile_pyc_arm64_test", + srcs = ["test_compile_pyc.sh"], + data = [":arm64_pyc_probe"], + target_compatible_with = ["@platforms//os:linux"], +) diff --git a/e2e/crossbuild/compile_pyc/compile_pyc_main.py b/e2e/crossbuild/compile_pyc/compile_pyc_main.py new file mode 100644 index 000000000..6608fcdf9 --- /dev/null +++ b/e2e/crossbuild/compile_pyc/compile_pyc_main.py @@ -0,0 +1,3 @@ +import filelock + +print(filelock.__version__) diff --git a/e2e/crossbuild/compile_pyc/test_compile_pyc.sh b/e2e/crossbuild/compile_pyc/test_compile_pyc.sh new file mode 100755 index 000000000..18d31662a --- /dev/null +++ b/e2e/crossbuild/compile_pyc/test_compile_pyc.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# Assert the cross-built (arm64) filelock install tree carries precompiled +# .pyc files. The data dep building at all already proves compileall did not +# pick the target-arch interpreter (the original "Exec format error" +# regression); the count check below additionally catches compileall being +# silently skipped. +set -euo pipefail + +install_root="$(find "$TEST_SRCDIR" -type d -path '*whl_install__pycross_pure_python__filelock*' -name '*.install' | head -1)" +if [ -z "$install_root" ]; then + echo "FAIL: filelock whl_install tree not found under TEST_SRCDIR" + exit 1 +fi + +count="$(find "$install_root" -path '*/filelock/__pycache__/*.pyc' | wc -l)" +if [ "$count" -lt 1 ]; then + echo "FAIL: no precompiled .pyc under $install_root" + echo "whl_install's compileall either failed to run for this configuration" + echo "or was silently skipped (see exec_matches_target in" + echo "uv/private/whl_install/rule.bzl)." + exit 1 +fi + +echo "PASS: $count precompiled .pyc files in the cross-built filelock install" From c6fc189a3fd794ea48961b027574e9b22652ce23 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 13 Aug 2026 17:07:11 -0600 Subject: [PATCH 033/103] fix(e2e): regenerate the crossbuild lockfile with the pinned bazel 8.6.0 The committed lock carried lockFileVersion 28 (a bazel 9 artifact), which --lockfile_mode=error rejects under the workspace's .bazelversion. --- e2e/crossbuild/MODULE.bazel.lock | 403 ++++++++++++++++++++++++++++++- 1 file changed, 398 insertions(+), 5 deletions(-) diff --git a/e2e/crossbuild/MODULE.bazel.lock b/e2e/crossbuild/MODULE.bazel.lock index f196b3cd8..d58d47c51 100644 --- a/e2e/crossbuild/MODULE.bazel.lock +++ b/e2e/crossbuild/MODULE.bazel.lock @@ -165,8 +165,7 @@ "https://bcr.bazel.build/modules/rules_oci/2.2.7/source.json": "b099f02af330f47f19dc67fc9300ef6e1937a8c86882690db0e7a2fcea8c7f6b", "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", - "https://bcr.bazel.build/modules/rules_pkg/1.1.0/source.json": "fef768df13a92ce6067e1cd0cdc47560dace01354f1d921cfb1d632511f7d608", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", @@ -179,7 +178,6 @@ "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", - "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", @@ -202,8 +200,7 @@ "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/MODULE.bazel": "b573395fe63aef4299ba095173e2f62ccfee5ad9bbf7acaa95dba73af9fc2b38", - "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/MODULE.bazel": "6b6c543e415d2a502954766e50c6a6144a131687f2751b62157a9250e2b04982", - "https://bcr.bazel.build/modules/with_cfg.bzl/0.14.6/source.json": "12363ac76d821f6c7dabfebbd673615391da06e2e33f576402d31a96a7b56532", + "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/source.json": "3f3fbaeafecaf629877ad152a2c9def21f8d330d91aa94c5dc75bbb98c10b8b8", "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", "https://bcr.bazel.build/modules/yq.bzl/0.1.1/source.json": "2d2bad780a9f2b9195a4a370314d2c17ae95eaa745cefc2e12fbc49759b15aa3", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", @@ -356,6 +353,250 @@ ] } }, + "@@gcc_toolchain+//:internal.bzl%non_bazel_dependencies": { + "general": { + "bzlTransitiveDigest": "hmUGYjMm3KwHvLCbnHLlUJifQF92hJY/BW858Vkjzr8=", + "usagesDigest": "QxuddaEOFhA9BcbwTpSCM3BEIa2u7hr8DlVSo/gl5a4=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "openssl": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"srcs\",\n srcs = glob(\n include = [\"**\"],\n exclude = [\"**/* *\"],\n ),\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a", + "strip_prefix": "openssl-1.1.1n", + "url": "https://www.openssl.org/source/openssl-1.1.1n.tar.gz" + } + }, + "lapack": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "build_file_content": "filegroup(\n name = \"srcs\",\n srcs = glob(\n include = [\"**\"],\n exclude = [\"**/* *\"],\n ),\n visibility = [\"//visibility:public\"],\n)\n", + "patch_cmds": [ + "cat > make.inc < Date: Thu, 13 Aug 2026 20:58:26 -0600 Subject: [PATCH 034/103] refactor(uv): deduplicate and tighten build_helper.py Behavior-neutral cleanup, verified by a full from-scratch rebuild of the e2e/crossbuild suite (every action key changed with the tool): - _get_wrapper_flags no longer reimplements the sysroot absolutization that _absolutize_sysroot_flags already does; it absolutizes first and only filters. The execroot rationale now lives in one place. - A NoReturn _die() replaces nine print-to-stderr-then-exit blocks. The build-command-detection branch keeps an explicit raise because ty does not narrow NoReturn in module-level flow. - _expected_cpu_in_tag drops the identity entries from its maps. - Comments and docstrings compress to their load-bearing rationale; the module docstring now describes what the script actually is. Prose that restated the code, duplicated an in-template comment, or carried reference URLs is gone. --- uv/private/pep517_whl/build_helper.py | 421 +++++++++----------------- 1 file changed, 147 insertions(+), 274 deletions(-) diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/build_helper.py index 60df11481..cec8c754c 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/build_helper.py @@ -1,9 +1,12 @@ #!/usr/bin/env python3 -""" -A minimal python3 -m build wrapper +"""Drive a PEP 517 sdist-to-wheel build inside a Bazel action. -Mostly exists to allow debugging. +Unpacks the sdist, assembles a build environment that survives the backend's +chdir (compiler wrappers, absolutized toolchain paths) and — in cross mode — +fakes the target platform's identity for the backend, then runs the +pypa/build frontend. Deliberately a single self-contained script: it is the +`main` of the py_binary each sdist_build repo generates. """ from __future__ import annotations @@ -20,7 +23,7 @@ from os import chmod, defpath, listdir, makedirs, path, pathsep from subprocess import CalledProcessError, check_call, check_output, STDOUT, run from tempfile import TemporaryFile -from typing import Dict, Optional +from typing import Dict, NoReturn, Optional try: tomllib = importlib.import_module("tomllib") @@ -34,24 +37,22 @@ ) -# Compiler commands must remain valid across working-directory changes. -# argv[0] must name the resolved driver because compilers may use its directory -# to locate sibling tools and resources. Clang does so under -no-canonical-prefixes: -# https://github.com/llvm/llvm-project/blob/llvmorg-22.1.4/clang/tools/driver/driver.cpp#L63-L78 +def _die(message: str) -> NoReturn: + print(message, file=sys.stderr) + sys.exit(1) + + +# Clang-only DWARF flag some Bazel toolchains inject; stripped by the +# wrappers because non-clang drivers reject it. _DEBUG_FLAG = "-fdebug-default-version=4" -# gcc_toolchain's tool_path for the cpp_compile/cpp_link_dynamic_library -# actions is plain "gcc", not "g++": Bazel toolchains dispatch C vs C++ by -# file extension/-x, not by driver name, and gcc_toolchain's link flags carry -# no -lstdc++. `-static-libstdc++` alone is a no-op there — that flag only -# modifies an *implicit* libstdc++ link that only the "g++" argv[0] spec adds -# in the first place. `-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic` forces the static -# archive regardless of driver name, making a C++ extension self-contained -# instead of depending on the target's libstdc++.so.6 matching ours — and -# without it, cross-arch (and even native) C++ extensions can build and even -# import (borrowing symbols another already-loaded .so happened to pull in) -# yet fail once nothing else in the process provides them. GNU-ld-only -# syntax: skipped on Darwin, where clang++ already links libc++ implicitly. +# Forces the static libstdc++ archive regardless of driver name. Plain +# `-static-libstdc++` is a no-op under gcc_toolchain, whose tool_path is +# "gcc" (not "g++"): that flag only modifies the implicit libstdc++ link the +# "g++" argv[0] spec adds. Without this, C++ extensions can build and even +# import (borrowing symbols another loaded .so pulled in) yet fail at +# runtime. GNU-ld-only syntax: skipped on Darwin, where clang++ links libc++ +# implicitly. _STATIC_LIBSTDCXX_FLAGS = ("-Wl,-Bstatic", "-lstdc++", "-Wl,-Bdynamic") _COMPILER_WRAPPER = """#!/usr/bin/env python3 @@ -137,38 +138,26 @@ filtered.append(a) i += 1 -# Standalone (non-"-shared") executables built by this cross toolchain are -# never the actual wheel deliverable — always some build tool's own -# throwaway sanity-check/feature-probe binary (e.g. meson's own compiler -# check, or a project's cc.run() call) that an exe_wrapper immediately -# executes under QEMU. Dynamically-linked target-arch PIE binaries hit a -# real qemu-user/glibc bug there ("Inconsistency detected by ld.so: -# ... DT_VERSYM ... Assertion failed") on process startup's own relocation -# path, verified independent of any toolchain mismatch (a single-toolchain -# hello-world binary reproduces it); statically linking sidesteps it -# entirely, since it never touches ld.so's dynamic-executable-startup path. -# The actual .so deliverables this wrapper also builds are unaffected — -# they always pass "-shared" and load via dlopen()'s own, unrelated path. -# Mutually exclusive with the static-libstdc++-only trick below: a trailing -# "-Wl,-Bdynamic" there would undo a preceding bare "-static" for whatever -# the driver appends after our args (libc included), reintroducing the same -# bug — and full static linking already covers libstdc++ too, making that -# partial trick redundant for a binary that's never shipped anyway. +# Standalone (non-"-shared") executables built here are never the wheel +# deliverable — only throwaway feature probes (meson sanity checks, +# cc.run()) executed under QEMU, where dynamically-linked target-arch PIE +# binaries hit a real qemu-user/glibc startup bug ("Inconsistency detected +# by ld.so: ... DT_VERSYM"), reproducible with a single-toolchain +# hello-world. "-static" sidesteps ld.so entirely; the .so deliverables +# always pass "-shared" and load via dlopen's unrelated path. Mutually +# exclusive with the static-libstdc++ trick: its trailing "-Wl,-Bdynamic" +# would undo a bare "-static" for driver-appended libs (libc included). is_shared = "-shared" in filtered if is_link and exe_link_flags: - # LLVM-style toolchain (nonempty exe_link_flags, see the "-nostdlib++" - # detection in build_helper): clang only reaches its crt objects and - # glibc/libc++ archives through the link action's -B/-L/--sysroot flags - # (no self-contained GCC-like prefix layout), and not every caller - # threads $LDSHARED through — rustc invokes this wrapper as "-C linker" - # with its own args, meson links its probe executables bare. Bake the - # flags into every link; duplicates from the $LDSHARED path are - # harmless to clang. No "-static" for probe executables here: the QEMU - # ld.so bug that motivates it is only reachable via gcc_toolchain on - # the Linux CI runner. - # rustc hardcodes "-lgcc_s" for its unwinder on *-linux-gnu targets; - # this toolchain ships no libgcc at all — statically fold in its - # libunwind instead (cargo-zigbuild's trick, same ABI surface). + # LLVM-style toolchain (see the "-nostdlib++" detection in + # build_helper): clang only reaches its crt objects and glibc/libc++ + # archives through the link action's -B/-L/--sysroot flags, and not + # every caller threads $LDSHARED through (rustc invokes this wrapper as + # "-C linker", meson links probes bare) — bake the flags into every + # link; duplicates are harmless to clang. + # rustc hardcodes "-lgcc_s" on *-linux-gnu but this toolchain ships no + # libgcc — fold in its static libunwind instead (cargo-zigbuild's + # trick, same ABI surface). filtered = ["-lunwind" if a == "-lgcc_s" else a for a in filtered] filtered.extend(exe_link_flags) if is_cxx: @@ -255,13 +244,8 @@ def _darwin_kernel_release(macos_deployment_target: Optional[str]) -> str: def _absolutize_path(value: str) -> str: - """Resolve a relative path to absolute, leaving absolute/empty values untouched. - - Shared by _resolve_compiler_path (CC/CXX) and _absolutize_tool_paths. - Toolchain execroot-relative paths break once the PEP 517 backend chdirs into the - unpacked sdist. Centralizing the policy keeps the two paths in lockstep - and gives future toolchains (FC, RUSTC, ...) a single primitive to call. - """ + """Make a relative path absolute: execroot-relative toolchain paths stop + resolving once the PEP 517 backend chdirs into the unpacked sdist.""" return path.abspath(value) if value and not path.isabs(value) else value @@ -371,32 +355,20 @@ def _get_wrapper_flags(cflags: str) -> list[str]: """Extract identity flags (-target, --sysroot, -isysroot, ...) from CFLAGS. The PEP 517 backend (setuptools, meson-python) may strip these when - constructing its own compile commands. The cross wrapper re-injects - them on every invocation to guarantee the real compiler targets the - correct platform. - - Sysroot values are absolutized while this still runs from the execroot: - toolchains hand out execroot-relative paths (e.g. the llvm module's - external/…/macos_sdk/sysroot), which stop resolving once the backend - chdirs into the unpacked sdist — the compiler then silently falls back - to default header search paths and the linker finds no libraries at all. + constructing its own compile commands; the cross wrapper re-injects them + on every invocation so the real compiler always targets the right + platform. Sysroot values are absolutized first (see + _absolutize_sysroot_flags for why that must happen in the execroot). """ - parts = shlex.split(cflags) + parts = shlex.split(_absolutize_sysroot_flags(cflags)) result = [] i = 0 while i < len(parts): p = parts[i] if any(p == prefix or p.startswith(prefix + "=") for prefix in _IDENTITY_FLAG_PREFIXES): - if "=" in p: - flag, _, value = p.partition("=") - if flag in _SYSROOT_FLAG_PREFIXES: - p = "{}={}".format(flag, _absolutize_path(value)) result.append(p) if "=" not in p and i + 1 < len(parts) and not parts[i + 1].startswith("-"): - value = parts[i + 1] - if p in _SYSROOT_FLAG_PREFIXES: - value = _absolutize_path(value) - result.append(value) + result.append(parts[i + 1]) i += 1 i += 1 return result @@ -493,13 +465,9 @@ def _compiler_env( if execroot_marker: execroot = os.getcwd() env = {key: value.replace(execroot_marker, execroot) for key, value in env.items()} - # The helper's launcher exports RUNFILES_DIR, RUNFILES_MANIFEST_FILE, and - # JAVA_RUNFILES: - # https://github.com/hermeticbuild/hermetic-launcher/blob/381814d0818af0573263323dc0dd0e4e208fc3fa/README.md#runfiles-discovery - # Bazel adds RUNFILES_MANIFEST_ONLY when runfiles trees are disabled: - # https://github.com/bazelbuild/bazel/blob/9.1.1/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java#L192-L201 - # Nested Bazel executables check that inherited state before adjacent - # runfiles, so remove the parent's identity before package code runs. + # The helper's own launcher exported this runfiles identity; nested Bazel + # executables launched by package code would trust it over their adjacent + # runfiles, so strip it before any package code runs. for key in ( "JAVA_RUNFILES", "RUNFILES_DIR", @@ -507,15 +475,11 @@ def _compiler_env( "RUNFILES_MANIFEST_ONLY", ): env.pop(key, None) - # A build dependency's console-script wrappers resolve their own bundled - # binary via Python import machinery (ninja, meson), so they never need - # PATH. Some (maturin) instead ship a plain wheel-data script under - # /bin — rules_py's venv assembly only merges each - # dep's lib/site-packages into the shared venv, not its bin/, so that - # script never lands on sys.path or PATH by itself. Its files are still - # real runfiles under the runfiles root, just not indexed anywhere else, - # so find it the same way Bazel's own runfiles resolution would: walk - # the runfiles tree for a whl_install output's bin/ directory. + # Some build deps (maturin) ship plain wheel-data scripts under + # /bin, which venv assembly never merges (it only + # merges lib/site-packages) — so they land on neither sys.path nor PATH. + # They are still real runfiles; walk the runfiles roots for whl_install + # bin/ dirs and put those on PATH. bin_dirs = [] for runfiles_root in sys.path: if not path.isdir(runfiles_root) or "runfiles" not in runfiles_root: @@ -534,16 +498,11 @@ def _compiler_env( env["TEMP"] = tmpdir env["TEMPDIR"] = tmpdir - # python-build-standalone interpreters (our python_interpreters toolchain) - # bake their *original build-time* prefix into sysconfig's LIBDIR - # (observed: "/install/lib", nonexistent once relocated into a Bazel - # toolchain) — harmless for pure-Python builds, but anything that needs - # to actually link against libpythonX.Y (meson's own Cython compiler - # sanity check does, to link its transpiled-and-compiled test program) - # fails with "cannot find -lpythonX.Y". The toolchain's own pkg-config - # file resolves paths relative to itself instead (${pcfiledir}/../..), - # so pointing PKG_CONFIG_PATH at it sidesteps the broken sysconfig value - # entirely for any tool that tries pkg-config before falling back to it. + # PBS interpreters bake their original build-time prefix into sysconfig's + # LIBDIR ("/install/lib", nonexistent after relocation), so anything that + # links libpythonX.Y (meson's Cython sanity check) fails. The + # interpreter's own pkg-config file resolves relative to itself + # (${pcfiledir}/../..) — point PKG_CONFIG_PATH at it instead. interpreter_root = path.dirname(path.dirname(path.realpath(sys.executable))) pkgconfig_dir = path.join(interpreter_root, "lib", "pkgconfig") if path.isdir(pkgconfig_dir): @@ -582,30 +541,25 @@ def _compiler_env( cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path, is_darwin=is_darwin, exe_link_flags=exe_link_flags) cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path, is_cxx=True, is_darwin=is_darwin, exe_link_flags=exe_link_flags) - # gcc_toolchain's own layout (/xbin/gcc, /sysroot/...): - # a target-arch binary linked by this compiler needs ITS glibc/loader - # to run, not whatever the exec host or an unrelated toolchain (e.g. - # our python_interpreters build) happens to provide. Only meson's - # exe_wrapper (see _generate_meson_cross_file) uses this today. + # gcc_toolchain layout (/xbin/gcc, /sysroot/...): a + # target-arch binary needs THIS toolchain's glibc/loader to run. + # Consumed only by meson's exe_wrapper (_generate_meson_cross_file). target_gcc_sysroot = path.join(path.dirname(path.dirname(cc_path)), "sysroot") if not is_darwin and path.isdir(target_gcc_sysroot): env["RULES_PY_TARGET_GCC_SYSROOT"] = target_gcc_sysroot # The llvm toolchain on a darwin exec host reports llvm-libtool-darwin - # as its static archiver — a Mach-O-only tool that meson then invokes - # with ar-style args ("csr ...") for the target's static libs. For ELF - # targets swap in the sibling llvm-ar, which is what those args and - # the target format actually require. + # (Mach-O-only) as archiver; for ELF targets swap in the sibling + # llvm-ar, which the ar-style args and target format require. ar_path = env.get("AR", "") if not is_darwin and path.basename(ar_path) == "llvm-libtool-darwin": llvm_ar = path.join(path.dirname(ar_path), "llvm-ar") if path.exists(llvm_ar): env["AR"] = llvm_ar - # apple_support's wrapped_clang substitutes __BAZEL_XCODE_DEVELOPER_DIR__ - # and __BAZEL_XCODE_SDKROOT__ in its arguments from these variables and - # hard-fails without DEVELOPER_DIR. Bazel injects them only into actions - # with Xcode execution requirements, which this PEP 517 action is not. + # apple_support's wrapped_clang hard-fails without DEVELOPER_DIR / + # SDKROOT; Bazel injects them only into actions with Xcode execution + # requirements, which this PEP 517 action is not. if is_darwin and _platform.system() == "Darwin": if "DEVELOPER_DIR" not in env: developer_dir = _xcode_developer_dir() @@ -650,9 +604,8 @@ def _compiler_env( site_dir = _generate_cross_site(tmpdir, target_os, target_cpu, deployment_target) env["PYTHONPATH"] = site_dir + pathsep + env.get("PYTHONPATH", "") - # MPI builds (e.g. mpi4py) consult $MPICC before searching PATH, so a - # plain C compiler here would shadow the real mpicc. Only set it when - # a system mpicc exists, wrapped to keep the debug-flag stripping. + # MPI builds (mpi4py) consult $MPICC before PATH; only set it when a real + # mpicc exists, wrapped to keep the debug-flag stripping. mpicc_path = shutil.which("mpicc", path=env["PATH"]) if mpicc_path: env.setdefault("MPICC", _make_compiler_wrapper(tmpdir, "mpicc", mpicc_path, sysroot)) @@ -667,17 +620,13 @@ def _compiler_env( ]: _override_tool(env, key, wrapper) - # maturin's PEP 517 wrapper (and setuptools-rust) locate cargo via - # shutil.which("cargo"), not just $CARGO — otherwise they fall back to - # auto-installing a Rust toolchain via the puccinialin package, which - # isn't one of our declared build deps. + # maturin and setuptools-rust locate cargo via shutil.which, not $CARGO — + # without it on PATH they auto-install a Rust toolchain (puccinialin). cargo_path = env.get("CARGO") if cargo_path: env["PATH"] = pathsep.join([path.dirname(cargo_path), env.get("PATH", defpath)]) - # Cargo defaults its registry cache to $CARGO_HOME (~/.cargo), which - # in the sandbox is a read-only path outside the action's writable - # tree — give it a real, writable home instead. + # Cargo's default $CARGO_HOME (~/.cargo) is unwritable in the sandbox. cargo_home = path.join(tmpdir, ".cargo_home") makedirs(cargo_home, exist_ok=True) env.setdefault("CARGO_HOME", cargo_home) @@ -725,14 +674,11 @@ def _generate_cmake_toolchain_file( ) -> str: """Cross toolchain file for scikit-build-core/CMake. - scikit-build-core's cross-compile detection only covers macOS - ARCHFLAGS/CMAKE_OSX_ARCHITECTURES (see its builder.py); a generic - Linux-arch cross build gets none of that, so CMake configures as a - native build. It still compiles/links fine off $CC/$CXX, but - CMAKE_STRIP falls back to `find_program`'s host `strip` rather than - ours, which then rejects the foreign-arch .so ("Unable to recognise - the format of the input file"). Setting CMAKE_SYSTEM_NAME also puts - CMake into real CMAKE_CROSSCOMPILING mode. + scikit-build-core only auto-detects macOS ARCHFLAGS cross builds; a + Linux-arch cross build configures as native — it compiles fine off + $CC/$CXX but find_program picks the host `strip`, which rejects the + foreign-arch .so. CMAKE_SYSTEM_NAME also enables real + CMAKE_CROSSCOMPILING mode. """ return _write_generated_file( path.join(tmpdir, "cross_toolchain.cmake"), @@ -773,35 +719,20 @@ def _generate_meson_cross_file( ) -> str: """Cross file for meson-python. - meson-python only auto-synthesizes a cross file for macOS ARCHFLAGS, - cibuildwheel/Android, and iOS (see its __init__.py); a generic - Linux-arch cross build gets none of that and configures as a native - build, so meson tries to run its compiler sanity-check binary and - fails with "not runnable". `needs_exe_wrapper` alone only covers - meson's OWN compiler sanity checks (which just skip running anything - when it's set) — some projects' meson.build also call `cc.run()` - directly (numpy does, for a runtime feature check), which instead - hard-errors ("Can not run test applications in this cross - environment") unless an actual `exe_wrapper` program is configured. - binfmt_misc on this host already runs target-arch ELFs transparently - (verified: qemu-aarch64 is registered), so the wrapper mostly just - needs to exec straight through — it's meson's contract that needs a - program here, not anything the emulation itself is missing. The one - thing it does add is QEMU_LD_PREFIX, pointed at the gcc cross - toolchain's own sysroot: meson's *compiler* sanity check links a tiny - test binary against that sysroot's glibc, and without QEMU_LD_PREFIX - qemu-user falls back to searching the exec host's own filesystem for - ld-linux-aarch64.so.1 (an amd64 Linux box has none) — an entirely - different failure mode than the earlier "not runnable" one, but the - same root cause of not telling qemu-user which glibc actually matches. + meson-python only auto-synthesizes a cross file for macOS + ARCHFLAGS/cibuildwheel/iOS; a Linux-arch cross build configures as + native and meson fails running its compiler sanity-check binary. + `needs_exe_wrapper` alone only covers meson's own checks — projects + calling `cc.run()` directly (numpy) hard-error unless a real + `exe_wrapper` program exists. binfmt_misc+qemu-user already runs + target-arch ELFs transparently, so the wrapper just execs through; what + it adds is QEMU_LD_PREFIX pointed at the cross toolchain's sysroot, + without which qemu-user searches the exec host for the target's + ld-linux/glibc and finds none. """ - # The passthrough wrapper relies on the exec host transparently running - # target-arch ELFs (binfmt_misc + qemu-user) — a Linux-host capability. - # A darwin host cannot execute ELF at all, and an exe_wrapper that fails - # makes meson's sanity check fail outright; with needs_exe_wrapper=true - # and NO exe_wrapper, meson skips running its own checks instead, and - # projects calling cc.run() get meson's own explicit "can not run test - # applications" error — an honest host limitation, not a masked one. + # A darwin host cannot execute ELF at all; with needs_exe_wrapper=true + # and NO exe_wrapper, meson skips its own checks and cc.run() callers get + # meson's explicit cross-environment error — an honest host limitation. exe_wrapper_line = "" if _platform.system() == "Linux": exe_wrapper = _write_generated_file( @@ -853,13 +784,11 @@ def _generate_meson_cross_file( def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> str: """Symlink-merge the target toolchain's sysroot with the host's rust-std. - A rules_rust cross rust_toolchain's sysroot only bundles the exec - platform's LLVM shared libs (needed to *run* rustc), not its rust-std — - cargo still needs a real exec-platform rust-std to compile build - scripts/proc-macros, which are always host artifacts regardless of - --target. rustup-based cross setups don't hit this because one rustc - install holds every added target's std side by side; recreate that here - by merging the two Bazel-fetched, single-target sysroots into one. + A cross rust_toolchain's sysroot has no exec-platform rust-std, but + cargo needs one to compile build scripts/proc-macros (always host + artifacts regardless of --target). rustup holds every target's std side + by side in one install; recreate that by merging the two Bazel-fetched + single-target sysroots. """ target_sysroot = path.dirname(path.dirname(target_rustc)) merged = path.join(tmpdir, ".rust_sysroot") @@ -891,11 +820,9 @@ def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> st def _configure_cargo_cross_env(build_env: Dict[str, str], tmpdir: str, target_os: str, target_cpu: str) -> None: """Cross env vars for maturin/setuptools-rust (Cargo-driven PyO3 builds). - Cargo has no cross auto-detection to piggyback on the way meson-python's - macOS ARCHFLAGS case does — a cross build always needs an explicit - --target, and cargo has no idea which linker can actually produce a - binary for that target unless told via CARGO_TARGET__LINKER, so - it falls back to $CC (the *host* driver) and fails at the link step. + Cargo has no cross auto-detection: it needs an explicit target triple, + and without CARGO_TARGET__LINKER it links with the host driver + and fails. """ os_suffix = _RUST_TARGET_OS.get(target_os, target_os) triple = "{}-{}".format(target_cpu, os_suffix) @@ -903,11 +830,9 @@ def _configure_cargo_cross_env(build_env: Dict[str, str], tmpdir: str, target_os linker_var = "CARGO_TARGET_{}_LINKER".format(triple.upper().replace("-", "_")) build_env[linker_var] = build_env["CC"] - # PyO3's build script (pyo3-ffi) refuses to cross-compile without either - # an abi3-py3* feature or an explicit target Python version — maturin - # works around this itself (PYO3_CONFIG_FILE), but setuptools-rust just - # shells out to plain `cargo rustc` with no PyO3-specific help at all. - # Harmless to set even for non-PyO3 crates (simply unused). + # pyo3-ffi refuses to cross-compile without an explicit target Python + # version; maturin works around it itself, setuptools-rust does not. + # Unused (harmless) for non-PyO3 crates. build_env["PYO3_CROSS_PYTHON_VERSION"] = "{}.{}".format(sys.version_info.major, sys.version_info.minor) host_sysroot = build_env.get("RULES_PY_RUST_HOST_SYSROOT") @@ -919,13 +844,10 @@ def _configure_cargo_cross_env(build_env: Dict[str, str], tmpdir: str, target_os executable=True, ) - # maturin's PEP 517 wrapper passes -i by default so it - # can inspect the target interpreter's ABI. In cross mode it refuses to - # actually execute that path (it may not be host-runnable) and instead - # name-parses it for a "pythonX.Y"-shaped basename — but our venv's - # sys.executable is the generic "python" symlink, which fails that - # parse. Point it at the versioned sibling instead, which the venv's - # bin dir (already on $PATH) also provides. + # In cross mode maturin name-parses its -i interpreter argument for a + # "pythonX.Y"-shaped basename instead of executing it; our venv's + # sys.executable is the generic "python" symlink, which fails that parse + # — point it at the versioned sibling the venv also provides. build_env["MATURIN_PEP517_ARGS"] = "--interpreter python{}.{}".format( sys.version_info.major, sys.version_info.minor, @@ -950,9 +872,8 @@ def _configure_cargo_cross_env(build_env: Dict[str, str], tmpdir: str, target_os _sysname = {sysname!r} _release = {release!r} -# setup.py scripts routinely branch on sys.platform to decide which sources -# to even compile (psutil picks _psutil_osx.c vs _psutil_linux.c this way), -# and distutils keys its host-specific compiler customization on it too. +# setup.py scripts branch on sys.platform to decide which sources to compile +# (psutil picks _psutil_osx.c vs _psutil_linux.c this way). sys.platform = {sys_platform!r} os.uname = lambda: os.uname_result((_sysname, "build", _release, "", _machine)) @@ -980,10 +901,9 @@ def _confstr(name): platform.machine = lambda: _machine platform.libc_ver = lambda *a, **k: ("", "") -# packaging.tags._linux_platforms derives its arch from sysconfig.get_platform() -# (already correctly faked via $_PYTHON_HOST_PLATFORM), not from platform.machine() -# — no patch needed there. Only the manylinux-compatibility gate below is ours to -# set, via the top-level _manylinux hook packaging._manylinux itself looks for. +# packaging.tags derives its arch from sysconfig.get_platform() (already +# faked via $_PYTHON_HOST_PLATFORM); only the manylinux gate needs the +# top-level _manylinux hook packaging itself looks for. """ _MANYLINUX_HOOK = """\ @@ -1008,16 +928,12 @@ def _generate_cross_site( ) -> str: """sitecustomize + _manylinux hook faking the target's runtime identity. - sysconfig.get_platform()/_get_sysconfigdata_name() are already faked via - env vars that CPython itself reads (_PYTHON_HOST_PLATFORM, - _PYTHON_SYSCONFIGDATA_NAME) — no patching needed there. But some build - backends and package setup.py scripts branch on os.uname()/ - platform.machine() directly (e.g. to pick vectorized/arch-specific code - paths), which env vars can't reach. sitecustomize.py runs automatically - on interpreter startup — before any backend code executes — and patches - the already-imported os/platform modules in place. Modeled on crossenv's - os-patch.py/platform-patch.py/_manylinux.py, minus what rules_py doesn't - need (dual venvs, distutils.sysconfig, importlib.machinery interception). + sysconfig is already faked via env vars CPython itself reads + (_PYTHON_HOST_PLATFORM, _PYTHON_SYSCONFIGDATA_NAME), but setup.py + scripts also branch on os.uname()/platform.machine() directly, which + env vars can't reach. sitecustomize.py runs on interpreter startup — + before any backend code — and patches os/platform in place. Modeled on + crossenv, minus what rules_py doesn't need. """ site_dir = path.join(tmpdir, ".cross_site") @@ -1083,9 +999,9 @@ def _legacy_metadata_conflicts_with_pyproject(worktree: str, pyproject_data: Opt def _expected_cpu_in_tag(target_os: str, target_cpu: str) -> str: - if target_os == "darwin": - return {"aarch64": "arm64", "x86_64": "x86_64"}.get(target_cpu, target_cpu) - return {"x86_64": "x86_64", "aarch64": "aarch64", "x86": "i686", "arm": "armv7l"}.get(target_cpu, target_cpu) + if target_os == "darwin" and target_cpu == "aarch64": + return "arm64" + return {"x86": "i686", "arm": "armv7l"}.get(target_cpu, target_cpu) def _validate_wheel_platform(wheel_filename: str) -> None: @@ -1103,32 +1019,16 @@ def _validate_wheel_platform(wheel_filename: str) -> None: host_wheel_os = _WHEEL_OS_MAP.get(host_os, host_os) if target_os != host_os and host_wheel_os in platform_tag: - print( + _die( "Error: wheel platform tag '{}' contains exec host OS '{}' instead of " "target OS '{}'. The target sysconfig override may have failed.".format( platform_tag, host_wheel_os, expected_os, - ), - file=sys.stderr, + ) ) - exit(1) - if expected_os not in platform_tag: - print( - "Error: wheel platform tag '{}' does not contain target OS '{}'.".format( - platform_tag, expected_os, - ), - file=sys.stderr, - ) - exit(1) - + _die("Error: wheel platform tag '{}' does not contain target OS '{}'.".format(platform_tag, expected_os)) if expected_cpu not in platform_tag: - print( - "Error: wheel platform tag '{}' does not contain target CPU '{}'.".format( - platform_tag, expected_cpu, - ), - file=sys.stderr, - ) - exit(1) + _die("Error: wheel platform tag '{}' does not contain target CPU '{}'.".format(platform_tag, expected_cpu)) PARSER = ArgumentParser() @@ -1156,8 +1056,7 @@ def _validate_wheel_platform(wheel_filename: str) -> None: shutil.unpack_archive(opts.srcarchive, t) -# Annoyingly, unpack_archive creates a subdir in the target. Update t -# accordingly. Not worth the eng effort to prevent creating this dir. +# unpack_archive nests the sdist's own top-level directory; follow it. t = path.join(t, listdir(t)[0]) if opts.patches: @@ -1175,21 +1074,11 @@ def _validate_wheel_platform(wheel_filename: str) -> None: try: check_call(patch_cmd, cwd=t) except CalledProcessError as exc: - # Fail with a concise reason on stderr instead of a Python traceback. - print( - "Error: failed to apply patch {} (patch exited {}).".format(abs_patch, exc.returncode), - file=sys.stderr, - ) - exit(1) + _die("Error: failed to apply patch {} (patch exited {}).".format(abs_patch, exc.returncode)) -# Get a path to the outdir which will be valid after we cd outdir = path.abspath(opts.outdir) -# Preserve PATH so native sdist builds can find compilers (clang, gcc), -# and re-point CC/CXX/etc. through wrapper scripts in tmp_root so the -# Bazel-supplied workspace-relative compiler paths survive the cwd -# change into the worktree. build_env = _compiler_env( tmp_root, opts.execroot_marker, @@ -1214,21 +1103,13 @@ def _validate_wheel_platform(wheel_filename: str) -> None: outdir, ] elif path.exists(path.join(t, "pyproject.toml")) or path.exists(path.join(t, "setup.py")): - # Always use `python -m build` (PEP 517 frontend). For setup.py-only - # packages without a pyproject.toml, build creates a minimal PEP 517 - # shim automatically. --no-isolation ensures it uses the deps we've - # already provided in the build venv rather than trying to pip-install. - # Routing legacy setup_requires=… packages (e.g. googlemaps 4.10.0) - # through setup.py directly triggers setuptools' deprecated - # fetch_build_eggs path, which crashes on modern packaging. - # - # --skip-dependency-check disables `build`'s validation of - # `[build-system].requires` against the active venv. The - # validation is redundant under --no-isolation (we already - # commit to managing the venv) and rejects packages that pile - # unrelated dev tooling into `requires` — cdifflib 1.2.9 lists - # pytest/ruff/twine there, none of which are actually needed - # to compile its C extension. + # Always `python -m build`, even for setup.py-only packages (it creates + # the PEP 517 shim; invoking setup.py directly triggers setuptools' + # deprecated fetch_build_eggs path, which crashes on modern packaging). + # --no-isolation: use the deps already in the build venv, never pip. + # --skip-dependency-check: redundant under --no-isolation, and it + # rejects packages that pile dev tooling into [build-system].requires + # (cdifflib lists pytest/ruff/twine there). cmd = [ sys.executable, "-m", "build", @@ -1240,14 +1121,10 @@ def _validate_wheel_platform(wheel_filename: str) -> None: build_system = (pyproject_data or {}).get("build-system", {}) build_backend = build_system.get("build-backend") if isinstance(build_system, dict) else None - # meson-python has no auto-detection for a missing system BLAS/LAPACK - # the way it does for a missing cross-file (see below) — a package that - # needs one (numpy) has to pass its own -Dblas=none/-Dlapack=none (or - # similar) setup-args, and needs them for a native build here too, since - # our build venv never has a system BLAS/LAPACK either. meson-python's - # "setup-args" config-setting is list-typed, and `build`'s -C flag - # accumulates repeated keys into a list, so this can't collide with the - # --cross-file argument the cross branch below adds separately. + # Packages needing -D setup-args (numpy's -Dblas=none — the hermetic + # venv has no system BLAS in native mode either) pass them via this env + # var. `build`'s -C accumulates repeated keys, so it can't collide with + # the --cross-file the cross branch adds separately. if build_backend == "mesonpy": for arg in shlex.split(build_env.get("RULES_PY_MESON_SETUP_ARGS", "")): cmd += ["-C", "setup-args=" + arg] @@ -1256,10 +1133,9 @@ def _validate_wheel_platform(wheel_filename: str) -> None: build_requires = build_system.get("requires", []) if isinstance(build_system, dict) else [] if not isinstance(build_requires, list): build_requires = [] - # setuptools-rust has no build-backend value of its own — it's just - # setuptools.build_meta with an extra requirement — and no --target - # flag of its own either: it shells out to plain `cargo rustc` and - # relies on $CARGO_BUILD_TARGET, same as maturin does once we set it. + # setuptools-rust has no build-backend value of its own (it's + # setuptools.build_meta plus a requirement) and relies on + # $CARGO_BUILD_TARGET, same as maturin. uses_setuptools_rust = build_backend in _SETUPTOOLS_BACKENDS and any( isinstance(req, str) and _requirement_name(req) == "setuptools-rust" for req in build_requires ) @@ -1272,14 +1148,14 @@ def _validate_wheel_platform(wheel_filename: str) -> None: elif (build_backend == "maturin" or uses_setuptools_rust) and build_env.get("CARGO"): _configure_cargo_cross_env(build_env, tmp_root, opts.target_os, opts.target_cpu) else: - print("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!", file=sys.stderr) - raise SystemExit(1) + # raise, not _die(): ty doesn't narrow NoReturn in module-level flow and + # would flag `cmd` below as possibly unbound. + raise SystemExit("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!") with TemporaryFile(mode="w+") as build_log: try: if opts.monitor_memory: - # Generated build tools include this dependency only when the - # corresponding wheel opts into monitoring. + # Lazy: the dependency exists only when the wheel opts in. from uv.private.pep517_whl.memory_monitor import run_with_memory_monitor run_with_memory_monitor( @@ -1298,18 +1174,15 @@ def _validate_wheel_platform(wheel_filename: str) -> None: sys.stderr.write(output) if not output.endswith("\n"): sys.stderr.write("\n") - print("Error: Build failed!\nSee {} for the sandbox".format(t), file=sys.stderr) - exit(1) + _die("Error: Build failed!\nSee {} for the sandbox".format(t)) inventory = listdir(outdir) if len(inventory) > 1: - print("Error: Built more than one wheel!\nSee {} for the sandbox".format(t), file=sys.stderr) - exit(1) + _die("Error: Built more than one wheel!\nSee {} for the sandbox".format(t)) if opts.validate_anyarch and not inventory[0].endswith("-none-any.whl"): - print("Error: Target was anyarch but built a none-any wheel!\nSee {} for the sandbox".format(t), file=sys.stderr) - exit(1) + _die("Error: Target was anyarch but built a none-any wheel!\nSee {} for the sandbox".format(t)) if opts.cross and not inventory[0].endswith("-none-any.whl"): _validate_wheel_platform(inventory[0]) From fdbd3f7389583bc1376f76942259c484c7f0b782 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 13 Aug 2026 21:28:18 -0600 Subject: [PATCH 035/103] refactor(uv): reorganize the pep517_whl package by concern Split rule.bzl following the one-rule-per-file convention py/private already uses: pep517_whl.bzl (anyarch), pep517_native_whl.bzl (native + cross), common.bzl (shared helpers and base attrs), with defs.bzl as the package's single public surface. cc_layer.bzl and exec_transition.bzl were already factored by concern and stay put. The runtime tools move to tools/: build_helper.py (the main of every generated build_tool py_binary) and memory_monitor.py, each still following the package's constraints (single-file helper, conditional py_library). Mechanical fallout: the sdist_build BUILD template loads defs.bzl and points at the tools/ labels (generated-repo snapshots regenerated in the root and e2e/cases workspaces), test data labels and the dirname/TEST_SRCDIR-walking path assumptions follow the move, and the CI typecheck file lists pick up the new paths. --- .github/workflows/ci-workflows.yaml | 4 +- .../pep517-frontend-exec-group/BUILD.bazel | 2 +- ...build.uv_sdist_fallback.cowsay.BUILD.bazel | 8 +- ...uild.uv_sdist_jdk_build.jpype1.BUILD.bazel | 6 +- ...st_native_build.python_geohash.BUILD.bazel | 6 +- .../uv-pyproject-cases/cdifflib/BUILD.bazel | 4 +- .../uv-pyproject-cases/setup.MODULE.bazel | 2 +- e2e/cases/uv-sdist-mpicc/BUILD.bazel | 2 +- e2e/cases/uv-sdist-mpicc/__test__.py | 2 +- .../pycross-distutils-probe/BUILD.bazel | 2 +- .../pycross-distutils-probe/__test__.py | 2 +- uv/private/pep517_whl/BUILD.bazel | 43 +++-- uv/private/pep517_whl/common.bzl | 94 +++++++++ uv/private/pep517_whl/defs.bzl | 7 + .../{rule.bzl => pep517_native_whl.bzl} | 180 +++--------------- uv/private/pep517_whl/pep517_whl.bzl | 66 +++++++ uv/private/pep517_whl/tests/BUILD.bazel | 12 +- .../tests/build_helper_cross_test.py | 2 +- .../tests/console_scripts/pure/BUILD.bazel | 2 +- .../pep517_whl/tests/explicit_env/BUILD.bazel | 2 +- .../tests/local_cxx_companion_test.py | 2 +- .../pep517_whl/tests/memory_monitor_test.py | 2 +- .../pep517_whl/tests/native_dep/BUILD.bazel | 2 +- .../tests/native_dep/tool_names/BUILD.bazel | 2 +- .../native_dep/tool_names/bare/BUILD.bazel | 2 +- .../tests/wrapper_argv0/BUILD.bazel | 2 +- .../tests/wrapper_argv0/wrapper_argv0_test.py | 2 +- uv/private/pep517_whl/tools/BUILD.bazel | 15 ++ .../pep517_whl/{ => tools}/build_helper.py | 2 +- .../pep517_whl/{ => tools}/memory_monitor.py | 0 uv/private/sdist_build/repository.bzl | 8 +- .../sdist_build.bravado_core.BUILD.bazel | 6 +- 32 files changed, 280 insertions(+), 213 deletions(-) create mode 100644 uv/private/pep517_whl/common.bzl create mode 100644 uv/private/pep517_whl/defs.bzl rename uv/private/pep517_whl/{rule.bzl => pep517_native_whl.bzl} (71%) create mode 100644 uv/private/pep517_whl/pep517_whl.bzl create mode 100644 uv/private/pep517_whl/tools/BUILD.bazel rename uv/private/pep517_whl/{ => tools}/build_helper.py (99%) rename uv/private/pep517_whl/{ => tools}/memory_monitor.py (100%) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index e6c7732d6..7f3b41fbb 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -56,8 +56,8 @@ jobs: py/tools/site_merge/site_merge.py py/tools/unpack/unpack.py uv/private/gazelle_manifest/generate.py - uv/private/pep517_whl/build_helper.py - uv/private/pep517_whl/memory_monitor.py + uv/private/pep517_whl/tools/build_helper.py + uv/private/pep517_whl/tools/memory_monitor.py uv/private/py_entrypoint_binary/search.py ) runtime311=( diff --git a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel index cf7fa314c..f23e2a025 100644 --- a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel +++ b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel @@ -1,4 +1,4 @@ -load("@aspect_rules_py//uv/private/pep517_whl:rule.bzl", "pep517_native_whl") +load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@bazel_skylib//rules:write_file.bzl", "write_file") diff --git a/e2e/cases/snapshots/sdist_build.uv_sdist_fallback.cowsay.BUILD.bazel b/e2e/cases/snapshots/sdist_build.uv_sdist_fallback.cowsay.BUILD.bazel index af94b4d13..11f5cee89 100644 --- a/e2e/cases/snapshots/sdist_build.uv_sdist_fallback.cowsay.BUILD.bazel +++ b/e2e/cases/snapshots/sdist_build.uv_sdist_fallback.cowsay.BUILD.bazel @@ -1,12 +1,12 @@ -load("@aspect_rules_py//uv/private/pep517_whl:rule.bzl", "pep517_native_whl") +load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( name = "build_tool", - main = "@aspect_rules_py//uv/private/pep517_whl:build_helper.py", - srcs = ["@aspect_rules_py//uv/private/pep517_whl:build_helper.py"], - deps = ["@aspect_rules_py//uv/private/pep517_whl:memory_monitor", "@@aspect_rules_py++uv+project__uv_sdist_fallback//:packaging", "@@aspect_rules_py++uv+project__uv_sdist_fallback//:build", "@@aspect_rules_py++uv+project__uv_sdist_fallback//:setuptools", "@whl_install__uv_sdist_fallback__setuptools__80_10_2//:install"], + main = "@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py", + srcs = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], + deps = ["@aspect_rules_py//uv/private/pep517_whl/tools:memory_monitor", "@@aspect_rules_py++uv+project__uv_sdist_fallback//:packaging", "@@aspect_rules_py++uv+project__uv_sdist_fallback//:build", "@@aspect_rules_py++uv+project__uv_sdist_fallback//:setuptools", "@whl_install__uv_sdist_fallback__setuptools__80_10_2//:install"], ) pep517_native_whl( diff --git a/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel b/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel index e5360683d..2a9810d30 100644 --- a/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel +++ b/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel @@ -1,11 +1,11 @@ -load("@aspect_rules_py//uv/private/pep517_whl:rule.bzl", "pep517_native_whl") +load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( name = "build_tool", - main = "@aspect_rules_py//uv/private/pep517_whl:build_helper.py", - srcs = ["@aspect_rules_py//uv/private/pep517_whl:build_helper.py"], + main = "@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py", + srcs = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], deps = ["@@aspect_rules_py++uv+project__uv_sdist_jdk_build//:scikit_build_core", "@@aspect_rules_py++uv+project__uv_sdist_jdk_build//:setuptools", "@@aspect_rules_py++uv+project__uv_sdist_jdk_build//:wheel", "@@aspect_rules_py++uv+project__uv_sdist_jdk_build//:build", "@whl_install__uv_sdist_jdk_build__scikit_build_core__0_12_2//:install"], ) diff --git a/e2e/cases/snapshots/sdist_build.uv_sdist_native_build.python_geohash.BUILD.bazel b/e2e/cases/snapshots/sdist_build.uv_sdist_native_build.python_geohash.BUILD.bazel index 728ecb396..586d750ba 100644 --- a/e2e/cases/snapshots/sdist_build.uv_sdist_native_build.python_geohash.BUILD.bazel +++ b/e2e/cases/snapshots/sdist_build.uv_sdist_native_build.python_geohash.BUILD.bazel @@ -1,11 +1,11 @@ -load("@aspect_rules_py//uv/private/pep517_whl:rule.bzl", "pep517_native_whl") +load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( name = "build_tool", - main = "@aspect_rules_py//uv/private/pep517_whl:build_helper.py", - srcs = ["@aspect_rules_py//uv/private/pep517_whl:build_helper.py"], + main = "@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py", + srcs = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], deps = ["@@aspect_rules_py++uv+project__uv_sdist_native_build//:build", "@@aspect_rules_py++uv+project__uv_sdist_native_build//:setuptools", "@whl_install__uv_sdist_native_build__setuptools__75_8_2//:install"], ) diff --git a/e2e/cases/uv-pyproject-cases/cdifflib/BUILD.bazel b/e2e/cases/uv-pyproject-cases/cdifflib/BUILD.bazel index d7489fcb6..bd3112ce6 100644 --- a/e2e/cases/uv-pyproject-cases/cdifflib/BUILD.bazel +++ b/e2e/cases/uv-pyproject-cases/cdifflib/BUILD.bazel @@ -1,6 +1,6 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") -# Regression: cdifflib 1.2.9 exercises pep517_whl/build_helper.py +# Regression: cdifflib 1.2.9 exercises pep517_whl/tools/build_helper.py # via the parent's `[tool.uv].no-binary-package` setting. # # Sdist shape (load-bearing — pinned at 1.2.9): pyproject.toml with @@ -22,7 +22,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") # ruff # # Fix in tree: `--skip-dependency-check` on the `python -m build` -# invocation in pep517_whl/build_helper.py. The validation step is +# invocation in pep517_whl/tools/build_helper.py. The validation step is # redundant once we've committed to managing the build venv # ourselves, and skipping it sidesteps packages that pile unrelated # dev tooling into `[build-system].requires`. diff --git a/e2e/cases/uv-pyproject-cases/setup.MODULE.bazel b/e2e/cases/uv-pyproject-cases/setup.MODULE.bazel index 929041886..bbac65ede 100644 --- a/e2e/cases/uv-pyproject-cases/setup.MODULE.bazel +++ b/e2e/cases/uv-pyproject-cases/setup.MODULE.bazel @@ -1,7 +1,7 @@ """Regression cases for PEP 517 build-helper dispatch shapes. The packages here each cover a different sdist shape that -pep517_whl/build_helper.py has to handle correctly; see the +pep517_whl/tools/build_helper.py has to handle correctly; see the per-package BUILD.bazel files under `cdifflib/` and `pyahocorasick/` for the specifics. diff --git a/e2e/cases/uv-sdist-mpicc/BUILD.bazel b/e2e/cases/uv-sdist-mpicc/BUILD.bazel index 46a439565..abf5e23aa 100644 --- a/e2e/cases/uv-sdist-mpicc/BUILD.bazel +++ b/e2e/cases/uv-sdist-mpicc/BUILD.bazel @@ -9,7 +9,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") py_test( name = "test", srcs = ["__test__.py"], - data = ["@aspect_rules_py//uv/private/pep517_whl:build_helper.py"], + data = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], dep_group = "uv_sdist_mpicc", main = "__test__.py", python_version = "3.11", diff --git a/e2e/cases/uv-sdist-mpicc/__test__.py b/e2e/cases/uv-sdist-mpicc/__test__.py index 8bdb3bb58..0344d8506 100644 --- a/e2e/cases/uv-sdist-mpicc/__test__.py +++ b/e2e/cases/uv-sdist-mpicc/__test__.py @@ -59,7 +59,7 @@ def find_build_helper() -> str: srcdir = os.environ["TEST_SRCDIR"] for root, _, files in os.walk(srcdir, followlinks=True): - if "build_helper.py" in files and root.endswith(os.path.join("uv", "private", "pep517_whl")): + if "build_helper.py" in files and root.endswith(os.path.join("uv", "private", "pep517_whl", "tools")): return os.path.join(root, "build_helper.py") raise AssertionError("build_helper.py not found under TEST_SRCDIR") diff --git a/e2e/crossbuild/pycross-distutils-probe/BUILD.bazel b/e2e/crossbuild/pycross-distutils-probe/BUILD.bazel index 99534b307..cb2e18927 100644 --- a/e2e/crossbuild/pycross-distutils-probe/BUILD.bazel +++ b/e2e/crossbuild/pycross-distutils-probe/BUILD.bazel @@ -6,7 +6,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") py_test( name = "test", srcs = ["__test__.py"], - data = ["@aspect_rules_py//uv/private/pep517_whl:build_helper.py"], + data = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], dep_group = "pycross_distutils_probe", main = "__test__.py", python_version = "3.12", diff --git a/e2e/crossbuild/pycross-distutils-probe/__test__.py b/e2e/crossbuild/pycross-distutils-probe/__test__.py index 9504d667c..b052d4ccc 100644 --- a/e2e/crossbuild/pycross-distutils-probe/__test__.py +++ b/e2e/crossbuild/pycross-distutils-probe/__test__.py @@ -59,7 +59,7 @@ def run(self): def find_build_helper() -> str: srcdir = os.environ["TEST_SRCDIR"] for root, _, files in os.walk(srcdir, followlinks=True): - if "build_helper.py" in files and root.endswith(os.path.join("uv", "private", "pep517_whl")): + if "build_helper.py" in files and root.endswith(os.path.join("uv", "private", "pep517_whl", "tools")): return os.path.join(root, "build_helper.py") raise AssertionError("build_helper.py not found under TEST_SRCDIR") diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 46ca89705..709d18f79 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -1,30 +1,53 @@ load("@bazel_lib//:bzl_library.bzl", "bzl_library") -load("//py:defs.bzl", "py_library") package(default_visibility = [ "//uv/private:__subpackages__", ]) -exports_files( - ["build_helper.py"], - visibility = ["//visibility:public"], +bzl_library( + name = "defs", + srcs = ["defs.bzl"], + deps = [ + ":pep517_native_whl", + ":pep517_whl", + ], ) bzl_library( - name = "rule", - srcs = ["rule.bzl"], + name = "pep517_whl", + srcs = ["pep517_whl.bzl"], + deps = [ + ":common", + "//py/private/toolchain:types", + "@bazel_lib//lib:resource_sets", + ], +) + +bzl_library( + name = "pep517_native_whl", + srcs = ["pep517_native_whl.bzl"], deps = [ ":cc_layer", + ":common", ":exec_transition", "//py/private/interpreter:versions", "//py/private/toolchain:types", - "//uv/private:source_built_wheel", "@bazel_lib//lib:resource_sets", "@rules_cc//cc:action_names_bzl", "@rules_cc//cc/common", ], ) +bzl_library( + name = "common", + srcs = ["common.bzl"], + deps = [ + ":exec_transition", + "//uv/private:source_built_wheel", + "@bazel_lib//lib:resource_sets", + ], +) + bzl_library( name = "cc_layer", srcs = ["cc_layer.bzl"], @@ -35,12 +58,6 @@ bzl_library( ], ) -py_library( - name = "memory_monitor", - srcs = ["memory_monitor.py"], - visibility = ["//visibility:public"], -) - bzl_library( name = "exec_transition", srcs = ["exec_transition.bzl"], diff --git a/uv/private/pep517_whl/common.bzl b/uv/private/pep517_whl/common.bzl new file mode 100644 index 000000000..e3dbb5257 --- /dev/null +++ b/uv/private/pep517_whl/common.bzl @@ -0,0 +1,94 @@ +"""Shared helpers and attrs for the PEP 517 sdist-to-wheel rules.""" + +load("@bazel_lib//lib:resource_sets.bzl", "resource_set_attr") +load("//uv/private:source_built_wheel.bzl", "SourceBuiltWheelInfo") +load(":exec_transition.bzl", "exec_transition") + +TARGET_EXEC_GROUP = "target" + +_INHERITED_PYTHON_ENV = ( + "PYTHONHOME", + "PYTHONPATH", + "PYTHONPLATLIBDIR", +) + +def wheel_providers(wheel_dir, console_scripts): + return [ + DefaultInfo(files = depset([wheel_dir])), + SourceBuiltWheelInfo(console_scripts = tuple(console_scripts)), + ] + +def tool_files_to_run(ctx): + tool = ctx.attr.tool + if type(tool) == "list": + tool = tool[0] + return tool[DefaultInfo].files_to_run + +def common_env(ctx): + # pyproject_hooks copies the build process environment and launches its + # Python executable without -I: + # https://github.com/pypa/pyproject-hooks/blob/4b7c6d113fb89b755d762a88712c8a6873cddd47/src/pyproject_hooks/_impl.py#L70-L83 + # https://github.com/pypa/pyproject-hooks/blob/4b7c6d113fb89b755d762a88712c8a6873cddd47/src/pyproject_hooks/_impl.py#L378-L396 + # Host settings therefore must not replace that child's venv or stdlib. + # https://docs.python.org/3/using/cmdline.html#environment-variables + default_shell_env = { + key: value + for key, value in ctx.configuration.default_shell_env.items() + if key.upper() not in _INHERITED_PYTHON_ENV + } + return { + "SETUPTOOLS_SCM_PRETEND_VERSION": ctx.attr.version, + # Determinism: fix hash seed so dict/set iteration order is stable + "PYTHONHASHSEED": "0", + # Determinism: reproducible timestamps in archives + "SOURCE_DATE_EPOCH": "0", + } | default_shell_env + +def patch_args_and_inputs(ctx): + patch_args = [] + patch_inputs = [] + if ctx.attr.pre_build_patches: + patch_args.extend(["--patch-strip", str(ctx.attr.pre_build_patch_strip)]) + for target in ctx.attr.pre_build_patches: + for f in target[DefaultInfo].files.to_list(): + patch_args.extend(["--patch", f.path]) + patch_inputs.append(f) + return patch_args, patch_inputs + +def memory_args(ctx): + return ["--monitor-memory"] if ctx.attr.monitor_memory else [] + +_PATCH_ATTRS = { + "pre_build_patches": attr.label_list( + default = [], + allow_files = [".patch", ".diff"], + doc = "Patch files to apply to the extracted source before building.", + ), + "pre_build_patch_strip": attr.int( + default = 0, + doc = "Strip count for pre-build patches (-p flag to patch).", + ), +} + +PEP517_WHL_ATTRS = { + "src": attr.label(allow_single_file = True), + # The wheel action runs in the "target" exec group; its frontend must run + # on the exec (host) platform but resolve its Python build dependencies + # for the *target* Python version. exec_transition pins --platforms to the + # host and resets the platform_libc/platform_version flags to host values + # (Starlark flags otherwise leak from the target configuration and break + # wheel selection for build deps). See exec_transition.bzl. + "tool": attr.label(executable = True, cfg = exec_transition), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + "version": attr.string(), + "console_scripts": attr.string_list( + doc = "Console scripts discovered from the source distribution's entry-point metadata.", + ), + "args": attr.string_list(default = ["--validate-anyarch"]), + "monitor_memory": attr.bool( + default = False, + doc = "Report approximate Linux process-tree RSS while building the wheel.", + ), +} | _PATCH_ATTRS | resource_set_attr diff --git a/uv/private/pep517_whl/defs.bzl b/uv/private/pep517_whl/defs.bzl new file mode 100644 index 000000000..8254a02b1 --- /dev/null +++ b/uv/private/pep517_whl/defs.bzl @@ -0,0 +1,7 @@ +"""Public surface of the PEP 517 sdist-to-wheel rules.""" + +load(":pep517_native_whl.bzl", _pep517_native_whl = "pep517_native_whl") +load(":pep517_whl.bzl", _pep517_whl = "pep517_whl") + +pep517_whl = _pep517_whl +pep517_native_whl = _pep517_native_whl diff --git a/uv/private/pep517_whl/rule.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl similarity index 71% rename from uv/private/pep517_whl/rule.bzl rename to uv/private/pep517_whl/pep517_native_whl.bzl index 896d44a50..0acc53131 100644 --- a/uv/private/pep517_whl/rule.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -1,76 +1,27 @@ -""" -PEP 517 sdist-to-wheel build rules. +"""PEP 517 sdist to platform-specific whl build rule.""" -Uses `python -m build` (the pypa/build frontend) which delegates to whatever -build backend the sdist declares in its `[build-system]` table. -""" - -load("@bazel_lib//lib:resource_sets.bzl", "resource_set", "resource_set_attr") +load("@bazel_lib//lib:resource_sets.bzl", "resource_set") load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES") load("@rules_cc//cc/common:cc_common.bzl", "cc_common") load("//py/private/interpreter:versions.bzl", "PLATFORMS") load("//py/private/toolchain:types.bzl", "EXEC_TOOLS_TOOLCHAIN", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") -load("//uv/private:source_built_wheel.bzl", "SourceBuiltWheelInfo") load(":cc_layer.bzl", "CC_LAYER_ATTRS", "extract_cc_layer") +load( + ":common.bzl", + "PEP517_WHL_ATTRS", + "TARGET_EXEC_GROUP", + "common_env", + "memory_args", + "patch_args_and_inputs", + "tool_files_to_run", + "wheel_providers", +) load(":exec_transition.bzl", "exec_transition") _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") -_TARGET_EXEC_GROUP = "target" _EXECROOT_MARKER = "__ASPECT_RULES_PY_EXECROOT__" _INFER_CXX_COMPANION = "ASPECT_RULES_PY_INFER_CXX_COMPANION" -_INHERITED_PYTHON_ENV = ( - "PYTHONHOME", - "PYTHONPATH", - "PYTHONPLATLIBDIR", -) - -def _wheel_providers(wheel_dir, console_scripts): - return [ - DefaultInfo(files = depset([wheel_dir])), - SourceBuiltWheelInfo(console_scripts = tuple(console_scripts)), - ] - -def _tool_files_to_run(ctx): - tool = ctx.attr.tool - if type(tool) == "list": - tool = tool[0] - return tool[DefaultInfo].files_to_run - -def _common_env(ctx): - # pyproject_hooks copies the build process environment and launches its - # Python executable without -I: - # https://github.com/pypa/pyproject-hooks/blob/4b7c6d113fb89b755d762a88712c8a6873cddd47/src/pyproject_hooks/_impl.py#L70-L83 - # https://github.com/pypa/pyproject-hooks/blob/4b7c6d113fb89b755d762a88712c8a6873cddd47/src/pyproject_hooks/_impl.py#L378-L396 - # Host settings therefore must not replace that child's venv or stdlib. - # https://docs.python.org/3/using/cmdline.html#environment-variables - default_shell_env = { - key: value - for key, value in ctx.configuration.default_shell_env.items() - if key.upper() not in _INHERITED_PYTHON_ENV - } - return { - "SETUPTOOLS_SCM_PRETEND_VERSION": ctx.attr.version, - # Determinism: fix hash seed so dict/set iteration order is stable - "PYTHONHASHSEED": "0", - # Determinism: reproducible timestamps in archives - "SOURCE_DATE_EPOCH": "0", - } | default_shell_env - -def _patch_args_and_inputs(ctx): - patch_args = [] - patch_inputs = [] - if ctx.attr.pre_build_patches: - patch_args.extend(["--patch-strip", str(ctx.attr.pre_build_patch_strip)]) - for target in ctx.attr.pre_build_patches: - for f in target[DefaultInfo].files.to_list(): - patch_args.extend(["--patch", f.path]) - patch_inputs.append(f) - return patch_args, patch_inputs - -def _memory_args(ctx): - return ["--monitor-memory"] if ctx.attr.monitor_memory else [] - def _collect_toolchain_inputs_and_vars(ctx): """Gather files + Make-variable substitutions from `ctx.attr.toolchains`. @@ -105,7 +56,7 @@ def _collect_toolchain_inputs_and_vars(ctx): def _cc_toolchain_inputs_and_tools(ctx): """Return the target execution group's C++ files and selected build tools.""" - cc_toolchain = ctx.exec_groups[_TARGET_EXEC_GROUP].toolchains[_CC_TOOLCHAIN_TYPE] + cc_toolchain = ctx.exec_groups[TARGET_EXEC_GROUP].toolchains[_CC_TOOLCHAIN_TYPE] if hasattr(cc_toolchain, "cc_provider_in_toolchain") and hasattr(cc_toolchain, "cc"): cc_toolchain = cc_toolchain.cc if not cc_toolchain or not hasattr(cc_toolchain, "all_files"): @@ -200,36 +151,6 @@ def _derive_python_host_platform(target_os, target_cpu): return "macosx-11.0-" + cpu return None -def _pep517_whl(ctx): - archive = ctx.file.src - wheel_dir = ctx.actions.declare_directory("whl") - patch_args, patch_inputs = _patch_args_and_inputs(ctx) - - # The build tool is a py_binary wrapping build_helper.py. Using it as - # a tool (not just an input) causes Bazel to materialize its runfiles in - # the action sandbox, which means the venv shim can find the interpreter - # via the standard runfiles mechanism regardless of whether the interpreter - # comes from an external repo or the main workspace. - tool_files_to_run = _tool_files_to_run(ctx) - ctx.actions.run( - mnemonic = "PySdistBuild", - progress_message = "Source compiling {} to a whl".format(archive.basename), - executable = tool_files_to_run, - toolchain = None, - arguments = ctx.attr.args + patch_args + _memory_args(ctx) + [ - archive.path, - wheel_dir.path, - ], - inputs = [archive] + patch_inputs, - tools = [tool_files_to_run], - outputs = [wheel_dir], - env = _common_env(ctx), - exec_group = _TARGET_EXEC_GROUP, - resource_set = resource_set(ctx.attr), - ) - - return _wheel_providers(wheel_dir, ctx.attr.console_scripts) - def _interpreter_platform_triple(runtime): """Best-effort platform triple of the repo a PyRuntimeInfo comes from. @@ -271,9 +192,9 @@ def _cross_compile(ctx, eg_toolchains): def _pep517_native_whl(ctx): archive = ctx.file.src wheel_dir = ctx.actions.declare_directory("whl") - patch_args, patch_inputs = _patch_args_and_inputs(ctx) + patch_args, patch_inputs = patch_args_and_inputs(ctx) - eg_toolchains = ctx.exec_groups[_TARGET_EXEC_GROUP].toolchains + eg_toolchains = ctx.exec_groups[TARGET_EXEC_GROUP].toolchains cross = _cross_compile(ctx, eg_toolchains) cc_toolchain_raw = eg_toolchains[_CC_TOOLCHAIN_TYPE] @@ -299,7 +220,7 @@ def _pep517_native_whl(ctx): if hasattr(cc_toolchain, "cc_provider_in_toolchain") and hasattr(cc_toolchain, "cc"): cc_toolchain = cc_toolchain.cc - env = _common_env(ctx) + env = common_env(ctx) extra_inputs, known_variables = _collect_toolchain_inputs_and_vars(ctx) if "EXECROOT" in known_variables: @@ -361,7 +282,7 @@ def _pep517_native_whl(ctx): else: cross_args = [] - _tool = _tool_files_to_run(ctx) + tool = tool_files_to_run(ctx) ctx.actions.run( mnemonic = "PySdistCrossBuild" if cross else "PySdistNativeBuild", @@ -369,9 +290,9 @@ def _pep517_native_whl(ctx): "Cross" if cross else "Native", archive.basename, ), - executable = _tool, + executable = tool, toolchain = None, - arguments = ctx.attr.args + patch_args + _memory_args(ctx) + cross_args + [ + arguments = ctx.attr.args + patch_args + memory_args(ctx) + cross_args + [ "--execroot-marker", _EXECROOT_MARKER, archive.path, @@ -381,67 +302,14 @@ def _pep517_native_whl(ctx): [archive] + patch_inputs, transitive = extra_inputs, ), - tools = [_tool], + tools = [tool], outputs = [wheel_dir], env = env, - exec_group = _TARGET_EXEC_GROUP, + exec_group = TARGET_EXEC_GROUP, resource_set = resource_set(ctx.attr), ) - return _wheel_providers(wheel_dir, ctx.attr.console_scripts) - -_PATCH_ATTRS = { - "pre_build_patches": attr.label_list( - default = [], - allow_files = [".patch", ".diff"], - doc = "Patch files to apply to the extracted source before building.", - ), - "pre_build_patch_strip": attr.int( - default = 0, - doc = "Strip count for pre-build patches (-p flag to patch).", - ), -} - -_pep517_whl_attrs = { - "src": attr.label(allow_single_file = True), - # The wheel action runs in the "target" exec group; its frontend must run - # on the exec (host) platform but resolve its Python build dependencies - # for the *target* Python version. exec_transition pins --platforms to the - # host and resets the platform_libc/platform_version flags to host values - # (Starlark flags otherwise leak from the target configuration and break - # wheel selection for build deps). See exec_transition.bzl. - "tool": attr.label(executable = True, cfg = exec_transition), - "_allowlist_function_transition": attr.label( - default = "@bazel_tools//tools/allowlists/function_transition_allowlist", - ), - "version": attr.string(), - "console_scripts": attr.string_list( - doc = "Console scripts discovered from the source distribution's entry-point metadata.", - ), - "args": attr.string_list(default = ["--validate-anyarch"]), - "monitor_memory": attr.bool( - default = False, - doc = "Report approximate Linux process-tree RSS while building the wheel.", - ), -} | _PATCH_ATTRS | resource_set_attr - -pep517_whl = rule( - implementation = _pep517_whl, - doc = """PEP 517 sdist to anyarch whl build rule. - -Consumes a sdist artifact and performs a build of that artifact with the -specified Python dependencies under the configured Python toolchain. - -""", - attrs = _pep517_whl_attrs, - exec_groups = { - _TARGET_EXEC_GROUP: exec_group( - toolchains = [ - PY_TOOLCHAIN, - ], - ), - }, -) + return wheel_providers(wheel_dir, ctx.attr.console_scripts) pep517_native_whl = rule( implementation = _pep517_native_whl, @@ -469,7 +337,7 @@ origins are unrecognizable, the optional NATIVE_BUILD_TOOLCHAIN sentinel's absence is used as the cross signal. """, - attrs = _pep517_whl_attrs | { + attrs = PEP517_WHL_ATTRS | { "args": attr.string_list(), "env": attr.string_dict( doc = "Environment variables to set on the build action. Values may " + @@ -488,7 +356,7 @@ absence is used as the cross signal. config_common.toolchain_type(PY_TOOLCHAIN, mandatory = False), ], exec_groups = { - _TARGET_EXEC_GROUP: exec_group( + TARGET_EXEC_GROUP: exec_group( toolchains = [ PY_TOOLCHAIN, config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN, mandatory = False), diff --git a/uv/private/pep517_whl/pep517_whl.bzl b/uv/private/pep517_whl/pep517_whl.bzl new file mode 100644 index 000000000..c92644aca --- /dev/null +++ b/uv/private/pep517_whl/pep517_whl.bzl @@ -0,0 +1,66 @@ +"""PEP 517 sdist to anyarch whl build rule. + +Uses `python -m build` (the pypa/build frontend) which delegates to whatever +build backend the sdist declares in its `[build-system]` table. +""" + +load("@bazel_lib//lib:resource_sets.bzl", "resource_set") +load("//py/private/toolchain:types.bzl", "PY_TOOLCHAIN") +load( + ":common.bzl", + "PEP517_WHL_ATTRS", + "TARGET_EXEC_GROUP", + "common_env", + "memory_args", + "patch_args_and_inputs", + "tool_files_to_run", + "wheel_providers", +) + +def _pep517_whl(ctx): + archive = ctx.file.src + wheel_dir = ctx.actions.declare_directory("whl") + patch_args, patch_inputs = patch_args_and_inputs(ctx) + + # The build tool is a py_binary wrapping build_helper.py. Using it as + # a tool (not just an input) causes Bazel to materialize its runfiles in + # the action sandbox, which means the venv shim can find the interpreter + # via the standard runfiles mechanism regardless of whether the interpreter + # comes from an external repo or the main workspace. + tool = tool_files_to_run(ctx) + ctx.actions.run( + mnemonic = "PySdistBuild", + progress_message = "Source compiling {} to a whl".format(archive.basename), + executable = tool, + toolchain = None, + arguments = ctx.attr.args + patch_args + memory_args(ctx) + [ + archive.path, + wheel_dir.path, + ], + inputs = [archive] + patch_inputs, + tools = [tool], + outputs = [wheel_dir], + env = common_env(ctx), + exec_group = TARGET_EXEC_GROUP, + resource_set = resource_set(ctx.attr), + ) + + return wheel_providers(wheel_dir, ctx.attr.console_scripts) + +pep517_whl = rule( + implementation = _pep517_whl, + doc = """PEP 517 sdist to anyarch whl build rule. + +Consumes a sdist artifact and performs a build of that artifact with the +specified Python dependencies under the configured Python toolchain. + +""", + attrs = PEP517_WHL_ATTRS, + exec_groups = { + TARGET_EXEC_GROUP: exec_group( + toolchains = [ + PY_TOOLCHAIN, + ], + ), + }, +) diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index 7c886f3a5..db3ba704f 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -4,7 +4,7 @@ load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load("@tar.bzl//tar:mtree.bzl", "mtree_mutate", "mtree_spec") load("@tar.bzl//tar:tar.bzl", "tar_rule") load("//py:defs.bzl", "py_binary", "py_test") -load("//uv/private/pep517_whl:rule.bzl", "pep517_native_whl", "pep517_whl") +load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl", "pep517_whl") load( ":pep517_whl_test.bzl", "execroot_collision_toolchain", @@ -23,13 +23,13 @@ py_test( name = "memory_monitor_test", srcs = ["memory_monitor_test.py"], main = "memory_monitor_test.py", - deps = ["//uv/private/pep517_whl:memory_monitor"], + deps = ["//uv/private/pep517_whl/tools:memory_monitor"], ) py_test( name = "build_helper_cross_test", srcs = ["build_helper_cross_test.py"], - data = ["//uv/private/pep517_whl:build_helper.py"], + data = ["//uv/private/pep517_whl/tools:build_helper.py"], main = "build_helper_cross_test.py", target_compatible_with = ["@platforms//os:linux"], deps = [ @@ -41,7 +41,7 @@ py_test( py_test( name = "local_cxx_companion_test", srcs = ["local_cxx_companion_test.py"], - data = ["//uv/private/pep517_whl:build_helper.py"], + data = ["//uv/private/pep517_whl/tools:build_helper.py"], main = "local_cxx_companion_test.py", target_compatible_with = ["@platforms//os:linux"], deps = [ @@ -52,8 +52,8 @@ py_test( py_binary( name = "__build_helper", - srcs = ["//uv/private/pep517_whl:build_helper.py"], - main = "//uv/private/pep517_whl:build_helper.py", + srcs = ["//uv/private/pep517_whl/tools:build_helper.py"], + main = "//uv/private/pep517_whl/tools:build_helper.py", deps = ["@pypi//build"], ) diff --git a/uv/private/pep517_whl/tests/build_helper_cross_test.py b/uv/private/pep517_whl/tests/build_helper_cross_test.py index b120d3c3e..192309fcf 100644 --- a/uv/private/pep517_whl/tests/build_helper_cross_test.py +++ b/uv/private/pep517_whl/tests/build_helper_cross_test.py @@ -66,7 +66,7 @@ def _run(helper: str, sdist: str, workdir: str, label: str, env: dict, args: lis def main() -> None: workdir = tempfile.mkdtemp(dir=os.environ["TEST_TMPDIR"]) sdist = _make_sdist(workdir) - helper = os.path.join(os.path.dirname(os.path.dirname(__file__)), "build_helper.py") + helper = os.path.join(os.path.dirname(os.path.dirname(__file__)), "tools", "build_helper.py") real_machine = os.uname().machine fake_machine = "aarch64" if real_machine != "aarch64" else "x86_64" diff --git a/uv/private/pep517_whl/tests/console_scripts/pure/BUILD.bazel b/uv/private/pep517_whl/tests/console_scripts/pure/BUILD.bazel index 4c7f0aa03..e299ed253 100644 --- a/uv/private/pep517_whl/tests/console_scripts/pure/BUILD.bazel +++ b/uv/private/pep517_whl/tests/console_scripts/pure/BUILD.bazel @@ -1,6 +1,6 @@ load("@bazel_skylib//rules:write_file.bzl", "write_file") load("@rules_shell//shell:sh_binary.bzl", "sh_binary") -load("//uv/private/pep517_whl:rule.bzl", "pep517_whl") +load("//uv/private/pep517_whl:defs.bzl", "pep517_whl") load("//uv/private/pep517_whl/tests:pep517_whl_test.bzl", "pep517_whl_console_scripts_test") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/explicit_env/BUILD.bazel b/uv/private/pep517_whl/tests/explicit_env/BUILD.bazel index 24f9b56c1..da5ed8f74 100644 --- a/uv/private/pep517_whl/tests/explicit_env/BUILD.bazel +++ b/uv/private/pep517_whl/tests/explicit_env/BUILD.bazel @@ -1,4 +1,4 @@ -load("//uv/private/pep517_whl:rule.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") load("//uv/private/pep517_whl/tests:pep517_whl_test.bzl", "hostile_python_env_target") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/local_cxx_companion_test.py b/uv/private/pep517_whl/tests/local_cxx_companion_test.py index 3786846f3..5315c3235 100644 --- a/uv/private/pep517_whl/tests/local_cxx_companion_test.py +++ b/uv/private/pep517_whl/tests/local_cxx_companion_test.py @@ -90,7 +90,7 @@ def _run(helper: str, sdist: str, workdir: str, cxx: str, expect: str, infer_com def main() -> None: workdir = tempfile.mkdtemp(dir=os.environ["TEST_TMPDIR"]) sdist = _make_sdist(workdir) - helper = os.path.join(os.path.dirname(os.path.dirname(__file__)), "build_helper.py") + helper = os.path.join(os.path.dirname(os.path.dirname(__file__)), "tools", "build_helper.py") _run(helper, sdist, workdir, "/usr/bin/gcc -DRULES_PY_CXX_ARG_PRESERVED=1", "runtime", True) missing = os.path.join(workdir, "missing") diff --git a/uv/private/pep517_whl/tests/memory_monitor_test.py b/uv/private/pep517_whl/tests/memory_monitor_test.py index 7adace291..c523d6bfa 100644 --- a/uv/private/pep517_whl/tests/memory_monitor_test.py +++ b/uv/private/pep517_whl/tests/memory_monitor_test.py @@ -11,7 +11,7 @@ from typing import Dict, List, Optional from unittest import mock -from uv.private.pep517_whl import memory_monitor +from uv.private.pep517_whl.tools import memory_monitor class MemoryMonitorTest(unittest.TestCase): diff --git a/uv/private/pep517_whl/tests/native_dep/BUILD.bazel b/uv/private/pep517_whl/tests/native_dep/BUILD.bazel index 004b5e98f..3464c72fa 100644 --- a/uv/private/pep517_whl/tests/native_dep/BUILD.bazel +++ b/uv/private/pep517_whl/tests/native_dep/BUILD.bazel @@ -4,7 +4,7 @@ load("@bazel_skylib//rules:write_file.bzl", "write_file") load("@rules_cc//cc:defs.bzl", "cc_library") load("@tar.bzl//tar:mtree.bzl", "mtree_mutate", "mtree_spec") load("@tar.bzl//tar:tar.bzl", "tar_rule") -load("//uv/private/pep517_whl:rule.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") load(":defs.bzl", "dep_makevars") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/native_dep/tool_names/BUILD.bazel b/uv/private/pep517_whl/tests/native_dep/tool_names/BUILD.bazel index 5f99ae1e1..c380bc3de 100644 --- a/uv/private/pep517_whl/tests/native_dep/tool_names/BUILD.bazel +++ b/uv/private/pep517_whl/tests/native_dep/tool_names/BUILD.bazel @@ -1,5 +1,5 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("//uv/private/pep517_whl:rule.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/native_dep/tool_names/bare/BUILD.bazel b/uv/private/pep517_whl/tests/native_dep/tool_names/bare/BUILD.bazel index 124108dd7..d3e601fd6 100644 --- a/uv/private/pep517_whl/tests/native_dep/tool_names/bare/BUILD.bazel +++ b/uv/private/pep517_whl/tests/native_dep/tool_names/bare/BUILD.bazel @@ -1,5 +1,5 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("//uv/private/pep517_whl:rule.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/wrapper_argv0/BUILD.bazel b/uv/private/pep517_whl/tests/wrapper_argv0/BUILD.bazel index ff8a0f08e..0b9880f21 100644 --- a/uv/private/pep517_whl/tests/wrapper_argv0/BUILD.bazel +++ b/uv/private/pep517_whl/tests/wrapper_argv0/BUILD.bazel @@ -13,7 +13,7 @@ py_test( srcs = ["wrapper_argv0_test.py"], data = [ ":wrapper_argv0_fake_driver", - "//uv/private/pep517_whl:build_helper.py", + "//uv/private/pep517_whl/tools:build_helper.py", ], main = "wrapper_argv0_test.py", target_compatible_with = ["@platforms//os:linux"], diff --git a/uv/private/pep517_whl/tests/wrapper_argv0/wrapper_argv0_test.py b/uv/private/pep517_whl/tests/wrapper_argv0/wrapper_argv0_test.py index 33afa7bde..46fb83c4c 100644 --- a/uv/private/pep517_whl/tests/wrapper_argv0/wrapper_argv0_test.py +++ b/uv/private/pep517_whl/tests/wrapper_argv0/wrapper_argv0_test.py @@ -43,7 +43,7 @@ def main() -> None: workdir = tempfile.mkdtemp(dir=os.environ["TEST_TMPDIR"]) sdist = _make_sdist(workdir) here = os.path.dirname(__file__) - helper = os.path.join(here, "..", "..", "build_helper.py") + helper = os.path.join(here, "..", "..", "tools", "build_helper.py") # The driver directory must remain absent from PATH to expose basename argv[0]. drivers = os.path.join(workdir, "drivers") diff --git a/uv/private/pep517_whl/tools/BUILD.bazel b/uv/private/pep517_whl/tools/BUILD.bazel new file mode 100644 index 000000000..479545a8d --- /dev/null +++ b/uv/private/pep517_whl/tools/BUILD.bazel @@ -0,0 +1,15 @@ +load("//py:defs.bzl", "py_library") + +# Runtime tools for the PEP 517 build action. build_helper.py is the `main` +# of the py_binary each sdist_build repo generates; it stays a single +# self-contained script (no unconditional sibling imports). +exports_files( + ["build_helper.py"], + visibility = ["//visibility:public"], +) + +py_library( + name = "memory_monitor", + srcs = ["memory_monitor.py"], + visibility = ["//visibility:public"], +) diff --git a/uv/private/pep517_whl/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py similarity index 99% rename from uv/private/pep517_whl/build_helper.py rename to uv/private/pep517_whl/tools/build_helper.py index cec8c754c..7a254feb4 100644 --- a/uv/private/pep517_whl/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -1156,7 +1156,7 @@ def _validate_wheel_platform(wheel_filename: str) -> None: try: if opts.monitor_memory: # Lazy: the dependency exists only when the wheel opts in. - from uv.private.pep517_whl.memory_monitor import run_with_memory_monitor + from uv.private.pep517_whl.tools.memory_monitor import run_with_memory_monitor run_with_memory_monitor( cmd, diff --git a/uv/private/pep517_whl/memory_monitor.py b/uv/private/pep517_whl/tools/memory_monitor.py similarity index 100% rename from uv/private/pep517_whl/memory_monitor.py rename to uv/private/pep517_whl/tools/memory_monitor.py diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 8257f6689..90ff6a3ba 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -209,7 +209,7 @@ def _sdist_build_impl(repository_ctx): monitor_memory_attr = "" if repository_ctx.attr.monitor_memory: all_deps = [ - "@aspect_rules_py//uv/private/pep517_whl:memory_monitor", + "@aspect_rules_py//uv/private/pep517_whl/tools:memory_monitor", ] + all_deps monitor_memory_attr = "\n monitor_memory = True," @@ -258,13 +258,13 @@ def _sdist_build_impl(repository_ctx): # Leave args unset: the pure rule validates anyarch wheels by default, # while the native rule defaults to no validation. repository_ctx.file("BUILD.bazel", content = """ -load("@aspect_rules_py//uv/private/pep517_whl:rule.bzl", "{rule}") +load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "{rule}") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( name = "build_tool", - main = "@aspect_rules_py//uv/private/pep517_whl:build_helper.py", - srcs = ["@aspect_rules_py//uv/private/pep517_whl:build_helper.py"], + main = "@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py", + srcs = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], deps = {deps}, ) diff --git a/uv/private/uv_hub/snapshots/sdist_build.bravado_core.BUILD.bazel b/uv/private/uv_hub/snapshots/sdist_build.bravado_core.BUILD.bazel index 905ca5261..e9ef5c5a5 100644 --- a/uv/private/uv_hub/snapshots/sdist_build.bravado_core.BUILD.bazel +++ b/uv/private/uv_hub/snapshots/sdist_build.bravado_core.BUILD.bazel @@ -1,11 +1,11 @@ -load("@aspect_rules_py//uv/private/pep517_whl:rule.bzl", "pep517_whl") +load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_whl") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( name = "build_tool", - main = "@aspect_rules_py//uv/private/pep517_whl:build_helper.py", - srcs = ["@aspect_rules_py//uv/private/pep517_whl:build_helper.py"], + main = "@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py", + srcs = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], deps = ["@@+uv+project__aspect_rules_py//:build", "@@+uv+project__aspect_rules_py//:setuptools", "@@+uv+project__aspect_rules_py//:maturin", "@whl_install__aspect_rules_py__setuptools__80_9_0//:install"], ) From 4e91cf768f6d9ea48b5530e5667d70b5132c5339 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 13 Aug 2026 22:15:39 -0600 Subject: [PATCH 036/103] ci(e2e): execute crossbuild images on native runners via artifacts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two builder jobs produce docker-loadable OCI tarballs (new oci_load + tarball targets in pep517_cross_case, tagged manual) and native runner jobs docker-load and run them — no QEMU in the execution loop, so emulation can neither mask nor introduce failures: - crossbuild-images (linux/amd64 builder) uploads the arm64 tarballs; crossbuild-run-arm64 executes them on ubuntu-24.04-arm. Native amd64 execution already happens in the e2e-crossbuild test job. - crossbuild-images-darwin (gated like smoke, 10x-billed) cross-builds psutil/contourpy/rpds_py for both arches; crossbuild-run-darwin-built executes them on native amd64 + arm64. The macOS smoke job filters -requires-docker, so this is the first execution coverage the darwin-to-linux path gets. The reverse direction (arm64 builder -> amd64 execution) is documented as blocked in the workflow comment: gcc_toolchain registers exec=x86_64 only and //tools:rust_host_sysroot pins the x86_64 rust toolchain. --- .github/workflows/ci-workflows.yaml | 119 ++++++++++++++++++++++++++++ e2e/crossbuild/tools/cross_case.bzl | 23 +++++- 2 files changed, 141 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 7f3b41fbb..ffd8ce52e 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -159,6 +159,125 @@ jobs: if [ -f test.sh ]; then bash test.sh fi + # Artifact-based cross verification: build the e2e/crossbuild images on + # one host, then execute them on NATIVE hardware for each target arch — + # no QEMU in the execution loop, so emulation can neither mask nor + # introduce failures (qemu-user has real ld.so quirks; see the cross + # wrapper in uv/private/pep517_whl/tools/build_helper.py). + # + # Two builders: + # - crossbuild-images (linux/amd64): arm64 tarballs only. Native amd64 + # execution is already covered by the e2e-crossbuild test job's + # container_structure_tests on that same runner arch. + # - crossbuild-images-darwin (macOS, gated like `smoke`, 10x-billed): + # both arches for one case per backend family. The macOS smoke job + # cross-builds darwin→linux but filters -requires-docker (no daemon + # there), so these artifacts are the ONLY execution coverage the + # darwin→linux path has. + # + # Missing direction (deliberate): an arm64 builder. Blocked on + # amd64-exec-host assumptions in e2e/crossbuild/MODULE.bazel — + # gcc_toolchain registers exec=x86_64 only, and //tools:rust_host_sysroot + # pins the x86_64 rust toolchain by label. + crossbuild-images: + name: crossbuild-images (linux builder) + runs-on: ubuntu-22.04-32core + steps: + - uses: actions/checkout@v6 + - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 + with: + aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + - name: Build arm64 image tarballs + working-directory: e2e/crossbuild + run: | + targets=$(bazel query 'filter(".*:arm64_tarball$", //...)') + bazel build ${targets} + mkdir -p "${RUNNER_TEMP}/images" + for target in ${targets}; do + case="${target#//}" + case="${case%:arm64_tarball}" + cp "bazel-bin/${case}/arm64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-arm64.tar" + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-images-arm64 + path: ${{ runner.temp }}/images/*.tar + retention-days: 1 + crossbuild-run-arm64: + name: crossbuild-run (native arm64) + needs: crossbuild-images + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-images-arm64 + path: images + - name: Run every image on native arm64 + run: | + status=0 + for tar in images/*-arm64.tar; do + tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') + echo "::group::${tag}" + docker run --rm "${tag}" || status=1 + echo "::endgroup::" + done + exit "${status}" + crossbuild-images-darwin: + name: crossbuild-images (darwin builder) + if: >- + ${{ github.ref_name == 'main' + || contains(github.head_ref || github.ref_name, 'macos') }} + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + with: + bazelisk-cache: true + disk-cache: macos-crossbuild-images + repository-cache: true + # One case per backend family: psutil (setuptools/distutils), + # contourpy (meson-python), rpds_py (maturin/PyO3). + - name: Cross-build linux image tarballs from macOS + working-directory: e2e/crossbuild + shell: bash + run: | + mkdir -p "${RUNNER_TEMP}/images" + for case in psutil contourpy rpds_py; do + for arch in amd64 arm64; do + bazel build --config=ci "//${case}:${arch}_tarball" + cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" + done + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-images-darwin + path: ${{ runner.temp }}/images/*.tar + retention-days: 1 + crossbuild-run-darwin-built: + name: crossbuild-run (darwin-built, native ${{ matrix.arch }}) + needs: crossbuild-images-darwin + strategy: + fail-fast: false + matrix: + include: + - { runner: "ubuntu-latest", arch: "amd64" } + - { runner: "ubuntu-24.04-arm", arch: "arm64" } + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-images-darwin + path: images + - name: Run darwin-built images on native ${{ matrix.arch }} + run: | + status=0 + for tar in images/*-${{ matrix.arch }}.tar; do + tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') + echo "::group::${tag}" + docker run --rm "${tag}" || status=1 + echo "::endgroup::" + done + exit "${status}" test-all: name: test-all runs-on: ubuntu-latest diff --git a/e2e/crossbuild/tools/cross_case.bzl b/e2e/crossbuild/tools/cross_case.bzl index 1449c7b5f..49d4aca32 100644 --- a/e2e/crossbuild/tools/cross_case.bzl +++ b/e2e/crossbuild/tools/cross_case.bzl @@ -15,7 +15,7 @@ that reason. load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") load("@container_structure_test//:defs.bzl", "container_structure_test") -load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_oci//oci:defs.bzl", "oci_image", "oci_load") load(":checks.bzl", "assert_so_arch", "assert_so_suffix") def pep517_cross_case(name, deps, so_pattern, check_so_suffix = True, main = None, dep_group = None, image_command_test_config = None): @@ -123,6 +123,27 @@ def pep517_cross_case(name, deps, so_pattern, check_so_suffix = True, main = Non target_platform = "//:arm64_linux", ) + # Docker-loadable tarballs for the artifact-based CI jobs: a builder job + # `bazel build`s these, uploads them, and native amd64/arm64 runner jobs + # `docker load` + `docker run` them on real hardware (no QEMU). Tagged + # manual: under plain `//...` they would only repackage what the + # container_structure_tests already cover on this host. The repo_tag is + # what the runner job executes, so it must stay `crossbuild/:`. + for arch in ("amd64", "arm64"): + oci_load( + name = arch + "_load", + image = ":" + arch + "_image", + repo_tags = ["crossbuild/" + name + ":" + arch], + tags = ["manual"], + ) + + native.filegroup( + name = arch + "_tarball", + srcs = [":" + arch + "_load"], + output_group = "tarball", + tags = ["manual"], + ) + container_structure_test( name = "amd64_command_test", configs = [image_command_test_config], From 631c52c2a2d0de0520d297687dabebfa20673a76 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 13 Aug 2026 22:22:04 -0600 Subject: [PATCH 037/103] ci(e2e): register QEMU binfmt on the crossbuild image builder The native-runner jobs remove QEMU from the execution loop, but the builder still needs it during the build itself: meson's compiler sanity check and cc.run() probes execute target-arch binaries through the exe_wrapper, which relies on binfmt_misc (contourpy failed with "Executables created by cpp compiler ... are not runnable"). --- .github/workflows/ci-workflows.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index ffd8ce52e..fdec3c8a6 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -187,6 +187,13 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + # QEMU leaves the *execution* loop (that's the point of the native + # runner jobs) but not the *build* loop: meson's compiler sanity + # check and cc.run() probes execute target-arch binaries through + # the exe_wrapper during the build itself. + - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 + with: + platforms: arm64 - name: Build arm64 image tarballs working-directory: e2e/crossbuild run: | From cb218efaaeef3e1d72e1b97afc74ee2e634dbbfb Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 13 Aug 2026 22:33:37 -0600 Subject: [PATCH 038/103] fix(e2e): define the ci config in e2e/crossbuild's bazelrc The smoke job and the darwin image builder invoke bazel with --config=ci in every workspace; this one lost the definition when the branch's .bazelrc superseded main's in the merge, failing with "Config value 'ci' is not defined in any .rc file". --- e2e/crossbuild/.bazelrc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/e2e/crossbuild/.bazelrc b/e2e/crossbuild/.bazelrc index f8b70ea56..52f3b0277 100644 --- a/e2e/crossbuild/.bazelrc +++ b/e2e/crossbuild/.bazelrc @@ -1,3 +1,7 @@ # Without this, sdist build actions run with no PATH and clang can't find # `ld` (not bundled with the hermetic LLVM toolchain). common --incompatible_strict_action_env + +# Build without the bytes +common:ci --remote_download_outputs=minimal +common:ci --nobuild_runfile_links From ef0b521ef713b67c4d4484073ba3baafff51e31e Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 13 Aug 2026 23:19:57 -0600 Subject: [PATCH 039/103] fix(uv): link the -nostdlib++ toolchain's static runtime archives explicitly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The BCR llvm toolchain supplies its C++/unwind runtime (libc++.a, libc++abi.a, libunwind.a) as toolchain inputs via static_runtime_lib — never as link-action flags — and ships empty stub libraries on the search path, so the wrapper's name-based "-lc++ -lc++abi" (and rustc's "-lgcc_s" fold to "-lunwind") resolved against stubs. The resulting .so's linked cleanly (undefined symbols are legal in shared links) and only exploded at dlopen on the target: contourpy with 45 undefined std::__1 symbols, rpds_py with undefined _Unwind_*. First caught by the darwin-built native-execution CI jobs; gcc_toolchain never hits this because its self-contained driver resolves its own runtime. cc_layer now extracts static_runtime_lib behind the -nostdlib++ marker (so the gcc path is untouched), the rule forwards the archives as action inputs plus RULES_PY_CXX_STATIC_RUNTIME, and the cross wrapper links them as absolute paths in dependency order on every ELF link, dropping -lgcc_s. Archive semantics keep this inert for pure-C links. --- uv/private/pep517_whl/cc_layer.bzl | 23 +++++++++++++ uv/private/pep517_whl/pep517_native_whl.bzl | 4 +++ uv/private/pep517_whl/tools/build_helper.py | 36 ++++++++++++++++++--- 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/uv/private/pep517_whl/cc_layer.bzl b/uv/private/pep517_whl/cc_layer.bzl index 9a0b2841d..0ccbc15b4 100644 --- a/uv/private/pep517_whl/cc_layer.bzl +++ b/uv/private/pep517_whl/cc_layer.bzl @@ -179,6 +179,27 @@ def extract_cc_layer(ctx, cc_toolchain): target_os, target_cpu = get_target_platform(ctx) + # A "-nostdlib++" toolchain (the BCR llvm module) supplies its C++/unwind + # runtime as toolchain *inputs* (static_runtime_lib), not as link-action + # flags — get_memory_inefficient_command_line never sees them, so a PEP + # 517 backend linking through our wrappers produces .so's with undefined + # std::__1/_Unwind_* symbols that only explode at dlopen time on the + # target. Extract the archives so the wrapper can link them explicitly. + # Only probed behind the -nostdlib++ marker: self-contained drivers + # (gcc_toolchain) resolve their own runtime and may not define + # static_runtime_lib at all, which would fail the API call. + static_runtime_files = None + static_runtime_paths = [] + if "-nostdlib++" in flags.get("ldshared", ""): + static_runtime_files = cc_toolchain.static_runtime_lib( + feature_configuration = feature_configuration, + ) + static_runtime_paths = [ + _EXECROOT_MARKER + "/" + f.path + for f in static_runtime_files.to_list() + if f.path.endswith(".a") + ] + return struct( cc = tools.get("cc"), cxx = tools.get("cxx"), @@ -190,4 +211,6 @@ def extract_cc_layer(ctx, cc_toolchain): ccshared = "-fPIC" if needs_pic else "", target_os = target_os, target_cpu = target_cpu, + static_runtime_files = static_runtime_files, + static_runtime_paths = static_runtime_paths, ) diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index 0acc53131..b7dda121e 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -248,6 +248,10 @@ def _pep517_native_whl(ctx): env["RULES_PY_CROSS_COMPILE"] = "1" env["RULES_PY_TARGET_OS"] = cc_layer.target_os or "" env["RULES_PY_TARGET_CPU"] = cc_layer.target_cpu or "" + if cc_layer.static_runtime_files: + extra_inputs.append(cc_layer.static_runtime_files) + if cc_layer.static_runtime_paths: + env["RULES_PY_CXX_STATIC_RUNTIME"] = ":".join(cc_layer.static_runtime_paths) if cc_layer.cflags: env["CFLAGS"] = cc_layer.cflags if cc_layer.cxxflags: diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 7a254feb4..cf45679b1 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -123,6 +123,7 @@ def _die(message: str) -> NoReturn: is_darwin = {is_darwin!r} static_libstdcxx_flags = {static_libstdcxx_flags!r} exe_link_flags = {exe_link_flags!r} +static_runtime_archives = {static_runtime_archives!r} is_link = "-c" not in args filtered = [] @@ -156,11 +157,22 @@ def _die(message: str) -> NoReturn: # "-C linker", meson links probes bare) — bake the flags into every # link; duplicates are harmless to clang. # rustc hardcodes "-lgcc_s" on *-linux-gnu but this toolchain ships no - # libgcc — fold in its static libunwind instead (cargo-zigbuild's + # libgcc; its unwinder comes from the static runtime archives below + # (or, without them, from folding in "-lunwind" — cargo-zigbuild's # trick, same ABI surface). - filtered = ["-lunwind" if a == "-lgcc_s" else a for a in filtered] + if static_runtime_archives and not is_darwin: + filtered = [a for a in filtered if a != "-lgcc_s"] + else: + filtered = ["-lunwind" if a == "-lgcc_s" else a for a in filtered] filtered.extend(exe_link_flags) - if is_cxx: + if static_runtime_archives and not is_darwin: + # The toolchain's C++/unwind runtime (libc++.a, libc++abi.a, + # libunwind.a) travels as toolchain inputs, never as link flags — + # link the archives explicitly, in dependency order, after every + # object. Archive semantics make this safe on pure-C links: unused + # members are simply not pulled. + filtered.extend(static_runtime_archives) + elif is_cxx: # No implicit C++ stdlib under -nostdlib++; statically embed # libc++ so the produced .so has no host-libstdc++ dependency # (only static archives exist on the toolchain's search path). @@ -395,6 +407,7 @@ def _make_cross_compiler_wrapper( is_cxx: bool = False, is_darwin: bool = False, exe_link_flags: Optional[list[str]] = None, + static_runtime_archives: Optional[list[str]] = None, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) @@ -422,6 +435,7 @@ def _make_cross_compiler_wrapper( is_darwin=is_darwin, static_libstdcxx_flags=list(_STATIC_LIBSTDCXX_FLAGS), exe_link_flags=list(exe_link_flags or []), + static_runtime_archives=list(static_runtime_archives or []), ), executable=True, ) @@ -528,6 +542,18 @@ def _compiler_env( wrapper_flags = _get_wrapper_flags(env.get("CFLAGS", "")) lld_path = _find_lld(cc_path) + # The -nostdlib++ toolchain's C++/unwind runtime archives, extracted + # by cc_layer.bzl from static_runtime_lib (they never appear in the + # link-action flags). Ordered for single-pass archive resolution: + # libc++ pulls from libc++abi, which pulls from libunwind. + static_runtime = [ + _absolutize_path(p) + for p in env.pop("RULES_PY_CXX_STATIC_RUNTIME", "").split(":") + if p + ] + runtime_rank = {"libc++.a": 0, "libc++abi.a": 1, "libunwind.a": 2} + static_runtime.sort(key=lambda p: runtime_rank.get(path.basename(p), 3)) + # An LLVM-style toolchain (BCR `llvm` module) reaches its crt objects # and runtime archives only through the link action's flags; detect it # by its "-nostdlib++" marker and bake those flags (sans "-shared") @@ -538,8 +564,8 @@ def _compiler_env( [f for f in ldshared_flag_list if f != "-shared"] if "-nostdlib++" in ldshared_flag_list else [] ) - cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path, is_darwin=is_darwin, exe_link_flags=exe_link_flags) - cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path, is_cxx=True, is_darwin=is_darwin, exe_link_flags=exe_link_flags) + cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path, is_darwin=is_darwin, exe_link_flags=exe_link_flags, static_runtime_archives=static_runtime) + cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path, is_cxx=True, is_darwin=is_darwin, exe_link_flags=exe_link_flags, static_runtime_archives=static_runtime) # gcc_toolchain layout (/xbin/gcc, /sysroot/...): a # target-arch binary needs THIS toolchain's glibc/loader to run. From 1c684e52e46f8a2d49ae71958f0d6e1fffc5f251 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Thu, 13 Aug 2026 23:40:22 -0600 Subject: [PATCH 040/103] ci(e2e): surface meson tracebacks in the darwin image builder Temporary instrumentation: the darwin builder's contourpy build fails in meson's sysconfig python lookup with a bare UnicodeDecodeError one-liner; MESON_FORCE_BACKTRACE names the file and line doing the read. --- .github/workflows/ci-workflows.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index fdec3c8a6..1fc3d66c1 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -251,7 +251,7 @@ jobs: mkdir -p "${RUNNER_TEMP}/images" for case in psutil contourpy rpds_py; do for arch in amd64 arm64; do - bazel build --config=ci "//${case}:${arch}_tarball" + bazel build --config=ci --action_env=MESON_FORCE_BACKTRACE=1 "//${case}:${arch}_tarball" cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" done done From 7bb19927de0488e5365265909d2f5d556c44efa9 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 00:04:29 -0600 Subject: [PATCH 041/103] fix(uv): stop treating compiler-introspection probes as link invocations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both wrappers classified anything without "-c" as a link. meson probes the compiler through the wrapper with "-E -v -", "-print-search-dirs", and "--version"; the link-only additions were mostly inert there until the static runtime archives became positional inputs — "-E" preprocesses positional inputs, so libc++.a turned into megabytes of binary on stdout that meson strictly utf-8 decodes (its sysconfig python lookup died with UnicodeDecodeError on darwin hosts, where the absence of pkg-config is what routes meson into that code path). is_link now excludes -c/-E/-S/-fsyntax-only and the introspection queries in both the native and cross wrappers. --- uv/private/pep517_whl/tools/build_helper.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index cf45679b1..de32c3b0d 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -62,7 +62,13 @@ def _die(message: str) -> NoReturn: filtered_args = [arg for arg in sys.argv[1:] if arg != "{debug_flag}"] is_cxx = {is_cxx!r} is_darwin = {is_darwin!r} -is_link = "-c" not in filtered_args +# Same non-link detection as the cross wrapper: compiles, preprocessing, +# and compiler-introspection probes must not receive link-only flags. +is_link = True +for _arg in filtered_args: + if _arg in ("-c", "-E", "-S", "-fsyntax-only", "--version", "-dumpmachine", "-dumpversion", "-###") or _arg.startswith("-print-"): + is_link = False + break if is_cxx and is_link and not is_darwin: filtered_args = filtered_args + {static_libstdcxx_flags!r} sysroot = {sysroot!r} @@ -125,7 +131,17 @@ def _die(message: str) -> NoReturn: exe_link_flags = {exe_link_flags!r} static_runtime_archives = {static_runtime_archives!r} -is_link = "-c" not in args +# Not a link if compiling/preprocessing (-c/-E/-S/-fsyntax-only) or if this +# is a compiler-introspection probe (meson runs "-E -v -", "-print-*", +# "--version" through us): appending link inputs there is at best noise and +# at worst catastrophic — "-E" *preprocesses* positional inputs, so an +# appended static archive becomes megabytes of binary on stdout that +# meson then strictly utf-8 decodes. +is_link = True +for a in args: + if a in ("-c", "-E", "-S", "-fsyntax-only", "--version", "-dumpmachine", "-dumpversion", "-###") or a.startswith("-print-"): + is_link = False + break filtered = [] i = 0 while i < len(args): From 37825dd3353d6594922d18f175b2be7e1430278a Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 00:34:40 -0600 Subject: [PATCH 042/103] ci(e2e): close the linux-to-linux cycle with an arm64 image builder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An ubuntu-24.04-arm builder cross-compiles the per-backend subset to amd64 and a native amd64 runner executes the artifacts — the reverse of the existing direction. gcc_toolchain has no arm64-exec variant, so this is also the first Linux-hosted exercise of the llvm toolchain fallback (the same path darwin hosts take). rust and the CC layer needed no changes: rust_host_sysroot re-resolves via exec_transition on any host, and rules_rust already registers both linux target triples. --- .github/workflows/ci-workflows.yaml | 56 ++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 1fc3d66c1..f6519acc8 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -175,10 +175,10 @@ jobs: # there), so these artifacts are the ONLY execution coverage the # darwin→linux path has. # - # Missing direction (deliberate): an arm64 builder. Blocked on - # amd64-exec-host assumptions in e2e/crossbuild/MODULE.bazel — - # gcc_toolchain registers exec=x86_64 only, and //tools:rust_host_sysroot - # pins the x86_64 rust toolchain by label. + # - crossbuild-images-arm (linux/arm64): the reverse direction, closing + # the linux↔linux cycle. gcc_toolchain has no arm64-exec variant, so + # these builds exercise the llvm toolchain fallback — the same path a + # darwin host takes — on a Linux arm64 host. crossbuild-images: name: crossbuild-images (linux builder) runs-on: ubuntu-22.04-32core @@ -229,6 +229,54 @@ jobs: echo "::endgroup::" done exit "${status}" + crossbuild-images-arm: + name: crossbuild-images (arm64 builder) + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/checkout@v6 + - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 + with: + aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + # amd64 binfmt for meson's build-time probes (mirror image of the + # arm64 registration on the amd64 builder). + - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 + with: + platforms: amd64 + # Same one-case-per-backend subset as the darwin builder: the + # free arm64 runners are 4-core, and the llvm-fallback coverage + # per backend is what this direction is for. + - name: Cross-build amd64 image tarballs from arm64 + working-directory: e2e/crossbuild + run: | + mkdir -p "${RUNNER_TEMP}/images" + for case in psutil contourpy rpds_py; do + bazel build --config=ci "//${case}:amd64_tarball" + cp "bazel-bin/${case}/amd64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-amd64.tar" + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-images-arm-built + path: ${{ runner.temp }}/images/*.tar + retention-days: 1 + crossbuild-run-arm-built: + name: crossbuild-run (arm-built, native amd64) + needs: crossbuild-images-arm + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-images-arm-built + path: images + - name: Run arm-built images on native amd64 + run: | + status=0 + for tar in images/*-amd64.tar; do + tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') + echo "::group::${tag}" + docker run --rm "${tag}" || status=1 + echo "::endgroup::" + done + exit "${status}" crossbuild-images-darwin: name: crossbuild-images (darwin builder) if: >- From 32d567916c89a8a718f199101120774a97c4835d Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 00:49:41 -0600 Subject: [PATCH 043/103] fix(uv): only offer meson an exe_wrapper when qemu can load the binary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The passthrough exe_wrapper assumed Linux hosts can always run target-arch ELFs via binfmt, but a dynamically-linked probe also needs QEMU_LD_PREFIX to resolve the target's ld.so — and only gcc_toolchain's layout provides that sysroot. Under the llvm fallback (empty sysroot, as exercised by the arm64 builder) meson's sanity check died with "not runnable". Gate the wrapper on RULES_PY_TARGET_GCC_SYSROOT: elsewhere meson gets needs_exe_wrapper=true with no wrapper, the same honest skip-or-explicit-error semantics darwin hosts already had. --- uv/private/pep517_whl/tools/build_helper.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index de32c3b0d..e1046e747 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -772,11 +772,16 @@ def _generate_meson_cross_file( without which qemu-user searches the exec host for the target's ld-linux/glibc and finds none. """ - # A darwin host cannot execute ELF at all; with needs_exe_wrapper=true - # and NO exe_wrapper, meson skips its own checks and cc.run() callers get - # meson's explicit cross-environment error — an honest host limitation. + # The wrapper is only offered when the emulated binary can actually + # resolve its dynamic interpreter: binfmt+qemu need QEMU_LD_PREFIX to + # locate the target's ld.so/glibc, and only the gcc_toolchain layout + # hands us that sysroot. Everywhere else (darwin hosts can't execute + # ELF at all; the llvm toolchain's empty-sysroot layout gives qemu no + # loader prefix) meson gets needs_exe_wrapper=true with NO exe_wrapper: + # it skips its own sanity runs and cc.run() callers get meson's + # explicit cross-environment error — an honest limitation. exe_wrapper_line = "" - if _platform.system() == "Linux": + if _platform.system() == "Linux" and build_env.get("RULES_PY_TARGET_GCC_SYSROOT"): exe_wrapper = _write_generated_file( path.join(tmpdir, "meson_exe_wrapper.py"), _MESON_EXE_WRAPPER.format(qemu_ld_prefix=build_env.get("RULES_PY_TARGET_GCC_SYSROOT", "")), From 5eabe8e700bf8e1ff90e2de0527e78554680d683 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 00:56:39 -0600 Subject: [PATCH 044/103] ci(e2e): materialize tarballs on the arm64 builder despite minimal downloads --config=ci turns on --remote_download_outputs=minimal, so on cache hits the tarball this job uploads never lands in bazel-bin and the cp fails; toplevel keeps the byte savings for everything else. --- .github/workflows/ci-workflows.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index f6519acc8..4245839b8 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -250,7 +250,9 @@ jobs: run: | mkdir -p "${RUNNER_TEMP}/images" for case in psutil contourpy rpds_py; do - bazel build --config=ci "//${case}:amd64_tarball" + # toplevel: build-without-the-bytes must still materialize + # the tarball this job exists to upload. + bazel build --config=ci --remote_download_outputs=toplevel "//${case}:amd64_tarball" cp "bazel-bin/${case}/amd64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-amd64.tar" done - uses: actions/upload-artifact@v4 From 544aa924a1afb45210961f643cebc6a3a6bc9a45 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 01:09:53 -0600 Subject: [PATCH 045/103] ci(e2e): rename crossbuild-images to crossbuild-images-amd64 The builder fleet is now three-way (amd64, arm64, darwin); the unqualified name predates the other two. --- .github/workflows/ci-workflows.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 4245839b8..f098c4e8e 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -166,7 +166,7 @@ jobs: # wrapper in uv/private/pep517_whl/tools/build_helper.py). # # Two builders: - # - crossbuild-images (linux/amd64): arm64 tarballs only. Native amd64 + # - crossbuild-images-amd64: arm64 tarballs only. Native amd64 # execution is already covered by the e2e-crossbuild test job's # container_structure_tests on that same runner arch. # - crossbuild-images-darwin (macOS, gated like `smoke`, 10x-billed): @@ -179,8 +179,8 @@ jobs: # the linux↔linux cycle. gcc_toolchain has no arm64-exec variant, so # these builds exercise the llvm toolchain fallback — the same path a # darwin host takes — on a Linux arm64 host. - crossbuild-images: - name: crossbuild-images (linux builder) + crossbuild-images-amd64: + name: crossbuild-images (amd64 builder) runs-on: ubuntu-22.04-32core steps: - uses: actions/checkout@v6 @@ -212,7 +212,7 @@ jobs: retention-days: 1 crossbuild-run-arm64: name: crossbuild-run (native arm64) - needs: crossbuild-images + needs: crossbuild-images-amd64 runs-on: ubuntu-24.04-arm steps: - uses: actions/download-artifact@v4 From 36ff7c72ce3e1c4990ae69583ed7807c02dce3fb Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 01:24:43 -0600 Subject: [PATCH 046/103] refining github workflow --- .github/workflows/ci-workflows.yaml | 217 +++++++++++++--------------- e2e/crossbuild/MODULE.bazel | 105 -------------- 2 files changed, 103 insertions(+), 219 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index f098c4e8e..a547d9aa0 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -120,65 +120,67 @@ jobs: if [ -f test.sh ]; then bash test.sh fi + # macOS minutes are billed at 10X, so it only covers the root and e2e consumer # workspaces, on main plus branches whose name contains 'macos'. # https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes - smoke: - name: smoke (${{ matrix.workspace.path }}, macos) + + crossbuild-images-darwin: + name: crossbuild-images (darwin builder) if: >- ${{ github.ref_name == 'main' || contains(github.head_ref || github.ref_name, 'macos') }} runs-on: macos-latest - strategy: - fail-fast: false - matrix: - workspace: - - { path: ".", slug: "root" } - - { path: "e2e/cases", slug: "e2e" } - - { path: "e2e/crossbuild", slug: "e2e-crossbuild" } - defaults: - run: - working-directory: ${{ matrix.workspace.path }} steps: - uses: actions/checkout@v6 - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 with: bazelisk-cache: true - disk-cache: macos-${{ matrix.workspace.slug }} + disk-cache: macos-crossbuild-images repository-cache: true - # Images still build; only the tests that need a Linux container daemon are - # dropped, since the GitHub-hosted macOS runners have none. - # Run `test //...`, then the workspace's test.sh if it has one - - name: Test + - name: Cross-build linux image tarballs from macOS + working-directory: e2e/crossbuild shell: bash run: | - bazel test --config=ci --keep_going \ - --test_tag_filters=-skip-on-bazel8,-requires-docker \ - --build_tag_filters=-skip-on-bazel8 \ - //... - if [ -f test.sh ]; then - bash test.sh - fi - # Artifact-based cross verification: build the e2e/crossbuild images on - # one host, then execute them on NATIVE hardware for each target arch — - # no QEMU in the execution loop, so emulation can neither mask nor - # introduce failures (qemu-user has real ld.so quirks; see the cross - # wrapper in uv/private/pep517_whl/tools/build_helper.py). - # - # Two builders: - # - crossbuild-images-amd64: arm64 tarballs only. Native amd64 - # execution is already covered by the e2e-crossbuild test job's - # container_structure_tests on that same runner arch. - # - crossbuild-images-darwin (macOS, gated like `smoke`, 10x-billed): - # both arches for one case per backend family. The macOS smoke job - # cross-builds darwin→linux but filters -requires-docker (no daemon - # there), so these artifacts are the ONLY execution coverage the - # darwin→linux path has. - # - # - crossbuild-images-arm (linux/arm64): the reverse direction, closing - # the linux↔linux cycle. gcc_toolchain has no arm64-exec variant, so - # these builds exercise the llvm toolchain fallback — the same path a - # darwin host takes — on a Linux arm64 host. + mkdir -p "${RUNNER_TEMP}/images" + for case in psutil contourpy rpds_py; do + for arch in amd64 arm64; do + bazel build --config=ci --action_env=MESON_FORCE_BACKTRACE=1 "//${case}:${arch}_tarball" + cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" + done + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-images-darwin + path: ${{ runner.temp }}/images/*.tar + retention-days: 1 + crossbuild-run-darwin-built: + name: crossbuild-run (darwin-built, native ${{ matrix.arch }}) + needs: crossbuild-images-darwin + strategy: + fail-fast: false + matrix: + include: + - { runner: "ubuntu-latest", arch: "amd64" } + - { runner: "ubuntu-24.04-arm", arch: "arm64" } + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-images-darwin + path: images + - name: Run darwin-built images on native ${{ matrix.arch }} + run: | + status=0 + for tar in images/*-${{ matrix.arch }}.tar; do + tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') + echo "::group::${tag}" + docker run --rm "${tag}" || status=1 + echo "::endgroup::" + done + exit "${status}" + + crossbuild-images-amd64: name: crossbuild-images (amd64 builder) runs-on: ubuntu-22.04-32core @@ -187,10 +189,6 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - # QEMU leaves the *execution* loop (that's the point of the native - # runner jobs) but not the *build* loop: meson's compiler sanity - # check and cc.run() probes execute target-arch binaries through - # the exe_wrapper during the build itself. - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 with: platforms: arm64 @@ -210,7 +208,7 @@ jobs: name: crossbuild-images-arm64 path: ${{ runner.temp }}/images/*.tar retention-days: 1 - crossbuild-run-arm64: + crossbuild-run-amd64-built: name: crossbuild-run (native arm64) needs: crossbuild-images-amd64 runs-on: ubuntu-24.04-arm @@ -229,7 +227,10 @@ jobs: echo "::endgroup::" done exit "${status}" - crossbuild-images-arm: + + + + crossbuild-images-arm64: name: crossbuild-images (arm64 builder) runs-on: ubuntu-24.04-arm steps: @@ -237,14 +238,9 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - # amd64 binfmt for meson's build-time probes (mirror image of the - # arm64 registration on the amd64 builder). - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 with: platforms: amd64 - # Same one-case-per-backend subset as the darwin builder: the - # free arm64 runners are 4-core, and the llvm-fallback coverage - # per backend is what this direction is for. - name: Cross-build amd64 image tarballs from arm64 working-directory: e2e/crossbuild run: | @@ -260,9 +256,9 @@ jobs: name: crossbuild-images-arm-built path: ${{ runner.temp }}/images/*.tar retention-days: 1 - crossbuild-run-arm-built: + crossbuild-run-arm64-built: name: crossbuild-run (arm-built, native amd64) - needs: crossbuild-images-arm + needs: crossbuild-images-arm64 runs-on: ubuntu-latest steps: - uses: actions/download-artifact@v4 @@ -279,66 +275,20 @@ jobs: echo "::endgroup::" done exit "${status}" - crossbuild-images-darwin: - name: crossbuild-images (darwin builder) - if: >- - ${{ github.ref_name == 'main' - || contains(github.head_ref || github.ref_name, 'macos') }} - runs-on: macos-latest - steps: - - uses: actions/checkout@v6 - - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 - with: - bazelisk-cache: true - disk-cache: macos-crossbuild-images - repository-cache: true - # One case per backend family: psutil (setuptools/distutils), - # contourpy (meson-python), rpds_py (maturin/PyO3). - - name: Cross-build linux image tarballs from macOS - working-directory: e2e/crossbuild - shell: bash - run: | - mkdir -p "${RUNNER_TEMP}/images" - for case in psutil contourpy rpds_py; do - for arch in amd64 arm64; do - bazel build --config=ci --action_env=MESON_FORCE_BACKTRACE=1 "//${case}:${arch}_tarball" - cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" - done - done - - uses: actions/upload-artifact@v4 - with: - name: crossbuild-images-darwin - path: ${{ runner.temp }}/images/*.tar - retention-days: 1 - crossbuild-run-darwin-built: - name: crossbuild-run (darwin-built, native ${{ matrix.arch }}) - needs: crossbuild-images-darwin - strategy: - fail-fast: false - matrix: - include: - - { runner: "ubuntu-latest", arch: "amd64" } - - { runner: "ubuntu-24.04-arm", arch: "arm64" } - runs-on: ${{ matrix.runner }} - steps: - - uses: actions/download-artifact@v4 - with: - name: crossbuild-images-darwin - path: images - - name: Run darwin-built images on native ${{ matrix.arch }} - run: | - status=0 - for tar in images/*-${{ matrix.arch }}.tar; do - tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') - echo "::group::${tag}" - docker run --rm "${tag}" || status=1 - echo "::endgroup::" - done - exit "${status}" + + + + + + + + + + test-all: name: test-all runs-on: ubuntu-latest - needs: [test, typecheck] + needs: [buildifier, gazelle, test, typecheck, crossbuild-run-arm64-built, crossbuild-run-arm64-built] if: always() steps: - name: All required jobs succeeded @@ -351,3 +301,42 @@ jobs: echo "Typecheck did not succeed: ${{ needs.typecheck.result }}" exit 1 fi + + + + smoke: + name: smoke (${{ matrix.workspace.path }}, macos) + if: >- + ${{ github.ref_name == 'main' + || contains(github.head_ref || github.ref_name, 'macos') }} + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + workspace: + - { path: ".", slug: "root" } + - { path: "e2e/cases", slug: "e2e" } + - { path: "e2e/crossbuild", slug: "e2e-crossbuild" } + defaults: + run: + working-directory: ${{ matrix.workspace.path }} + steps: + - uses: actions/checkout@v6 + - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + with: + bazelisk-cache: true + disk-cache: macos-${{ matrix.workspace.slug }} + repository-cache: true + # Images still build; only the tests that need a Linux container daemon are + # dropped, since the GitHub-hosted macOS runners have none. + # Run `test //...`, then the workspace's test.sh if it has one + - name: Test + shell: bash + run: | + bazel test --config=ci --keep_going \ + --test_tag_filters=-skip-on-bazel8,-requires-docker \ + --build_tag_filters=-skip-on-bazel8 \ + //... + if [ -f test.sh ]; then + bash test.sh + fi diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 5da8aba15..80ff7ff4b 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -1,103 +1,3 @@ -"""Cross-compiled sdist e2e coverage — isolated from `e2e/cases`. - -`python-geohash` (a real C++ extension) is built for linux/amd64 and -linux/arm64 from the same amd64 exec host, exercising `pep517_native_whl`'s -cross path end to end. Isolated from `e2e/cases` because -`default_build_dependencies`, the pre-build patch, and -`resource_set = "mem_4g"` are specific to `python-geohash` and would -otherwise leak onto unrelated packages sharing the hub. - -The Linux cross toolchain is `gcc_toolchain` (real GCC, hermetic sysroots), -not LLVM: clang is a native cross-compiler and papers over missing -sysroot/flag propagation in ways a stricter GCC cross toolchain won't — for -instance gcc_toolchain does not auto-link libstdc++, so a C++ build here -only succeeds if `cc_layer.bzl` actually forwards the link flags it should. - -On a macOS host, BUILD.bazel's geohash_macos_* targets also build for -arm64/amd64 macOS via the Xcode SDK; see test.sh for why those are `manual` -rather than plain `platform_transition_filegroup` targets. gcc_toolchain is -Linux-only, so geohash_macos_amd64_cross_test has no registered toolchain -for its target/exec combination and will fail analysis with a clear -diagnostic if ever run — this path was already unverified (no CI runs it), -so failing loudly here is a wash, not a regression. - -`//zstandard` cross-compiles a package that also ships official prebuilt -wheels, and diffs our build's compressed output against theirs — a stronger -check than `//geohash`'s fixed expected value, since it validates against an -independent reference build rather than a hardcoded string. - -`//contourpy` (meson-python) and `//awkward_cpp` (scikit-build-core/CMake) -exercise cross support for those two backends, on top of `//geohash` and -`//zstandard`'s setuptools/distutils coverage — `build_helper.py` generates a -meson cross file / CMake toolchain file per build, since neither backend's -own cross auto-detection covers a plain Linux-arch cross build (both only -special-case macOS ARCHFLAGS, plus Android/iOS for meson-python). - -`//rpds_py` (maturin/PyO3, real Rust) needs its own Cargo toolchain: `rust` -registers x86_64 (exec) and arm64 (target) rust_toolchains, and -build_helper.py sets CARGO_BUILD_TARGET / CARGO_TARGET__LINKER since -Cargo has no cross auto-detection at all — every build needs an explicit ---target and a linker for it, or it silently falls back to $CC (the host -driver) and fails at the link step. The arm64-*targeting* rust_toolchain's -sysroot only bundles LLVM's own runtime libs for the exec platform, not its -rust-std (needed to compile build scripts/proc-macros, always host -artifacts) — `//tools:rust_host_sysroot` pins the plain x86_64 toolchain by -label (bypassing toolchain resolution, which under this cross transition -would otherwise hand back the arm64-targeting one again) so -build_helper.py can merge the two sysroots into one Cargo can actually use. - -`//pydantic_core` (maturin/PyO3, ~100 transitive crates vs. //rpds_py's ~20) -and `//bcrypt` (setuptools-rust — a build-backend of plain -"setuptools.build_meta" with "setuptools-rust" only visible in -build-system.requires, and no --target flag of its own either — it shells -out to a bare `cargo rustc` and relies on the same $CARGO_BUILD_TARGET) each -add a second, widely-used real-world package per Rust code path, so neither -is validated by one lucky package alone. setuptools-rust also needed -PYO3_CROSS_PYTHON_VERSION: maturin auto-generates a PYO3_CONFIG_FILE for -pyo3-ffi's build script, but setuptools-rust gives it no cross help at all. -`//psutil` is a second, far more widely-used plain setuptools/distutils -C-extension package alongside `//geohash` and `//zstandard`, for the same -"one lucky package" reason. - -`//jpype1` (scikit-build-core/CMake, same backend as `//awkward_cpp`) needs -a JDK and Apache Ant on top of that — but both are always exec-platform -tools regardless of what CPU `_jpype.so` targets: it only links against -libdl (see its CMakeLists.txt), never libjvm/libjawt, and the JAR Ant -produces is portable JVM bytecode, so unlike Rust's rust-std there's no -host/target split to solve here. `@bazel_tools//tools/jdk:current_java_runtime` -(used by e.g. `e2e/cases/uv-sdist-jdk-build`) resolves to rules_java's -default remotejdk, which is actually Azul Zulu, not genuine Eclipse -Temurin — `@temurin11_linux_x86_64` fetches a real Temurin 11 build instead -(see its `http_archive` for the exact Adoptium release metadata). Ant ships -no Bazel toolchain at all upstream, hermetic or otherwise, so -`@apache_ant` + `//tools:ant_home` vendor and expose it the same way. - -`//msgpack` is a third setuptools/distutils C-extension package, distinct -from `//geohash` (hand-written C++) and `//psutil`/`//zstandard` (hand-written -C/CFFI): its extension is Cython-generated, committed as pre-Cythonized .c -in the sdist, exercising that code-generation path's symbol/link pattern -rather than a fourth hand-written one. - -`//tiktoken` is a second setuptools-rust package alongside `//bcrypt` (same -build-backend shape, same $CARGO_BUILD_TARGET-driven cross path) — not a -maturin package despite superficially resembling `//rpds_py`/ -`//pydantic_core`; verified against its real sdist pyproject.toml before -wiring it in. Its own encodings download BPE vocab files over the network on -first use, which a sandboxed cross build/QEMU container can't do, so -tiktoken_main.py builds a minimal `tiktoken.Encoding` directly instead — -still a real round-trip through the compiled Rust core, just without the -network dependency. - -`//numpy` is the only other widely-used meson-python package besides -`//contourpy` — its build has no cross auto-detection for a missing system -BLAS/LAPACK either (meson-python only special-cases the macOS ARCHFLAGS/ -Android/iOS cases build_helper.py already works around), so it needs its -own `-Dblas=none -Dlapack=none` (numpy's own documented no-BLAS recipe, see -its emscripten cibuildwheel config) passed via a new, backend-generic -RULES_PY_MESON_SETUP_ARGS env var — needed for the *native* build here too, -since this sandbox has no system BLAS/LAPACK either, not just the cross one. -""" - bazel_dep(name = "aspect_rules_py") bazel_dep(name = "bazel_features", version = "1.38.0") bazel_dep(name = "bazel_skylib", version = "1.4.2") @@ -118,7 +18,6 @@ local_path_override( path = "../..", ) -# Ensure any transitive "aspect_bazel_lib" is latest to be forward compatible with bazel_lib 3+ single_version_override( module_name = "aspect_bazel_lib", version = "2.22.5", @@ -171,9 +70,6 @@ register_toolchains("@llvm//toolchain:all") rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") rust.toolchain( edition = "2021", - # Both linux triples: on the linux/amd64 CI runner x86_64 is the host - # triple (redundant there), but a darwin host needs it as an explicit - # cross target for the amd64 cases. extra_target_triples = [ "aarch64-unknown-linux-gnu", "x86_64-unknown-linux-gnu", @@ -197,7 +93,6 @@ oci.pull( ) use_repo(oci, "ubuntu", "ubuntu_linux_amd64", "ubuntu_linux_arm64_v8") -# Used by assert_tar_listing (tools/asserts.bzl). bazel_lib_toolchains = use_extension("@tar.bzl//tar:extensions.bzl", "toolchains", dev_dependency = True) use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") From 98f8bffd16245ce0372cd580cfe9f39948ffe3d0 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 01:37:18 -0600 Subject: [PATCH 047/103] ci(e2e): fold the crossbuild pipelines into one reusable workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six flat jobs rendered as dependency spaghetti in the Actions graph. Each builder direction is now one workflow_call node (crossbuild-{amd64,arm64,darwin}) that expands to its own images->run chain, parameterized over the four real differences: builder runner, setup flavor, case list, and native-executor matrix. The build command is now uniform too — every builder gets --config=ci with toplevel output materialization and the meson traceback instrumentation. --- .github/workflows/ci-workflows.yaml | 197 +++++------------------ .github/workflows/crossbuild-verify.yaml | 104 ++++++++++++ 2 files changed, 144 insertions(+), 157 deletions(-) create mode 100644 .github/workflows/crossbuild-verify.yaml diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index a547d9aa0..5c39371de 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -125,166 +125,49 @@ jobs: # workspaces, on main plus branches whose name contains 'macos'. # https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes - crossbuild-images-darwin: - name: crossbuild-images (darwin builder) + # Artifact-based cross verification: each crossbuild-* node below is one + # build->run pipeline from .github/workflows/crossbuild-verify.yaml — + # build OCI tarballs on one host, execute them on NATIVE runners per + # target arch. Directions: + # - amd64 builder (gcc_toolchain) -> native arm64 execution. Native amd64 + # execution is already covered by the e2e-crossbuild test job. + # - arm64 builder (llvm fallback; gcc_toolchain has no arm64-exec + # variant) -> native amd64 execution. Closes the linux<->linux cycle. + # - darwin builder (llvm; 10x-billed, gated like smoke) -> native amd64 + + # arm64. The macOS smoke job filters -requires-docker, so these are the + # only execution coverage the darwin->linux path has. + crossbuild-amd64: + uses: ./.github/workflows/crossbuild-verify.yaml + secrets: inherit + with: + builder-runner: ubuntu-22.04-32core + qemu-platforms: arm64 + archs: arm64 + artifact: crossbuild-images-amd64-built + run-matrix: '[{"runner": "ubuntu-24.04-arm", "arch": "arm64"}]' + crossbuild-arm64: + uses: ./.github/workflows/crossbuild-verify.yaml + secrets: inherit + with: + builder-runner: ubuntu-24.04-arm + qemu-platforms: amd64 + cases: psutil contourpy rpds_py + archs: amd64 + artifact: crossbuild-images-arm64-built + run-matrix: '[{"runner": "ubuntu-latest", "arch": "amd64"}]' + crossbuild-darwin: if: >- ${{ github.ref_name == 'main' || contains(github.head_ref || github.ref_name, 'macos') }} - runs-on: macos-latest - steps: - - uses: actions/checkout@v6 - - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 - with: - bazelisk-cache: true - disk-cache: macos-crossbuild-images - repository-cache: true - - name: Cross-build linux image tarballs from macOS - working-directory: e2e/crossbuild - shell: bash - run: | - mkdir -p "${RUNNER_TEMP}/images" - for case in psutil contourpy rpds_py; do - for arch in amd64 arm64; do - bazel build --config=ci --action_env=MESON_FORCE_BACKTRACE=1 "//${case}:${arch}_tarball" - cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" - done - done - - uses: actions/upload-artifact@v4 - with: - name: crossbuild-images-darwin - path: ${{ runner.temp }}/images/*.tar - retention-days: 1 - crossbuild-run-darwin-built: - name: crossbuild-run (darwin-built, native ${{ matrix.arch }}) - needs: crossbuild-images-darwin - strategy: - fail-fast: false - matrix: - include: - - { runner: "ubuntu-latest", arch: "amd64" } - - { runner: "ubuntu-24.04-arm", arch: "arm64" } - runs-on: ${{ matrix.runner }} - steps: - - uses: actions/download-artifact@v4 - with: - name: crossbuild-images-darwin - path: images - - name: Run darwin-built images on native ${{ matrix.arch }} - run: | - status=0 - for tar in images/*-${{ matrix.arch }}.tar; do - tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') - echo "::group::${tag}" - docker run --rm "${tag}" || status=1 - echo "::endgroup::" - done - exit "${status}" - - - crossbuild-images-amd64: - name: crossbuild-images (amd64 builder) - runs-on: ubuntu-22.04-32core - steps: - - uses: actions/checkout@v6 - - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 - with: - aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - with: - platforms: arm64 - - name: Build arm64 image tarballs - working-directory: e2e/crossbuild - run: | - targets=$(bazel query 'filter(".*:arm64_tarball$", //...)') - bazel build ${targets} - mkdir -p "${RUNNER_TEMP}/images" - for target in ${targets}; do - case="${target#//}" - case="${case%:arm64_tarball}" - cp "bazel-bin/${case}/arm64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-arm64.tar" - done - - uses: actions/upload-artifact@v4 - with: - name: crossbuild-images-arm64 - path: ${{ runner.temp }}/images/*.tar - retention-days: 1 - crossbuild-run-amd64-built: - name: crossbuild-run (native arm64) - needs: crossbuild-images-amd64 - runs-on: ubuntu-24.04-arm - steps: - - uses: actions/download-artifact@v4 - with: - name: crossbuild-images-arm64 - path: images - - name: Run every image on native arm64 - run: | - status=0 - for tar in images/*-arm64.tar; do - tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') - echo "::group::${tag}" - docker run --rm "${tag}" || status=1 - echo "::endgroup::" - done - exit "${status}" - - - - crossbuild-images-arm64: - name: crossbuild-images (arm64 builder) - runs-on: ubuntu-24.04-arm - steps: - - uses: actions/checkout@v6 - - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 - with: - aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - with: - platforms: amd64 - - name: Cross-build amd64 image tarballs from arm64 - working-directory: e2e/crossbuild - run: | - mkdir -p "${RUNNER_TEMP}/images" - for case in psutil contourpy rpds_py; do - # toplevel: build-without-the-bytes must still materialize - # the tarball this job exists to upload. - bazel build --config=ci --remote_download_outputs=toplevel "//${case}:amd64_tarball" - cp "bazel-bin/${case}/amd64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-amd64.tar" - done - - uses: actions/upload-artifact@v4 - with: - name: crossbuild-images-arm-built - path: ${{ runner.temp }}/images/*.tar - retention-days: 1 - crossbuild-run-arm64-built: - name: crossbuild-run (arm-built, native amd64) - needs: crossbuild-images-arm64 - runs-on: ubuntu-latest - steps: - - uses: actions/download-artifact@v4 - with: - name: crossbuild-images-arm-built - path: images - - name: Run arm-built images on native amd64 - run: | - status=0 - for tar in images/*-amd64.tar; do - tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') - echo "::group::${tag}" - docker run --rm "${tag}" || status=1 - echo "::endgroup::" - done - exit "${status}" - - - - - - - - - - + uses: ./.github/workflows/crossbuild-verify.yaml + secrets: inherit + with: + builder-runner: macos-latest + setup: bazel + cases: psutil contourpy rpds_py + archs: amd64 arm64 + artifact: crossbuild-images-darwin-built + run-matrix: '[{"runner": "ubuntu-latest", "arch": "amd64"}, {"runner": "ubuntu-24.04-arm", "arch": "arm64"}]' test-all: name: test-all runs-on: ubuntu-latest diff --git a/.github/workflows/crossbuild-verify.yaml b/.github/workflows/crossbuild-verify.yaml new file mode 100644 index 000000000..3499d554d --- /dev/null +++ b/.github/workflows/crossbuild-verify.yaml @@ -0,0 +1,104 @@ +name: crossbuild-verify + +# One build→run verification pipeline for e2e/crossbuild, reused per builder +# platform by ci-workflows.yaml. Builds OCI tarballs for the requested target +# arches on the given builder, uploads them, and executes each on NATIVE +# hardware — no QEMU in the execution loop (build-time meson probes may still +# need binfmt, hence qemu-platforms). +on: + workflow_call: + inputs: + builder-runner: + required: true + type: string + setup: + description: "'aspect' (Aspect CLI + remote cache) or 'bazel' (setup-bazel, for macOS)" + type: string + default: aspect + qemu-platforms: + description: binfmt platforms the builder needs for build-time probes + type: string + default: "" + cases: + description: space-separated case dirs; empty = every case exposing tarball targets + type: string + default: "" + archs: + description: space-separated target arches to build tarballs for + required: true + type: string + artifact: + required: true + type: string + run-matrix: + description: 'JSON include list of {runner, arch} native executors' + required: true + type: string + +jobs: + images: + runs-on: ${{ inputs.builder-runner }} + steps: + - uses: actions/checkout@v6 + - if: inputs.setup == 'aspect' + uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 + with: + aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + - if: inputs.setup == 'bazel' + uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + with: + bazelisk-cache: true + disk-cache: ${{ inputs.artifact }} + repository-cache: true + - if: inputs.qemu-platforms != '' + uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 + with: + platforms: ${{ inputs.qemu-platforms }} + - name: Build image tarballs + working-directory: e2e/crossbuild + shell: bash + run: | + mkdir -p "${RUNNER_TEMP}/images" + for arch in ${{ inputs.archs }}; do + cases="${{ inputs.cases }}" + if [ -z "${cases}" ]; then + cases=$(bazel query "filter(\".*:${arch}_tarball\$\", //...)" | sed -e 's|^//||' -e "s|:${arch}_tarball||") + fi + for case in ${cases}; do + # toplevel: build-without-the-bytes must still + # materialize the tarball this job exists to upload. + bazel build --config=ci \ + --remote_download_outputs=toplevel \ + --action_env=MESON_FORCE_BACKTRACE=1 \ + "//${case}:${arch}_tarball" + cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" + done + done + - uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.artifact }} + path: ${{ runner.temp }}/images/*.tar + retention-days: 1 + run: + name: run (native ${{ matrix.arch }}) + needs: images + strategy: + fail-fast: false + matrix: + include: ${{ fromJSON(inputs.run-matrix) }} + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/download-artifact@v4 + with: + name: ${{ inputs.artifact }} + path: images + - name: Run images on native ${{ matrix.arch }} + run: | + status=0 + for tar in images/*-${{ matrix.arch }}.tar; do + tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') + echo "::group::${tag}" + docker run --rm "${tag}" || status=1 + echo "::endgroup::" + done + exit "${status}" From 22da005f9a7bc67219758282e13830b4ab88ce24 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 01:40:32 -0600 Subject: [PATCH 048/103] ci: gate test-all on the crossbuild pipelines, tolerating the darwin skip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous needs list referenced the pre-refactor job names (twice), which is a workflow startup error — the whole CI run failed to launch. test-all now needs the three reusable-workflow nodes and requires success from everything unconditional; crossbuild-darwin may be skipped (it only runs on main and '*macos*' branches) but must pass when it ran. --- .github/workflows/ci-workflows.yaml | 33 +++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 5c39371de..759e8d36c 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -171,21 +171,32 @@ jobs: test-all: name: test-all runs-on: ubuntu-latest - needs: [buildifier, gazelle, test, typecheck, crossbuild-run-arm64-built, crossbuild-run-arm64-built] + needs: [buildifier, gazelle, test, typecheck, crossbuild-amd64, crossbuild-arm64, crossbuild-darwin] if: always() steps: - name: All required jobs succeeded run: | - if [ "${{ needs.test.result }}" != "success" ]; then - echo "One or more test matrix jobs did not succeed: ${{ needs.test.result }}" - exit 1 - fi - if [ "${{ needs.typecheck.result }}" != "success" ]; then - echo "Typecheck did not succeed: ${{ needs.typecheck.result }}" - exit 1 - fi - - + for result in \ + "test=${{ needs.test.result }}" \ + "typecheck=${{ needs.typecheck.result }}" \ + "buildifier=${{ needs.buildifier.result }}" \ + "gazelle=${{ needs.gazelle.result }}" \ + "crossbuild-amd64=${{ needs['crossbuild-amd64'].result }}" \ + "crossbuild-arm64=${{ needs['crossbuild-arm64'].result }}"; do + if [ "${result#*=}" != "success" ]; then + echo "Required job did not succeed: ${result}" + exit 1 + fi + done + # crossbuild-darwin is gated to main and '*macos*' branches: + # skipped is expected elsewhere; anything that ran must pass. + case "${{ needs['crossbuild-darwin'].result }}" in + success|skipped) ;; + *) + echo "crossbuild-darwin did not succeed: ${{ needs['crossbuild-darwin'].result }}" + exit 1 + ;; + esac smoke: name: smoke (${{ matrix.workspace.path }}, macos) From 929e38d578b276a146c0e089f7491ef48993e085 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 02:00:38 -0600 Subject: [PATCH 049/103] =?UTF-8?q?refactor(e2e):=20move=20crossbuild=20ex?= =?UTF-8?q?ecution=20off-host=20=E2=80=94=20native=20runners=20only?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop every container_structure_test from e2e/crossbuild: they compiled and executed on the same host through a docker+QEMU sandwich, and the crossbuild-verify pipelines have superseded them — each case's OCI tarball is uploaded and `docker run` on native amd64 and arm64 runners, which is where execution verification now lives exclusively. geohash and zstandard gain the same {amd64,arm64}_load/_tarball targets the macro declares, so the builder's tarball query picks them up automatically; the amd64 pipeline now ships both arch sets (in-suite amd64 command tests were the only native amd64 execution before). `bazel test //...` in the workspace is structural-only (ELF arch, ABI tags, byte-diffs) and no longer needs docker at all. The container_structure_test dep is gone; uv_bin pin restored to 0.11.21, the only version pinned in versions.bzl. --- .github/workflows/ci-workflows.yaml | 188 ++++++++++++++---- .github/workflows/crossbuild-verify.yaml | 104 ---------- e2e/README.md | 8 +- e2e/crossbuild/MODULE.bazel | 3 +- e2e/crossbuild/MODULE.bazel.lock | 113 ----------- .../awkward_cpp_image_command_test.yaml | 9 - .../bcrypt/bcrypt_image_command_test.yaml | 9 - .../contourpy_image_command_test.yaml | 9 - e2e/crossbuild/geohash/BUILD.bazel | 45 +++-- .../geohash/geohash_image_command_test.yaml | 9 - .../jpype1/jpype1_image_command_test.yaml | 9 - .../msgpack/msgpack_image_command_test.yaml | 9 - .../numpy/numpy_image_command_test.yaml | 9 - .../psutil/psutil_image_command_test.yaml | 9 - .../pydantic_core_image_command_test.yaml | 9 - .../rpds_py/rpds_py_image_command_test.yaml | 9 - .../tiktoken/tiktoken_image_command_test.yaml | 10 - e2e/crossbuild/tools/cross_case.bzl | 61 ++---- e2e/crossbuild/zstandard/BUILD.bazel | 41 ++-- .../zstandard/zstandard_diff_test.yaml | 7 - 20 files changed, 224 insertions(+), 446 deletions(-) delete mode 100644 .github/workflows/crossbuild-verify.yaml delete mode 100644 e2e/crossbuild/awkward_cpp/awkward_cpp_image_command_test.yaml delete mode 100644 e2e/crossbuild/bcrypt/bcrypt_image_command_test.yaml delete mode 100644 e2e/crossbuild/contourpy/contourpy_image_command_test.yaml delete mode 100644 e2e/crossbuild/geohash/geohash_image_command_test.yaml delete mode 100644 e2e/crossbuild/jpype1/jpype1_image_command_test.yaml delete mode 100644 e2e/crossbuild/msgpack/msgpack_image_command_test.yaml delete mode 100644 e2e/crossbuild/numpy/numpy_image_command_test.yaml delete mode 100644 e2e/crossbuild/psutil/psutil_image_command_test.yaml delete mode 100644 e2e/crossbuild/pydantic_core/pydantic_core_image_command_test.yaml delete mode 100644 e2e/crossbuild/rpds_py/rpds_py_image_command_test.yaml delete mode 100644 e2e/crossbuild/tiktoken/tiktoken_image_command_test.yaml delete mode 100644 e2e/crossbuild/zstandard/zstandard_diff_test.yaml diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 759e8d36c..0a4d7dd7d 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -125,49 +125,157 @@ jobs: # workspaces, on main plus branches whose name contains 'macos'. # https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes - # Artifact-based cross verification: each crossbuild-* node below is one - # build->run pipeline from .github/workflows/crossbuild-verify.yaml — - # build OCI tarballs on one host, execute them on NATIVE runners per - # target arch. Directions: - # - amd64 builder (gcc_toolchain) -> native arm64 execution. Native amd64 - # execution is already covered by the e2e-crossbuild test job. - # - arm64 builder (llvm fallback; gcc_toolchain has no arm64-exec - # variant) -> native amd64 execution. Closes the linux<->linux cycle. - # - darwin builder (llvm; 10x-billed, gated like smoke) -> native amd64 + - # arm64. The macOS smoke job filters -requires-docker, so these are the - # only execution coverage the darwin->linux path has. - crossbuild-amd64: - uses: ./.github/workflows/crossbuild-verify.yaml - secrets: inherit - with: - builder-runner: ubuntu-22.04-32core - qemu-platforms: arm64 - archs: arm64 - artifact: crossbuild-images-amd64-built - run-matrix: '[{"runner": "ubuntu-24.04-arm", "arch": "arm64"}]' - crossbuild-arm64: - uses: ./.github/workflows/crossbuild-verify.yaml - secrets: inherit - with: - builder-runner: ubuntu-24.04-arm - qemu-platforms: amd64 - cases: psutil contourpy rpds_py - archs: amd64 - artifact: crossbuild-images-arm64-built - run-matrix: '[{"runner": "ubuntu-latest", "arch": "amd64"}]' - crossbuild-darwin: + crossbuild-images-darwin: + name: crossbuild-images (darwin builder) if: >- ${{ github.ref_name == 'main' || contains(github.head_ref || github.ref_name, 'macos') }} - uses: ./.github/workflows/crossbuild-verify.yaml - secrets: inherit - with: - builder-runner: macos-latest - setup: bazel - cases: psutil contourpy rpds_py - archs: amd64 arm64 - artifact: crossbuild-images-darwin-built - run-matrix: '[{"runner": "ubuntu-latest", "arch": "amd64"}, {"runner": "ubuntu-24.04-arm", "arch": "arm64"}]' + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + with: + bazelisk-cache: true + disk-cache: macos-crossbuild-images + repository-cache: true + - name: Cross-build linux image tarballs from macOS + working-directory: e2e/crossbuild + shell: bash + run: | + mkdir -p "${RUNNER_TEMP}/images" + for case in psutil contourpy rpds_py; do + for arch in amd64 arm64; do + bazel build --config=ci --action_env=MESON_FORCE_BACKTRACE=1 "//${case}:${arch}_tarball" + cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" + done + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-images-darwin + path: ${{ runner.temp }}/images/*.tar + retention-days: 1 + crossbuild-run-darwin-built: + name: crossbuild-run (darwin-built, native ${{ matrix.arch }}) + needs: crossbuild-images-darwin + strategy: + fail-fast: false + matrix: + include: + - { runner: "ubuntu-latest", arch: "amd64" } + - { runner: "ubuntu-24.04-arm", arch: "arm64" } + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-images-darwin + path: images + - name: Run darwin-built images on native ${{ matrix.arch }} + run: | + status=0 + for tar in images/*-${{ matrix.arch }}.tar; do + tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') + echo "::group::${tag}" + docker run --rm "${tag}" || status=1 + echo "::endgroup::" + done + exit "${status}" + + + crossbuild-images-amd64: + name: crossbuild-images (amd64 builder) + runs-on: ubuntu-22.04-32core + steps: + - uses: actions/checkout@v6 + - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 + with: + aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 + with: + platforms: arm64 + - name: Build arm64 image tarballs + working-directory: e2e/crossbuild + run: | + targets=$(bazel query 'filter(".*:arm64_tarball$", //...)') + bazel build ${targets} + mkdir -p "${RUNNER_TEMP}/images" + for target in ${targets}; do + case="${target#//}" + case="${case%:arm64_tarball}" + cp "bazel-bin/${case}/arm64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-arm64.tar" + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-images-arm64 + path: ${{ runner.temp }}/images/*.tar + retention-days: 1 + crossbuild-run-amd64-built: + name: crossbuild-run (native arm64) + needs: crossbuild-images-amd64 + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-images-arm64 + path: images + - name: Run every image on native arm64 + run: | + status=0 + for tar in images/*-arm64.tar; do + tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') + echo "::group::${tag}" + docker run --rm "${tag}" || status=1 + echo "::endgroup::" + done + exit "${status}" + + + crossbuild-images-arm64: + name: crossbuild-images (arm64 builder) + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/checkout@v6 + - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 + with: + aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 + with: + platforms: amd64 + - name: Cross-build amd64 image tarballs from arm64 + working-directory: e2e/crossbuild + run: | + mkdir -p "${RUNNER_TEMP}/images" + for case in psutil contourpy rpds_py; do + # toplevel: build-without-the-bytes must still materialize + # the tarball this job exists to upload. + bazel build --config=ci --remote_download_outputs=toplevel "//${case}:amd64_tarball" + cp "bazel-bin/${case}/amd64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-amd64.tar" + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-images-arm-built + path: ${{ runner.temp }}/images/*.tar + retention-days: 1 + crossbuild-run-arm64-built: + name: crossbuild-run (arm-built, native amd64) + needs: crossbuild-images-arm64 + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-images-arm-built + path: images + - name: Run arm-built images on native amd64 + run: | + status=0 + for tar in images/*-amd64.tar; do + tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') + echo "::group::${tag}" + docker run --rm "${tag}" || status=1 + echo "::endgroup::" + done + exit "${status}" + + test-all: name: test-all runs-on: ubuntu-latest diff --git a/.github/workflows/crossbuild-verify.yaml b/.github/workflows/crossbuild-verify.yaml deleted file mode 100644 index 3499d554d..000000000 --- a/.github/workflows/crossbuild-verify.yaml +++ /dev/null @@ -1,104 +0,0 @@ -name: crossbuild-verify - -# One build→run verification pipeline for e2e/crossbuild, reused per builder -# platform by ci-workflows.yaml. Builds OCI tarballs for the requested target -# arches on the given builder, uploads them, and executes each on NATIVE -# hardware — no QEMU in the execution loop (build-time meson probes may still -# need binfmt, hence qemu-platforms). -on: - workflow_call: - inputs: - builder-runner: - required: true - type: string - setup: - description: "'aspect' (Aspect CLI + remote cache) or 'bazel' (setup-bazel, for macOS)" - type: string - default: aspect - qemu-platforms: - description: binfmt platforms the builder needs for build-time probes - type: string - default: "" - cases: - description: space-separated case dirs; empty = every case exposing tarball targets - type: string - default: "" - archs: - description: space-separated target arches to build tarballs for - required: true - type: string - artifact: - required: true - type: string - run-matrix: - description: 'JSON include list of {runner, arch} native executors' - required: true - type: string - -jobs: - images: - runs-on: ${{ inputs.builder-runner }} - steps: - - uses: actions/checkout@v6 - - if: inputs.setup == 'aspect' - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 - with: - aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - - if: inputs.setup == 'bazel' - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 - with: - bazelisk-cache: true - disk-cache: ${{ inputs.artifact }} - repository-cache: true - - if: inputs.qemu-platforms != '' - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - with: - platforms: ${{ inputs.qemu-platforms }} - - name: Build image tarballs - working-directory: e2e/crossbuild - shell: bash - run: | - mkdir -p "${RUNNER_TEMP}/images" - for arch in ${{ inputs.archs }}; do - cases="${{ inputs.cases }}" - if [ -z "${cases}" ]; then - cases=$(bazel query "filter(\".*:${arch}_tarball\$\", //...)" | sed -e 's|^//||' -e "s|:${arch}_tarball||") - fi - for case in ${cases}; do - # toplevel: build-without-the-bytes must still - # materialize the tarball this job exists to upload. - bazel build --config=ci \ - --remote_download_outputs=toplevel \ - --action_env=MESON_FORCE_BACKTRACE=1 \ - "//${case}:${arch}_tarball" - cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" - done - done - - uses: actions/upload-artifact@v4 - with: - name: ${{ inputs.artifact }} - path: ${{ runner.temp }}/images/*.tar - retention-days: 1 - run: - name: run (native ${{ matrix.arch }}) - needs: images - strategy: - fail-fast: false - matrix: - include: ${{ fromJSON(inputs.run-matrix) }} - runs-on: ${{ matrix.runner }} - steps: - - uses: actions/download-artifact@v4 - with: - name: ${{ inputs.artifact }} - path: images - - name: Run images on native ${{ matrix.arch }} - run: | - status=0 - for tar in images/*-${{ matrix.arch }}.tar; do - tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') - echo "::group::${tag}" - docker run --rm "${tag}" || status=1 - echo "::endgroup::" - done - exit "${status}" diff --git a/e2e/README.md b/e2e/README.md index a88516e7d..9f5508aaa 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -46,9 +46,11 @@ on rules_java's default remotejdk, which is actually Azul Zulu, or a system `ant`), two maturin/PyO3 Rust packages (`rpds_py`, `pydantic_core`), and `bcrypt` (setuptools-rust — a different real-world Rust-in-Python integration than maturin, with no build-backend value of its own to detect -it by). Every case is built and packaged for linux/amd64 and linux/arm64 -from the same amd64 exec host and actually executed — QEMU for the Linux -targets — not just inspected. The same workspace hosts the rules_pycross +it by). Every case is built and packaged for linux/amd64 and linux/arm64. +In-suite verification is structural (ELF arch, ABI tags, byte-diffs); +execution happens in CI's crossbuild-verify pipelines, which upload each +case's OCI tarball and `docker run` it on NATIVE amd64 and arm64 runners — +no emulation in the verdict. The same workspace hosts the rules_pycross ports (`pycross-*`), which force packages to build from their sdists and assert properties of the resulting wheels, including rebuilding them under non-host target platforms via `collect_wheels`. One more package diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 80ff7ff4b..c18f84c04 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -9,7 +9,6 @@ bazel_dep(name = "gcc_toolchain", version = "0.11.0") bazel_dep(name = "llvm", version = "0.8.3") bazel_dep(name = "rules_oci", version = "2.2.7") bazel_dep(name = "rules_shell", version = "0.4.1") -bazel_dep(name = "container_structure_test", version = "1.22.1") bazel_dep(name = "rules_rust", version = "0.68.0") bazel_dep(name = "rules_java", version = "8.14.0") @@ -97,7 +96,7 @@ bazel_lib_toolchains = use_extension("@tar.bzl//tar:extensions.bzl", "toolchains use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") uv_bin = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv_bin") -uv_bin.toolchain(version = "0.11.6") +uv_bin.toolchain(version = "0.11.21") use_repo(uv_bin, "uv") uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") diff --git a/e2e/crossbuild/MODULE.bazel.lock b/e2e/crossbuild/MODULE.bazel.lock index d58d47c51..4992f0b38 100644 --- a/e2e/crossbuild/MODULE.bazel.lock +++ b/e2e/crossbuild/MODULE.bazel.lock @@ -60,8 +60,6 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", - "https://bcr.bazel.build/modules/container_structure_test/1.22.1/MODULE.bazel": "da58a98f9f6d47e702532fdfec0431bd60e417d3f004471f409a4543cae0e61e", - "https://bcr.bazel.build/modules/container_structure_test/1.22.1/source.json": "75873f230014ff7a6f30e9f81b9e31ee4593c71353ffa8d5f8fe4ad4aba21160", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.1/MODULE.bazel": "cdf8cbe5ee750db04b78878c9633cc76e80dcf4416cbe982ac3a9222f80713c8", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", @@ -242,117 +240,6 @@ ] } }, - "@@container_structure_test+//:repositories.bzl%extension": { - "general": { - "bzlTransitiveDigest": "Yi2XrRCMXgBjN02PBU8hDqf505D+o2Tr5jihM3CNIE4=", - "usagesDigest": "uXk1ym4ketE3OMAHoR5fUuuv8pOmi0aSyCe28koTwfA=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "jq_darwin_amd64": { - "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", - "attributes": { - "platform": "darwin_amd64", - "version": "1.7" - } - }, - "jq_darwin_arm64": { - "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", - "attributes": { - "platform": "darwin_arm64", - "version": "1.7" - } - }, - "jq_linux_amd64": { - "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", - "attributes": { - "platform": "linux_amd64", - "version": "1.7" - } - }, - "jq_linux_arm64": { - "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", - "attributes": { - "platform": "linux_arm64", - "version": "1.7" - } - }, - "jq_windows_amd64": { - "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_platform_repo", - "attributes": { - "platform": "windows_amd64", - "version": "1.7" - } - }, - "jq": { - "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_host_alias_repo", - "attributes": {} - }, - "jq_toolchains": { - "repoRuleId": "@@aspect_bazel_lib+//lib/private:jq_toolchain.bzl%jq_toolchains_repo", - "attributes": { - "user_repository_name": "jq" - } - }, - "structure_test_st_darwin_amd64": { - "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", - "attributes": { - "platform": "darwin_amd64" - } - }, - "structure_test_st_darwin_arm64": { - "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", - "attributes": { - "platform": "darwin_arm64" - } - }, - "structure_test_st_linux_arm64": { - "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", - "attributes": { - "platform": "linux_arm64" - } - }, - "structure_test_st_linux_s390x": { - "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", - "attributes": { - "platform": "linux_s390x" - } - }, - "structure_test_st_linux_amd64": { - "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", - "attributes": { - "platform": "linux_amd64" - } - }, - "structure_test_st_windows_amd64": { - "repoRuleId": "@@container_structure_test+//:repositories.bzl%structure_test_repositories", - "attributes": { - "platform": "windows_amd64" - } - }, - "structure_test_toolchains": { - "repoRuleId": "@@container_structure_test+//bazel:toolchains_repo.bzl%toolchains_repo", - "attributes": { - "toolchain_type": "@container_structure_test//bazel:structure_test_toolchain_type", - "toolchain": "@structure_test_st_{platform}//:structure_test_toolchain" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "aspect_bazel_lib+", - "bazel_tools", - "bazel_tools" - ], - [ - "container_structure_test+", - "aspect_bazel_lib", - "aspect_bazel_lib+" - ] - ] - } - }, "@@gcc_toolchain+//:internal.bzl%non_bazel_dependencies": { "general": { "bzlTransitiveDigest": "hmUGYjMm3KwHvLCbnHLlUJifQF92hJY/BW858Vkjzr8=", diff --git a/e2e/crossbuild/awkward_cpp/awkward_cpp_image_command_test.yaml b/e2e/crossbuild/awkward_cpp/awkward_cpp_image_command_test.yaml deleted file mode 100644 index 02721d4ed..000000000 --- a/e2e/crossbuild/awkward_cpp/awkward_cpp_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# awkward_cpp_main.py asserts the exact null count itself and only prints -# "OK" on success. -commandTests: - - name: awkward_IndexedArray_numnull counts correctly - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/bcrypt/bcrypt_image_command_test.yaml b/e2e/crossbuild/bcrypt/bcrypt_image_command_test.yaml deleted file mode 100644 index eb9fa7ad5..000000000 --- a/e2e/crossbuild/bcrypt/bcrypt_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# bcrypt_main.py asserts the hashpw/checkpw round-trip itself and only -# prints "OK" on success. -commandTests: - - name: bcrypt hashpw/checkpw round-trips correctly - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/contourpy/contourpy_image_command_test.yaml b/e2e/crossbuild/contourpy/contourpy_image_command_test.yaml deleted file mode 100644 index 7d8f5c80c..000000000 --- a/e2e/crossbuild/contourpy/contourpy_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# contourpy_main.py asserts the exact 1.5-contour of z=x+y itself and only -# prints "OK" on success. -commandTests: - - name: contourpy computes the 1.5 contour of z=x+y correctly - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/geohash/BUILD.bazel b/e2e/crossbuild/geohash/BUILD.bazel index a31ea998e..5866b7e23 100644 --- a/e2e/crossbuild/geohash/BUILD.bazel +++ b/e2e/crossbuild/geohash/BUILD.bazel @@ -6,8 +6,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") load("@bazel_lib//lib:transitions.bzl", "platform_transition_binary", "platform_transition_filegroup") load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("@container_structure_test//:defs.bzl", "container_structure_test") -load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_oci//oci:defs.bzl", "oci_image", "oci_load") load("@rules_shell//shell:sh_test.bzl", "sh_test") load("//tools:checks.bzl", "assert_so_arch", "assert_so_suffix") @@ -105,27 +104,35 @@ platform_transition_filegroup( target_platform = "//:arm64_linux", ) -container_structure_test( - name = "geohash_amd64_image_command_test", - configs = ["geohash_image_command_test.yaml"], +# Execution happens in CI's crossbuild-verify pipelines on NATIVE runners +# (amd64 and arm64) — geohash_main.py asserts the exact encoded value and +# exits nonzero on mismatch, so `docker run` exit status is the verdict. +oci_load( + name = "amd64_load", image = ":geohash_amd64_image", - platform = "linux/amd64", - tags = ["requires-docker"], + repo_tags = ["crossbuild/geohash:amd64"], + tags = ["manual"], ) -# Runs the arm64 build under QEMU (binfmt_misc) instead of just checking its -# ELF/suffix — proves the extension computes the right answer, not just that -# it looks cross-compiled. Local repro: sudo apt-get install qemu-user-static -# binfmt-support. -container_structure_test( - name = "geohash_arm64_image_command_test", - configs = ["geohash_image_command_test.yaml"], +filegroup( + name = "amd64_tarball", + srcs = [":amd64_load"], + output_group = "tarball", + tags = ["manual"], +) + +oci_load( + name = "arm64_load", image = ":geohash_arm64_image", - platform = "linux/aarch64", - tags = [ - "requires-docker", - "requires-qemu", - ], + repo_tags = ["crossbuild/geohash:arm64"], + tags = ["manual"], +) + +filegroup( + name = "arm64_tarball", + srcs = [":arm64_load"], + output_group = "tarball", + tags = ["manual"], ) # geohash_bin with no platform override already targets the ambient host, diff --git a/e2e/crossbuild/geohash/geohash_image_command_test.yaml b/e2e/crossbuild/geohash/geohash_image_command_test.yaml deleted file mode 100644 index 075bf6ec9..000000000 --- a/e2e/crossbuild/geohash/geohash_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# geohash.encode(37.7749, -122.4194) is deterministic across architectures; -# geohash_main.py asserts the exact value and only prints "OK" on success. -commandTests: - - name: geohash encodes correctly - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/jpype1/jpype1_image_command_test.yaml b/e2e/crossbuild/jpype1/jpype1_image_command_test.yaml deleted file mode 100644 index fdc4cdcd7..000000000 --- a/e2e/crossbuild/jpype1/jpype1_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# jpype1_main.py asserts jpype.__version__ itself and only prints "OK" on -# success. -commandTests: - - name: jpype1 imports successfully after an Ant + JNI cross build - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/msgpack/msgpack_image_command_test.yaml b/e2e/crossbuild/msgpack/msgpack_image_command_test.yaml deleted file mode 100644 index b4d9efcdb..000000000 --- a/e2e/crossbuild/msgpack/msgpack_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# msgpack_main.py asserts a real pack/unpack round-trip through the compiled -# _cmsgpack extension itself and only prints "OK" on success. -commandTests: - - name: msgpack round-trips a nested structure correctly - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/numpy/numpy_image_command_test.yaml b/e2e/crossbuild/numpy/numpy_image_command_test.yaml deleted file mode 100644 index f0445d0f4..000000000 --- a/e2e/crossbuild/numpy/numpy_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# numpy_main.py asserts real elementwise arithmetic and a no-BLAS matmul -# fallback through the compiled core itself and only prints "OK" on success. -commandTests: - - name: numpy computes elementwise arithmetic and a no-BLAS matmul correctly - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/psutil/psutil_image_command_test.yaml b/e2e/crossbuild/psutil/psutil_image_command_test.yaml deleted file mode 100644 index 252f3a096..000000000 --- a/e2e/crossbuild/psutil/psutil_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# psutil_main.py asserts real cpu/memory info from its compiled Linux -# backend itself and only prints "OK" on success. -commandTests: - - name: psutil reads real cpu/memory info through its compiled backend - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/pydantic_core/pydantic_core_image_command_test.yaml b/e2e/crossbuild/pydantic_core/pydantic_core_image_command_test.yaml deleted file mode 100644 index 5428f90b2..000000000 --- a/e2e/crossbuild/pydantic_core/pydantic_core_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# pydantic_core_main.py asserts the coerced int value itself and only -# prints "OK" on success. -commandTests: - - name: pydantic-core validates and coerces a string to int - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/rpds_py/rpds_py_image_command_test.yaml b/e2e/crossbuild/rpds_py/rpds_py_image_command_test.yaml deleted file mode 100644 index 1cd919c2d..000000000 --- a/e2e/crossbuild/rpds_py/rpds_py_image_command_test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -schemaVersion: 2.0.0 - -# rpds_py_main.py asserts rpds.List([1,2,3]).push_front(0)'s exact iteration -# order itself and only prints "OK" on success. -commandTests: - - name: rpds-py List.push_front computes the correct order - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/tiktoken/tiktoken_image_command_test.yaml b/e2e/crossbuild/tiktoken/tiktoken_image_command_test.yaml deleted file mode 100644 index 59b81cd1a..000000000 --- a/e2e/crossbuild/tiktoken/tiktoken_image_command_test.yaml +++ /dev/null @@ -1,10 +0,0 @@ -schemaVersion: 2.0.0 - -# tiktoken_main.py asserts a real encode/decode round-trip through the -# compiled Rust core (_tiktoken.CoreBPE) itself and only prints "OK" on -# success. -commandTests: - - name: tiktoken encodes and decodes through its compiled Rust core - exitCode: 0 - command: /app - expectedOutput: ["OK"] diff --git a/e2e/crossbuild/tools/cross_case.bzl b/e2e/crossbuild/tools/cross_case.bzl index 49d4aca32..746561046 100644 --- a/e2e/crossbuild/tools/cross_case.bzl +++ b/e2e/crossbuild/tools/cross_case.bzl @@ -1,30 +1,27 @@ -"""Shared scaffolding for a "build one real package for amd64+arm64, then -actually run it" e2e/crossbuild case. - -Every case here cross-compiles a package from the same amd64 exec host for -linux/amd64 and linux/arm64, then runs both — QEMU for arm64 — via -container_structure_test, plus a per-arch structural check (ELF machine, -and, where the .so's own filename carries one, its cpython ABI tag). This -macro is the ~90 lines every case shared verbatim; anything genuinely -case-specific (extra data deps, a diff-against-a-reference-wheel test -instead of a command test, macOS coverage) stays hand-written — see -//geohash and //zstandard, which aren't built from this macro for exactly -that reason. +"""Shared scaffolding for a "build one real package for amd64+arm64" case. + +Every case cross-compiles a package for linux/amd64 and linux/arm64 and +asserts structure in-suite (ELF machine, and, where the .so's filename +carries one, its cpython ABI tag). Execution is deliberately NOT part of +`bazel test //...`: the docker-loadable tarballs declared here are built by +CI's crossbuild-verify pipelines, uploaded, and run on NATIVE hardware per +target arch — no same-host docker+QEMU sandwich. This macro is the lines +every case shared verbatim; anything genuinely case-specific stays +hand-written — see //geohash and //zstandard. """ load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") -load("@container_structure_test//:defs.bzl", "container_structure_test") load("@rules_oci//oci:defs.bzl", "oci_image", "oci_load") load(":checks.bzl", "assert_so_arch", "assert_so_suffix") -def pep517_cross_case(name, deps, so_pattern, check_so_suffix = True, main = None, dep_group = None, image_command_test_config = None): +def pep517_cross_case(name, deps, so_pattern, check_so_suffix = True, main = None, dep_group = None): """Declares the amd64/arm64 build+run scaffolding for one e2e/crossbuild package. Produces (all unprefixed, matching the package's own BUILD.bazel): "_bin", "layers", "{amd64,arm64}_layers", "_so_arch_{amd64,arm64}_test", "_so_suffix_{amd64,arm64}_test" (if check_so_suffix), "image", - "{amd64,arm64}_image", "{amd64,arm64}_command_test". + "{amd64,arm64}_image", "{amd64,arm64}_load", "{amd64,arm64}_tarball". Args: name: the package's own directory/case name, e.g. "bcrypt". Only @@ -42,12 +39,9 @@ def pep517_cross_case(name, deps, so_pattern, check_so_suffix = True, main = Non (jpype1's _jpype.so). main: py_binary's main/srcs file; defaults to "_main.py". dep_group: py_binary's dep_group; defaults to "crossbuild_". - image_command_test_config: the container_structure_test YAML; - defaults to "_image_command_test.yaml". """ main = main or (name + "_main.py") dep_group = dep_group or ("crossbuild_" + name) - image_command_test_config = image_command_test_config or (name + "_image_command_test.yaml") py_binary( name = name + "_bin", @@ -123,12 +117,12 @@ def pep517_cross_case(name, deps, so_pattern, check_so_suffix = True, main = Non target_platform = "//:arm64_linux", ) - # Docker-loadable tarballs for the artifact-based CI jobs: a builder job - # `bazel build`s these, uploads them, and native amd64/arm64 runner jobs - # `docker load` + `docker run` them on real hardware (no QEMU). Tagged - # manual: under plain `//...` they would only repackage what the - # container_structure_tests already cover on this host. The repo_tag is - # what the runner job executes, so it must stay `crossbuild/:`. + # Docker-loadable tarballs consumed by CI's crossbuild-verify pipelines: + # a builder job `bazel build`s these, uploads them, and native + # amd64/arm64 runner jobs `docker load` + `docker run` them on real + # hardware. This is the ONLY execution verification for these cases. + # Tagged manual: repackaging is dead weight under plain `//...`. The + # repo_tag is what the runner executes: `crossbuild/:`. for arch in ("amd64", "arm64"): oci_load( name = arch + "_load", @@ -143,22 +137,3 @@ def pep517_cross_case(name, deps, so_pattern, check_so_suffix = True, main = Non output_group = "tarball", tags = ["manual"], ) - - container_structure_test( - name = "amd64_command_test", - configs = [image_command_test_config], - image = ":amd64_image", - platform = "linux/amd64", - tags = ["requires-docker"], - ) - - container_structure_test( - name = "arm64_command_test", - configs = [image_command_test_config], - image = ":arm64_image", - platform = "linux/aarch64", - tags = [ - "requires-docker", - "requires-qemu", - ], - ) diff --git a/e2e/crossbuild/zstandard/BUILD.bazel b/e2e/crossbuild/zstandard/BUILD.bazel index 9ebfd0bab..74c9c3d0f 100644 --- a/e2e/crossbuild/zstandard/BUILD.bazel +++ b/e2e/crossbuild/zstandard/BUILD.bazel @@ -5,8 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_image_layer") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") -load("@container_structure_test//:defs.bzl", "container_structure_test") -load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_oci//oci:defs.bzl", "oci_image", "oci_load") load("//tools:checks.bzl", "assert_so_arch", "assert_so_suffix") # Matches only our own build's backend_c.so (installed under a @@ -97,21 +96,33 @@ platform_transition_filegroup( target_platform = "//:arm64_linux", ) -container_structure_test( - name = "amd64_diff_test", - configs = ["zstandard_diff_test.yaml"], +# Execution happens in CI's crossbuild-verify pipelines on native runners: +# the entrypoint diffs our cross-compiled backend against the official +# wheels byte-for-byte and exits nonzero on any mismatch. +oci_load( + name = "amd64_load", image = ":amd64_image", - platform = "linux/amd64", - tags = ["requires-docker"], + repo_tags = ["crossbuild/zstandard:amd64"], + tags = ["manual"], ) -container_structure_test( - name = "arm64_diff_test", - configs = ["zstandard_diff_test.yaml"], +filegroup( + name = "amd64_tarball", + srcs = [":amd64_load"], + output_group = "tarball", + tags = ["manual"], +) + +oci_load( + name = "arm64_load", image = ":arm64_image", - platform = "linux/aarch64", - tags = [ - "requires-docker", - "requires-qemu", - ], + repo_tags = ["crossbuild/zstandard:arm64"], + tags = ["manual"], +) + +filegroup( + name = "arm64_tarball", + srcs = [":arm64_load"], + output_group = "tarball", + tags = ["manual"], ) diff --git a/e2e/crossbuild/zstandard/zstandard_diff_test.yaml b/e2e/crossbuild/zstandard/zstandard_diff_test.yaml deleted file mode 100644 index 7eb22a14e..000000000 --- a/e2e/crossbuild/zstandard/zstandard_diff_test.yaml +++ /dev/null @@ -1,7 +0,0 @@ -schemaVersion: 2.0.0 - -commandTests: - - name: cross-compiled zstandard matches the official wheel - exitCode: 0 - command: /app - expectedOutput: ["PASS: identical compressed output, cross-decompression OK"] From d25f1daadc3e84dc1bf76821863d689a262f7e47 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 02:02:00 -0600 Subject: [PATCH 050/103] refining github workflow --- .github/workflows/ci-workflows.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 0a4d7dd7d..bc6a37a94 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -279,7 +279,7 @@ jobs: test-all: name: test-all runs-on: ubuntu-latest - needs: [buildifier, gazelle, test, typecheck, crossbuild-amd64, crossbuild-arm64, crossbuild-darwin] + needs: [buildifier, gazelle, test, typecheck, crossbuild-run-amd64-built, crossbuild-run-arm64-built, crossbuild-run-darwin-built] if: always() steps: - name: All required jobs succeeded From dc6e2ba7ede402cbdcdc2b9dcc7af086be7af86d Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 02:02:38 -0600 Subject: [PATCH 051/103] ci: repair test-all gating and restore native amd64 execution coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test-all's needs pointed at the reusable-workflow job names that the flat-jobs rework removed — a workflow startup error. It now gates on the three crossbuild-run jobs, tolerating the skip of the gated darwin one. With the in-suite container tests gone, the amd64 builder was uploading arm64 tarballs only, leaving the macro cases without native amd64 execution — it now ships both arch sets (with toplevel output materialization) and its run job fans out to native amd64 and arm64 runners, mirroring the darwin pipeline's shape. --- .github/workflows/ci-workflows.yaml | 47 +++++++++++++++++------------ 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index bc6a37a94..fb923cf43 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -189,45 +189,54 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + # arm64 binfmt for meson's build-time probes only; execution is + # native on the runner jobs below. - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 with: platforms: arm64 - - name: Build arm64 image tarballs + - name: Build amd64+arm64 image tarballs working-directory: e2e/crossbuild run: | - targets=$(bazel query 'filter(".*:arm64_tarball$", //...)') - bazel build ${targets} mkdir -p "${RUNNER_TEMP}/images" - for target in ${targets}; do - case="${target#//}" - case="${case%:arm64_tarball}" - cp "bazel-bin/${case}/arm64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-arm64.tar" + for arch in amd64 arm64; do + targets=$(bazel query "filter(\".*:${arch}_tarball\$\", //...)") + bazel build --remote_download_outputs=toplevel ${targets} + for target in ${targets}; do + case="${target#//}" + case="${case%:${arch}_tarball}" + cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" + done done - uses: actions/upload-artifact@v4 with: - name: crossbuild-images-arm64 + name: crossbuild-images-amd64-built path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-amd64-built: - name: crossbuild-run (native arm64) + name: crossbuild-run (amd64-built, native ${{ matrix.arch }}) needs: crossbuild-images-amd64 - runs-on: ubuntu-24.04-arm + strategy: + fail-fast: false + matrix: + include: + - { runner: "ubuntu-latest", arch: "amd64" } + - { runner: "ubuntu-24.04-arm", arch: "arm64" } + runs-on: ${{ matrix.runner }} steps: - uses: actions/download-artifact@v4 with: - name: crossbuild-images-arm64 + name: crossbuild-images-amd64-built path: images - - name: Run every image on native arm64 + - name: Run amd64-built images on native ${{ matrix.arch }} run: | status=0 - for tar in images/*-arm64.tar; do + for tar in images/*-${{ matrix.arch }}.tar; do tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') echo "::group::${tag}" docker run --rm "${tag}" || status=1 echo "::endgroup::" done exit "${status}" - crossbuild-images-arm64: name: crossbuild-images (arm64 builder) @@ -289,19 +298,19 @@ jobs: "typecheck=${{ needs.typecheck.result }}" \ "buildifier=${{ needs.buildifier.result }}" \ "gazelle=${{ needs.gazelle.result }}" \ - "crossbuild-amd64=${{ needs['crossbuild-amd64'].result }}" \ - "crossbuild-arm64=${{ needs['crossbuild-arm64'].result }}"; do + "crossbuild-run-amd64-built=${{ needs['crossbuild-run-amd64-built'].result }}" \ + "crossbuild-run-arm64-built=${{ needs['crossbuild-run-arm64-built'].result }}"; do if [ "${result#*=}" != "success" ]; then echo "Required job did not succeed: ${result}" exit 1 fi done - # crossbuild-darwin is gated to main and '*macos*' branches: + # The darwin pipeline is gated to main and '*macos*' branches: # skipped is expected elsewhere; anything that ran must pass. - case "${{ needs['crossbuild-darwin'].result }}" in + case "${{ needs['crossbuild-run-darwin-built'].result }}" in success|skipped) ;; *) - echo "crossbuild-darwin did not succeed: ${{ needs['crossbuild-darwin'].result }}" + echo "crossbuild-run-darwin-built did not succeed: ${{ needs['crossbuild-run-darwin-built'].result }}" exit 1 ;; esac From fd8f3ef157fde884f55a5da75c3fb34c0ebea12a Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 02:11:23 -0600 Subject: [PATCH 052/103] refining github workflow --- .github/workflows/ci-workflows.yaml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index fb923cf43..d6806066f 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -126,7 +126,7 @@ jobs: # https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes crossbuild-images-darwin: - name: crossbuild-images (darwin builder) + name: build on darwin if: >- ${{ github.ref_name == 'main' || contains(github.head_ref || github.ref_name, 'macos') }} @@ -155,7 +155,7 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-darwin-built: - name: crossbuild-run (darwin-built, native ${{ matrix.arch }}) + name: run on linux ${{ matrix.arch }}) needs: crossbuild-images-darwin strategy: fail-fast: false @@ -182,15 +182,13 @@ jobs: crossbuild-images-amd64: - name: crossbuild-images (amd64 builder) + name: build on linux amd64 runs-on: ubuntu-22.04-32core steps: - uses: actions/checkout@v6 - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - # arm64 binfmt for meson's build-time probes only; execution is - # native on the runner jobs below. - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 with: platforms: arm64 @@ -213,7 +211,7 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-amd64-built: - name: crossbuild-run (amd64-built, native ${{ matrix.arch }}) + name: run on linux ${{ matrix.arch }}) needs: crossbuild-images-amd64 strategy: fail-fast: false @@ -239,7 +237,7 @@ jobs: exit "${status}" crossbuild-images-arm64: - name: crossbuild-images (arm64 builder) + name: build on linux arm64 runs-on: ubuntu-24.04-arm steps: - uses: actions/checkout@v6 @@ -265,7 +263,7 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-arm64-built: - name: crossbuild-run (arm-built, native amd64) + name: run on linux amd64 needs: crossbuild-images-arm64 runs-on: ubuntu-latest steps: From add21637c54cd398f58103ab6aaf99e645c02587 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 02:14:21 -0600 Subject: [PATCH 053/103] =?UTF-8?q?ci:=20make=20the=20amd64=20pipeline=20f?= =?UTF-8?q?ully=20native=20=E2=80=94=20one=20builder,=20one=20runner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit crossbuild-images-amd64 builds only the amd64 tarballs (native builds: no cross machinery, no binfmt, no QEMU step) and a single crossbuild-run-amd64-built job executes the artifact on a separate native amd64 machine. arm64-target coverage from this host moves entirely to the other pipeline directions. --- .github/workflows/ci-workflows.yaml | 35 +++++++++++------------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index d6806066f..db1da16f1 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -189,21 +189,18 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - with: - platforms: arm64 - - name: Build amd64+arm64 image tarballs + # amd64 targets on an amd64 host: fully native builds — no cross + # machinery, no QEMU anywhere in this pipeline. + - name: Build amd64 image tarballs working-directory: e2e/crossbuild run: | mkdir -p "${RUNNER_TEMP}/images" - for arch in amd64 arm64; do - targets=$(bazel query "filter(\".*:${arch}_tarball\$\", //...)") - bazel build --remote_download_outputs=toplevel ${targets} - for target in ${targets}; do - case="${target#//}" - case="${case%:${arch}_tarball}" - cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" - done + targets=$(bazel query 'filter(".*:amd64_tarball$", //...)') + bazel build --remote_download_outputs=toplevel ${targets} + for target in ${targets}; do + case="${target#//}" + case="${case%:amd64_tarball}" + cp "bazel-bin/${case}/amd64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-amd64.tar" done - uses: actions/upload-artifact@v4 with: @@ -211,24 +208,18 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-amd64-built: - name: run on linux ${{ matrix.arch }}) + name: run amd64-built images on native amd64 needs: crossbuild-images-amd64 - strategy: - fail-fast: false - matrix: - include: - - { runner: "ubuntu-latest", arch: "amd64" } - - { runner: "ubuntu-24.04-arm", arch: "arm64" } - runs-on: ${{ matrix.runner }} + runs-on: ubuntu-latest steps: - uses: actions/download-artifact@v4 with: name: crossbuild-images-amd64-built path: images - - name: Run amd64-built images on native ${{ matrix.arch }} + - name: Run amd64-built images on native amd64 run: | status=0 - for tar in images/*-${{ matrix.arch }}.tar; do + for tar in images/*-amd64.tar; do tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') echo "::group::${tag}" docker run --rm "${tag}" || status=1 From c22820dd7325853ff36a3d5ab5f172a620719152 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 02:27:00 -0600 Subject: [PATCH 054/103] ci: the amd64 pipeline cross-builds for arm64 and runs on native arm64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The point of this direction is empirical cross-compilation validation: build every case's arm64 image on the amd64 host (binfmt present only for meson's build-time probes) and execute the artifact on a native arm64 runner — one builder job, one runner job. --- .github/workflows/ci-workflows.yaml | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index db1da16f1..6606242c4 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -182,25 +182,29 @@ jobs: crossbuild-images-amd64: - name: build on linux amd64 + name: cross-build arm64 images on linux amd64 runs-on: ubuntu-22.04-32core steps: - uses: actions/checkout@v6 - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - # amd64 targets on an amd64 host: fully native builds — no cross - # machinery, no QEMU anywhere in this pipeline. - - name: Build amd64 image tarballs + # binfmt for meson's build-time probes only (sanity checks and + # cc.run() execute target-arch binaries mid-build); the actual + # execution verdict comes from the native arm64 runner below. + - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 + with: + platforms: arm64 + - name: Cross-build arm64 image tarballs working-directory: e2e/crossbuild run: | mkdir -p "${RUNNER_TEMP}/images" - targets=$(bazel query 'filter(".*:amd64_tarball$", //...)') + targets=$(bazel query 'filter(".*:arm64_tarball$", //...)') bazel build --remote_download_outputs=toplevel ${targets} for target in ${targets}; do case="${target#//}" - case="${case%:amd64_tarball}" - cp "bazel-bin/${case}/amd64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-amd64.tar" + case="${case%:arm64_tarball}" + cp "bazel-bin/${case}/arm64_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-arm64.tar" done - uses: actions/upload-artifact@v4 with: @@ -208,18 +212,18 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-amd64-built: - name: run amd64-built images on native amd64 + name: run amd64-built images on native arm64 needs: crossbuild-images-amd64 - runs-on: ubuntu-latest + runs-on: ubuntu-24.04-arm steps: - uses: actions/download-artifact@v4 with: name: crossbuild-images-amd64-built path: images - - name: Run amd64-built images on native amd64 + - name: Run amd64-built images on native arm64 run: | status=0 - for tar in images/*-amd64.tar; do + for tar in images/*-arm64.tar; do tag=$(docker load -i "${tar}" | sed -n 's/^Loaded image: //p') echo "::group::${tag}" docker run --rm "${tag}" || status=1 From 617dc74a95dc6a992a0d9563631705a291997e22 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 02:37:21 -0600 Subject: [PATCH 055/103] ci: materialize tarballs on the darwin builder too Same build-without-the-bytes failure the arm64 builder hit: with --config=ci, disk-cache hits leave the tarball unmaterialized and the cp fails. toplevel downloads fix it, as on the other builders. --- .github/workflows/ci-workflows.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 6606242c4..1d467f819 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -145,7 +145,7 @@ jobs: mkdir -p "${RUNNER_TEMP}/images" for case in psutil contourpy rpds_py; do for arch in amd64 arm64; do - bazel build --config=ci --action_env=MESON_FORCE_BACKTRACE=1 "//${case}:${arch}_tarball" + bazel build --config=ci --remote_download_outputs=toplevel --action_env=MESON_FORCE_BACKTRACE=1 "//${case}:${arch}_tarball" cp "bazel-bin/${case}/${arch}_load/tarball.tar" "${RUNNER_TEMP}/images/${case}-${arch}.tar" done done From 80e57098d130d0a06e442b8259a466d6a321975b Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 02:47:04 -0600 Subject: [PATCH 056/103] refining github workflow --- .github/workflows/ci-workflows.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 1d467f819..a542aaccf 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -232,7 +232,7 @@ jobs: exit "${status}" crossbuild-images-arm64: - name: build on linux arm64 + name: cross-build amd64 images on linux arm64 runs-on: ubuntu-24.04-arm steps: - uses: actions/checkout@v6 @@ -258,7 +258,7 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-arm64-built: - name: run on linux amd64 + name: run amd64-built images on native arm64 needs: crossbuild-images-arm64 runs-on: ubuntu-latest steps: @@ -281,7 +281,7 @@ jobs: test-all: name: test-all runs-on: ubuntu-latest - needs: [buildifier, gazelle, test, typecheck, crossbuild-run-amd64-built, crossbuild-run-arm64-built, crossbuild-run-darwin-built] + needs: [buildifier, gazelle, typecheck, crossbuild-run-amd64-built, crossbuild-run-arm64-built, crossbuild-run-darwin-built] if: always() steps: - name: All required jobs succeeded From 2840a2adf51ec4dd70cc3cdb3b77924767143334 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 03:07:58 -0600 Subject: [PATCH 057/103] spliting test cases MODULE.bazel --- e2e/crossbuild/MODULE.bazel | 300 +----------------- e2e/crossbuild/awkward_cpp/setup.MODULE.bazel | 17 + e2e/crossbuild/bcrypt/setup.MODULE.bazel | 34 ++ e2e/crossbuild/contourpy/setup.MODULE.bazel | 17 + e2e/crossbuild/geohash/setup.MODULE.bazel | 27 ++ e2e/crossbuild/jpype1/setup.MODULE.bazel | 86 +++++ e2e/crossbuild/msgpack/setup.MODULE.bazel | 14 + e2e/crossbuild/numpy/setup.MODULE.bazel | 27 ++ e2e/crossbuild/psutil/setup.MODULE.bazel | 15 + .../pydantic_core/setup.MODULE.bazel | 33 ++ e2e/crossbuild/rpds_py/setup.MODULE.bazel | 33 ++ e2e/crossbuild/tiktoken/setup.MODULE.bazel | 34 ++ e2e/crossbuild/zstandard/setup.MODULE.bazel | 39 +++ 13 files changed, 392 insertions(+), 284 deletions(-) create mode 100644 e2e/crossbuild/awkward_cpp/setup.MODULE.bazel create mode 100644 e2e/crossbuild/bcrypt/setup.MODULE.bazel create mode 100644 e2e/crossbuild/contourpy/setup.MODULE.bazel create mode 100644 e2e/crossbuild/geohash/setup.MODULE.bazel create mode 100644 e2e/crossbuild/jpype1/setup.MODULE.bazel create mode 100644 e2e/crossbuild/msgpack/setup.MODULE.bazel create mode 100644 e2e/crossbuild/numpy/setup.MODULE.bazel create mode 100644 e2e/crossbuild/psutil/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pydantic_core/setup.MODULE.bazel create mode 100644 e2e/crossbuild/rpds_py/setup.MODULE.bazel create mode 100644 e2e/crossbuild/tiktoken/setup.MODULE.bazel create mode 100644 e2e/crossbuild/zstandard/setup.MODULE.bazel diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index c18f84c04..d02bd056d 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -10,7 +10,6 @@ bazel_dep(name = "llvm", version = "0.8.3") bazel_dep(name = "rules_oci", version = "2.2.7") bazel_dep(name = "rules_shell", version = "0.4.1") bazel_dep(name = "rules_rust", version = "0.68.0") -bazel_dep(name = "rules_java", version = "8.14.0") local_path_override( module_name = "aspect_rules_py", @@ -66,6 +65,8 @@ register_toolchains( # host cross-building the linux cases locally (exec=darwin → target=linux). register_toolchains("@llvm//toolchain:all") +# Shared by the four rust suites (bcrypt, pydantic_core, rpds_py, tiktoken) +# and //tools:rust_host_sysroot. rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") rust.toolchain( edition = "2021", @@ -79,6 +80,7 @@ use_repo(rust, "rust_toolchains") register_toolchains("@rust_toolchains//:all") +# Base image for every suite's container smoke test (tools/cross_case.bzl). oci = use_extension("@rules_oci//oci:extensions.bzl", "oci") oci.pull( name = "ubuntu", @@ -92,6 +94,7 @@ oci.pull( ) use_repo(oci, "ubuntu", "ubuntu_linux_amd64", "ubuntu_linux_arm64_v8") +# Used by tools/asserts.bzl to unpack images/wheels across suites. bazel_lib_toolchains = use_extension("@tar.bzl//tar:extensions.bzl", "toolchains", dev_dependency = True) use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") @@ -99,290 +102,19 @@ uv_bin = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv_bin") uv_bin.toolchain(version = "0.11.21") use_repo(uv_bin, "uv") -uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") -uv.declare_hub(hub_name = "pypi_crossbuild_geohash") -uv.project( - default_build_dependencies = [ - "build", - "cffi", - "setuptools", - ], - hub_name = "pypi_crossbuild_geohash", - lock = "//geohash:uv.lock", - pyproject = "//geohash:pyproject.toml", -) -uv.override_package( - name = "python-geohash", - lock = "//geohash:uv.lock", - pre_build_patch_strip = 1, - pre_build_patches = ["//geohash:require_cxx_driver.patch"], - resource_set = "mem_4g", -) -use_repo(uv, "pypi_crossbuild_geohash") - -# rules_pycross e2e ports: per-suite hubs, each self-described by its own -# setup.MODULE.bazel (same include() layout as e2e/cases). +include("//awkward_cpp:setup.MODULE.bazel") +include("//bcrypt:setup.MODULE.bazel") +include("//contourpy:setup.MODULE.bazel") +include("//geohash:setup.MODULE.bazel") +include("//jpype1:setup.MODULE.bazel") +include("//msgpack:setup.MODULE.bazel") +include("//numpy:setup.MODULE.bazel") +include("//psutil:setup.MODULE.bazel") include("//pycross-distutils-probe:setup.MODULE.bazel") include("//pycross-patches:setup.MODULE.bazel") include("//pycross-pure-python:setup.MODULE.bazel") include("//pycross-setuptools:setup.MODULE.bazel") - -# Plain setuptools/meson-python/scikit-build-core hubs: no rust/jdk toolchain -# wiring, so each is fully described by (hub dir, its build deps). -_SIMPLE_CROSSBUILD_PACKAGES = [ - { - "deps": [ - "build", - "cffi", - "setuptools", - "wheel", - ], - "hub": "zstandard", - }, - { - "deps": [ - "build", - "meson", - "meson-python", - "ninja", - "pybind11", - ], - "hub": "contourpy", - }, - { - "deps": [ - "build", - "cmake", - "ninja", - "pybind11", - "scikit-build-core", - ], - "hub": "awkward_cpp", - }, - { - "deps": [ - "build", - "setuptools", - "wheel", - ], - "hub": "psutil", - }, - { - "deps": [ - "build", - "setuptools", - ], - "hub": "msgpack", - }, -] - -[uv.declare_hub(hub_name = "pypi_crossbuild_" + pkg["hub"]) for pkg in _SIMPLE_CROSSBUILD_PACKAGES] - -[ - uv.project( - default_build_dependencies = pkg["deps"], - hub_name = "pypi_crossbuild_" + pkg["hub"], - lock = "//{}:uv.lock".format(pkg["hub"]), - pyproject = "//{}:pyproject.toml".format(pkg["hub"]), - ) - for pkg in _SIMPLE_CROSSBUILD_PACKAGES -] - -[use_repo(uv, "pypi_crossbuild_" + pkg["hub"]) for pkg in _SIMPLE_CROSSBUILD_PACKAGES] - -# maturin/PyO3 + setuptools-rust hubs: all three need the identical Cargo -# cross env/toolchains wiring (see //tools:rust_host_sysroot); a shared block -# also makes that identical-ness visually obvious instead of relying on the -# reader to diff three near-copies. "pypi_name" differs from "hub" for -# rpds_py/pydantic_core since PyPI hyphenates what the hub dir underscores. -_RUST_CROSSBUILD_PACKAGES = [ - { - "deps": [ - "build", - "maturin", - ], - "hub": "rpds_py", - "pypi_name": "rpds-py", - }, - { - "deps": [ - "build", - "setuptools", - "setuptools-rust", - "wheel", - ], - "hub": "bcrypt", - "pypi_name": "bcrypt", - }, - { - "deps": [ - "build", - "maturin", - ], - "hub": "pydantic_core", - "pypi_name": "pydantic-core", - }, - { - "deps": [ - "build", - "setuptools", - "setuptools-rust", - "wheel", - ], - "hub": "tiktoken", - "pypi_name": "tiktoken", - }, -] - -[uv.declare_hub(hub_name = "pypi_crossbuild_" + pkg["hub"]) for pkg in _RUST_CROSSBUILD_PACKAGES] - -[ - uv.project( - default_build_dependencies = pkg["deps"], - hub_name = "pypi_crossbuild_" + pkg["hub"], - lock = "//{}:uv.lock".format(pkg["hub"]), - pyproject = "//{}:pyproject.toml".format(pkg["hub"]), - ) - for pkg in _RUST_CROSSBUILD_PACKAGES -] - -[ - uv.override_package( - name = pkg["pypi_name"], - env = { - "CARGO": "$(CARGO)", - "RUSTC": "$(RUSTC)", - "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", - }, - lock = "//{}:uv.lock".format(pkg["hub"]), - toolchains = [ - "@rules_rust//rust/toolchain:current_rust_toolchain", - "//tools:rust_host_sysroot", - ], - ) - for pkg in _RUST_CROSSBUILD_PACKAGES -] - -[use_repo(uv, "pypi_crossbuild_" + pkg["hub"]) for pkg in _RUST_CROSSBUILD_PACKAGES] - -uv.declare_hub(hub_name = "pypi_crossbuild_numpy") -uv.project( - default_build_dependencies = [ - "build", - "cython", - "meson-python", - "ninja", - ], - hub_name = "pypi_crossbuild_numpy", - lock = "//numpy:uv.lock", - pyproject = "//numpy:pyproject.toml", -) -uv.override_package( - # numpy has no system BLAS/LAPACK in this sandbox (native build) or in - # the cross toolchain (cross build) — no toolchain needed, just a - # literal extra meson setup-args value, same as numpy's own documented - # no-BLAS cross recipe (see its emscripten cibuildwheel config). - name = "numpy", - env = { - "RULES_PY_MESON_SETUP_ARGS": "-Dblas=none -Dlapack=none", - }, - lock = "//numpy:uv.lock", -) -use_repo(uv, "pypi_crossbuild_numpy") - -uv.declare_hub(hub_name = "pypi_crossbuild_jpype1") -uv.project( - default_build_dependencies = [ - "build", - "scikit-build-core", - "setuptools", - "wheel", - ], - hub_name = "pypi_crossbuild_jpype1", - lock = "//jpype1:uv.lock", - pyproject = "//jpype1:pyproject.toml", -) -uv.override_package( - name = "jpype1", - env = { - "JAVA": "$(JAVA)", - "JAVA_HOME": "$(JAVABASE)", - "RULES_PY_ANT_BIN_DIR": "$(ANT_BIN_DIR)", - }, - lock = "//jpype1:uv.lock", - toolchains = [ - "@temurin11_linux_x86_64//:jdk", - "//tools:ant_home", - ], -) -use_repo(uv, "pypi_crossbuild_jpype1") - -# Official prebuilt wheels to diff our cross-compiled build against. -http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -http_archive( - name = "official_zstandard_amd64_linux", - build_file_content = """filegroup(name = "backend_c", srcs = ["zstandard/backend_c.cpython-312-x86_64-linux-gnu.so"], visibility = ["//visibility:public"])""", - sha256 = "466e6ad8caefb589ed281c076deb6f0cd330e8bc13c5035854ffb9c2014b118c", - type = "zip", - url = "https://files.pythonhosted.org/packages/e5/01/080939755ca12ebbb7fc38b6f4ddecd5e8c416d571d4927ece1360baba2c/zstandard-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", -) - -http_archive( - name = "official_zstandard_arm64_linux", - build_file_content = """filegroup(name = "backend_c", srcs = ["zstandard/backend_c.cpython-312-aarch64-linux-gnu.so"], visibility = ["//visibility:public"])""", - sha256 = "a88b7df61a292603e7cd662d92565d915796b094ffb3d206579aaebac6b85d5f", - type = "zip", - url = "https://files.pythonhosted.org/packages/47/44/be2d67304ba9bf4694ffcaa99d146814d70c4cb0bfc00e0e86fdfae66a31/zstandard-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", -) - -# jpype1 only ever runs Ant/javac at build time to produce a JAR (portable -# Java bytecode) — always a host-executed step regardless of what CPU the -# compiled _jpype.so targets, so a single exec-platform (x86_64) JDK and a -# single (architecture-independent) Ant install cover both the native and -# cross builds. Genuine Eclipse Temurin, not rules_java's default remotejdk -# (which resolves to Azul Zulu builds) — see fetched release metadata at -# https://api.adoptium.net/v3/assets/latest/11/hotspot?image_type=jdk&os=linux&architecture=x64. -http_archive( - name = "temurin11_linux_x86_64", - build_file_content = """load("@rules_java//java/toolchains:java_runtime.bzl", "java_runtime") - -package(default_visibility = ["//visibility:public"]) - -filegroup(name = "jdk-bin", srcs = glob(["bin/**"])) - -filegroup(name = "jdk-conf", srcs = glob(["conf/**"], allow_empty = True)) - -filegroup(name = "jdk-include", srcs = glob(["include/**"], allow_empty = True)) - -filegroup(name = "jdk-lib", srcs = glob(["lib/**", "release"], allow_empty = True)) - -java_runtime( - name = "jdk", - srcs = [":jdk-bin", ":jdk-conf", ":jdk-include", ":jdk-lib"], - java = "bin/java", - version = 11, -) -""", - sha256 = "5906e0339e9322a688b2375eaf40666e00a16e008b0067b0a9f9e4b6c5033720", - strip_prefix = "jdk-11.0.32+9", - url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.32%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.32_9.tar.gz", -) - -# Apache Ant: plain Java bytecode plus shell/bat launchers — no architecture -# variants needed. -http_archive( - name = "apache_ant", - build_file_content = """package(default_visibility = ["//visibility:public"]) - -exports_files(["bin/ant"]) - -filegroup( - name = "all_files", - srcs = glob(["**"], allow_empty = True), -) -""", - sha256 = "71334d7e5d98cfe53d6c429a648a5021137a967378667306c5f613dff5180506", - strip_prefix = "apache-ant-1.10.15", - url = "https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.15-bin.tar.gz", -) +include("//pydantic_core:setup.MODULE.bazel") +include("//rpds_py:setup.MODULE.bazel") +include("//tiktoken:setup.MODULE.bazel") +include("//zstandard:setup.MODULE.bazel") diff --git a/e2e/crossbuild/awkward_cpp/setup.MODULE.bazel b/e2e/crossbuild/awkward_cpp/setup.MODULE.bazel new file mode 100644 index 000000000..ae01c6150 --- /dev/null +++ b/e2e/crossbuild/awkward_cpp/setup.MODULE.bazel @@ -0,0 +1,17 @@ +"""awkward_cpp: scikit-build-core (CMake + ninja) + pybind11 sdist build.""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_awkward_cpp") +uv.project( + default_build_dependencies = [ + "build", + "cmake", + "ninja", + "pybind11", + "scikit-build-core", + ], + hub_name = "pypi_crossbuild_awkward_cpp", + lock = "//awkward_cpp:uv.lock", + pyproject = "//awkward_cpp:pyproject.toml", +) +use_repo(uv, "pypi_crossbuild_awkward_cpp") diff --git a/e2e/crossbuild/bcrypt/setup.MODULE.bazel b/e2e/crossbuild/bcrypt/setup.MODULE.bazel new file mode 100644 index 000000000..41b3b87c6 --- /dev/null +++ b/e2e/crossbuild/bcrypt/setup.MODULE.bazel @@ -0,0 +1,34 @@ +"""bcrypt: setuptools-rust sdist build. + +The Cargo cross env/toolchains wiring must stay identical across the four +rust suites (bcrypt, pydantic_core, rpds_py, tiktoken) — see +//tools:rust_host_sysroot for why CARGO/RUSTC alone aren't enough. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_bcrypt") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + "setuptools-rust", + "wheel", + ], + hub_name = "pypi_crossbuild_bcrypt", + lock = "//bcrypt:uv.lock", + pyproject = "//bcrypt:pyproject.toml", +) +uv.override_package( + name = "bcrypt", + env = { + "CARGO": "$(CARGO)", + "RUSTC": "$(RUSTC)", + "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", + }, + lock = "//bcrypt:uv.lock", + toolchains = [ + "@rules_rust//rust/toolchain:current_rust_toolchain", + "//tools:rust_host_sysroot", + ], +) +use_repo(uv, "pypi_crossbuild_bcrypt") diff --git a/e2e/crossbuild/contourpy/setup.MODULE.bazel b/e2e/crossbuild/contourpy/setup.MODULE.bazel new file mode 100644 index 000000000..ff3787ac8 --- /dev/null +++ b/e2e/crossbuild/contourpy/setup.MODULE.bazel @@ -0,0 +1,17 @@ +"""contourpy: meson-python + pybind11 C++ extension sdist build.""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_contourpy") +uv.project( + default_build_dependencies = [ + "build", + "meson", + "meson-python", + "ninja", + "pybind11", + ], + hub_name = "pypi_crossbuild_contourpy", + lock = "//contourpy:uv.lock", + pyproject = "//contourpy:pyproject.toml", +) +use_repo(uv, "pypi_crossbuild_contourpy") diff --git a/e2e/crossbuild/geohash/setup.MODULE.bazel b/e2e/crossbuild/geohash/setup.MODULE.bazel new file mode 100644 index 000000000..a29a6c604 --- /dev/null +++ b/e2e/crossbuild/geohash/setup.MODULE.bazel @@ -0,0 +1,27 @@ +"""python-geohash: setuptools sdist with both C and C++ extensions. + +The pre-build patch injects a C++ probe (require_cxx_driver.patch) so the +build fails outright if the cross toolchain can only drive C — geohash's own +setup.py would otherwise fall back silently. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_geohash") +uv.project( + default_build_dependencies = [ + "build", + "cffi", + "setuptools", + ], + hub_name = "pypi_crossbuild_geohash", + lock = "//geohash:uv.lock", + pyproject = "//geohash:pyproject.toml", +) +uv.override_package( + name = "python-geohash", + lock = "//geohash:uv.lock", + pre_build_patch_strip = 1, + pre_build_patches = ["//geohash:require_cxx_driver.patch"], + resource_set = "mem_4g", +) +use_repo(uv, "pypi_crossbuild_geohash") diff --git a/e2e/crossbuild/jpype1/setup.MODULE.bazel b/e2e/crossbuild/jpype1/setup.MODULE.bazel new file mode 100644 index 000000000..c59ffab75 --- /dev/null +++ b/e2e/crossbuild/jpype1/setup.MODULE.bazel @@ -0,0 +1,86 @@ +"""jpype1: setuptools sdist whose build shells out to Ant/javac to produce a +JAR before compiling the _jpype C++ extension. +""" + +bazel_dep(name = "rules_java", version = "8.14.0") + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_jpype1") +uv.project( + default_build_dependencies = [ + "build", + "scikit-build-core", + "setuptools", + "wheel", + ], + hub_name = "pypi_crossbuild_jpype1", + lock = "//jpype1:uv.lock", + pyproject = "//jpype1:pyproject.toml", +) +uv.override_package( + name = "jpype1", + env = { + "JAVA": "$(JAVA)", + "JAVA_HOME": "$(JAVABASE)", + "RULES_PY_ANT_BIN_DIR": "$(ANT_BIN_DIR)", + }, + lock = "//jpype1:uv.lock", + toolchains = [ + "@temurin11_linux_x86_64//:jdk", + "//tools:ant_home", + ], +) +use_repo(uv, "pypi_crossbuild_jpype1") + +http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +# jpype1 only ever runs Ant/javac at build time to produce a JAR (portable +# Java bytecode) — always a host-executed step regardless of what CPU the +# compiled _jpype.so targets, so a single exec-platform (x86_64) JDK and a +# single (architecture-independent) Ant install cover both the native and +# cross builds. Genuine Eclipse Temurin, not rules_java's default remotejdk +# (which resolves to Azul Zulu builds) — see fetched release metadata at +# https://api.adoptium.net/v3/assets/latest/11/hotspot?image_type=jdk&os=linux&architecture=x64. +http_archive( + name = "temurin11_linux_x86_64", + build_file_content = """load("@rules_java//java/toolchains:java_runtime.bzl", "java_runtime") + +package(default_visibility = ["//visibility:public"]) + +filegroup(name = "jdk-bin", srcs = glob(["bin/**"])) + +filegroup(name = "jdk-conf", srcs = glob(["conf/**"], allow_empty = True)) + +filegroup(name = "jdk-include", srcs = glob(["include/**"], allow_empty = True)) + +filegroup(name = "jdk-lib", srcs = glob(["lib/**", "release"], allow_empty = True)) + +java_runtime( + name = "jdk", + srcs = [":jdk-bin", ":jdk-conf", ":jdk-include", ":jdk-lib"], + java = "bin/java", + version = 11, +) +""", + sha256 = "5906e0339e9322a688b2375eaf40666e00a16e008b0067b0a9f9e4b6c5033720", + strip_prefix = "jdk-11.0.32+9", + url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.32%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.32_9.tar.gz", +) + +# Apache Ant: plain Java bytecode plus shell/bat launchers — no architecture +# variants needed. +http_archive( + name = "apache_ant", + build_file_content = """package(default_visibility = ["//visibility:public"]) + +exports_files(["bin/ant"]) + +filegroup( + name = "all_files", + srcs = glob(["**"], allow_empty = True), +) +""", + sha256 = "71334d7e5d98cfe53d6c429a648a5021137a967378667306c5f613dff5180506", + strip_prefix = "apache-ant-1.10.15", + url = "https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.15-bin.tar.gz", +) diff --git a/e2e/crossbuild/msgpack/setup.MODULE.bazel b/e2e/crossbuild/msgpack/setup.MODULE.bazel new file mode 100644 index 000000000..faab70807 --- /dev/null +++ b/e2e/crossbuild/msgpack/setup.MODULE.bazel @@ -0,0 +1,14 @@ +"""msgpack: setuptools C-extension sdist build.""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_msgpack") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + ], + hub_name = "pypi_crossbuild_msgpack", + lock = "//msgpack:uv.lock", + pyproject = "//msgpack:pyproject.toml", +) +use_repo(uv, "pypi_crossbuild_msgpack") diff --git a/e2e/crossbuild/numpy/setup.MODULE.bazel b/e2e/crossbuild/numpy/setup.MODULE.bazel new file mode 100644 index 000000000..68eed87aa --- /dev/null +++ b/e2e/crossbuild/numpy/setup.MODULE.bazel @@ -0,0 +1,27 @@ +"""numpy: meson-python + cython sdist build.""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_numpy") +uv.project( + default_build_dependencies = [ + "build", + "cython", + "meson-python", + "ninja", + ], + hub_name = "pypi_crossbuild_numpy", + lock = "//numpy:uv.lock", + pyproject = "//numpy:pyproject.toml", +) +uv.override_package( + # numpy has no system BLAS/LAPACK in this sandbox (native build) or in + # the cross toolchain (cross build) — no toolchain needed, just a + # literal extra meson setup-args value, same as numpy's own documented + # no-BLAS cross recipe (see its emscripten cibuildwheel config). + name = "numpy", + env = { + "RULES_PY_MESON_SETUP_ARGS": "-Dblas=none -Dlapack=none", + }, + lock = "//numpy:uv.lock", +) +use_repo(uv, "pypi_crossbuild_numpy") diff --git a/e2e/crossbuild/psutil/setup.MODULE.bazel b/e2e/crossbuild/psutil/setup.MODULE.bazel new file mode 100644 index 000000000..5428fd084 --- /dev/null +++ b/e2e/crossbuild/psutil/setup.MODULE.bazel @@ -0,0 +1,15 @@ +"""psutil: plain setuptools C-extension sdist build.""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_psutil") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + "wheel", + ], + hub_name = "pypi_crossbuild_psutil", + lock = "//psutil:uv.lock", + pyproject = "//psutil:pyproject.toml", +) +use_repo(uv, "pypi_crossbuild_psutil") diff --git a/e2e/crossbuild/pydantic_core/setup.MODULE.bazel b/e2e/crossbuild/pydantic_core/setup.MODULE.bazel new file mode 100644 index 000000000..2fdc23f6d --- /dev/null +++ b/e2e/crossbuild/pydantic_core/setup.MODULE.bazel @@ -0,0 +1,33 @@ +"""pydantic-core: maturin/PyO3 sdist build (hub dir underscores what PyPI +hyphenates, hence override name != hub name). + +The Cargo cross env/toolchains wiring must stay identical across the four +rust suites (bcrypt, pydantic_core, rpds_py, tiktoken) — see +//tools:rust_host_sysroot for why CARGO/RUSTC alone aren't enough. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_pydantic_core") +uv.project( + default_build_dependencies = [ + "build", + "maturin", + ], + hub_name = "pypi_crossbuild_pydantic_core", + lock = "//pydantic_core:uv.lock", + pyproject = "//pydantic_core:pyproject.toml", +) +uv.override_package( + name = "pydantic-core", + env = { + "CARGO": "$(CARGO)", + "RUSTC": "$(RUSTC)", + "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", + }, + lock = "//pydantic_core:uv.lock", + toolchains = [ + "@rules_rust//rust/toolchain:current_rust_toolchain", + "//tools:rust_host_sysroot", + ], +) +use_repo(uv, "pypi_crossbuild_pydantic_core") diff --git a/e2e/crossbuild/rpds_py/setup.MODULE.bazel b/e2e/crossbuild/rpds_py/setup.MODULE.bazel new file mode 100644 index 000000000..e02036b84 --- /dev/null +++ b/e2e/crossbuild/rpds_py/setup.MODULE.bazel @@ -0,0 +1,33 @@ +"""rpds-py: maturin/PyO3 sdist build (hub dir underscores what PyPI +hyphenates, hence override name != hub name). + +The Cargo cross env/toolchains wiring must stay identical across the four +rust suites (bcrypt, pydantic_core, rpds_py, tiktoken) — see +//tools:rust_host_sysroot for why CARGO/RUSTC alone aren't enough. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_rpds_py") +uv.project( + default_build_dependencies = [ + "build", + "maturin", + ], + hub_name = "pypi_crossbuild_rpds_py", + lock = "//rpds_py:uv.lock", + pyproject = "//rpds_py:pyproject.toml", +) +uv.override_package( + name = "rpds-py", + env = { + "CARGO": "$(CARGO)", + "RUSTC": "$(RUSTC)", + "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", + }, + lock = "//rpds_py:uv.lock", + toolchains = [ + "@rules_rust//rust/toolchain:current_rust_toolchain", + "//tools:rust_host_sysroot", + ], +) +use_repo(uv, "pypi_crossbuild_rpds_py") diff --git a/e2e/crossbuild/tiktoken/setup.MODULE.bazel b/e2e/crossbuild/tiktoken/setup.MODULE.bazel new file mode 100644 index 000000000..d6625e951 --- /dev/null +++ b/e2e/crossbuild/tiktoken/setup.MODULE.bazel @@ -0,0 +1,34 @@ +"""tiktoken: setuptools-rust sdist build. + +The Cargo cross env/toolchains wiring must stay identical across the four +rust suites (bcrypt, pydantic_core, rpds_py, tiktoken) — see +//tools:rust_host_sysroot for why CARGO/RUSTC alone aren't enough. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_tiktoken") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + "setuptools-rust", + "wheel", + ], + hub_name = "pypi_crossbuild_tiktoken", + lock = "//tiktoken:uv.lock", + pyproject = "//tiktoken:pyproject.toml", +) +uv.override_package( + name = "tiktoken", + env = { + "CARGO": "$(CARGO)", + "RUSTC": "$(RUSTC)", + "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", + }, + lock = "//tiktoken:uv.lock", + toolchains = [ + "@rules_rust//rust/toolchain:current_rust_toolchain", + "//tools:rust_host_sysroot", + ], +) +use_repo(uv, "pypi_crossbuild_tiktoken") diff --git a/e2e/crossbuild/zstandard/setup.MODULE.bazel b/e2e/crossbuild/zstandard/setup.MODULE.bazel new file mode 100644 index 000000000..2930e8fa6 --- /dev/null +++ b/e2e/crossbuild/zstandard/setup.MODULE.bazel @@ -0,0 +1,39 @@ +"""zstandard: setuptools sdist with a large vendored-libzstd C build plus an +optional cffi backend. + +Also fetches the official PyPI manylinux wheels so BUILD.bazel can diff our +cross-compiled extension against the upstream-built one per architecture. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_crossbuild_zstandard") +uv.project( + default_build_dependencies = [ + "build", + "cffi", + "setuptools", + "wheel", + ], + hub_name = "pypi_crossbuild_zstandard", + lock = "//zstandard:uv.lock", + pyproject = "//zstandard:pyproject.toml", +) +use_repo(uv, "pypi_crossbuild_zstandard") + +http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "official_zstandard_amd64_linux", + build_file_content = """filegroup(name = "backend_c", srcs = ["zstandard/backend_c.cpython-312-x86_64-linux-gnu.so"], visibility = ["//visibility:public"])""", + sha256 = "466e6ad8caefb589ed281c076deb6f0cd330e8bc13c5035854ffb9c2014b118c", + type = "zip", + url = "https://files.pythonhosted.org/packages/e5/01/080939755ca12ebbb7fc38b6f4ddecd5e8c416d571d4927ece1360baba2c/zstandard-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", +) + +http_archive( + name = "official_zstandard_arm64_linux", + build_file_content = """filegroup(name = "backend_c", srcs = ["zstandard/backend_c.cpython-312-aarch64-linux-gnu.so"], visibility = ["//visibility:public"])""", + sha256 = "a88b7df61a292603e7cd662d92565d915796b094ffb3d206579aaebac6b85d5f", + type = "zip", + url = "https://files.pythonhosted.org/packages/47/44/be2d67304ba9bf4694ffcaa99d146814d70c4cb0bfc00e0e86fdfae66a31/zstandard-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", +) From b8e9753fe2bb6a288efd0d789cc2770954b863db Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 03:30:16 -0600 Subject: [PATCH 058/103] refine workflow --- .github/workflows/ci-workflows.yaml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index a542aaccf..9605e4937 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -155,7 +155,7 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-darwin-built: - name: run on linux ${{ matrix.arch }}) + name: run on linux ${{ matrix.arch }} needs: crossbuild-images-darwin strategy: fail-fast: false @@ -182,16 +182,13 @@ jobs: crossbuild-images-amd64: - name: cross-build arm64 images on linux amd64 + name: build on amd runs-on: ubuntu-22.04-32core steps: - uses: actions/checkout@v6 - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - # binfmt for meson's build-time probes only (sanity checks and - # cc.run() execute target-arch binaries mid-build); the actual - # execution verdict comes from the native arm64 runner below. - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 with: platforms: arm64 @@ -212,7 +209,7 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-amd64-built: - name: run amd64-built images on native arm64 + name: run on arm needs: crossbuild-images-amd64 runs-on: ubuntu-24.04-arm steps: @@ -232,7 +229,7 @@ jobs: exit "${status}" crossbuild-images-arm64: - name: cross-build amd64 images on linux arm64 + name: build on arm runs-on: ubuntu-24.04-arm steps: - uses: actions/checkout@v6 @@ -287,7 +284,6 @@ jobs: - name: All required jobs succeeded run: | for result in \ - "test=${{ needs.test.result }}" \ "typecheck=${{ needs.typecheck.result }}" \ "buildifier=${{ needs.buildifier.result }}" \ "gazelle=${{ needs.gazelle.result }}" \ From 11c9aa36325d350c9fb3a85f0dcac539c8bb5e60 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 13:44:05 -0600 Subject: [PATCH 059/103] fix smoke test --- e2e/crossbuild/jpype1/setup.MODULE.bazel | 2 ++ 1 file changed, 2 insertions(+) diff --git a/e2e/crossbuild/jpype1/setup.MODULE.bazel b/e2e/crossbuild/jpype1/setup.MODULE.bazel index c59ffab75..c8c85d75c 100644 --- a/e2e/crossbuild/jpype1/setup.MODULE.bazel +++ b/e2e/crossbuild/jpype1/setup.MODULE.bazel @@ -9,6 +9,8 @@ uv.declare_hub(hub_name = "pypi_crossbuild_jpype1") uv.project( default_build_dependencies = [ "build", + "cmake", + "ninja", "scikit-build-core", "setuptools", "wheel", From 8e243f52fb5d67b5cfe5ee7c255fba974bfe70ff Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 13:45:02 -0600 Subject: [PATCH 060/103] fix smoke test --- e2e/crossbuild/jpype1/pyproject.toml | 2 + e2e/crossbuild/jpype1/uv.lock | 56 +++++++++++++++++++ .../tests/build_helper_cross_test.py | 38 +++++++++++++ uv/private/pep517_whl/tools/build_helper.py | 44 +++++++++++---- 4 files changed, 130 insertions(+), 10 deletions(-) diff --git a/e2e/crossbuild/jpype1/pyproject.toml b/e2e/crossbuild/jpype1/pyproject.toml index 752870bad..8b4fc17b6 100644 --- a/e2e/crossbuild/jpype1/pyproject.toml +++ b/e2e/crossbuild/jpype1/pyproject.toml @@ -4,7 +4,9 @@ version = "0.0.0" requires-python = ">=3.11" dependencies = [ "build", + "cmake", "jpype1==1.7.1", + "ninja", "scikit-build-core", "setuptools", "wheel", diff --git a/e2e/crossbuild/jpype1/uv.lock b/e2e/crossbuild/jpype1/uv.lock index 2a0b9eee6..f214da4c6 100644 --- a/e2e/crossbuild/jpype1/uv.lock +++ b/e2e/crossbuild/jpype1/uv.lock @@ -16,6 +16,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, ] +[[package]] +name = "cmake" +version = "4.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/ea/206baf6fd51a47790f766a24fa4514cd39c31b26ab934376f29a4aa458e5/cmake-4.4.2.tar.gz", hash = "sha256:6af2e0585239627f85f49a8f90761ce4560c671daae1d5e8d2b5f059dc7d22de", size = 34953, upload-time = "2026-08-04T06:14:49.786Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/5a/578888a6713994abfd97db756c937ce5ced44fa6280e7b7d452eebb8aa83/cmake-4.4.2-py3-none-macosx_10_10_universal2.whl", hash = "sha256:7a0279d3006c961ba1d62fe4383919ebcb7b770fb3357f6ae1309ca89210183b", size = 54414035, upload-time = "2026-08-04T06:13:31.175Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4f/925a2a60ae544791599e2fb14d3619d979511a56518e512081e7ef4b5f8d/cmake-4.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc9d9f95dc9a542db99ca96cba1c275adeeb497ff2e134c780a9677b8578bd05", size = 30288280, upload-time = "2026-08-04T06:13:35.675Z" }, + { url = "https://files.pythonhosted.org/packages/2a/76/6f4327771875666f95c4f4c56a53fc25eaac8e027e3144b37ec827ed3818/cmake-4.4.2-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b0a9bb2fa889773c3ff719130064de28edd36fd3e916b46e576243a6f16f033f", size = 31466224, upload-time = "2026-08-04T06:13:39.268Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8f/f5a8bb6e7e86947b6810d2b2685710ed8332c2ab8766c6e3121d17cee59e/cmake-4.4.2-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:93b06166210e478783e3078612144700d44e0492fe7efd6fcd00e4061bc709a6", size = 31225510, upload-time = "2026-08-04T06:13:43.367Z" }, + { url = "https://files.pythonhosted.org/packages/a0/57/ebd7a6f429a6d5b9cf87a8fe16f17851aa9b3ce78af5b58af3c5e41ac939/cmake-4.4.2-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ea5c206308f8eefc0be7cbeeee93b8b192b6af7338741b6d12fe387234bb7920", size = 29098755, upload-time = "2026-08-04T06:13:47.102Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/b8d0b15f57b37ac5b9e374169471f045da3a715b7f0f3af681011415d972/cmake-4.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:27b024e903ef985b37183d754a5c61230b56b41fe0971cd44b71b80c787ec594", size = 30230879, upload-time = "2026-08-04T06:13:50.678Z" }, + { url = "https://files.pythonhosted.org/packages/3b/91/1d72e960d27edbcc3f02bedd3890c4096bbaaf9dbcb7d86f678d2082fe90/cmake-4.4.2-py3-none-manylinux_2_31_armv7l.whl", hash = "sha256:a3580e0c30755c36b48edbbf471aaeb5d07858de0281e58a4a598dfa52a0f05d", size = 27319760, upload-time = "2026-08-04T06:13:54.468Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f7/dc27806fdee158ca3f30d043ef1c1b18b5f846266d5adf4989d97cc571cc/cmake-4.4.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e58296c6e0c04dec37fc28cbf56ca7150646c948dddab2b0d6f8a0a466e7f1ca", size = 27432198, upload-time = "2026-08-04T06:13:58.614Z" }, + { url = "https://files.pythonhosted.org/packages/97/ff/b3f135c8a28a2ee2b57c2f671342a0c0f3cb1b78ea62a633815483eb4acd/cmake-4.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:00a0a207efc83019b55f617b93b2592c2616aebd9c4eeab83ec076dc2a9b84a4", size = 39474065, upload-time = "2026-08-04T06:14:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b5/463afc4ec6ae535661d6a50918efff9e165ef4793ae6c14c376f0660d756/cmake-4.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0220135cceb78530e79e2b5cd0392672e4c524178db768a5f940ea24520e1359", size = 36109755, upload-time = "2026-08-04T06:14:08.512Z" }, + { url = "https://files.pythonhosted.org/packages/c4/e8/052a01a2c3362d04cb545c456ab26a8776c683f9a97f4082508c6d8cc506/cmake-4.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4eb0e17af8344d3063ce0c1a38a156eb7bbe3447f984ad12629a40f5c967fedd", size = 42239493, upload-time = "2026-08-04T06:14:14.295Z" }, + { url = "https://files.pythonhosted.org/packages/0e/30/c9b5bcd20411793c26838191a73e0e820da64d8f872ecba5364ebc2a3538/cmake-4.4.2-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:00195668e40e5dd0d51244e31d15fabb79b97c5e154f9f78b4240f152198c2eb", size = 41399147, upload-time = "2026-08-04T06:14:19.396Z" }, + { url = "https://files.pythonhosted.org/packages/31/d4/56f18d34b11981031f7bdb0215f05e8e43982d7848dc39a8a96b141d4e6a/cmake-4.4.2-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:41e2a04663685304222ba03fb5bed8db52480854aa873cbae1478eedf3a8ec1a", size = 36322600, upload-time = "2026-08-04T06:14:24.013Z" }, + { url = "https://files.pythonhosted.org/packages/34/4a/582268f8468d0f49b4b73423364af7ee82dba28eef63886e9c32f34761a2/cmake-4.4.2-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:269f84ede6543c5d65249dd685db6125a962e5928b7eafd0ed3acdd2b600aa9e", size = 38668384, upload-time = "2026-08-04T06:14:28.633Z" }, + { url = "https://files.pythonhosted.org/packages/45/24/620930e1ddf0832ac688e00aad2568dd876d71f3637fa98f917dfec25df0/cmake-4.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5b51faffe02ca78ed4f6b9afbe6dee8d25ab36e9a9365f510e890a16db76013", size = 39444623, upload-time = "2026-08-04T06:14:33.525Z" }, + { url = "https://files.pythonhosted.org/packages/70/a4/2f2af96afacfb0f4e5fc02f6f491d4cde4ce8e51d914311f2492e22ed8d9/cmake-4.4.2-py3-none-win32.whl", hash = "sha256:109af09f308fd53ddc44bbc23536b6ecb72db53f0218f611efccd9871b19f39f", size = 38774551, upload-time = "2026-08-04T06:14:38.493Z" }, + { url = "https://files.pythonhosted.org/packages/06/9e/3e572a9a8966eec43b6d75b8b8d9543ca2182ec4006a538fb239e004a3cf/cmake-4.4.2-py3-none-win_amd64.whl", hash = "sha256:c28388fe95298486169c45c0ec8bdf067aabcb59273b98a4cdae8be5cd9c74f3", size = 42325289, upload-time = "2026-08-04T06:14:42.919Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b9/2f0b9b355a5293d73db62cefab46a7d0f3b151962d58fb284f340e3685c4/cmake-4.4.2-py3-none-win_arm64.whl", hash = "sha256:1358f355578d19397f87955d4204f737bb399ba36cce59be5853976912836b32", size = 40497534, upload-time = "2026-08-04T06:14:47.366Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -31,7 +57,9 @@ version = "0.0.0" source = { virtual = "." } dependencies = [ { name = "build" }, + { name = "cmake" }, { name = "jpype1" }, + { name = "ninja" }, { name = "scikit-build-core" }, { name = "setuptools" }, { name = "wheel" }, @@ -40,7 +68,9 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "build" }, + { name = "cmake" }, { name = "jpype1", specifier = "==1.7.1" }, + { name = "ninja" }, { name = "scikit-build-core" }, { name = "setuptools" }, { name = "wheel" }, @@ -87,6 +117,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9f/87/f5b46e288dc3a0c7c6fb02e00f68a621035fa03cac3b6b489effd4170b13/jpype1-1.7.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b230c9475525b29114e6396b864c154f02f7cb041f2ac6bde006ed569e579aea", size = 439454, upload-time = "2026-05-06T23:54:59.609Z" }, ] +[[package]] +name = "ninja" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/73/79a0b22fc731989c708068427579e840a6cf4e937fe7ae5c5d0b7356ac22/ninja-1.13.0.tar.gz", hash = "sha256:4a40ce995ded54d9dc24f8ea37ff3bf62ad192b547f6c7126e7e25045e76f978", size = 242558, upload-time = "2025-08-11T15:10:19.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/74/d02409ed2aa865e051b7edda22ad416a39d81a84980f544f8de717cab133/ninja-1.13.0-py3-none-macosx_10_9_universal2.whl", hash = "sha256:fa2a8bfc62e31b08f83127d1613d10821775a0eb334197154c4d6067b7068ff1", size = 310125, upload-time = "2025-08-11T15:09:50.971Z" }, + { url = "https://files.pythonhosted.org/packages/8e/de/6e1cd6b84b412ac1ef327b76f0641aeb5dcc01e9d3f9eee0286d0c34fd93/ninja-1.13.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3d00c692fb717fd511abeb44b8c5d00340c36938c12d6538ba989fe764e79630", size = 177467, upload-time = "2025-08-11T15:09:52.767Z" }, + { url = "https://files.pythonhosted.org/packages/c8/83/49320fb6e58ae3c079381e333575fdbcf1cca3506ee160a2dcce775046fa/ninja-1.13.0-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:be7f478ff9f96a128b599a964fc60a6a87b9fa332ee1bd44fa243ac88d50291c", size = 187834, upload-time = "2025-08-11T15:09:54.115Z" }, + { url = "https://files.pythonhosted.org/packages/56/c7/ba22748fb59f7f896b609cd3e568d28a0a367a6d953c24c461fe04fc4433/ninja-1.13.0-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:60056592cf495e9a6a4bea3cd178903056ecb0943e4de45a2ea825edb6dc8d3e", size = 202736, upload-time = "2025-08-11T15:09:55.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/22/d1de07632b78ac8e6b785f41fa9aad7a978ec8c0a1bf15772def36d77aac/ninja-1.13.0-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1c97223cdda0417f414bf864cfb73b72d8777e57ebb279c5f6de368de0062988", size = 179034, upload-time = "2025-08-11T15:09:57.394Z" }, + { url = "https://files.pythonhosted.org/packages/ed/de/0e6edf44d6a04dabd0318a519125ed0415ce437ad5a1ec9b9be03d9048cf/ninja-1.13.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa", size = 180716, upload-time = "2025-08-11T15:09:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/938b562f9057aaa4d6bfbeaa05e81899a47aebb3ba6751e36c027a7f5ff7/ninja-1.13.0-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4be9c1b082d244b1ad7ef41eb8ab088aae8c109a9f3f0b3e56a252d3e00f42c1", size = 146843, upload-time = "2025-08-11T15:10:00.046Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fb/d06a3838de4f8ab866e44ee52a797b5491df823901c54943b2adb0389fbb/ninja-1.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6739d3352073341ad284246f81339a384eec091d9851a886dfa5b00a6d48b3e2", size = 154402, upload-time = "2025-08-11T15:10:01.657Z" }, + { url = "https://files.pythonhosted.org/packages/31/bf/0d7808af695ceddc763cf251b84a9892cd7f51622dc8b4c89d5012779f06/ninja-1.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11be2d22027bde06f14c343f01d31446747dbb51e72d00decca2eb99be911e2f", size = 552388, upload-time = "2025-08-11T15:10:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/9d/70/c99d0c2c809f992752453cce312848abb3b1607e56d4cd1b6cded317351a/ninja-1.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aa45b4037b313c2f698bc13306239b8b93b4680eb47e287773156ac9e9304714", size = 472501, upload-time = "2025-08-11T15:10:04.735Z" }, + { url = "https://files.pythonhosted.org/packages/9f/43/c217b1153f0e499652f5e0766da8523ce3480f0a951039c7af115e224d55/ninja-1.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f8e1e8a1a30835eeb51db05cf5a67151ad37542f5a4af2a438e9490915e5b72", size = 638280, upload-time = "2025-08-11T15:10:06.512Z" }, + { url = "https://files.pythonhosted.org/packages/8c/45/9151bba2c8d0ae2b6260f71696330590de5850e5574b7b5694dce6023e20/ninja-1.13.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:3d7d7779d12cb20c6d054c61b702139fd23a7a964ec8f2c823f1ab1b084150db", size = 642420, upload-time = "2025-08-11T15:10:08.35Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/95752eb635bb8ad27d101d71bef15bc63049de23f299e312878fc21cb2da/ninja-1.13.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:d741a5e6754e0bda767e3274a0f0deeef4807f1fec6c0d7921a0244018926ae5", size = 585106, upload-time = "2025-08-11T15:10:09.818Z" }, + { url = "https://files.pythonhosted.org/packages/c1/31/aa56a1a286703800c0cbe39fb4e82811c277772dc8cd084f442dd8e2938a/ninja-1.13.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:e8bad11f8a00b64137e9b315b137d8bb6cbf3086fbdc43bf1f90fd33324d2e96", size = 707138, upload-time = "2025-08-11T15:10:11.366Z" }, + { url = "https://files.pythonhosted.org/packages/34/6f/5f5a54a1041af945130abdb2b8529cbef0cdcbbf9bcf3f4195378319d29a/ninja-1.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4f2a072db3c0f944c32793e91532d8948d20d9ab83da9c0c7c15b5768072200", size = 581758, upload-time = "2025-08-11T15:10:13.295Z" }, + { url = "https://files.pythonhosted.org/packages/95/97/51359c77527d45943fe7a94d00a3843b81162e6c4244b3579fe8fc54cb9c/ninja-1.13.0-py3-none-win32.whl", hash = "sha256:8cfbb80b4a53456ae8a39f90ae3d7a2129f45ea164f43fadfa15dc38c4aef1c9", size = 267201, upload-time = "2025-08-11T15:10:15.158Z" }, + { url = "https://files.pythonhosted.org/packages/29/45/c0adfbfb0b5895aa18cec400c535b4f7ff3e52536e0403602fc1a23f7de9/ninja-1.13.0-py3-none-win_amd64.whl", hash = "sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e", size = 309975, upload-time = "2025-08-11T15:10:16.697Z" }, + { url = "https://files.pythonhosted.org/packages/df/93/a7b983643d1253bb223234b5b226e69de6cda02b76cdca7770f684b795f5/ninja-1.13.0-py3-none-win_arm64.whl", hash = "sha256:3c0b40b1f0bba764644385319028650087b4c1b18cdfa6f45cb39a3669b81aa9", size = 290806, upload-time = "2025-08-11T15:10:18.018Z" }, +] + [[package]] name = "packaging" version = "26.3" diff --git a/uv/private/pep517_whl/tests/build_helper_cross_test.py b/uv/private/pep517_whl/tests/build_helper_cross_test.py index 192309fcf..56778e5f2 100644 --- a/uv/private/pep517_whl/tests/build_helper_cross_test.py +++ b/uv/private/pep517_whl/tests/build_helper_cross_test.py @@ -33,10 +33,26 @@ if _manylinux.manylinux_compatible(2, 17, expected): sys.exit("MANYLINUX_NOT_DISABLED") +expected_ar = os.environ.get("EXPECTED_AR_BASENAME") +if expected_ar is not None: + seen_ar = os.path.basename(os.environ.get("AR", "")) + if seen_ar != expected_ar: + sys.exit("WRONG_AR: saw {!r}, expected {!r}".format(seen_ar, expected_ar)) + setup(name="cross_site_probe", version="1.0", py_modules=[]) """ +def _make_fake_llvm_bindir(workdir: str) -> str: + bindir = os.path.join(workdir, "llvm-bin") + os.makedirs(bindir) + for tool in ("llvm-libtool-darwin", "llvm-ar"): + with open(os.path.join(bindir, tool), "w") as f: + f.write("#!/bin/sh\nexit 0\n") + os.chmod(os.path.join(bindir, tool), 0o755) + return bindir + + def _make_sdist(workdir: str) -> str: pkgdir = os.path.join(workdir, "cross_site_probe-1.0") os.makedirs(pkgdir) @@ -85,6 +101,28 @@ def main() -> None: # Native build: no faking involved — setup.py must see the real host arch. _run(helper, sdist, workdir, "native", {"EXPECTED_MACHINE": real_machine}, []) + # llvm-libtool-darwin (the llvm toolchain's static-library tool on darwin + # exec hosts) only takes libtool-style args, but every $AR consumer + # invokes ar-style — the helper must swap in the sibling llvm-ar for + # native and cross builds alike. + fake_ar = os.path.join(_make_fake_llvm_bindir(workdir), "llvm-libtool-darwin") + _run( + helper, + sdist, + workdir, + "ar-swap-native", + {"AR": fake_ar, "EXPECTED_AR_BASENAME": "llvm-ar"}, + [], + ) + _run( + helper, + sdist, + workdir, + "ar-swap-cross", + {"AR": fake_ar, "EXPECTED_AR_BASENAME": "llvm-ar"}, + ["--cross", "--target-os", "linux", "--target-cpu", fake_machine], + ) + print("OK") diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index e1046e747..3787ac830 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -590,15 +590,6 @@ def _compiler_env( if not is_darwin and path.isdir(target_gcc_sysroot): env["RULES_PY_TARGET_GCC_SYSROOT"] = target_gcc_sysroot - # The llvm toolchain on a darwin exec host reports llvm-libtool-darwin - # (Mach-O-only) as archiver; for ELF targets swap in the sibling - # llvm-ar, which the ar-style args and target format require. - ar_path = env.get("AR", "") - if not is_darwin and path.basename(ar_path) == "llvm-libtool-darwin": - llvm_ar = path.join(path.dirname(ar_path), "llvm-ar") - if path.exists(llvm_ar): - env["AR"] = llvm_ar - # apple_support's wrapped_clang hard-fails without DEVELOPER_DIR / # SDKROOT; Bazel injects them only into actions with Xcode execution # requirements, which this PEP 517 action is not. @@ -651,6 +642,17 @@ def _compiler_env( mpicc_path = shutil.which("mpicc", path=env["PATH"]) if mpicc_path: env.setdefault("MPICC", _make_compiler_wrapper(tmpdir, "mpicc", mpicc_path, sysroot)) + + # $AR consumers (meson, distutils, CMake) all invoke it with ar-style + # args, but the llvm toolchain's cpp_link_static_library tool on a darwin + # exec host is llvm-libtool-darwin, which only accepts libtool-style + # `-static -o`. Swap in the sibling llvm-ar for every target: its + # symbol-table'd archives satisfy ld64 and ELF linkers alike. + ar_path = env.get("AR", "") + if path.basename(ar_path) == "llvm-libtool-darwin": + llvm_ar = path.join(path.dirname(ar_path), "llvm-ar") + if path.exists(llvm_ar): + env["AR"] = llvm_ar env.setdefault("AR", "ar") for key, wrapper in [ @@ -753,6 +755,17 @@ def _generate_cmake_toolchain_file( """ +# numpy's longdouble probe outputs (numpy/_core/meson.build), keyed by the +# target ABI: x86 keeps the 80-bit x87 format padded to 16 bytes, aarch64 +# glibc uses IEEE binary128, and Apple aarch64 aliases long double to double. +_MESON_LONGDOUBLE_FORMAT = { + ("darwin", "aarch64"): "IEEE_DOUBLE_LE", + ("darwin", "x86_64"): "INTEL_EXTENDED_16_BYTES_LE", + ("linux", "aarch64"): "IEEE_QUAD_LE", + ("linux", "x86_64"): "INTEL_EXTENDED_16_BYTES_LE", +} + + def _generate_meson_cross_file( tmpdir: str, build_env: Dict[str, str], @@ -788,6 +801,16 @@ def _generate_meson_cross_file( executable=True, ) exe_wrapper_line = "exe_wrapper = ['{}']\n".format(exe_wrapper) + + # numpy's documented cross recipe: its meson.build reads this external + # property and only falls back to a cc.run() probe when it is absent — + # which hard-errors wherever no exe_wrapper exists (any darwin→linux + # cross). The value is an ABI constant of (os, cpu, libc), so bake it in + # rather than making every consumer rediscover numpy gh-23972. + longdouble_line = "" + longdouble_format = _MESON_LONGDOUBLE_FORMAT.get((target_os, target_cpu)) + if longdouble_format: + longdouble_line = "longdouble_format = '{}'\n".format(longdouble_format) return _write_generated_file( path.join(tmpdir, "cross_file.ini"), textwrap.dedent("""\ @@ -805,10 +828,11 @@ def _generate_meson_cross_file( [properties] needs_exe_wrapper = true - """).format( + {longdouble_line}""").format( cc=build_env["CC"], cxx=build_env["CXX"], exe_wrapper_line=exe_wrapper_line, + longdouble_line=longdouble_line, ar=build_env.get("AR", "ar"), strip=build_env.get("STRIP", "strip"), system=target_os, From 50bbc92aacb341980b0be738d627bfdb715e4fb7 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 14 Aug 2026 14:40:01 -0600 Subject: [PATCH 061/103] remove smoke tests --- .github/workflows/ci-workflows.yaml | 38 +---------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 1e24fcef8..48f83318b 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -254,7 +254,7 @@ jobs: path: ${{ runner.temp }}/images/*.tar retention-days: 1 crossbuild-run-arm64-built: - name: run amd64-built images on native arm64 + name: run on amd needs: crossbuild-images-arm64 runs-on: ubuntu-latest steps: @@ -303,39 +303,3 @@ jobs: ;; esac - smoke: - name: smoke (${{ matrix.workspace.path }}, macos) - if: >- - ${{ github.ref_name == 'main' - || contains(github.head_ref || github.ref_name, 'macos') }} - runs-on: macos-latest - strategy: - fail-fast: false - matrix: - workspace: - - { path: ".", slug: "root" } - - { path: "e2e/cases", slug: "e2e" } - - { path: "e2e/crossbuild", slug: "e2e-crossbuild" } - defaults: - run: - working-directory: ${{ matrix.workspace.path }} - steps: - - uses: actions/checkout@v6 - - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 - with: - bazelisk-cache: true - disk-cache: macos-${{ matrix.workspace.slug }} - repository-cache: true - # Images still build; only the tests that need a Linux container daemon are - # dropped, since the GitHub-hosted macOS runners have none. - # Run `test //...`, then the workspace's test.sh if it has one - - name: Test - shell: bash - run: | - bazel test --config=ci --keep_going \ - --test_tag_filters=-skip-on-bazel8,-requires-docker \ - --build_tag_filters=-skip-on-bazel8 \ - //... - if [ -f test.sh ]; then - bash test.sh - fi From 52c8eefea0b8ba83b236ecabdbd582d1bbb1032a Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Mon, 17 Aug 2026 12:28:19 -0600 Subject: [PATCH 062/103] =?UTF-8?q?fix:=20darwin=20exec-host=20cross=20bui?= =?UTF-8?q?lds=20=E2=80=94=20exec-resolved=20JDK,=20ar=E2=86=92libtool=20f?= =?UTF-8?q?allback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - drop the pep517_whl defs.bzl re-export; load pep517_whl.bzl / pep517_native_whl.bzl directly everywhere (snapshots regenerated) - build_helper: when the sandbox doesn't mount llvm-ar, wrap llvm-libtool-darwin behind an ar-style argv translator - jpype1: re-resolve the JDK select() under exec_transition so a darwin host cross-building linux doesn't pick the linux JDK; add temurin darwin/aarch64 Co-Authored-By: Claude Fable 5 --- .../pep517-frontend-exec-group/BUILD.bazel | 2 +- ...build.uv_sdist_fallback.cowsay.BUILD.bazel | 2 +- ...uild.uv_sdist_jdk_build.jpype1.BUILD.bazel | 2 +- ...st_native_build.python_geohash.BUILD.bazel | 2 +- e2e/crossbuild/jpype1/BUILD.bazel | 18 +++++++++ e2e/crossbuild/jpype1/setup.MODULE.bazel | 37 ++++++++++++++++-- e2e/crossbuild/tools/jdk_layer.bzl | 36 ++++++++++++++++++ uv/defs.bzl | 5 --- uv/private/pep517_whl/BUILD.bazel | 9 ----- uv/private/pep517_whl/defs.bzl | 7 ---- uv/private/pep517_whl/tests/BUILD.bazel | 5 ++- .../tests/console_scripts/pure/BUILD.bazel | 2 +- .../pep517_whl/tests/explicit_env/BUILD.bazel | 2 +- .../pep517_whl/tests/native_dep/BUILD.bazel | 2 +- .../tests/native_dep/tool_names/BUILD.bazel | 2 +- .../native_dep/tool_names/bare/BUILD.bazel | 2 +- uv/private/pep517_whl/tools/build_helper.py | 38 ++++++++++++++++++- uv/private/sdist_build/repository.bzl | 2 +- .../sdist_build.bravado_core.BUILD.bazel | 2 +- 19 files changed, 137 insertions(+), 40 deletions(-) create mode 100644 e2e/crossbuild/tools/jdk_layer.bzl delete mode 100644 uv/private/pep517_whl/defs.bzl diff --git a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel index f23e2a025..25117bc32 100644 --- a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel +++ b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel @@ -1,4 +1,4 @@ -load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") +load("@aspect_rules_py//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@bazel_skylib//rules:write_file.bzl", "write_file") diff --git a/e2e/cases/snapshots/sdist_build.uv_sdist_fallback.cowsay.BUILD.bazel b/e2e/cases/snapshots/sdist_build.uv_sdist_fallback.cowsay.BUILD.bazel index fafa0dc3c..ed0503afa 100644 --- a/e2e/cases/snapshots/sdist_build.uv_sdist_fallback.cowsay.BUILD.bazel +++ b/e2e/cases/snapshots/sdist_build.uv_sdist_fallback.cowsay.BUILD.bazel @@ -1,5 +1,5 @@ -load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") +load("@aspect_rules_py//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( diff --git a/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel b/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel index 2a9810d30..d50e88b31 100644 --- a/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel +++ b/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel @@ -1,5 +1,5 @@ -load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") +load("@aspect_rules_py//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( diff --git a/e2e/cases/snapshots/sdist_build.uv_sdist_native_build.python_geohash.BUILD.bazel b/e2e/cases/snapshots/sdist_build.uv_sdist_native_build.python_geohash.BUILD.bazel index 586d750ba..761491ef3 100644 --- a/e2e/cases/snapshots/sdist_build.uv_sdist_native_build.python_geohash.BUILD.bazel +++ b/e2e/cases/snapshots/sdist_build.uv_sdist_native_build.python_geohash.BUILD.bazel @@ -1,5 +1,5 @@ -load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") +load("@aspect_rules_py//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( diff --git a/e2e/crossbuild/jpype1/BUILD.bazel b/e2e/crossbuild/jpype1/BUILD.bazel index 29199436d..a3beecf89 100644 --- a/e2e/crossbuild/jpype1/BUILD.bazel +++ b/e2e/crossbuild/jpype1/BUILD.bazel @@ -8,6 +8,24 @@ # portable JVM bytecode. load("//tools:cross_case.bzl", "pep517_cross_case") +load("//tools:jdk_layer.bzl", "exec_jdk") + +# Ant/javac always run on the exec platform (see setup.MODULE.bazel), but +# the `toolchains` attribute is target-configured — exec_jdk re-resolves the +# select under the host platform so cross builds don't pick a foreign JDK. +exec_jdk( + name = "jdk", + actual = ":jdk_for_exec", + visibility = ["//visibility:public"], +) + +alias( + name = "jdk_for_exec", + actual = select({ + "@platforms//os:macos": "@temurin11_darwin_aarch64//:jdk", + "//conditions:default": "@temurin11_linux_x86_64//:jdk", + }), +) pep517_cross_case( name = "jpype1", diff --git a/e2e/crossbuild/jpype1/setup.MODULE.bazel b/e2e/crossbuild/jpype1/setup.MODULE.bazel index c8c85d75c..d5dbad84b 100644 --- a/e2e/crossbuild/jpype1/setup.MODULE.bazel +++ b/e2e/crossbuild/jpype1/setup.MODULE.bazel @@ -28,7 +28,7 @@ uv.override_package( }, lock = "//jpype1:uv.lock", toolchains = [ - "@temurin11_linux_x86_64//:jdk", + "//jpype1:jdk", "//tools:ant_home", ], ) @@ -38,9 +38,10 @@ http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "ht # jpype1 only ever runs Ant/javac at build time to produce a JAR (portable # Java bytecode) — always a host-executed step regardless of what CPU the -# compiled _jpype.so targets, so a single exec-platform (x86_64) JDK and a -# single (architecture-independent) Ant install cover both the native and -# cross builds. Genuine Eclipse Temurin, not rules_java's default remotejdk +# compiled _jpype.so targets, so the JDK must match the exec platform: +# linux x86_64 on CI, darwin aarch64 on macOS dev hosts (selected via +# //jpype1:jdk). Ant is architecture-independent, one install covers all. +# Genuine Eclipse Temurin, not rules_java's default remotejdk # (which resolves to Azul Zulu builds) — see fetched release metadata at # https://api.adoptium.net/v3/assets/latest/11/hotspot?image_type=jdk&os=linux&architecture=x64. http_archive( @@ -69,6 +70,34 @@ java_runtime( url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.32%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.32_9.tar.gz", ) +# Same release for darwin/aarch64 exec hosts. Mac Temurin tarballs nest the +# JDK under Contents/Home (macOS bundle layout), hence the deeper prefix. +http_archive( + name = "temurin11_darwin_aarch64", + build_file_content = """load("@rules_java//java/toolchains:java_runtime.bzl", "java_runtime") + +package(default_visibility = ["//visibility:public"]) + +filegroup(name = "jdk-bin", srcs = glob(["bin/**"])) + +filegroup(name = "jdk-conf", srcs = glob(["conf/**"], allow_empty = True)) + +filegroup(name = "jdk-include", srcs = glob(["include/**"], allow_empty = True)) + +filegroup(name = "jdk-lib", srcs = glob(["lib/**", "release"], allow_empty = True)) + +java_runtime( + name = "jdk", + srcs = [":jdk-bin", ":jdk-conf", ":jdk-include", ":jdk-lib"], + java = "bin/java", + version = 11, +) +""", + sha256 = "3e3687488e472035b7a27732f0f6127d59903ba9fd0cb6c815f1a182f4160109", + strip_prefix = "jdk-11.0.32+9/Contents/Home", + url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.32%2B9/OpenJDK11U-jdk_aarch64_mac_hotspot_11.0.32_9.tar.gz", +) + # Apache Ant: plain Java bytecode plus shell/bat launchers — no architecture # variants needed. http_archive( diff --git a/e2e/crossbuild/tools/jdk_layer.bzl b/e2e/crossbuild/tools/jdk_layer.bzl new file mode 100644 index 000000000..51cc81520 --- /dev/null +++ b/e2e/crossbuild/tools/jdk_layer.bzl @@ -0,0 +1,36 @@ +"""Re-resolves a java_runtime under the exec platform. + +jpype1's CMake build runs javac/Ant on the exec platform regardless of what +CPU the compiled _jpype.so targets, but the standard `toolchains` attribute +is target-configured: a plain select() over the JDK repos would pick the +target platform's JDK and hand a Linux ELF java to a macOS host under a +cross transition. Same trick as rust_host_sysroot: re-resolve the selecting +alias under rules_py's exec_transition (--platforms := the host platform) +and forward its files + Make variables. +""" + +load("@aspect_rules_py//uv/private/pep517_whl:exec_transition.bzl", "exec_transition") + +def _exec_jdk_impl(ctx): + actual = ctx.attr.actual + if type(actual) == "list": + actual = actual[0] + return [ + DefaultInfo(files = actual[DefaultInfo].files), + actual[platform_common.TemplateVariableInfo], + ] + +exec_jdk = rule( + implementation = _exec_jdk_impl, + attrs = { + "actual": attr.label( + cfg = exec_transition, + doc = "A java_runtime (or selecting alias), re-resolved with --platforms set to the host.", + mandatory = True, + ), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + }, + doc = "Forwards a java_runtime's files and $(JAVA)/$(JAVABASE), resolved for the exec platform.", +) diff --git a/uv/defs.bzl b/uv/defs.bzl index 3f49139a6..2f9781798 100644 --- a/uv/defs.bzl +++ b/uv/defs.bzl @@ -1,8 +1,3 @@ -"""Stable public API for uv rules. - -Graduated from `@aspect_rules_py//uv/unstable:defs.bzl` in rules_py v2.0.0. -""" - load( "//uv/private/gazelle_manifest:defs.bzl", _gazelle_python_manifest = "gazelle_python_manifest", diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 709d18f79..c9f7c04b5 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -4,15 +4,6 @@ package(default_visibility = [ "//uv/private:__subpackages__", ]) -bzl_library( - name = "defs", - srcs = ["defs.bzl"], - deps = [ - ":pep517_native_whl", - ":pep517_whl", - ], -) - bzl_library( name = "pep517_whl", srcs = ["pep517_whl.bzl"], diff --git a/uv/private/pep517_whl/defs.bzl b/uv/private/pep517_whl/defs.bzl deleted file mode 100644 index 8254a02b1..000000000 --- a/uv/private/pep517_whl/defs.bzl +++ /dev/null @@ -1,7 +0,0 @@ -"""Public surface of the PEP 517 sdist-to-wheel rules.""" - -load(":pep517_native_whl.bzl", _pep517_native_whl = "pep517_native_whl") -load(":pep517_whl.bzl", _pep517_whl = "pep517_whl") - -pep517_whl = _pep517_whl -pep517_native_whl = _pep517_native_whl diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index db3ba704f..1be414f8a 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -4,7 +4,8 @@ load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load("@tar.bzl//tar:mtree.bzl", "mtree_mutate", "mtree_spec") load("@tar.bzl//tar:tar.bzl", "tar_rule") load("//py:defs.bzl", "py_binary", "py_test") -load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl", "pep517_whl") +load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:pep517_whl.bzl", "pep517_whl") load( ":pep517_whl_test.bzl", "execroot_collision_toolchain", @@ -23,7 +24,7 @@ py_test( name = "memory_monitor_test", srcs = ["memory_monitor_test.py"], main = "memory_monitor_test.py", - deps = ["//uv/private/pep517_whl/tools:memory_monitor"], + deps = ["//uv/private/pep517_whl/tools"], ) py_test( diff --git a/uv/private/pep517_whl/tests/console_scripts/pure/BUILD.bazel b/uv/private/pep517_whl/tests/console_scripts/pure/BUILD.bazel index e299ed253..7f2c597b3 100644 --- a/uv/private/pep517_whl/tests/console_scripts/pure/BUILD.bazel +++ b/uv/private/pep517_whl/tests/console_scripts/pure/BUILD.bazel @@ -1,6 +1,6 @@ load("@bazel_skylib//rules:write_file.bzl", "write_file") load("@rules_shell//shell:sh_binary.bzl", "sh_binary") -load("//uv/private/pep517_whl:defs.bzl", "pep517_whl") +load("//uv/private/pep517_whl:pep517_whl.bzl", "pep517_whl") load("//uv/private/pep517_whl/tests:pep517_whl_test.bzl", "pep517_whl_console_scripts_test") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/explicit_env/BUILD.bazel b/uv/private/pep517_whl/tests/explicit_env/BUILD.bazel index da5ed8f74..b5ee9d457 100644 --- a/uv/private/pep517_whl/tests/explicit_env/BUILD.bazel +++ b/uv/private/pep517_whl/tests/explicit_env/BUILD.bazel @@ -1,4 +1,4 @@ -load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("//uv/private/pep517_whl/tests:pep517_whl_test.bzl", "hostile_python_env_target") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/native_dep/BUILD.bazel b/uv/private/pep517_whl/tests/native_dep/BUILD.bazel index 3464c72fa..ea59f8eec 100644 --- a/uv/private/pep517_whl/tests/native_dep/BUILD.bazel +++ b/uv/private/pep517_whl/tests/native_dep/BUILD.bazel @@ -4,7 +4,7 @@ load("@bazel_skylib//rules:write_file.bzl", "write_file") load("@rules_cc//cc:defs.bzl", "cc_library") load("@tar.bzl//tar:mtree.bzl", "mtree_mutate", "mtree_spec") load("@tar.bzl//tar:tar.bzl", "tar_rule") -load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load(":defs.bzl", "dep_makevars") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/native_dep/tool_names/BUILD.bazel b/uv/private/pep517_whl/tests/native_dep/tool_names/BUILD.bazel index c380bc3de..a3bce6972 100644 --- a/uv/private/pep517_whl/tests/native_dep/tool_names/BUILD.bazel +++ b/uv/private/pep517_whl/tests/native_dep/tool_names/BUILD.bazel @@ -1,5 +1,5 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tests/native_dep/tool_names/bare/BUILD.bazel b/uv/private/pep517_whl/tests/native_dep/tool_names/bare/BUILD.bazel index d3e601fd6..096f6e00b 100644 --- a/uv/private/pep517_whl/tests/native_dep/tool_names/bare/BUILD.bazel +++ b/uv/private/pep517_whl/tests/native_dep/tool_names/bare/BUILD.bazel @@ -1,5 +1,5 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("//uv/private/pep517_whl:defs.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") package(default_testonly = True) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 8abbc259a..29ad633f8 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -457,6 +457,36 @@ def _make_cross_compiler_wrapper( ) +_AR_LIBTOOL_WRAPPER = """#!/usr/bin/env python3 +import os +import sys + +libtool = {libtool!r} +args = sys.argv[1:] + +# Already libtool-style ("-static ...") or a tool probe ("--version", "-V"): +# hand through untouched. +if not args or args[0].startswith("-"): + os.execv(libtool, [libtool] + args) + +# ar-style " " (meson "csr", CMake "qc", +# distutils "rcs"). libtool -static always rewrites the whole symbol-tabled +# archive, so create/replace/append modifiers all collapse to the same call. +archive = args[1] +members = args[2:] +os.execv(libtool, [libtool, "-static", "-o", archive] + members) +""" + + +def _make_ar_libtool_wrapper(tmpdir: str, libtool_path: str) -> str: + wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", "ar") + return _write_generated_file( + wrapper, + _AR_LIBTOOL_WRAPPER.format(libtool=libtool_path), + executable=True, + ) + + def _override_tool(env: Dict[str, str], key: str, wrapper: str) -> None: current = env.get(key) if not current: @@ -646,13 +676,17 @@ def _compiler_env( # $AR consumers (meson, distutils, CMake) all invoke it with ar-style # args, but the llvm toolchain's cpp_link_static_library tool on a darwin # exec host is llvm-libtool-darwin, which only accepts libtool-style - # `-static -o`. Swap in the sibling llvm-ar for every target: its - # symbol-table'd archives satisfy ld64 and ELF linkers alike. + # `-static -o`. Prefer the sibling llvm-ar (symbol-table'd archives + # satisfy ld64 and ELF linkers alike), but the sandbox only mounts the + # toolchain's declared tool files — llvm-ar is usually not among them — + # so fall back to a wrapper that translates ar-style argv to libtool's. ar_path = env.get("AR", "") if path.basename(ar_path) == "llvm-libtool-darwin": llvm_ar = path.join(path.dirname(ar_path), "llvm-ar") if path.exists(llvm_ar): env["AR"] = llvm_ar + else: + env["AR"] = _make_ar_libtool_wrapper(tmpdir, ar_path) env.setdefault("AR", "ar") for key, wrapper in [ diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index f9f9755ed..45f5e678e 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -258,7 +258,7 @@ def _sdist_build_impl(repository_ctx): # Leave args unset: the pure rule validates anyarch wheels by default, # while the native rule defaults to no validation. repository_ctx.file("BUILD.bazel", content = """ -load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "{rule}") +load("@aspect_rules_py//uv/private/pep517_whl:{rule}.bzl", "{rule}") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( diff --git a/uv/private/uv_hub/snapshots/sdist_build.bravado_core.BUILD.bazel b/uv/private/uv_hub/snapshots/sdist_build.bravado_core.BUILD.bazel index e9ef5c5a5..57da8fd6e 100644 --- a/uv/private/uv_hub/snapshots/sdist_build.bravado_core.BUILD.bazel +++ b/uv/private/uv_hub/snapshots/sdist_build.bravado_core.BUILD.bazel @@ -1,5 +1,5 @@ -load("@aspect_rules_py//uv/private/pep517_whl:defs.bzl", "pep517_whl") +load("@aspect_rules_py//uv/private/pep517_whl:pep517_whl.bzl", "pep517_whl") load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( From f12166b5f557000a664fed88f3e4cbd7be353c1a Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Mon, 17 Aug 2026 15:51:11 -0600 Subject: [PATCH 063/103] chore: drop accidental typing reverts against main The merges of main resolved d9c4a7b6 (modern python typings) and the uv/defs.bzl docstring away in files this branch doesn't functionally change; restore main's versions. --- uv/defs.bzl | 5 +++++ .../pep517_whl/tests/memory_monitor_test.py | 5 ++--- .../pep517_whl/tests/native_dep/sdist/backend.py | 12 ++++++------ uv/private/pep517_whl/tools/memory_monitor.py | 15 ++++++++------- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/uv/defs.bzl b/uv/defs.bzl index 2f9781798..3f49139a6 100644 --- a/uv/defs.bzl +++ b/uv/defs.bzl @@ -1,3 +1,8 @@ +"""Stable public API for uv rules. + +Graduated from `@aspect_rules_py//uv/unstable:defs.bzl` in rules_py v2.0.0. +""" + load( "//uv/private/gazelle_manifest:defs.bzl", _gazelle_python_manifest = "gazelle_python_manifest", diff --git a/uv/private/pep517_whl/tests/memory_monitor_test.py b/uv/private/pep517_whl/tests/memory_monitor_test.py index c523d6bfa..6fc2b93c3 100644 --- a/uv/private/pep517_whl/tests/memory_monitor_test.py +++ b/uv/private/pep517_whl/tests/memory_monitor_test.py @@ -8,7 +8,6 @@ import sys import tempfile import unittest -from typing import Dict, List, Optional from unittest import mock from uv.private.pep517_whl.tools import memory_monitor @@ -143,8 +142,8 @@ def test_child_stays_in_callers_process_group(self) -> None: def _write_process( proc_root: Path, pid: int, - rss_pages: Optional[int], - task_children: Dict[int, List[int]], + rss_pages: int | None, + task_children: dict[int, list[int]], ) -> None: process_dir = proc_root / str(pid) process_dir.mkdir() diff --git a/uv/private/pep517_whl/tests/native_dep/sdist/backend.py b/uv/private/pep517_whl/tests/native_dep/sdist/backend.py index 9dcc4d44a..47e7804f6 100644 --- a/uv/private/pep517_whl/tests/native_dep/sdist/backend.py +++ b/uv/private/pep517_whl/tests/native_dep/sdist/backend.py @@ -10,12 +10,12 @@ import shlex import subprocess from pathlib import Path -from typing import Dict, List, Mapping, Optional, Union +from collections.abc import Mapping from zipfile import ZIP_DEFLATED, ZipFile _DIST_INFO = "native_dep_ext-0.0.1.dist-info" _EXT = "native_dep_ext.so" -ConfigSettings = Optional[Mapping[str, Union[str, List[str]]]] +ConfigSettings = Mapping[str, str | list[str]] | None def _compile() -> None: @@ -41,7 +41,7 @@ def _compile() -> None: def get_requires_for_build_wheel( config_settings: ConfigSettings = None, -) -> List[str]: +) -> list[str]: del config_settings return [] @@ -49,12 +49,12 @@ def get_requires_for_build_wheel( def build_wheel( wheel_directory: str, config_settings: ConfigSettings = None, - metadata_directory: Optional[str] = None, + metadata_directory: str | None = None, ) -> str: del config_settings, metadata_directory _compile() - files: Dict[str, bytes] = { + files: dict[str, bytes] = { _EXT: Path(_EXT).read_bytes(), f"{_DIST_INFO}/METADATA": ( "Metadata-Version: 2.1\nName: native-dep-ext\nVersion: 0.0.1\n" @@ -67,7 +67,7 @@ def build_wheel( ).encode(), } - rows: List[List[str]] = [] + rows: list[list[str]] = [] for name, content in files.items(): digest = base64.urlsafe_b64encode(hashlib.sha256(content).digest()).rstrip(b"=") rows.append([name, "sha256=" + digest.decode(), str(len(content))]) diff --git a/uv/private/pep517_whl/tools/memory_monitor.py b/uv/private/pep517_whl/tools/memory_monitor.py index 9ed87f00e..621f35459 100644 --- a/uv/private/pep517_whl/tools/memory_monitor.py +++ b/uv/private/pep517_whl/tools/memory_monitor.py @@ -6,7 +6,8 @@ import subprocess import sys import time -from typing import IO, Mapping, Optional, Sequence, Union +from typing import IO +from collections.abc import Mapping, Sequence _MIB = 1024 * 1024 _REPORT_STEP_BYTES = 256 * _MIB @@ -17,7 +18,7 @@ def _process_tree_rss_bytes( root_pid: int, page_size: int, proc_root: str = "/proc", -) -> Optional[int]: +) -> int | None: """Return the sampled RSS sum for root_pid and its descendants.""" # statm reports resident memory in pages: # https://man7.org/linux/man-pages/man5/proc_pid_statm.5.html @@ -60,9 +61,9 @@ def _process_tree_rss_bytes( def _report_memory( wheel: str, state: str, - peak: Optional[int], - current: Optional[int] = None, - returncode: Optional[int] = None, + peak: int | None, + current: int | None = None, + returncode: int | None = None, ) -> None: if peak is None: details = "unavailable" @@ -91,9 +92,9 @@ def _report_memory( def run_with_memory_monitor( cmd: Sequence[str], *, - cwd: Optional[str], + cwd: str | None, env: Mapping[str, str], - stdout: Union[IO[str], IO[bytes]], + stdout: IO[str] | IO[bytes], wheel: str, ) -> None: """Run cmd while reporting best-effort process-tree RSS.""" From 3e16914627a39ae4924a7c057e10c5a34150c93d Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 27 Aug 2026 05:45:37 -0600 Subject: [PATCH 064/103] =?UTF-8?q?fix(e2e):=20unred=20spike=20CI=20?= =?UTF-8?q?=E2=80=94=20drop=20swept-in=20strays,=20bump=20setproctitle=20f?= =?UTF-8?q?or=20GCC=2015?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The a6ce6935 merge's git add -A swept ten local-only files into the branch (uv/private/normalize/BUILD.bazel referencing a nonexistent wheel.bzl, local MODULE.bazel.lock files, tool configs). The phantom bzl_library broke analysis repo-wide, failing the buildifier, gazelle and root-test jobs. The crossbuild e2e resolves native linux builds to gcc_toolchain (registered first, on purpose) whose 0.11.0 ships GCC 15: C23-by-default rejects setproctitle 1.3.2's typedef bool. Bump the case to 1.3.7, which guards stdbool.h by __STDC_VERSION__; require_extension.patch applies unchanged. --- .opencode/skills/bug/SKILL.md | 162 ------- benchmark/analysis/MODULE.bazel.lock | 217 ---------- .../subrepo_a/MODULE.bazel.lock | 193 --------- .../subrepo_b/MODULE.bazel.lock | 193 --------- .../extrepo/MODULE.bazel.lock | 193 --------- .../ambiguous-version/MODULE.bazel.lock | 217 ---------- .../duplicate/MODULE.bazel.lock | 217 ---------- e2e/crossbuild/pycross-setuptools/BUILD.bazel | 2 +- .../pycross-setuptools/pyproject.toml | 2 +- .../pycross-setuptools/setup.MODULE.bazel | 4 +- e2e/crossbuild/pycross-setuptools/uv.lock | 81 +++- examples/django/db.sqlite3 | 0 tdr-indexed-imports-pr1466.md | 404 ------------------ uv/private/normalize/BUILD.bazel | 8 - 14 files changed, 70 insertions(+), 1823 deletions(-) delete mode 100644 .opencode/skills/bug/SKILL.md delete mode 100644 benchmark/analysis/MODULE.bazel.lock delete mode 100644 e2e/cases/cross-repo-610/subrepo_a/MODULE.bazel.lock delete mode 100644 e2e/cases/cross-repo-610/subrepo_b/MODULE.bazel.lock delete mode 100644 e2e/cases/unittest-test-868/extrepo/MODULE.bazel.lock delete mode 100644 e2e/cases/uv-all-lock-overrides/ambiguous-version/MODULE.bazel.lock delete mode 100644 e2e/cases/uv-all-lock-overrides/duplicate/MODULE.bazel.lock delete mode 100644 examples/django/db.sqlite3 delete mode 100644 tdr-indexed-imports-pr1466.md delete mode 100644 uv/private/normalize/BUILD.bazel diff --git a/.opencode/skills/bug/SKILL.md b/.opencode/skills/bug/SKILL.md deleted file mode 100644 index 3221c6efc..000000000 --- a/.opencode/skills/bug/SKILL.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -name: bug -description: Use when fixing a bug or regression in aspect_rules_py. Reproduces the failure with a new e2e case under e2e/cases/, then implements the fix in py/ or uv/, then verifies. Leaves all changes uncommitted for manual review. Trigger on words like "bug", "regression", "broken", "fix this", "reproduce", or when given an issue number. ---- - -# Bug-fix workflow for aspect_rules_py - -This skill reproduces a reported bug as a regression test under `e2e/cases/`, -implements the fix in the ruleset source, and verifies the fix passes. Every -change stays **uncommitted** for manual review. - -## Hard rules - -- **Never commit.** Stage nothing. Leave the tree dirty for the user to `git diff`. -- **The fix lives in `py/` or `uv/`.** The reproduction lives in `e2e/cases/`. - These are separate Bazel workspaces linked by - `local_path_override(module_name = "aspect_rules_py", path = "../..")` — - edits to `py/` / `uv/` are picked up by the e2e workspace without a publish. -- **Name the case after the issue.** Convention is `-` - (e.g. `venv-conflict-608`, `pytest-mock-530`). No issue number → drop suffix. -- **Reproduce before fixing, verify after fixing.** Two separate runs of the - case. The first must fail (proving the repro), the second must pass. - -## Step 1 — Reproduce: create the e2e case - -Determine which of the three case patterns fits the bug. Read an existing -sibling case as a template before writing your own. - -### Pattern A — plain build/run regression (no extra deps) - -A `BUILD.bazel` target that the failure touches. Discovered automatically by -`bazel test //...`, so it must be a real `py_test` / `sh_test` / `build_test`. - -Files: -``` -e2e/cases// -├── BUILD.bazel -└── .py -``` - -Reference: `e2e/cases/venv-conflict-608/` (uses `build_test` to assert two -targets build together without an action conflict). - -### Pattern B — regression needing third-party deps (uv hub) - -Same as A, plus a `setup.MODULE.bazel` fragment that declares its own uv hub + -project, and a `uv.lock` + `pyproject.toml` when the deps aren't already -available in the shared cases workspace. - -Files: -``` -e2e/cases// -├── BUILD.bazel -├── setup.MODULE.bazel # declares hub + uv.project; reinstantiates use_extension -├── pyproject.toml # only if new deps are needed -├── uv.lock # only if new deps are needed -└── .py -``` - -The `setup.MODULE.bazel` must **re-instantiate** `use_extension` against -`@aspect_rules_py` (do NOT reuse the shared `uv` proxy from the root -`e2e/cases/MODULE.bazel`): - -```starlark -uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") -uv.declare_hub(hub_name = "pypi_") -uv.project( - hub_name = "pypi_", - lock = "//:uv.lock", - pyproject = "//:pyproject.toml", -) -use_repo(uv, "pypi_") -``` - -Reference: `e2e/cases/pytest-mock-530/setup.MODULE.bazel`. - -**Register the fragment**: append one line to the root workspace module: -```starlark -# e2e/cases/MODULE.bazel — keep the alphabetical order of the include() list -include("//:setup.MODULE.bazel") -``` - -### Pattern C — assert a *build failure* (cannot be an sh_test under //...) - -When the bug is that something should fail (or fail with a specific message), -it can't live under `//...`. Ship a `test.sh` that invokes bazel and asserts -on exit code / stderr. Targets in `BUILD.bazel` must be tagged `manual` so -`//...` skips them. - -Files: -``` -e2e/cases// -├── BUILD.bazel -├── test.sh # self-locating: `cd "$(dirname "$0")/.."` to reach cases root -└── -``` - -The `test.sh` is discovered automatically by `e2e/cases/test.sh`'s -`*/test.sh` glob — no registration needed beyond dropping the file. - -Reference: `e2e/cases/patch-failure/test.sh`. Honor `$BAZEL` (default -`bazel`) so CI can override the launcher. - -## Step 2 — Run the case and confirm it FAILS - -All commands run from the **`e2e/cases/`** workspace root. - -```bash -# Pattern A / B: target is under //... -bazel test //: - -# Pattern C: run the script directly -bash /test.sh - -# Whole workspace (slow, only as a final gate) -bazel test //... -``` - -If the case **passes** before the fix, the repro is wrong — the bug isn't -captured. Re-examine the failure mode before touching `py/` or `uv/`. Do not -move on to the fix with a green repro. - -## Step 3 — Implement the fix - -Edit the ruleset source under `py/` or `uv/`. The e2e workspace consumes it -via the `local_path_override`, so no republish is needed — the next bazel -invocation rebuilds the changed `.bzl` / providers. - -When editing rule implementations, follow the codebase conventions: -- Providers and `make_wheel_record` live in `py/private/providers.bzl`. -- Venv assembly core is `py/private/py_venv/venv.bzl::assemble_venv`. -- Keep the `# HACK:` / `# TODO:` comment convention only for genuine - workarounds (e.g. upstream Bazel bugs). No redundant inline comments. - -## Step 4 — Run the case again and confirm it PASSES - -Re-run the **exact same command** from Step 2. It must pass now. If it still -fails, the fix is incomplete — iterate on Step 3. - -Optionally also run the broader suite around the touched component to catch -collateral regressions: -```bash -bazel test //py/tests/... # unit/integration tests for the ruleset itself -``` - -## Step 5 — Hand off uncommitted - -Stop. Do **not** `git add`, `git commit`, or `git stash`. Report to the user: -1. The case directory created and which pattern (A/B/C) was used. -2. The files changed in `py/` / `uv/` with `file:line` references. -3. The before (failing) and after (passing) command output summary. - -Leave the decision to commit — including splitting the repro and the fix into -separate commits — to the user. - -## Quick reference: case pattern chooser - -| If the bug... | Pattern | Needs setup.MODULE.bazel? | Discovery | -|-------------------------------------------------------------|---------|---------------------------|------------------| -| ...is a runtime/build behavior of a target with no new deps | A | No | `bazel test //...` | -| ...needs third-party wheels from a uv hub | B | Yes (+ include() in root) | `bazel test //...` | -| ...is that a build *should* fail / emit a specific error | C | Maybe | `*/test.sh` glob | diff --git a/benchmark/analysis/MODULE.bazel.lock b/benchmark/analysis/MODULE.bazel.lock deleted file mode 100644 index d7c9f316b..000000000 --- a/benchmark/analysis/MODULE.bazel.lock +++ /dev/null @@ -1,217 +0,0 @@ -{ - "lockFileVersion": 28, - "registryFileHashes": { - "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", - "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", - "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", - "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", - "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", - "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", - "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", - "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", - "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", - "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", - "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", - "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", - "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", - "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", - "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", - "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", - "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", - "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", - "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", - "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", - "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", - "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", - "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", - "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", - "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", - "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", - "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", - "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", - "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", - "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", - "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", - "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", - "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", - "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", - "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", - "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", - "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", - "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", - "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", - "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", - "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", - "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/MODULE.bazel": "67ff71bbfb482e58510451c4c8b8cd303c757f7ff79a2aff7cf381277be96f9f", - "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/source.json": "475aa00426677e643e327b4b031d8816a3bc0a134c94d0d0d510cfd67b2cfd2c", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", - "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", - "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", - "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", - "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", - "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", - "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", - "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", - "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", - "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", - "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", - "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", - "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", - "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", - "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", - "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", - "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", - "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", - "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", - "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", - "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", - "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", - "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", - "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", - "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", - "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", - "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", - "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", - "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", - "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", - "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", - "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", - "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", - "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", - "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", - "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", - "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", - "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", - "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", - "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", - "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", - "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", - "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", - "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", - "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", - "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", - "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", - "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", - "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", - "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", - "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", - "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", - "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", - "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", - "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", - "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", - "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", - "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", - "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", - "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", - "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", - "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", - "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", - "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", - "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", - "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", - "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", - "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", - "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", - "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", - "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", - "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" - }, - "selectedYankedVersions": {}, - "moduleExtensions": {}, - "facts": {}, - "factsVersions": {} -} diff --git a/e2e/cases/cross-repo-610/subrepo_a/MODULE.bazel.lock b/e2e/cases/cross-repo-610/subrepo_a/MODULE.bazel.lock deleted file mode 100644 index 426a6970a..000000000 --- a/e2e/cases/cross-repo-610/subrepo_a/MODULE.bazel.lock +++ /dev/null @@ -1,193 +0,0 @@ -{ - "lockFileVersion": 28, - "registryFileHashes": { - "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", - "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", - "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", - "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", - "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", - "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", - "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", - "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", - "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", - "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", - "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", - "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", - "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", - "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", - "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", - "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", - "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", - "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", - "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", - "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", - "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", - "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/source.json": "fcd4396b2df85f64f2b3bb436ad870793ecf39180f1d796f913cc9276d355309", - "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", - "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", - "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", - "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", - "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/source.json": "34a3c8bcf233b835eb74be9d628899bb32999d3e0eadef1947a0a562a2b16ffb", - "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", - "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", - "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", - "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", - "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", - "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", - "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", - "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", - "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", - "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", - "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", - "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", - "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", - "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", - "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", - "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", - "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", - "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", - "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", - "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", - "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", - "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", - "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", - "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", - "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", - "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", - "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", - "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", - "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", - "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", - "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", - "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", - "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", - "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", - "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", - "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/source.json": "3832f45d145354049137c0090df04629d9c2b5493dc5c2bf46f1834040133a07", - "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", - "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", - "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", - "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", - "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", - "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", - "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", - "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", - "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", - "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", - "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", - "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", - "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", - "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", - "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", - "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", - "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", - "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", - "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", - "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", - "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", - "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", - "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", - "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", - "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", - "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", - "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/source.json": "028a084b65dcf8f4dc4f82f8778dbe65df133f234b316828a82e060d81bdce32", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", - "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", - "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", - "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", - "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", - "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", - "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", - "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", - "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" - }, - "selectedYankedVersions": {}, - "moduleExtensions": {}, - "facts": {}, - "factsVersions": {} -} diff --git a/e2e/cases/cross-repo-610/subrepo_b/MODULE.bazel.lock b/e2e/cases/cross-repo-610/subrepo_b/MODULE.bazel.lock deleted file mode 100644 index 426a6970a..000000000 --- a/e2e/cases/cross-repo-610/subrepo_b/MODULE.bazel.lock +++ /dev/null @@ -1,193 +0,0 @@ -{ - "lockFileVersion": 28, - "registryFileHashes": { - "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", - "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", - "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", - "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", - "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", - "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", - "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", - "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", - "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", - "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", - "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", - "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", - "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", - "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", - "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", - "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", - "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", - "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", - "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", - "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", - "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", - "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/source.json": "fcd4396b2df85f64f2b3bb436ad870793ecf39180f1d796f913cc9276d355309", - "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", - "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", - "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", - "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", - "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/source.json": "34a3c8bcf233b835eb74be9d628899bb32999d3e0eadef1947a0a562a2b16ffb", - "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", - "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", - "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", - "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", - "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", - "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", - "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", - "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", - "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", - "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", - "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", - "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", - "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", - "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", - "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", - "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", - "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", - "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", - "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", - "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", - "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", - "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", - "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", - "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", - "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", - "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", - "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", - "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", - "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", - "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", - "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", - "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", - "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", - "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", - "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", - "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/source.json": "3832f45d145354049137c0090df04629d9c2b5493dc5c2bf46f1834040133a07", - "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", - "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", - "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", - "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", - "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", - "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", - "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", - "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", - "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", - "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", - "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", - "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", - "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", - "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", - "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", - "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", - "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", - "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", - "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", - "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", - "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", - "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", - "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", - "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", - "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", - "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", - "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/source.json": "028a084b65dcf8f4dc4f82f8778dbe65df133f234b316828a82e060d81bdce32", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", - "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", - "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", - "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", - "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", - "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", - "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", - "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", - "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" - }, - "selectedYankedVersions": {}, - "moduleExtensions": {}, - "facts": {}, - "factsVersions": {} -} diff --git a/e2e/cases/unittest-test-868/extrepo/MODULE.bazel.lock b/e2e/cases/unittest-test-868/extrepo/MODULE.bazel.lock deleted file mode 100644 index 426a6970a..000000000 --- a/e2e/cases/unittest-test-868/extrepo/MODULE.bazel.lock +++ /dev/null @@ -1,193 +0,0 @@ -{ - "lockFileVersion": 28, - "registryFileHashes": { - "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", - "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", - "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", - "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", - "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", - "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", - "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", - "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", - "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", - "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", - "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", - "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", - "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", - "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", - "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", - "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", - "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", - "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", - "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", - "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", - "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", - "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/source.json": "fcd4396b2df85f64f2b3bb436ad870793ecf39180f1d796f913cc9276d355309", - "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", - "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", - "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", - "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", - "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/source.json": "34a3c8bcf233b835eb74be9d628899bb32999d3e0eadef1947a0a562a2b16ffb", - "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", - "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", - "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", - "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", - "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", - "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", - "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", - "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", - "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", - "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", - "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", - "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", - "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", - "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", - "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", - "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", - "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", - "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", - "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", - "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", - "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", - "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", - "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", - "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", - "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", - "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", - "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", - "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", - "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", - "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", - "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", - "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", - "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", - "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", - "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", - "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/source.json": "3832f45d145354049137c0090df04629d9c2b5493dc5c2bf46f1834040133a07", - "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", - "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", - "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", - "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", - "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", - "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", - "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", - "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", - "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", - "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", - "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", - "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", - "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", - "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", - "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", - "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", - "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", - "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", - "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", - "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", - "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", - "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", - "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", - "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", - "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", - "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", - "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/source.json": "028a084b65dcf8f4dc4f82f8778dbe65df133f234b316828a82e060d81bdce32", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", - "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", - "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", - "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", - "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", - "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", - "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", - "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", - "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" - }, - "selectedYankedVersions": {}, - "moduleExtensions": {}, - "facts": {}, - "factsVersions": {} -} diff --git a/e2e/cases/uv-all-lock-overrides/ambiguous-version/MODULE.bazel.lock b/e2e/cases/uv-all-lock-overrides/ambiguous-version/MODULE.bazel.lock deleted file mode 100644 index d7c9f316b..000000000 --- a/e2e/cases/uv-all-lock-overrides/ambiguous-version/MODULE.bazel.lock +++ /dev/null @@ -1,217 +0,0 @@ -{ - "lockFileVersion": 28, - "registryFileHashes": { - "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", - "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", - "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", - "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", - "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", - "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", - "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", - "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", - "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", - "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", - "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", - "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", - "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", - "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", - "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", - "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", - "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", - "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", - "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", - "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", - "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", - "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", - "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", - "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", - "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", - "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", - "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", - "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", - "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", - "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", - "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", - "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", - "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", - "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", - "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", - "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", - "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", - "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", - "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", - "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", - "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", - "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/MODULE.bazel": "67ff71bbfb482e58510451c4c8b8cd303c757f7ff79a2aff7cf381277be96f9f", - "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/source.json": "475aa00426677e643e327b4b031d8816a3bc0a134c94d0d0d510cfd67b2cfd2c", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", - "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", - "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", - "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", - "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", - "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", - "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", - "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", - "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", - "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", - "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", - "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", - "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", - "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", - "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", - "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", - "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", - "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", - "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", - "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", - "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", - "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", - "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", - "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", - "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", - "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", - "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", - "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", - "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", - "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", - "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", - "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", - "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", - "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", - "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", - "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", - "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", - "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", - "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", - "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", - "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", - "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", - "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", - "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", - "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", - "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", - "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", - "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", - "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", - "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", - "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", - "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", - "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", - "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", - "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", - "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", - "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", - "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", - "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", - "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", - "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", - "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", - "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", - "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", - "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", - "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", - "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", - "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", - "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", - "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", - "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", - "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" - }, - "selectedYankedVersions": {}, - "moduleExtensions": {}, - "facts": {}, - "factsVersions": {} -} diff --git a/e2e/cases/uv-all-lock-overrides/duplicate/MODULE.bazel.lock b/e2e/cases/uv-all-lock-overrides/duplicate/MODULE.bazel.lock deleted file mode 100644 index d7c9f316b..000000000 --- a/e2e/cases/uv-all-lock-overrides/duplicate/MODULE.bazel.lock +++ /dev/null @@ -1,217 +0,0 @@ -{ - "lockFileVersion": 28, - "registryFileHashes": { - "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", - "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", - "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", - "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", - "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/MODULE.bazel": "d209fdb6f36ffaf61c509fcc81b19e81b411a999a934a032e10cd009a0226215", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/MODULE.bazel": "51f2312901470cdab0dbdf3b88c40cd21c62a7ed58a3de45b365ddc5b11bcab2", - "https://bcr.bazel.build/modules/abseil-cpp/20250814.1/source.json": "cea3901d7e299da7320700abbaafe57a65d039f10d0d7ea601c4a66938ea4b0c", - "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", - "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", - "https://bcr.bazel.build/modules/apple_support/1.21.0/MODULE.bazel": "ac1824ed5edf17dee2fdd4927ada30c9f8c3b520be1b5fd02a5da15bc10bff3e", - "https://bcr.bazel.build/modules/apple_support/1.21.1/MODULE.bazel": "5809fa3efab15d1f3c3c635af6974044bac8a4919c62238cce06acee8a8c11f1", - "https://bcr.bazel.build/modules/apple_support/1.24.2/MODULE.bazel": "0e62471818affb9f0b26f128831d5c40b074d32e6dda5a0d3852847215a41ca4", - "https://bcr.bazel.build/modules/apple_support/1.24.2/source.json": "2c22c9827093250406c5568da6c54e6fdf0ef06238def3d99c71b12feb057a8d", - "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", - "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", - "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", - "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", - "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", - "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", - "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", - "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", - "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", - "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", - "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", - "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", - "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", - "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", - "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", - "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", - "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", - "https://bcr.bazel.build/modules/bazel_lib/3.0.0/source.json": "895f21909c6fba01d7c17914bb6c8e135982275a1b18cdaa4e62272217ef1751", - "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", - "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", - "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", - "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", - "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", - "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", - "https://bcr.bazel.build/modules/buildozer/8.5.1/MODULE.bazel": "a35d9561b3fc5b18797c330793e99e3b834a473d5fbd3d7d7634aafc9bdb6f8f", - "https://bcr.bazel.build/modules/buildozer/8.5.1/source.json": "e3386e6ff4529f2442800dee47ad28d3e6487f36a1f75ae39ae56c70f0cd2fbd", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", - "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", - "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", - "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", - "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", - "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", - "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/MODULE.bazel": "67ff71bbfb482e58510451c4c8b8cd303c757f7ff79a2aff7cf381277be96f9f", - "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/source.json": "475aa00426677e643e327b4b031d8816a3bc0a134c94d0d0d510cfd67b2cfd2c", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0", - "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000", - "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", - "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/source.json": "f448c6e8963fdfa7eb831457df83ad63d3d6355018f6574fb017e8169deb43a9", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", - "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", - "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", - "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", - "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", - "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", - "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", - "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", - "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", - "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", - "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", - "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", - "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", - "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", - "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/32.1/MODULE.bazel": "89cd2866a9cb07fee9ff74c41ceace11554f32e0d849de4e23ac55515cfada4d", - "https://bcr.bazel.build/modules/protobuf/33.4/MODULE.bazel": "114775b816b38b6d0ca620450d6b02550c60ceedfdc8d9a229833b34a223dc42", - "https://bcr.bazel.build/modules/protobuf/33.4/source.json": "555f8686b4c7d6b5ba731fbea13bf656b4bfd9a7ff629c1d9d3f6e1d6155de79", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", - "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680", - "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", - "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", - "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", - "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", - "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", - "https://bcr.bazel.build/modules/rules_apple/3.16.0/MODULE.bazel": "0d1caf0b8375942ce98ea944be754a18874041e4e0459401d925577624d3a54a", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/MODULE.bazel": "76e10fd4a48038d3fc7c5dc6e63b7063bbf5304a2e3bd42edda6ec660eebea68", - "https://bcr.bazel.build/modules/rules_apple/4.1.0/source.json": "8ee81e1708756f81b343a5eb2b2f0b953f1d25c4ab3d4a68dc02754872e80715", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", - "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", - "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", - "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", - "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", - "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", - "https://bcr.bazel.build/modules/rules_cc/0.1.2/MODULE.bazel": "557ddc3a96858ec0d465a87c0a931054d7dcfd6583af2c7ed3baf494407fd8d0", - "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", - "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", - "https://bcr.bazel.build/modules/rules_cc/0.2.13/MODULE.bazel": "eecdd666eda6be16a8d9dc15e44b5c75133405e820f620a234acc4b1fdc5aa37", - "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", - "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", - "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", - "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", - "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", - "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", - "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", - "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", - "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", - "https://bcr.bazel.build/modules/rules_java/9.1.0/MODULE.bazel": "ee63f27e36a3fada80342869361182f120a9819c74320e8e65b1e04ba0cd7a9d", - "https://bcr.bazel.build/modules/rules_java/9.1.0/source.json": "da589573c1dee2c9ac4a568b301269a2e8191110ff0345c1a959fa7ea6c4dfd6", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", - "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", - "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/MODULE.bazel": "e717beabc4d091ecb2c803c2d341b88590e9116b8bf7947915eeb33aab4f96dd", - "https://bcr.bazel.build/modules/rules_jvm_external/6.7/source.json": "5426f412d0a7fc6b611643376c7e4a82dec991491b9ce5cb1cfdd25fe2e92be4", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", - "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", - "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", - "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", - "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", - "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", - "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", - "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", - "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", - "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", - "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", - "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", - "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", - "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", - "https://bcr.bazel.build/modules/rules_python/1.3.0/MODULE.bazel": "8361d57eafb67c09b75bf4bbe6be360e1b8f4f18118ab48037f2bd50aa2ccb13", - "https://bcr.bazel.build/modules/rules_python/1.4.1/MODULE.bazel": "8991ad45bdc25018301d6b7e1d3626afc3c8af8aaf4bc04f23d0b99c938b73a6", - "https://bcr.bazel.build/modules/rules_python/1.6.0/MODULE.bazel": "7e04ad8f8d5bea40451cf80b1bd8262552aa73f841415d20db96b7241bd027d8", - "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", - "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", - "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", - "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", - "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca", - "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046", - "https://bcr.bazel.build/modules/rules_swift/2.4.0/MODULE.bazel": "1639617eb1ede28d774d967a738b4a68b0accb40650beadb57c21846beab5efd", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/MODULE.bazel": "72c8f5cf9d26427cee6c76c8e3853eb46ce6b0412a081b2b6db6e8ad56267400", - "https://bcr.bazel.build/modules/rules_swift/3.1.2/source.json": "e85761f3098a6faf40b8187695e3de6d97944e98abd0d8ce579cb2daf6319a66", - "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", - "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", - "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", - "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", - "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "75aab2373a4bbe2a1260b9bf2a1ebbdbf872d3bd36f80bff058dccd82e89422f", - "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.2/source.json": "5fba48bbe0ba48761f9e9f75f92876cafb5d07c0ce059cc7a8027416de94a05b", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" - }, - "selectedYankedVersions": {}, - "moduleExtensions": {}, - "facts": {}, - "factsVersions": {} -} diff --git a/e2e/crossbuild/pycross-setuptools/BUILD.bazel b/e2e/crossbuild/pycross-setuptools/BUILD.bazel index cee14705c..aca2b4f5a 100644 --- a/e2e/crossbuild/pycross-setuptools/BUILD.bazel +++ b/e2e/crossbuild/pycross-setuptools/BUILD.bazel @@ -85,7 +85,7 @@ collect_wheels( ], wheels = [ "@sdist_build__pycross_setuptools__pyyaml__6_0_1//:whl", - "@sdist_build__pycross_setuptools__setproctitle__1_3_2//:whl", + "@sdist_build__pycross_setuptools__setproctitle__1_3_7//:whl", "@sdist_build__pycross_setuptools__zstandard__0_22_0//:whl", ], ) diff --git a/e2e/crossbuild/pycross-setuptools/pyproject.toml b/e2e/crossbuild/pycross-setuptools/pyproject.toml index 292a3927f..e1ed142a1 100644 --- a/e2e/crossbuild/pycross-setuptools/pyproject.toml +++ b/e2e/crossbuild/pycross-setuptools/pyproject.toml @@ -9,7 +9,7 @@ dependencies = [ "cffi", "cython<3.0", "pyyaml==6.0.1", - "setproctitle==1.3.2", + "setproctitle==1.3.7", "zstandard==0.22.0", ] diff --git a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel index 928551982..7401c4c04 100644 --- a/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-setuptools/setup.MODULE.bazel @@ -7,7 +7,7 @@ sdists (`[tool.uv] no-binary-package` in pyproject.toml), covering the - PyYAML 6.0.1: Cython-generated extension (sdist → cythonize → C → .so). The lock pins `cython<3.0` because PyYAML 6.0.x cannot be cythonized by Cython 3. -- setproctitle 1.3.2: a plain C extension, the minimal native case. +- setproctitle 1.3.7: a plain C extension, the minimal native case. - zstandard 0.22.0: a large vendored-libzstd build, plus an optional cffi backend its setup.py compiles whenever cffi is importable at build time. @@ -71,6 +71,6 @@ use_repo( uv, "pypi_pycross_setuptools", "sdist_build__pycross_setuptools__pyyaml__6_0_1", - "sdist_build__pycross_setuptools__setproctitle__1_3_2", + "sdist_build__pycross_setuptools__setproctitle__1_3_7", "sdist_build__pycross_setuptools__zstandard__0_22_0", ) diff --git a/e2e/crossbuild/pycross-setuptools/uv.lock b/e2e/crossbuild/pycross-setuptools/uv.lock index 441684d9a..031977cd5 100644 --- a/e2e/crossbuild/pycross-setuptools/uv.lock +++ b/e2e/crossbuild/pycross-setuptools/uv.lock @@ -177,7 +177,7 @@ requires-dist = [ { name = "cffi" }, { name = "cython", specifier = "<3.0" }, { name = "pyyaml", specifier = "==6.0.1" }, - { name = "setproctitle", specifier = "==1.3.2" }, + { name = "setproctitle", specifier = "==1.3.7" }, { name = "setuptools" }, { name = "wheel" }, { name = "zstandard", specifier = "==0.22.0" }, @@ -217,22 +217,73 @@ wheels = [ [[package]] name = "setproctitle" -version = "1.3.2" +version = "1.3.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/47/ac709629ddb9779fee29b7d10ae9580f60a4b37e49bce72360ddf9a79cdc/setproctitle-1.3.2.tar.gz", hash = "sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd", size = 27173, upload-time = "2022-08-11T11:13:25.768Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/48/49393a96a2eef1ab418b17475fb92b8fcfad83d099e678751b05472e69de/setproctitle-1.3.7.tar.gz", hash = "sha256:bc2bc917691c1537d5b9bca1468437176809c7e11e5694ca79a9ca12345dcb9e", size = 27002, upload-time = "2025-09-05T12:51:25.278Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/f9/f4e96c6c95d5e5e958405292ddb9dd932ec083c6f76ba55458b6caa4db02/setproctitle-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa", size = 16936, upload-time = "2022-12-17T04:40:43.223Z" }, - { url = "https://files.pythonhosted.org/packages/8c/4c/1b2c04a95da8e6c0951223bfbb0d4b56876ba35567455b88bbc9e48b7052/setproctitle-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077", size = 11292, upload-time = "2022-12-17T04:40:45.225Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8d/4ad25c2e80e81f9c698add6c7a96e547c7194412ce85bce6c2c75eb8d2f8/setproctitle-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de", size = 31575, upload-time = "2022-12-17T04:40:47.282Z" }, - { url = "https://files.pythonhosted.org/packages/1c/4c/c1ef1118bcb756fd10bee57a2748240b033168501c77aec80d0eb9874f64/setproctitle-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e", size = 32915, upload-time = "2022-12-17T04:40:49.347Z" }, - { url = "https://files.pythonhosted.org/packages/d7/76/46e536e87e0e46309f5664ebecebbbc541315d81ad301e93204d0248beed/setproctitle-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf", size = 30080, upload-time = "2022-12-17T04:40:51.289Z" }, - { url = "https://files.pythonhosted.org/packages/18/c7/890da8a5790fa733a9fbf47d92e8226c1ff4bf1853dbdbabbdaa3aa6dffc/setproctitle-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3", size = 31071, upload-time = "2022-12-17T04:40:53.078Z" }, - { url = "https://files.pythonhosted.org/packages/0e/08/a1fa4d4a3077604e71eb6b76795814b44a8a1fec874b06bca853157b2313/setproctitle-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4", size = 41228, upload-time = "2022-12-17T04:40:54.905Z" }, - { url = "https://files.pythonhosted.org/packages/4d/7d/9c8371cde990ecce6d263c9b482bae0e75d49505589f1f7ef1ad4f756bbd/setproctitle-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77", size = 39720, upload-time = "2022-12-17T04:40:56.824Z" }, - { url = "https://files.pythonhosted.org/packages/26/a8/e406c98df9ff7a7481b8bb9ab4b410405a39751ec8b54ac8108bd0c80b4d/setproctitle-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80", size = 42765, upload-time = "2022-12-17T04:40:58.681Z" }, - { url = "https://files.pythonhosted.org/packages/96/e7/e409f944c8d22667f725eaba9d6c505ce6c44d91ff5922acc8347447ac66/setproctitle-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7", size = 41084, upload-time = "2022-12-17T04:41:00.616Z" }, - { url = "https://files.pythonhosted.org/packages/3f/a4/931fb6e85ea5ea7569e563b8a97b43c695f97bb3fa88ee7d70492329679d/setproctitle-1.3.2-cp311-cp311-win32.whl", hash = "sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc", size = 11051, upload-time = "2022-12-17T04:41:02.379Z" }, - { url = "https://files.pythonhosted.org/packages/7b/93/69ee2f7a651ca6a01b05aab3c55b9db3a44ff50125120cfacd46ced239b5/setproctitle-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff", size = 11803, upload-time = "2022-12-17T04:41:03.966Z" }, + { url = "https://files.pythonhosted.org/packages/04/cd/1b7ba5cad635510720ce19d7122154df96a2387d2a74217be552887c93e5/setproctitle-1.3.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a600eeb4145fb0ee6c287cb82a2884bd4ec5bbb076921e287039dcc7b7cc6dd0", size = 18085, upload-time = "2025-09-05T12:49:22.183Z" }, + { url = "https://files.pythonhosted.org/packages/8f/1a/b2da0a620490aae355f9d72072ac13e901a9fec809a6a24fc6493a8f3c35/setproctitle-1.3.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97a090fed480471bb175689859532709e28c085087e344bca45cf318034f70c4", size = 13097, upload-time = "2025-09-05T12:49:23.322Z" }, + { url = "https://files.pythonhosted.org/packages/18/2e/bd03ff02432a181c1787f6fc2a678f53b7dacdd5ded69c318fe1619556e8/setproctitle-1.3.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1607b963e7b53e24ec8a2cb4e0ab3ae591d7c6bf0a160feef0551da63452b37f", size = 32191, upload-time = "2025-09-05T12:49:24.567Z" }, + { url = "https://files.pythonhosted.org/packages/28/78/1e62fc0937a8549f2220445ed2175daacee9b6764c7963b16148119b016d/setproctitle-1.3.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a20fb1a3974e2dab857870cf874b325b8705605cb7e7e8bcbb915bca896f52a9", size = 33203, upload-time = "2025-09-05T12:49:25.871Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3c/65edc65db3fa3df400cf13b05e9d41a3c77517b4839ce873aa6b4043184f/setproctitle-1.3.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f8d961bba676e07d77665204f36cffaa260f526e7b32d07ab3df6a2c1dfb44ba", size = 34963, upload-time = "2025-09-05T12:49:27.044Z" }, + { url = "https://files.pythonhosted.org/packages/a1/32/89157e3de997973e306e44152522385f428e16f92f3cf113461489e1e2ee/setproctitle-1.3.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:db0fd964fbd3a9f8999b502f65bd2e20883fdb5b1fae3a424e66db9a793ed307", size = 32398, upload-time = "2025-09-05T12:49:28.909Z" }, + { url = "https://files.pythonhosted.org/packages/4a/18/77a765a339ddf046844cb4513353d8e9dcd8183da9cdba6e078713e6b0b2/setproctitle-1.3.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:db116850fcf7cca19492030f8d3b4b6e231278e8fe097a043957d22ce1bdf3ee", size = 33657, upload-time = "2025-09-05T12:49:30.323Z" }, + { url = "https://files.pythonhosted.org/packages/6b/63/f0b6205c64d74d2a24a58644a38ec77bdbaa6afc13747e75973bf8904932/setproctitle-1.3.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:316664d8b24a5c91ee244460bdaf7a74a707adaa9e14fbe0dc0a53168bb9aba1", size = 31836, upload-time = "2025-09-05T12:49:32.309Z" }, + { url = "https://files.pythonhosted.org/packages/ba/51/e1277f9ba302f1a250bbd3eedbbee747a244b3cc682eb58fb9733968f6d8/setproctitle-1.3.7-cp311-cp311-win32.whl", hash = "sha256:b74774ca471c86c09b9d5037c8451fff06bb82cd320d26ae5a01c758088c0d5d", size = 12556, upload-time = "2025-09-05T12:49:33.529Z" }, + { url = "https://files.pythonhosted.org/packages/b6/7b/822a23f17e9003dfdee92cd72758441ca2a3680388da813a371b716fb07f/setproctitle-1.3.7-cp311-cp311-win_amd64.whl", hash = "sha256:acb9097213a8dd3410ed9f0dc147840e45ca9797785272928d4be3f0e69e3be4", size = 13243, upload-time = "2025-09-05T12:49:34.553Z" }, + { url = "https://files.pythonhosted.org/packages/fb/f0/2dc88e842077719d7384d86cc47403e5102810492b33680e7dadcee64cd8/setproctitle-1.3.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2dc99aec591ab6126e636b11035a70991bc1ab7a261da428491a40b84376654e", size = 18049, upload-time = "2025-09-05T12:49:36.241Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b4/50940504466689cda65680c9e9a1e518e5750c10490639fa687489ac7013/setproctitle-1.3.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cdd8aa571b7aa39840fdbea620e308a19691ff595c3a10231e9ee830339dd798", size = 13079, upload-time = "2025-09-05T12:49:38.088Z" }, + { url = "https://files.pythonhosted.org/packages/d0/99/71630546b9395b095f4082be41165d1078204d1696c2d9baade3de3202d0/setproctitle-1.3.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2906b6c7959cdb75f46159bf0acd8cc9906cf1361c9e1ded0d065fe8f9039629", size = 32932, upload-time = "2025-09-05T12:49:39.271Z" }, + { url = "https://files.pythonhosted.org/packages/50/22/cee06af4ffcfb0e8aba047bd44f5262e644199ae7527ae2c1f672b86495c/setproctitle-1.3.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6915964a6dda07920a1159321dcd6d94fc7fc526f815ca08a8063aeca3c204f1", size = 33736, upload-time = "2025-09-05T12:49:40.565Z" }, + { url = "https://files.pythonhosted.org/packages/5c/00/a5949a8bb06ef5e7df214fc393bb2fb6aedf0479b17214e57750dfdd0f24/setproctitle-1.3.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cff72899861c765bd4021d1ff1c68d60edc129711a2fdba77f9cb69ef726a8b6", size = 35605, upload-time = "2025-09-05T12:49:42.362Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3a/50caca532a9343828e3bf5778c7a84d6c737a249b1796d50dd680290594d/setproctitle-1.3.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b7cb05bd446687ff816a3aaaf831047fc4c364feff7ada94a66024f1367b448c", size = 33143, upload-time = "2025-09-05T12:49:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ca/14/b843a251296ce55e2e17c017d6b9f11ce0d3d070e9265de4ecad948b913d/setproctitle-1.3.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3a57b9a00de8cae7e2a1f7b9f0c2ac7b69372159e16a7708aa2f38f9e5cc987a", size = 34434, upload-time = "2025-09-05T12:49:45.31Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b7/06145c238c0a6d2c4bc881f8be230bb9f36d2bf51aff7bddcb796d5eed67/setproctitle-1.3.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d8828b356114f6b308b04afe398ed93803d7fca4a955dd3abe84430e28d33739", size = 32795, upload-time = "2025-09-05T12:49:46.419Z" }, + { url = "https://files.pythonhosted.org/packages/ef/dc/ef76a81fac9bf27b84ed23df19c1f67391a753eed6e3c2254ebcb5133f56/setproctitle-1.3.7-cp312-cp312-win32.whl", hash = "sha256:b0304f905efc845829ac2bc791ddebb976db2885f6171f4a3de678d7ee3f7c9f", size = 12552, upload-time = "2025-09-05T12:49:47.635Z" }, + { url = "https://files.pythonhosted.org/packages/e2/5b/a9fe517912cd6e28cf43a212b80cb679ff179a91b623138a99796d7d18a0/setproctitle-1.3.7-cp312-cp312-win_amd64.whl", hash = "sha256:9888ceb4faea3116cf02a920ff00bfbc8cc899743e4b4ac914b03625bdc3c300", size = 13247, upload-time = "2025-09-05T12:49:49.16Z" }, + { url = "https://files.pythonhosted.org/packages/5d/2f/fcedcade3b307a391b6e17c774c6261a7166aed641aee00ed2aad96c63ce/setproctitle-1.3.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3736b2a423146b5e62230502e47e08e68282ff3b69bcfe08a322bee73407922", size = 18047, upload-time = "2025-09-05T12:49:50.271Z" }, + { url = "https://files.pythonhosted.org/packages/23/ae/afc141ca9631350d0a80b8f287aac79a76f26b6af28fd8bf92dae70dc2c5/setproctitle-1.3.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3384e682b158d569e85a51cfbde2afd1ab57ecf93ea6651fe198d0ba451196ee", size = 13073, upload-time = "2025-09-05T12:49:51.46Z" }, + { url = "https://files.pythonhosted.org/packages/87/ed/0a4f00315bc02510395b95eec3d4aa77c07192ee79f0baae77ea7b9603d8/setproctitle-1.3.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0564a936ea687cd24dffcea35903e2a20962aa6ac20e61dd3a207652401492dd", size = 33284, upload-time = "2025-09-05T12:49:52.741Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e4/adf3c4c0a2173cb7920dc9df710bcc67e9bcdbf377e243b7a962dc31a51a/setproctitle-1.3.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5d1cb3f81531f0eb40e13246b679a1bdb58762b170303463cb06ecc296f26d0", size = 34104, upload-time = "2025-09-05T12:49:54.416Z" }, + { url = "https://files.pythonhosted.org/packages/52/4f/6daf66394152756664257180439d37047aa9a1cfaa5e4f5ed35e93d1dc06/setproctitle-1.3.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a7d159e7345f343b44330cbba9194169b8590cb13dae940da47aa36a72aa9929", size = 35982, upload-time = "2025-09-05T12:49:56.295Z" }, + { url = "https://files.pythonhosted.org/packages/1b/62/f2c0595403cf915db031f346b0e3b2c0096050e90e0be658a64f44f4278a/setproctitle-1.3.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0b5074649797fd07c72ca1f6bff0406f4a42e1194faac03ecaab765ce605866f", size = 33150, upload-time = "2025-09-05T12:49:58.025Z" }, + { url = "https://files.pythonhosted.org/packages/a0/29/10dd41cde849fb2f9b626c846b7ea30c99c81a18a5037a45cc4ba33c19a7/setproctitle-1.3.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:61e96febced3f61b766115381d97a21a6265a0f29188a791f6df7ed777aef698", size = 34463, upload-time = "2025-09-05T12:49:59.424Z" }, + { url = "https://files.pythonhosted.org/packages/71/3c/cedd8eccfaf15fb73a2c20525b68c9477518917c9437737fa0fda91e378f/setproctitle-1.3.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:047138279f9463f06b858e579cc79580fbf7a04554d24e6bddf8fe5dddbe3d4c", size = 32848, upload-time = "2025-09-05T12:50:01.107Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3e/0a0e27d1c9926fecccfd1f91796c244416c70bf6bca448d988638faea81d/setproctitle-1.3.7-cp313-cp313-win32.whl", hash = "sha256:7f47accafac7fe6535ba8ba9efd59df9d84a6214565108d0ebb1199119c9cbbd", size = 12544, upload-time = "2025-09-05T12:50:15.81Z" }, + { url = "https://files.pythonhosted.org/packages/36/1b/6bf4cb7acbbd5c846ede1c3f4d6b4ee52744d402e43546826da065ff2ab7/setproctitle-1.3.7-cp313-cp313-win_amd64.whl", hash = "sha256:fe5ca35aeec6dc50cabab9bf2d12fbc9067eede7ff4fe92b8f5b99d92e21263f", size = 13235, upload-time = "2025-09-05T12:50:16.89Z" }, + { url = "https://files.pythonhosted.org/packages/e6/a4/d588d3497d4714750e3eaf269e9e8985449203d82b16b933c39bd3fc52a1/setproctitle-1.3.7-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:10e92915c4b3086b1586933a36faf4f92f903c5554f3c34102d18c7d3f5378e9", size = 18058, upload-time = "2025-09-05T12:50:02.501Z" }, + { url = "https://files.pythonhosted.org/packages/05/77/7637f7682322a7244e07c373881c7e982567e2cb1dd2f31bd31481e45500/setproctitle-1.3.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:de879e9c2eab637f34b1a14c4da1e030c12658cdc69ee1b3e5be81b380163ce5", size = 13072, upload-time = "2025-09-05T12:50:03.601Z" }, + { url = "https://files.pythonhosted.org/packages/52/09/f366eca0973cfbac1470068d1313fa3fe3de4a594683385204ec7f1c4101/setproctitle-1.3.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c18246d88e227a5b16248687514f95642505000442165f4b7db354d39d0e4c29", size = 34490, upload-time = "2025-09-05T12:50:04.948Z" }, + { url = "https://files.pythonhosted.org/packages/71/36/611fc2ed149fdea17c3677e1d0df30d8186eef9562acc248682b91312706/setproctitle-1.3.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7081f193dab22df2c36f9fc6d113f3793f83c27891af8fe30c64d89d9a37e152", size = 35267, upload-time = "2025-09-05T12:50:06.015Z" }, + { url = "https://files.pythonhosted.org/packages/88/a4/64e77d0671446bd5a5554387b69e1efd915274686844bea733714c828813/setproctitle-1.3.7-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9cc9b901ce129350637426a89cfd650066a4adc6899e47822e2478a74023ff7c", size = 37376, upload-time = "2025-09-05T12:50:07.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/bc/ad9c664fe524fb4a4b2d3663661a5c63453ce851736171e454fa2cdec35c/setproctitle-1.3.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:80e177eff2d1ec172188d0d7fd9694f8e43d3aab76a6f5f929bee7bf7894e98b", size = 33963, upload-time = "2025-09-05T12:50:09.056Z" }, + { url = "https://files.pythonhosted.org/packages/ab/01/a36de7caf2d90c4c28678da1466b47495cbbad43badb4e982d8db8167ed4/setproctitle-1.3.7-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:23e520776c445478a67ee71b2a3c1ffdafbe1f9f677239e03d7e2cc635954e18", size = 35550, upload-time = "2025-09-05T12:50:10.791Z" }, + { url = "https://files.pythonhosted.org/packages/dd/68/17e8aea0ed5ebc17fbf03ed2562bfab277c280e3625850c38d92a7b5fcd9/setproctitle-1.3.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5fa1953126a3b9bd47049d58c51b9dac72e78ed120459bd3aceb1bacee72357c", size = 33727, upload-time = "2025-09-05T12:50:12.032Z" }, + { url = "https://files.pythonhosted.org/packages/b2/33/90a3bf43fe3a2242b4618aa799c672270250b5780667898f30663fd94993/setproctitle-1.3.7-cp313-cp313t-win32.whl", hash = "sha256:4a5e212bf438a4dbeece763f4962ad472c6008ff6702e230b4f16a037e2f6f29", size = 12549, upload-time = "2025-09-05T12:50:13.074Z" }, + { url = "https://files.pythonhosted.org/packages/0b/0e/50d1f07f3032e1f23d814ad6462bc0a138f369967c72494286b8a5228e40/setproctitle-1.3.7-cp313-cp313t-win_amd64.whl", hash = "sha256:cf2727b733e90b4f874bac53e3092aa0413fe1ea6d4f153f01207e6ce65034d9", size = 13243, upload-time = "2025-09-05T12:50:14.146Z" }, + { url = "https://files.pythonhosted.org/packages/89/c7/43ac3a98414f91d1b86a276bc2f799ad0b4b010e08497a95750d5bc42803/setproctitle-1.3.7-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:80c36c6a87ff72eabf621d0c79b66f3bdd0ecc79e873c1e9f0651ee8bf215c63", size = 18052, upload-time = "2025-09-05T12:50:17.928Z" }, + { url = "https://files.pythonhosted.org/packages/cd/2c/dc258600a25e1a1f04948073826bebc55e18dbd99dc65a576277a82146fa/setproctitle-1.3.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b53602371a52b91c80aaf578b5ada29d311d12b8a69c0c17fbc35b76a1fd4f2e", size = 13071, upload-time = "2025-09-05T12:50:19.061Z" }, + { url = "https://files.pythonhosted.org/packages/ab/26/8e3bb082992f19823d831f3d62a89409deb6092e72fc6940962983ffc94f/setproctitle-1.3.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fcb966a6c57cf07cc9448321a08f3be6b11b7635be502669bc1d8745115d7e7f", size = 33180, upload-time = "2025-09-05T12:50:20.395Z" }, + { url = "https://files.pythonhosted.org/packages/f1/af/ae692a20276d1159dd0cf77b0bcf92cbb954b965655eb4a69672099bb214/setproctitle-1.3.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46178672599b940368d769474fe13ecef1b587d58bb438ea72b9987f74c56ea5", size = 34043, upload-time = "2025-09-05T12:50:22.454Z" }, + { url = "https://files.pythonhosted.org/packages/34/b2/6a092076324dd4dac1a6d38482bedebbff5cf34ef29f58585ec76e47bc9d/setproctitle-1.3.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7f9e9e3ff135cbcc3edd2f4cf29b139f4aca040d931573102742db70ff428c17", size = 35892, upload-time = "2025-09-05T12:50:23.937Z" }, + { url = "https://files.pythonhosted.org/packages/1c/1a/8836b9f28cee32859ac36c3df85aa03e1ff4598d23ea17ca2e96b5845a8f/setproctitle-1.3.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:14c7eba8d90c93b0e79c01f0bd92a37b61983c27d6d7d5a3b5defd599113d60e", size = 32898, upload-time = "2025-09-05T12:50:25.617Z" }, + { url = "https://files.pythonhosted.org/packages/ef/22/8fabdc24baf42defb599714799d8445fe3ae987ec425a26ec8e80ea38f8e/setproctitle-1.3.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9e64e98077fb30b6cf98073d6c439cd91deb8ebbf8fc62d9dbf52bd38b0c6ac0", size = 34308, upload-time = "2025-09-05T12:50:26.827Z" }, + { url = "https://files.pythonhosted.org/packages/15/1b/b9bee9de6c8cdcb3b3a6cb0b3e773afdb86bbbc1665a3bfa424a4294fda2/setproctitle-1.3.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b91387cc0f02a00ac95dcd93f066242d3cca10ff9e6153de7ee07069c6f0f7c8", size = 32536, upload-time = "2025-09-05T12:50:28.5Z" }, + { url = "https://files.pythonhosted.org/packages/37/0c/75e5f2685a5e3eda0b39a8b158d6d8895d6daf3ba86dec9e3ba021510272/setproctitle-1.3.7-cp314-cp314-win32.whl", hash = "sha256:52b054a61c99d1b72fba58b7f5486e04b20fefc6961cd76722b424c187f362ed", size = 12731, upload-time = "2025-09-05T12:50:43.955Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/acddbce90d1361e1786e1fb421bc25baeb0c22ef244ee5d0176511769ec8/setproctitle-1.3.7-cp314-cp314-win_amd64.whl", hash = "sha256:5818e4080ac04da1851b3ec71e8a0f64e3748bf9849045180566d8b736702416", size = 13464, upload-time = "2025-09-05T12:50:45.057Z" }, + { url = "https://files.pythonhosted.org/packages/01/6d/20886c8ff2e6d85e3cabadab6aab9bb90acaf1a5cfcb04d633f8d61b2626/setproctitle-1.3.7-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6fc87caf9e323ac426910306c3e5d3205cd9f8dcac06d233fcafe9337f0928a3", size = 18062, upload-time = "2025-09-05T12:50:29.78Z" }, + { url = "https://files.pythonhosted.org/packages/9a/60/26dfc5f198715f1343b95c2f7a1c16ae9ffa45bd89ffd45a60ed258d24ea/setproctitle-1.3.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6134c63853d87a4897ba7d5cc0e16abfa687f6c66fc09f262bb70d67718f2309", size = 13075, upload-time = "2025-09-05T12:50:31.604Z" }, + { url = "https://files.pythonhosted.org/packages/21/9c/980b01f50d51345dd513047e3ba9e96468134b9181319093e61db1c47188/setproctitle-1.3.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1403d2abfd32790b6369916e2313dffbe87d6b11dca5bbd898981bcde48e7a2b", size = 34744, upload-time = "2025-09-05T12:50:32.777Z" }, + { url = "https://files.pythonhosted.org/packages/86/b4/82cd0c86e6d1c4538e1a7eb908c7517721513b801dff4ba3f98ef816a240/setproctitle-1.3.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e7c5bfe4228ea22373e3025965d1a4116097e555ee3436044f5c954a5e63ac45", size = 35589, upload-time = "2025-09-05T12:50:34.13Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4f/9f6b2a7417fd45673037554021c888b31247f7594ff4bd2239918c5cd6d0/setproctitle-1.3.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:585edf25e54e21a94ccb0fe81ad32b9196b69ebc4fc25f81da81fb8a50cca9e4", size = 37698, upload-time = "2025-09-05T12:50:35.524Z" }, + { url = "https://files.pythonhosted.org/packages/20/92/927b7d4744aac214d149c892cb5fa6dc6f49cfa040cb2b0a844acd63dcaf/setproctitle-1.3.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:96c38cdeef9036eb2724c2210e8d0b93224e709af68c435d46a4733a3675fee1", size = 34201, upload-time = "2025-09-05T12:50:36.697Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0c/fd4901db5ba4b9d9013e62f61d9c18d52290497f956745cd3e91b0d80f90/setproctitle-1.3.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:45e3ef48350abb49cf937d0a8ba15e42cee1e5ae13ca41a77c66d1abc27a5070", size = 35801, upload-time = "2025-09-05T12:50:38.314Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e3/54b496ac724e60e61cc3447f02690105901ca6d90da0377dffe49ff99fc7/setproctitle-1.3.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1fae595d032b30dab4d659bece20debd202229fce12b55abab978b7f30783d73", size = 33958, upload-time = "2025-09-05T12:50:39.841Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a8/c84bb045ebf8c6fdc7f7532319e86f8380d14bbd3084e6348df56bdfe6fd/setproctitle-1.3.7-cp314-cp314t-win32.whl", hash = "sha256:02432f26f5d1329ab22279ff863c83589894977063f59e6c4b4845804a08f8c2", size = 12745, upload-time = "2025-09-05T12:50:41.377Z" }, + { url = "https://files.pythonhosted.org/packages/08/b6/3a5a4f9952972791a9114ac01dfc123f0df79903577a3e0a7a404a695586/setproctitle-1.3.7-cp314-cp314t-win_amd64.whl", hash = "sha256:cbc388e3d86da1f766d8fc2e12682e446064c01cea9f88a88647cfe7c011de6a", size = 13469, upload-time = "2025-09-05T12:50:42.67Z" }, + { url = "https://files.pythonhosted.org/packages/c3/5b/5e1c117ac84e3cefcf8d7a7f6b2461795a87e20869da065a5c087149060b/setproctitle-1.3.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b1cac6a4b0252b8811d60b6d8d0f157c0fdfed379ac89c25a914e6346cf355a1", size = 12587, upload-time = "2025-09-05T12:51:21.195Z" }, + { url = "https://files.pythonhosted.org/packages/73/02/b9eadc226195dcfa90eed37afe56b5dd6fa2f0e5220ab8b7867b8862b926/setproctitle-1.3.7-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f1704c9e041f2b1dc38f5be4552e141e1432fba3dd52c72eeffd5bc2db04dc65", size = 14286, upload-time = "2025-09-05T12:51:22.61Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/1be1d2a53c2a91ec48fa2ff4a409b395f836798adf194d99de9c059419ea/setproctitle-1.3.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b08b61976ffa548bd5349ce54404bf6b2d51bd74d4f1b241ed1b0f25bce09c3a", size = 13282, upload-time = "2025-09-05T12:51:24.094Z" }, ] [[package]] diff --git a/examples/django/db.sqlite3 b/examples/django/db.sqlite3 deleted file mode 100644 index e69de29bb..000000000 diff --git a/tdr-indexed-imports-pr1466.md b/tdr-indexed-imports-pr1466.md deleted file mode 100644 index 804d2943a..000000000 --- a/tdr-indexed-imports-pr1466.md +++ /dev/null @@ -1,404 +0,0 @@ -# TDR — Indexed Imports en rules_py - -**PR:** [aspect-build/rules_py#1466](https://github.com/aspect-build/rules_py/pull/1466) — `perf(py): index Python imports in runtime venvs` -**Autor:** `zbarsky-openai` · **Base:** `main` · **Tamaño:** +1,242 / −293 en 18 archivos -**Flag:** `--@aspect_rules_py//py:experimental_indexed_imports` (default `False`) -**Fecha del análisis:** 2026-08-19 · **Revisor:** Abel (maintainer, aspect_rules_py) - ---- - -## 1. Resumen ejecutivo - -El PR reemplaza, de forma opt-in y solo para **venvs privados** (los internos de `py_binary` / `py_test`), la proyección física de symlinks por-paquete dentro de `site-packages` por: - -1. **Una acción de build por venv** (`PyImportIndex`) que genera un índice TSV mapeando cada nombre importable de nivel superior a su root dueño (wheel o directorio first-party). -2. **Un finder custom en `sys.meta_path`** (`_IndexedImportFinder`) instalado por el `.pth` del venv, que resuelve cada import consultando el índice y delegando la carga real en el `PathFinder` estándar de CPython, sin poner los roots virtualizados en `sys.path`. - -El objetivo es romper la escala O(targets × paquetes) en número de acciones y outputs declarados. Los números reportados por el autor (monorepo grande, presumiblemente OpenAI): **−56% acciones** en configuración compatible, **−74%** en configuración full, **−7% wall time** de builds analysis-only, **−6% memoria pico**, y ~127 ms para construir un índice de ~37,000 records incluyendo el arranque del intérprete. - -Los venvs **públicos** (`py_venv`, `expose_venv = True`) permanecen físicos siempre. Cada target puede optar por salir con `indexed_imports = False`. - ---- - -## 2. Terminología - -Glosario de los términos que este documento y el código usan. Las definiciones marcadas **(PR)** son introducidas por el cambio. - -| Término | Definición | -|---|---| -| **venv privado** | El venv hermano `_.venv` que la macro `py_binary_with_venv` emite para cada `py_binary`/`py_test` sin `expose_venv`. Es una regla no-ejecutable (`_py_venv_lib`), `visibility:private`, `tags:manual`. Solo el launcher del binario lo consume. | -| **venv público** | El target `.venv` emitido con `expose_venv = True`, o un `py_venv` standalone. Es ejecutable (`bazel run` abre un REPL) y su layout físico es contrato para IDEs/typecheckers vía `py_venv_link`. | -| **proyección (projection)** | Un symlink declarado dentro del `site-packages` del venv apuntando (escapando por runfiles) al contenido de un wheel. Hoy: un `ctx.actions.declare_symlink` + `ctx.actions.symlink` por entrada de `top_level_to_site_pkgs`. | -| **top-level** | Entrada inmediata del `site-packages` de un wheel: un paquete (`requests/`), un módulo (`six.py`), una extensión nativa (`_x.cpython-312-….so`), o metadata (`*.dist-info`). | -| **`PyWheelsInfo`** | Provider (`py/private/providers.bzl`) con un depset postorder de *wheel records*: layout (`top_levels`, `namespace_*`, `regular_roots`, `native_roots`), `site_packages_rfpath`, `install_tree`, `console_scripts`, `data_files`, y claims precomputados (`tl_claims`, `metadata_top_levels`, `cs_claims`). | -| **`site_packages_rfpath`** | Path relativo al runfiles root del `site-packages` de un wheel instalado (p.ej. `rules_py~~uv~pkg_312_requests/site-packages/lib/python3.12/site-packages`). Es la identidad de un wheel en toda la resolución de colisiones. | -| **`install_tree`** | Tree artifact con el árbol instalado completo del wheel (output de la acción de unpack de `whl_install`). | -| **claimant / claim** | Struct por (wheel, top-level) con los hechos de ese top-level (`is_ns`, `is_dir`, `is_native`, `ns_entries`, `ns_dirs`). La resolución de colisiones opera sobre listas de claimants por nombre. | -| **namespace package (PEP 420)** | Paquete sin `__init__.py` cuyo `__path__` une contribuciones de múltiples `sys.path` entries. En rules_py se materializa con symlinks por-entrada (`google/cloud/storage → wheel A`, `google/cloud/bigquery → wheel B`). | -| **regular root** | Directorio mínimo bajo un namespace top-level que sí lleva `__init__.py`. Si dos wheels aportan al mismo regular root, Python fija `__path__` al primero que encuentra → hace falta **merge físico**. | -| **native root** | Root en conflicto que contiene entradas nativas (`.so`/`.dylib`/`.pyd`). No se puede copiar a un merge sin cambiar el origen físico de la librería → se resuelve por proyección directa del último claimant regular. | -| **merge group / `PySiteMerge`** | Acción que copia el subárbol de un regular package desde cada wheel contribuyente a un directorio real del venv (el layout que produciría `pip install` plano). Corre bajo el intérprete del exec toolchain. | -| **`.pth` fallback (whole-wheel fallback)** | Línea del `.pth` del venv que pone el `site-packages` completo de un wheel en `sys.path`. Es el mecanismo para wheels sin layout proyectable o para claimants perdedores de una colisión. | -| **fully covered** | Wheel cuyo `site-packages` puede salirse del `.pth` fallback porque cada top-level suyo quedó proyectado, mergeado o suprimido. Condición necesaria para virtualizarlo **(PR)**. | -| **known layout** | Wheel que declara `top_levels` (layout derivado de RECORD). Un wheel source-built de layout desconocido deja `top_levels` vacío y vive solo del fallback `addsitedir`. | -| **`imports_depset`** | Depset de import roots: paths first-party (`_main/src/...`) + los `site_packages_rfpath` de los wheels. Hoy se serializa línea a línea al `.pth`. | -| **escape / `venv_to_runfiles_escape`** | Aritmética de `../` para escapar desde `site-packages` (o desde el root del venv) hasta el runfiles root. Calculada por `resolve_venv_toolchain`. | -| **indexed imports (PR)** | El modo nuevo: proyecciones de wheels seguras se reemplazan por records del índice; los import roots first-party reclamados salen de `sys.path` y se resuelven vía finder. | -| **root virtual (PR)** | Import root que existe solo en el índice — nunca entra a `sys.path`. Kinds `F` (first-party) y los roots de wheels en records `I`/`D`. | -| **root retenido (PR)** | Import root que conserva su línea física en el `.pth` (kind `K`) o su `addsitedir` (kind `X`). | -| **shim (PR)** | `_aspect_rules_py_import_index.py`, copiado al `site-packages` del venv; define e instala `_IndexedImportFinder` al ser importado por el `.pth`. | -| **RBE** | Remote Build Execution. Relevante: la acción nueva declara `supports-path-mapping` y consume solo *paths*, no contenidos. | - ---- - -## 3. Arquitectura actual (baseline) - -### 3.1 Pipeline de wheels: del registry al provider - -``` -PyPI/registry - │ (repository rule: whl_dist — uv/private/whl_install/dist_repository.bzl) - ▼ -descarga wheel + peek de RECORD y entry_points.txt - │ extract_install_metadata() → derive_layout() (metadata.bzl) - ▼ -repo @whl__pkg__hash: atributos de layout serializados en el BUILD generado - │ (regla whl_dist / whl_install — uv/private/whl_install/rule.bzl) - ▼ -acción de unpack → install_tree (tree artifact) - │ make_wheel_record() (py/private/providers.bzl) - ▼ -PyWheelsInfo.wheels (depset postorder de wheel records) -``` - -Puntos clave: - -- **`derive_layout`** clasifica cada top-level de RECORD: regular vs namespace (¿hay `/__init__.py`?), esqueleto de directorios namespace, regular roots mínimos, native roots. Esta clasificación es la que hace posible decidir *en análisis* qué es seguro symlinkear, qué se mergea y qué cae al fallback. -- **`exclude_glob`** (baseline): la extracción del repo es agnóstica a exclusiones; cuando un paquete consumidor declara `exclude_glob`, el wheel carga `record_paths` completos y `whl_install` filtra y **re-deriva** el layout en análisis. -- El orden postorder del depset define la precedencia de colisiones: "último claimant distinto gana". - -### 3.2 De `py_binary` al venv hermano - -`py_binary` / `py_test` son macros (`py_binary_with_venv`, `py_venv.bzl:362`) que dividen cada invocación en: - -- un venv hermano — privado (`_.venv`, regla `_py_venv_lib`, no ejecutable) o público (`.venv`, regla `py_venv`) según `expose_venv`; -- la regla launcher (`py_binary`/`py_test`) que lo consume vía el atributo interno `venv` y hace exec de `/bin/python -I main.py`. - -Todos los atributos que dan forma al venv (`deps`, `imports`, `virtual_deps`, `resolutions`, `package_collisions`, …) viven en `_VENV_ONLY_ATTRS` y se rutean al hermano. **Esto importa para el PR**: el atributo nuevo `indexed_imports` se agrega a esa lista y por lo tanto fluye del macro al venv. - -### 3.3 `assemble_venv`: el layout físico - -`assemble_venv` (`py/private/py_venv/venv.bzl`) es el único lugar que declara los archivos de un venv. Produce, por venv: - -| Artefacto | Mecanismo | Cardinalidad | -|---|---|---| -| Symlink por top-level proyectado | `declare_symlink` + `ctx.actions.symlink`, target relativo `escape//` | **O(top-levels del closure)** | -| Symlinks de data files PEP 427 (`share/…`, `etc/…`) | ídem, bajo el prefix del venv | O(data files colapsados) | -| Merges físicos de regular packages que cruzan wheels | acción `PySiteMerge` (intérprete exec-config) | O(merge groups) | -| `.pth` | `ctx.actions.write` con `Args` param-file (`map_each = _format_imp`) | 1 | -| `pyvenv.cfg` | `ctx.actions.write` | 1 | -| `bin/python` + versionados | `declare_symlink` | ~3 | -| `bin/activate`, `bin/` | `expand_template` | 1 + O(scripts) | - -La primera fila es el problema de escala: **cada binario y cada test del repo re-declara un symlink por cada top-level de cada wheel de su closure**. Con cientos de targets compartiendo los mismos ~500 wheels, la cantidad de outputs declarados, acciones symlink y nodos Skyframe crece multiplicativamente. - -### 3.4 `resolve_wheel_collisions`: las clases de colisión - -`virtuals_resolvers.bzl` recorre los wheel records y produce el plan. Clases y resoluciones (baseline): - -| Clase | Resolución | Destino de los perdedores | -|---|---|---| -| Top-level de un solo claimant | proyección directa | — | -| Todos namespace, sin conflicto de regular roots | symlinks por-entrada (`_resolve_pure_namespace`), colapsados al cover más grueso de un solo dueño | claimants sin `ns_entries` → `.pth` fallback | -| Todos namespace, con regular root cruzando wheels | root mergeable → `PySiteMerge`; root nativo → proyección directa del último claimant regular (`_resolve_native_span`) | `.pth` fallback (salvo dup-metadata) | -| Directorios ordinarios en colisión, sin nativos | merge físico `PySiteMerge` | — (todos contribuyen) | -| Directorios con nativos / archivos ordinarios | último claimant distinto gana | `.pth` fallback | -| Metadata `*.dist-info` duplicada | último gana; **`fail`** si un perdedor queda en fallback (expondría metadata duplicada insuprimible) | — | -| Console scripts | último claimant distinto gana | — | -| Data files | por-archivo, último gana; roots del venv (`bin`, `lib`, `pyvenv.cfg`) reservados; colapso al cover más grueso | drop reportado | - -Todo pasa por el recorder de colisiones y `enforce_collision_policy` aplica `error`/`warning`/`ignore`. - -Al final, `_compute_fully_covered` determina qué wheels pueden salir del `.pth`: en baseline, un wheel es fully covered si **cada** top-level suyo está `skipped`-free y además es dueño o fue marcado `covered` (proyectado/mergeado/suprimido) — tracking explícito vía `covered_per_wheel`. - -### 3.5 El `.pth` y por qué su contenido es delicado - -El `.pth` generado hoy contiene, en orden: - -1. `escape` — el runfiles root entra a `sys.path`. -2. Una línea ejecutable que antepone `/bin` a `$PATH` (console scripts alcanzables vía `subprocess.run("name")` sin cargar distutils). -3. Por cada import del `imports_depset`: - - wheel fully covered → **nada** (se suprime); - - `site-packages` de layout desconocido → línea `site.addsitedir(..., vars().get("known_paths"))` — el truco de reusar el set de `site.addpackage` evita el costo O(N²) de stats que domina el arranque cuando hay cientos de líneas; - - resto → path plano `escape/`. - -Nota de arquitectura: el `.pth` es hoy el **único** mecanismo de fallback universal. El orden de sus líneas es la precedencia de `sys.path`, byte a byte. - -### 3.6 Modelo de costo del baseline - -Para un repo con `T` binarios/tests y closures promedio de `P` top-levels de wheels: - -- **Outputs declarados / acciones symlink:** ~`T × P` (cada una es barata individualmente, pero son nodos de Skyframe, entradas del action cache, y entradas de runfiles manifests). -- **Análisis:** cada `File` declarado y cada `ctx.actions.symlink` cuesta memoria de análisis por target. -- **`sys.path` runtime:** first-party imports agregan una entrada por import root; repos con muchos `imports = [...]` degradan cada import fallido (stat por entrada). - ---- - -## 4. El cambio propuesto - -### 4.1 Superficie de configuración y gating - -```starlark -# py/BUILD.bazel -bool_flag(name = "experimental_indexed_imports", build_setting_default = False) -``` - -- Atributo nuevo `indexed_imports` (`attr.bool`, **default `True`**) en los attrs del venv, agregado a `_VENV_ONLY_ATTRS` para que fluya desde el macro `py_binary`/`py_test`. -- Gating en `_assemble_venv_target` (`py_venv.bzl`): - -```starlark -if (ctx.attr.indexed_imports and - hasattr(ctx.attr, "_indexed_imports") and - ctx.attr._indexed_imports[BuildSettingInfo].value): - indexed_runfiles = _py_library.make_merged_runfiles(...) -``` - -El label `_indexed_imports` (más `_import_index_shim` y `_import_index_generator`) se agrega **solo a `_py_venv_lib`** — la regla del venv privado. La regla pública `_py_venv` no lo tiene, así que `hasattr` corta y el venv público es físico incondicionalmente. El diseño del gate es triple: flag global AND atributo por-target AND variante de regla. - -`indexed_runfiles` son los runfiles mergeados de srcs + resolución de virtuals: el universo de paths first-party que el índice debe cubrir. - -### 4.2 Flujo de datos nuevo - -``` -resolve_wheel_collisions(ctx, wheels, wheel_by_site_packages, known_layout_site_pkgs) - │ (out-params nuevos) - ▼ -_indexed_projection_plan(...) ← decide qué proyecciones se virtualizan - │ - ├── retained_projections ──► loop de symlinks físicos (igual que baseline) - └── wheel_projections ──► records "W" para la acción - -Args (param file "records"): - R imports_depset C fully covered sps H known-layout-con-skips sps - S/T files de runfiles L/Q symlinks A/B root_symlinks - W proyecciones virtualizadas de wheels - - │ acción PyImportIndex (intérprete exec-config) - ▼ -import_index.py::generate() - │ - ├── .aspect_rules_py_import_index (TSV: I / D / R / P / N) - ├── .pth (PATH line, import shim, roots K, addsitedir X) - └── _aspect_rules_py_import_index.py (copia byte a byte del shim) - -runtime: site.py procesa el .pth → import del shim → install_import_index() - → _IndexedImportFinder insertado ANTES de PathFinder en sys.meta_path -``` - -### 4.3 La acción `PyImportIndex` y su propiedad clave - -```starlark -ctx.actions.run( - mnemonic = "PyImportIndex", - executable = exec_runtime.interpreter, - arguments = [arguments, records], - inputs = depset( - direct = [generator, shim], - transitive = [exec_runtime.files], - ), - outputs = [index_file, site_packages_pth_file, import_index_shim], - execution_requirements = {"supports-path-mapping": "1"}, -) -``` - -**Propiedad clave:** los records se construyen con `Args.add_all(...)` sobre depsets de `File`s (`imports_depset`, `indexed_runfiles.files/symlinks/root_symlinks`, `wheel_projections`) usando `map_each`, pero **esos Files no son inputs de la acción**. La acción consume paths declarados, no contenidos. Consecuencias: - -1. La acción **no espera** a que los wheels ni las fuentes se construyan — corre en cuanto el intérprete exec está disponible. No alarga el critical path. -2. Su action key depende solo del *conjunto de paths*, que es información de análisis. Es estable ante cambios de contenido de fuentes. -3. Reemplaza también el `ctx.actions.write` del `.pth` (la acción emite el `.pth`). - -**Costo nuevo:** un spawn de intérprete Python por venv indexado (vs. `ctx.actions.write` + N symlink actions locales). El autor mide ~127 ms para ~37k records. Bajo RBE, es una acción remota más con path mapping. - -Nota: si el exec-tools toolchain no está registrado, el modo indexado hace `fail` explícito (mismo patrón que `PySiteMerge`). - -### 4.4 Formato de records de entrada (venv.bzl → import_index.py) - -TSV, un record por línea, `\t`: - -| Kind | Fuente | Semántica | -|---|---|---| -| `R` | `imports_depset` | Import root, en orden de precedencia del `.pth` baseline. | -| `C` | `fully_covered_site_pkgs` | `site-packages` de wheel totalmente cubierto (su root desaparece del path). | -| `H` | `known_layout_site_pkgs` (out-param, **semántica nueva**: sps con top-levels que tuvieron skips y no quedaron cubiertos) | Root de wheel que debe **retenerse físico** en el `.pth` (kind `K`), no `addsitedir`. | -| `S` / `T` | `indexed_runfiles.files` (`map_each = _source_record`) | Archivo fuente / tree artifact (directorio opaco). Archivos no-Python colapsan a su directorio (`dir/` con slash final). Paths externos (`../`) se descartan. | -| `L` / `Q` | `indexed_runfiles.symlinks` | Symlink de runfiles a archivo / a directorio (paths workspace-relative). | -| `A` / `B` | `indexed_runfiles.root_symlinks` | Root symlink a archivo / a directorio (paths runfiles-root-relative; solo se aceptan bajo el workspace). | -| `W` | `wheel_projections` (lo virtualizado por `_indexed_projection_plan`) | `entry \t site_packages`: una proyección de wheel que ya no será symlink. | - -### 4.5 El generador: `import_index.py::generate()` - -Algoritmo (195 líneas, puro, testeado por unittest): - -1. **Wheels:** cada `W` se reduce a su nombre importable de primer nivel (strip de `.py/.pyc`, primer segmento antes de `.` para `.so/.pyd`) y acumula `nombre → {roots}` (records `I`). Entradas `*.dist-info`/`*.egg-info` de raíz van a records `D`. -2. **Clasificación de import roots** (en orden del depset, preservado): - - root cubierto (`C`) → desaparece; - - root `…site-packages` no cubierto → kind `X` (línea `addsitedir` en el `.pth`, `K` en el índice) — el equivalente del fallback de layout desconocido del baseline; - - root bajo un tree artifact opaco, o fuera del workspace, o con `site-packages` en sus segmentos → kind `K` (retenido físico); - - root first-party del workspace → kind `F` (candidato virtual), insertado en un **trie** de segmentos con su posición. -3. **Claims:** cada path fuente se camina por el trie; en cada root terminal atravesado, el siguiente segmento produce un nombre importable de top-level → `claims[nombre] ∋ posición` (records `P`). -4. **Namespaces first-party:** un nombre reclamado por ≥2 roots genera claims por subpaquete descendiendo el path (records `N`), cortando donde aparece un `__init__.py` (paquete regular: de ahí para abajo un solo dueño resuelve) o un árbol opaco. -5. **Degradación segura:** un root `F` que ningún claim reclamó se degrada a `K` — conserva su entrada física en `sys.path`. Nada se pierde silenciosamente. -6. **`.pth` de salida:** línea de `$PATH` (idéntica al baseline), `import _aspect_rules_py_import_index`, los paths `K` planos, y las líneas `addsitedir` `X` (mismo truco `known_paths`). - -### 4.6 Formato del índice de salida (`.aspect_rules_py_import_index`) - -| Kind | Forma | Semántica runtime | -|---|---|---| -| `I` | `I \t nombre \t root…` | Import top-level de wheel → roots dueños (venv-relative, se insertan justo tras `site-packages` en el path de búsqueda efímero). | -| `D` | `D \t dist-info-dir \t root` | Metadata de distribución virtualizada, para los bridges de `importlib.metadata` / `pkg_resources`. | -| `R` | `R \t K\|F \t root` | Orden original completo de import roots. `K` = está en `sys.path` físico; `F` = virtual. Las posiciones son los índices que usan `P`/`N`. | -| `P` | `P \t nombre \t pos…` | Top-level first-party → posiciones de roots que lo reclaman. | -| `N` | `N \t a.b.c \t pos…` | Hijo de namespace first-party repartido entre roots. | - -### 4.7 El shim runtime: `_IndexedImportFinder` - -432 líneas, sin dependencias, instalado **antes** de `PathFinder` en `sys.meta_path`. Mecánica: - -**Resolución de un top-level (`find_spec(fullname, path=None)`):** -1. Descarta dotted names y stdlib (`sys.stdlib_module_names`), salvo los módulos puente. -2. Copia `sys.path`, y reconstruye la precedencia original: los roots virtuales `F` que reclaman el nombre se insertan en la posición que tendrían relativa a los roots `K` retenidos aún vivos en `sys.path` (soporta que el usuario haya mutado `sys.path`); los roots de wheels (`I`) se insertan inmediatamente después del `site-packages` del venv. -3. Delegación total: `path_finder.find_spec(fullname, search_paths, target)`. El finder **no carga nada** — el loader, los specs, los namespace paths son los de CPython. - -**Namespaces first-party (`find_spec` con `path` no-None):** -- Solo actúa si el entorno está "prístino": `sys.path_hooks` sin cambios, él mismo inmediatamente antes de `PathFinder` en `meta_path`, y el `__path__` del padre es el `_NamespacePath` original. Cualquier desviación → `return None` (cede a la maquinaria estándar). -- Poda porciones del `__path__` del padre que pertenecen a roots que *no* reclaman el hijo — evita stats inútiles — respetando importers custom (solo poda entradas cuyo importer es `FileFinder`). -- Engancha `spec.submodule_search_locations._path_finder` para que los refrescos de namespace pasen por él. - -**Puentes de ecosistema** (interceptando `exec_module` del módulo al importarse): -- `pkgutil`: parchea `extend_path` para que los namespaces first-party virtuales sigan uniéndose. -- `pkg_resources`: registra cada distribución `D` en `working_set` con `PathMetadata` real (y ubica `location` en el root del wheel post-activación). -- `importlib.metadata` / backport `importlib_metadata`: envuelve `find_distributions` para inyectar `PathDistribution`s de los records `D` exactamente en la posición de `site-packages` dentro del contexto de búsqueda, con cache de lecturas de `METADATA`/`entry_points.txt`/`PKG-INFO` (los runfiles son inmutables) y `weakref` para no crear ciclos. -- `iter_modules(prefix)` en el finder: `pkgutil.iter_modules()` enumera también lo indexado. - -**Idempotencia:** el shim marca el finder con el path del índice y no se reinstala (relevante para `multiprocessing` spawn y subprocesos que re-ejecutan `site`). - -### 4.8 `_indexed_projection_plan`: qué queda físico - -La función (en `venv.bzl`) divide `top_level_to_site_pkgs` en `retained_projections` (siguen siendo symlinks) y `wheel_projections` (van al índice). Un wheel **retiene** su proyección física cuando: - -1. **No está fully covered** — su fallback sigue vivo, virtualizarlo cambiaría precedencias. -2. **Tiene `.pth` ejecutables en su raíz** (`projected_pth_sites`) — un `.pth` con código solo corre si el archivo está físicamente en el `site-packages` del venv. -3. **Colisión de spelling**: dos proyecciones distintas resuelven al mismo nombre importable (`import_spellings[name] = None`) — el índice no puede representar la precedencia fina, se conserva el layout físico. -4. Sus entradas no son nombres importables ni metadata (data-like) — permanecen como symlinks. - -Además, wheels con merges (`PySiteMerge`), proyecciones nativas y data files PEP 427 **no cambian en absoluto**: el plan solo virtualiza lo que era un symlink 1:1 seguro. - -Detalle frágil: el parámetro `ordered_metadata = True` habilita un `break` que asume que las entradas de metadata (`*.dist-info`) aparecen **al final** del dict `projections` — cierto hoy porque `_resolve_metadata_collisions` es el último pase que escribe `top_level_to_site_pkgs`, pero es un acoplamiento por orden de inserción entre dos archivos. - -### 4.9 Cambios en `virtuals_resolvers.bzl` - -Además del refactor mecánico (dict-como-set → builtin `set` de Starlark, fast-path para nombres sin duplicados vía `tl_duplicates`/`metadata_duplicates`), hay dos cambios de fondo: - -1. **Out-params nuevos:** `resolve_wheel_collisions(ctx, wheels, wheel_by_sp = None, known_layout_site_pkgs = None)`. El segundo se llena con "sps con skips que no quedaron fully covered" — nótese que **redefine el significado** del nombre `known_layout_site_pkgs`: en baseline era "wheels con `top_levels` declarados"; ahora es un subconjunto distinto que alimenta los records `H` y la clausura `_format_imp` del camino físico. -2. **Eliminación de `covered_per_wheel`:** `_compute_fully_covered` pasa de "cada top-level es dueño o está covered, y ninguno skipped" a simplemente "ningún top-level skipped". La equivalencia descansa en un invariante implícito del resolver: *todo claimant termina siendo dueño, skipped, o covered* — es decir, "no skipped ⟹ dueño o covered". Leyendo los pases (`_resolve_directory_collision`, `_resolve_native_span`, `_resolve_pure_namespace`, last-wins) el invariante parece sostenerse, pero era exactamente lo que el tracking explícito garantizaba por construcción. **Esto necesita o una prueba en el PR o un test de equivalencia** — un futuro pase que olvide llamar `_skip` para un perdedor haría que su wheel se declare fully covered (y por lo tanto virtualizable) incorrectamente, que es la clase de bug silencioso de runtime más cara de diagnosticar. - -### 4.10 Cambios en `uv/` - -Motivación: en modo indexado, un wheel fully covered ya no está en `sys.path`, así que la fidelidad del layout derivado importa más, y el costo del re-derive en análisis se paga por cada consumidor. - -- **`exclude_glob` baja al repository rule.** La extension (`defs.bzl`) calcula, por wheel compartido, si *todos* los consumidores declaran las mismas exclusiones. Si sí → `whl_dist` filtra `record_segments` **antes** de `derive_layout` en el repo y no carga `record_paths`. Si hay conflicto → se comporta como baseline (RECORD completo, re-derive por consumidor en `whl_install`). -- **Contrato de `record_paths` cambia** (doc del provider `PyWheelMetadataInfo`): ahora se emiten cuando hay consumidores en conflicto o cuando el filtrado vació el layout (para mantener distinguibles los prebuilt de los source-built). -- **`parse_record_path`** gana un fast-path para líneas sin comillas (la mayoría absoluta de RECORDs). -- **`search.py`** (resolución de entrypoints de `py_entrypoint_binary`): si detecta el shim en `sys.modules`, resuelve el console script vía `importlib.metadata.entry_points()` (que el shim ya puentea) antes de escanear `sys.path` — necesario porque los `dist-info` virtualizados no están en el filesystem del venv. -- **`sdist_build`** fuerza `indexed_imports = False` en el `py_binary` del build helper PEP 517: construir un sdist requiere que el build backend vea un `site-packages` físico. - -**Efecto lateral a evaluar:** `exclude_glob` como atributo de `whl_dist` entra al fingerprint del repository rule → cambiar exclusiones invalida y re-fetchea el repo del wheel (baseline: solo re-análisis). Y la detección de "consumidores en conflicto" ocurre en la extension, o sea a nivel de resolución del module extension, no por target. - ---- - -## 5. Matriz de compatibilidad - -| Consumidor / patrón | Venv privado indexado | Mecanismo | -|---|---|---| -| `import x` / `from x import y` | ✅ | Finder → PathFinder con path efímero | -| Namespace packages PEP 420 (wheels y first-party) | ✅ | Records `I` multi-root / `N` + poda de `__path__` | -| `pkgutil.extend_path` (namespaces legacy) | ✅ | Patch de `extend_path` | -| `pkgutil.iter_modules` | ✅ | `iter_modules` en el finder | -| `importlib.metadata` (`version()`, `entry_points()`, …) | ✅ | Wrap de `find_distributions` + records `D` | -| Backport `importlib_metadata` | ✅ | Wrap de `MetadataPathFinder` | -| `pkg_resources` (`working_set`, `iter_entry_points`) | ✅ | Registro en `working_set` | -| Plugins de pytest vía entry points | ✅ (por transitividad) | `importlib.metadata` bridge | -| Console scripts (`subprocess.run("black")`) | ✅ | `$PATH` line + wrappers `bin/` intactos | -| `.pth` ejecutables de wheels | ✅ | El wheel retiene proyección física | -| Wheels de layout desconocido (source-built) | ✅ | Kind `X` → `addsitedir`, igual que baseline | -| Extensiones nativas, merges, data files | ✅ | Fuera del alcance del plan (sin cambios) | -| Typecheckers / IDEs (mypy, pyright, jump-to-def) | ❌ por diseño | Usar venv público (`expose_venv`) — siempre físico | -| Copiar `sys.path` a otro intérprete / herramientas que escanean el filesystem | ❌ | `indexed_imports = False` por target | -| Build de sdists (PEP 517) | ❌ | Opt-out forzado en `sdist_build` | - ---- - -## 6. Análisis - -### 6.1 Modelo de rendimiento - -Qué se ahorra, por venv privado indexado con `W` proyecciones virtualizadas: - -| Concepto | Baseline | Indexado | -|---|---|---| -| Acciones symlink de site-packages | ~`W` + retenidas | solo retenidas | -| Acción de escritura del `.pth` | 1 (`ctx.actions.write`) | 0 (lo emite la acción de índice) | -| Acción nueva | — | 1 `PyImportIndex` (spawn de Python) | -| Outputs declarados | ~`W` Files/symlinks | 3 Files (índice, `.pth`, shim) | -| Entradas de runfiles manifest | ~`W` | 3 | -| `sys.path` runtime | roots first-party + fallbacks | roots retenidos + fallbacks (más corto) | - -El ahorro domina porque `W` se multiplica por el número de targets. El costo marginal nuevo es un proceso Python por venv en ejecución (no en análisis), amortizado por el action cache: como la key depende de paths y no de contenidos, ediciones de código no la invalidan — solo cambios de estructura de dependencias. - -Adicional no obvio: el arranque del intérprete mejora en repos con `sys.path` largos (menos entradas → menos stats por import fallido), y el costo de leer el índice + instalar el finder es un archivo TSV secuencial. - -**Verificación recomendada antes del merge:** reproducir las métricas en un repo público de tamaño medio (p. ej. los e2e de rules_py con `--profile` y `bazel analyze-profile`), y medir el delta de arranque del intérprete con `python -X importtime` en un test con ~100 wheels. - -### 6.2 Registro de riesgos - -| # | Riesgo | Severidad | Detalle / mitigación | -|---|---|---|---| -| R1 | **Dependencia de internals de CPython** | Alta | `_NamespacePath._path_finder` (privado, sin contrato de estabilidad), identificación de `PathFinder` por `__name__`, de `FileFinder` por `type(...).__name__`, wrap de `spec.loader.exec_module`, override por-instancia de `Distribution.read_text`. Cada minor de CPython es un evento de riesgo. Mitigación: matriz de tests de ejecución por versión soportada; los guards defensivos del shim (ceder a la maquinaria estándar ante cualquier desviación) están bien pensados, pero solo cubren los casos previstos. | -| R2 | **Shim de 432 líneas sin tests de ejecución en el diff** | Alta | El PR agrega unittest del *generador* y analysistests del *layout*, pero ningún test corre el finder contra paquetes reales (namespaces `google.cloud`-style, `pkg_resources`, plugins por entry points, `multiprocessing`). El body dice "54 focused Bazel tests"; el diff muestra 3 métodos de unittest + 3 analysistests. Bloqueante: exigir e2e de runtime. | -| R3 | **Cambio semántico en `_compute_fully_covered`** | Media | Ver §4.9. La equivalencia "no skipped ⟹ covered" es plausible pero no está probada ni testeada, y `fully_covered` ahora decide *elegibilidad de virtualización*, amplificando el costo de un falso positivo. | -| R4 | **Acoplamiento por orden de inserción** (`ordered_metadata` break) | Media | `_indexed_projection_plan` asume que la metadata está al final de `top_level_to_site_pkgs`. Cierto por el orden de pases del resolver, pero es un invariante inter-archivo sin assert ni test. | -| R5 | **Builtin `set` de Starlark** | Media/Baja | Requiere Bazel ≥ 8.1. El repo está en 8.6.0, pero hay que confirmar la versión mínima que rules_py declara soportar a consumidores (los `.bzl` se cargan en el Bazel del consumidor). | -| R6 | **Reubicación de `exclude_glob` al repo rule** | Media | Cambia fingerprints de repos externos (re-fetch al cambiar exclusiones), y la unificación "todos los consumidores coinciden" se decide en la module extension. Es una optimización ortogonal a indexed imports que viaja en el mismo PR. | -| R7 | **Out-params mutables en `resolve_wheel_collisions`** | Baja | Funciona, pero el contrato de la función pública ahora incluye efectos sobre argumentos. Preferible retornar los dos valores. | -| R8 | **Redefinición silenciosa de `known_layout_site_pkgs`** | Media | El mismo nombre significa dos cosas distintas antes y después del PR, y alimenta tanto `_format_imp` (camino físico) como los records `H`. Alto potencial de confusión en mantenimiento futuro; renombrar. | -| R9 | **Interacción con mutaciones de `sys.meta_path`/`path_hooks` por terceros** | Baja/Media | El shim cede correctamente (namespace pruning se autodesactiva), pero un finder de terceros insertado *antes* del shim que resuelva nombres indexados cambia precedencias vs. el layout físico. Documentar. | - -### 6.3 Preguntas para el autor (review) - -1. ¿Contra qué matriz de versiones de CPython corrieron el shim (3.9–3.13, freethreaded)? `_NamespacePath._path_finder` y `sys.stdlib_module_names` (3.10+) acotan el piso — ¿cuál es el mínimo declarado? -2. ¿Pueden aportar los e2e de runtime que respaldan la lista de compatibilidad del §5? En particular: namespace de dos wheels + first-party sobre el mismo top-level, `pkg_resources.iter_entry_points`, plugin de pytest por entry point, `multiprocessing.spawn`. -3. ¿Hay una prueba (o test parametrizado) de la equivalencia del nuevo `_compute_fully_covered`? -4. ¿Por qué el refactor de `virtuals_resolvers` y la reubicación de `exclude_glob` viajan en este PR? ¿Cuáles son prerequisitos duros del feature y cuáles son mejoras separables? -5. El `break` de `ordered_metadata`: ¿aceptan un assert estructural o un test que fije el invariante de orden? -6. ¿Cómo interactúa el índice con `py_pex_binary` y las reglas de imagen (que consumen `install_tree` como package leaf)? A primera vista no cambia, pero el `.pth` del venv empaquetado ahora importa el shim. - -### 6.4 Alternativas (contexto, no propuesta) - -- **Venv físico compartido entre targets** (un solo `site-packages` por grupo de deps): elimina la multiplicación pero rompe el aislamiento por-target y la precedencia postorder por binario. -- **Tree artifact para el site-packages**: colapsa outputs pero reintroduce los problemas de materialización remota que el header de `venv.bzl` cita como razón del diseño actual. -- **Solo `.pth` (todo a `sys.path`)**: es el fallback actual; escala mal en arranque (O(N) stats por import) y expone metadata duplicada. - -El enfoque del PR es la misma familia de solución que los import hooks de otros build systems a gran escala (el finder estático sobre un manifiesto): ataca el costo donde está (multiplicación de acciones) sin tocar el aislamiento ni la precedencia. La dirección es correcta; el riesgo está concentrado en el shim runtime y en los cambios semánticos colaterales. - ---- - -## 7. Recomendación - -1. **La feature, detrás del flag experimental y con el gate triple, es mergeable en dirección** — el diseño de degradación (todo caso dudoso retiene comportamiento físico) es sólido y el default no cambia nada para nadie. -2. **Bloqueantes antes del merge:** - - Tests de ejecución del shim (matriz CPython × los casos del §5), no solo del generador. - - Prueba o test de equivalencia del cambio en `fully_covered` (R3). - - Assert o test del invariante de orden de metadata (R4). - - Renombrar `known_layout_site_pkgs` en su nueva acepción (R8). -3. **Pedir separación** (o justificación de acoplamiento) de: el refactor a `set`/fast-paths de `virtuals_resolvers` y la reubicación de `exclude_glob` en `uv/`. Ambos son valiosos pero revisables de forma independiente, y cada uno tiene su propio blast radius (R5, R6). -4. **Documentar** en el sitio de docs: la matriz de compatibilidad, el opt-out por target, y la garantía "venv público = siempre físico". diff --git a/uv/private/normalize/BUILD.bazel b/uv/private/normalize/BUILD.bazel deleted file mode 100644 index a4d984998..000000000 --- a/uv/private/normalize/BUILD.bazel +++ /dev/null @@ -1,8 +0,0 @@ -load("@bazel_lib//:bzl_library.bzl", "bzl_library") - - -bzl_library( - name = "wheel", - srcs = ["wheel.bzl"], - deps = ["@bazel_skylib//lib:new_sets"], -) \ No newline at end of file From 3a1180062bc60e63f4f08d31c5377c837c2c2533 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 27 Aug 2026 14:56:33 -0600 Subject: [PATCH 065/103] fix(uv): drop shadowed duplicate _generate_meson_cross_file after main merge The merge brought in main's Slice-B copy alongside the spike's original; the later definition shadowed the earlier at runtime, so removing the stale first copy is behavior-preserving. Caught by CI pyright (reportRedeclaration). --- uv/private/pep517_whl/tools/build_helper.py | 76 --------------------- 1 file changed, 76 deletions(-) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 05735e3b9..37c9b2bce 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -826,82 +826,6 @@ def _generate_cmake_toolchain_file( } -def _generate_meson_cross_file( - tmpdir: str, - build_env: Dict[str, str], - target_os: str, - target_cpu: str, -) -> str: - """Cross file for meson-python. - - meson-python only auto-synthesizes a cross file for macOS - ARCHFLAGS/cibuildwheel/iOS; a Linux-arch cross build configures as - native and meson fails running its compiler sanity-check binary. - `needs_exe_wrapper` alone only covers meson's own checks — projects - calling `cc.run()` directly (numpy) hard-error unless a real - `exe_wrapper` program exists. binfmt_misc+qemu-user already runs - target-arch ELFs transparently, so the wrapper just execs through; what - it adds is QEMU_LD_PREFIX pointed at the cross toolchain's sysroot, - without which qemu-user searches the exec host for the target's - ld-linux/glibc and finds none. - """ - # The wrapper is only offered when the emulated binary can actually - # resolve its dynamic interpreter: binfmt+qemu need QEMU_LD_PREFIX to - # locate the target's ld.so/glibc, and only the gcc_toolchain layout - # hands us that sysroot. Everywhere else (darwin hosts can't execute - # ELF at all; the llvm toolchain's empty-sysroot layout gives qemu no - # loader prefix) meson gets needs_exe_wrapper=true with NO exe_wrapper: - # it skips its own sanity runs and cc.run() callers get meson's - # explicit cross-environment error — an honest limitation. - exe_wrapper_line = "" - if _platform.system() == "Linux" and build_env.get("RULES_PY_TARGET_GCC_SYSROOT"): - exe_wrapper = _write_generated_file( - path.join(tmpdir, "meson_exe_wrapper.py"), - _MESON_EXE_WRAPPER.format(qemu_ld_prefix=build_env.get("RULES_PY_TARGET_GCC_SYSROOT", "")), - executable=True, - ) - exe_wrapper_line = "exe_wrapper = ['{}']\n".format(exe_wrapper) - - # numpy's documented cross recipe: its meson.build reads this external - # property and only falls back to a cc.run() probe when it is absent — - # which hard-errors wherever no exe_wrapper exists (any darwin→linux - # cross). The value is an ABI constant of (os, cpu, libc), so bake it in - # rather than making every consumer rediscover numpy gh-23972. - longdouble_line = "" - longdouble_format = _MESON_LONGDOUBLE_FORMAT.get((target_os, target_cpu)) - if longdouble_format: - longdouble_line = "longdouble_format = '{}'\n".format(longdouble_format) - return _write_generated_file( - path.join(tmpdir, "cross_file.ini"), - textwrap.dedent("""\ - [binaries] - c = '{cc}' - cpp = '{cxx}' - ar = '{ar}' - strip = '{strip}' - {exe_wrapper_line} - [host_machine] - system = '{system}' - cpu_family = '{cpu_family}' - cpu = '{cpu}' - endian = 'little' - - [properties] - needs_exe_wrapper = true - {longdouble_line}""").format( - cc=build_env["CC"], - cxx=build_env["CXX"], - exe_wrapper_line=exe_wrapper_line, - longdouble_line=longdouble_line, - ar=build_env.get("AR", "ar"), - strip=build_env.get("STRIP", "strip"), - system=target_os, - cpu_family=target_cpu, - cpu=target_cpu, - ), - ) - - _RUST_TARGET_OS = {"linux": "unknown-linux-gnu", "darwin": "apple-darwin"} _RUSTC_WRAPPER = """#!/usr/bin/env python3 From 2f22556b4f5a37f0a883486d3f85f7da1aa20402 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Fri, 28 Aug 2026 11:49:20 -0600 Subject: [PATCH 066/103] fix(e2e): drop the spike's jpype1 case, superseded by main's pycross-jdk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both declared bazel_dep(rules_java) and the same temurin/ant repos, which Bzlmod rejects as duplicate definitions. The spike's case carried no unique coverage — its container smoke test duplicates what the other cross_case.bzl suites already exercise. --- e2e/crossbuild/BUILD.bazel | 1 - e2e/crossbuild/MODULE.bazel | 1 - e2e/crossbuild/jpype1/BUILD.bazel | 35 ---- e2e/crossbuild/jpype1/jpype1_main.py | 16 -- e2e/crossbuild/jpype1/pyproject.toml | 16 -- e2e/crossbuild/jpype1/setup.MODULE.bazel | 117 ------------- e2e/crossbuild/jpype1/uv.lock | 205 ----------------------- 7 files changed, 391 deletions(-) delete mode 100644 e2e/crossbuild/jpype1/BUILD.bazel delete mode 100644 e2e/crossbuild/jpype1/jpype1_main.py delete mode 100644 e2e/crossbuild/jpype1/pyproject.toml delete mode 100644 e2e/crossbuild/jpype1/setup.MODULE.bazel delete mode 100644 e2e/crossbuild/jpype1/uv.lock diff --git a/e2e/crossbuild/BUILD.bazel b/e2e/crossbuild/BUILD.bazel index 530464c4f..1e3a4001d 100644 --- a/e2e/crossbuild/BUILD.bazel +++ b/e2e/crossbuild/BUILD.bazel @@ -3,7 +3,6 @@ package(default_visibility = [ "//bcrypt:__pkg__", "//contourpy:__pkg__", "//geohash:__pkg__", - "//jpype1:__pkg__", "//msgpack:__pkg__", "//numpy:__pkg__", "//psutil:__pkg__", diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 7f2b5ff37..b3b860c73 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -106,7 +106,6 @@ include("//awkward_cpp:setup.MODULE.bazel") include("//bcrypt:setup.MODULE.bazel") include("//contourpy:setup.MODULE.bazel") include("//geohash:setup.MODULE.bazel") -include("//jpype1:setup.MODULE.bazel") include("//msgpack:setup.MODULE.bazel") include("//numpy:setup.MODULE.bazel") include("//psutil:setup.MODULE.bazel") diff --git a/e2e/crossbuild/jpype1/BUILD.bazel b/e2e/crossbuild/jpype1/BUILD.bazel deleted file mode 100644 index a3beecf89..000000000 --- a/e2e/crossbuild/jpype1/BUILD.bazel +++ /dev/null @@ -1,35 +0,0 @@ -# jpype1 ships official prebuilt wheels for linux/amd64 and linux/arm64, but -# [tool.uv] no-binary-package forces it to build from sdist here. Its -# scikit-build-core/CMake build additionally needs a JDK (javac/JNI headers) -# and Apache Ant (to build a Java-side JAR) — both always exec-platform -# tools regardless of what CPU _jpype.so targets, since jpype1's compiled -# extension only links against libdl, never against libjvm/libjawt (see -# CMakeLists.txt's target_link_libraries), and the JAR Ant produces is -# portable JVM bytecode. - -load("//tools:cross_case.bzl", "pep517_cross_case") -load("//tools:jdk_layer.bzl", "exec_jdk") - -# Ant/javac always run on the exec platform (see setup.MODULE.bazel), but -# the `toolchains` attribute is target-configured — exec_jdk re-resolves the -# select under the host platform so cross builds don't pick a foreign JDK. -exec_jdk( - name = "jdk", - actual = ":jdk_for_exec", - visibility = ["//visibility:public"], -) - -alias( - name = "jdk_for_exec", - actual = select({ - "@platforms//os:macos": "@temurin11_darwin_aarch64//:jdk", - "//conditions:default": "@temurin11_linux_x86_64//:jdk", - }), -) - -pep517_cross_case( - name = "jpype1", - check_so_suffix = False, - so_pattern = "whl_install__crossbuild_jpype1.*_jpype.*\\.so$$", - deps = ["@pypi_crossbuild_jpype1//jpype1"], -) diff --git a/e2e/crossbuild/jpype1/jpype1_main.py b/e2e/crossbuild/jpype1/jpype1_main.py deleted file mode 100644 index 13d5d2088..000000000 --- a/e2e/crossbuild/jpype1/jpype1_main.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python3 -import jpype - - -def main() -> None: - # jpype.__version__ is a plain constant baked into the pure-Python - # package — checking it proves the compiled _jpype extension (and its - # Java-side JAR, built via Ant) imported successfully, without needing - # to actually start a JVM at runtime (which would need a target-arch JRE - # inside the image too). - assert jpype.__version__ == "1.7.1", "expected jpype 1.7.1, got {}".format(jpype.__version__) - print("OK") - - -if __name__ == "__main__": - main() diff --git a/e2e/crossbuild/jpype1/pyproject.toml b/e2e/crossbuild/jpype1/pyproject.toml deleted file mode 100644 index 8b4fc17b6..000000000 --- a/e2e/crossbuild/jpype1/pyproject.toml +++ /dev/null @@ -1,16 +0,0 @@ -[project] -name = "crossbuild_jpype1" -version = "0.0.0" -requires-python = ">=3.11" -dependencies = [ - "build", - "cmake", - "jpype1==1.7.1", - "ninja", - "scikit-build-core", - "setuptools", - "wheel", -] - -[tool.uv] -no-binary-package = ["jpype1"] diff --git a/e2e/crossbuild/jpype1/setup.MODULE.bazel b/e2e/crossbuild/jpype1/setup.MODULE.bazel deleted file mode 100644 index d5dbad84b..000000000 --- a/e2e/crossbuild/jpype1/setup.MODULE.bazel +++ /dev/null @@ -1,117 +0,0 @@ -"""jpype1: setuptools sdist whose build shells out to Ant/javac to produce a -JAR before compiling the _jpype C++ extension. -""" - -bazel_dep(name = "rules_java", version = "8.14.0") - -uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") -uv.declare_hub(hub_name = "pypi_crossbuild_jpype1") -uv.project( - default_build_dependencies = [ - "build", - "cmake", - "ninja", - "scikit-build-core", - "setuptools", - "wheel", - ], - hub_name = "pypi_crossbuild_jpype1", - lock = "//jpype1:uv.lock", - pyproject = "//jpype1:pyproject.toml", -) -uv.override_package( - name = "jpype1", - env = { - "JAVA": "$(JAVA)", - "JAVA_HOME": "$(JAVABASE)", - "RULES_PY_ANT_BIN_DIR": "$(ANT_BIN_DIR)", - }, - lock = "//jpype1:uv.lock", - toolchains = [ - "//jpype1:jdk", - "//tools:ant_home", - ], -) -use_repo(uv, "pypi_crossbuild_jpype1") - -http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -# jpype1 only ever runs Ant/javac at build time to produce a JAR (portable -# Java bytecode) — always a host-executed step regardless of what CPU the -# compiled _jpype.so targets, so the JDK must match the exec platform: -# linux x86_64 on CI, darwin aarch64 on macOS dev hosts (selected via -# //jpype1:jdk). Ant is architecture-independent, one install covers all. -# Genuine Eclipse Temurin, not rules_java's default remotejdk -# (which resolves to Azul Zulu builds) — see fetched release metadata at -# https://api.adoptium.net/v3/assets/latest/11/hotspot?image_type=jdk&os=linux&architecture=x64. -http_archive( - name = "temurin11_linux_x86_64", - build_file_content = """load("@rules_java//java/toolchains:java_runtime.bzl", "java_runtime") - -package(default_visibility = ["//visibility:public"]) - -filegroup(name = "jdk-bin", srcs = glob(["bin/**"])) - -filegroup(name = "jdk-conf", srcs = glob(["conf/**"], allow_empty = True)) - -filegroup(name = "jdk-include", srcs = glob(["include/**"], allow_empty = True)) - -filegroup(name = "jdk-lib", srcs = glob(["lib/**", "release"], allow_empty = True)) - -java_runtime( - name = "jdk", - srcs = [":jdk-bin", ":jdk-conf", ":jdk-include", ":jdk-lib"], - java = "bin/java", - version = 11, -) -""", - sha256 = "5906e0339e9322a688b2375eaf40666e00a16e008b0067b0a9f9e4b6c5033720", - strip_prefix = "jdk-11.0.32+9", - url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.32%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.32_9.tar.gz", -) - -# Same release for darwin/aarch64 exec hosts. Mac Temurin tarballs nest the -# JDK under Contents/Home (macOS bundle layout), hence the deeper prefix. -http_archive( - name = "temurin11_darwin_aarch64", - build_file_content = """load("@rules_java//java/toolchains:java_runtime.bzl", "java_runtime") - -package(default_visibility = ["//visibility:public"]) - -filegroup(name = "jdk-bin", srcs = glob(["bin/**"])) - -filegroup(name = "jdk-conf", srcs = glob(["conf/**"], allow_empty = True)) - -filegroup(name = "jdk-include", srcs = glob(["include/**"], allow_empty = True)) - -filegroup(name = "jdk-lib", srcs = glob(["lib/**", "release"], allow_empty = True)) - -java_runtime( - name = "jdk", - srcs = [":jdk-bin", ":jdk-conf", ":jdk-include", ":jdk-lib"], - java = "bin/java", - version = 11, -) -""", - sha256 = "3e3687488e472035b7a27732f0f6127d59903ba9fd0cb6c815f1a182f4160109", - strip_prefix = "jdk-11.0.32+9/Contents/Home", - url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.32%2B9/OpenJDK11U-jdk_aarch64_mac_hotspot_11.0.32_9.tar.gz", -) - -# Apache Ant: plain Java bytecode plus shell/bat launchers — no architecture -# variants needed. -http_archive( - name = "apache_ant", - build_file_content = """package(default_visibility = ["//visibility:public"]) - -exports_files(["bin/ant"]) - -filegroup( - name = "all_files", - srcs = glob(["**"], allow_empty = True), -) -""", - sha256 = "71334d7e5d98cfe53d6c429a648a5021137a967378667306c5f613dff5180506", - strip_prefix = "apache-ant-1.10.15", - url = "https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.15-bin.tar.gz", -) diff --git a/e2e/crossbuild/jpype1/uv.lock b/e2e/crossbuild/jpype1/uv.lock deleted file mode 100644 index f214da4c6..000000000 --- a/e2e/crossbuild/jpype1/uv.lock +++ /dev/null @@ -1,205 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.11" - -[[package]] -name = "build" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "os_name == 'nt'" }, - { name = "packaging" }, - { name = "pyproject-hooks" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/78/e0/df5e171f685f82f37b12e1f208064e24244911079d7b767447d1af7e0d70/build-1.5.0.tar.gz", hash = "sha256:302c22c3ba2a0fd5f3911918651341ebb3896176cbdec15bd421f80b1afc7647", size = 89796, upload-time = "2026-04-30T03:18:25.17Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl", hash = "sha256:13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f", size = 26018, upload-time = "2026-04-30T03:18:23.644Z" }, -] - -[[package]] -name = "cmake" -version = "4.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/ea/206baf6fd51a47790f766a24fa4514cd39c31b26ab934376f29a4aa458e5/cmake-4.4.2.tar.gz", hash = "sha256:6af2e0585239627f85f49a8f90761ce4560c671daae1d5e8d2b5f059dc7d22de", size = 34953, upload-time = "2026-08-04T06:14:49.786Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/30/5a/578888a6713994abfd97db756c937ce5ced44fa6280e7b7d452eebb8aa83/cmake-4.4.2-py3-none-macosx_10_10_universal2.whl", hash = "sha256:7a0279d3006c961ba1d62fe4383919ebcb7b770fb3357f6ae1309ca89210183b", size = 54414035, upload-time = "2026-08-04T06:13:31.175Z" }, - { url = "https://files.pythonhosted.org/packages/0f/4f/925a2a60ae544791599e2fb14d3619d979511a56518e512081e7ef4b5f8d/cmake-4.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc9d9f95dc9a542db99ca96cba1c275adeeb497ff2e134c780a9677b8578bd05", size = 30288280, upload-time = "2026-08-04T06:13:35.675Z" }, - { url = "https://files.pythonhosted.org/packages/2a/76/6f4327771875666f95c4f4c56a53fc25eaac8e027e3144b37ec827ed3818/cmake-4.4.2-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b0a9bb2fa889773c3ff719130064de28edd36fd3e916b46e576243a6f16f033f", size = 31466224, upload-time = "2026-08-04T06:13:39.268Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8f/f5a8bb6e7e86947b6810d2b2685710ed8332c2ab8766c6e3121d17cee59e/cmake-4.4.2-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:93b06166210e478783e3078612144700d44e0492fe7efd6fcd00e4061bc709a6", size = 31225510, upload-time = "2026-08-04T06:13:43.367Z" }, - { url = "https://files.pythonhosted.org/packages/a0/57/ebd7a6f429a6d5b9cf87a8fe16f17851aa9b3ce78af5b58af3c5e41ac939/cmake-4.4.2-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ea5c206308f8eefc0be7cbeeee93b8b192b6af7338741b6d12fe387234bb7920", size = 29098755, upload-time = "2026-08-04T06:13:47.102Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b7/b8d0b15f57b37ac5b9e374169471f045da3a715b7f0f3af681011415d972/cmake-4.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:27b024e903ef985b37183d754a5c61230b56b41fe0971cd44b71b80c787ec594", size = 30230879, upload-time = "2026-08-04T06:13:50.678Z" }, - { url = "https://files.pythonhosted.org/packages/3b/91/1d72e960d27edbcc3f02bedd3890c4096bbaaf9dbcb7d86f678d2082fe90/cmake-4.4.2-py3-none-manylinux_2_31_armv7l.whl", hash = "sha256:a3580e0c30755c36b48edbbf471aaeb5d07858de0281e58a4a598dfa52a0f05d", size = 27319760, upload-time = "2026-08-04T06:13:54.468Z" }, - { url = "https://files.pythonhosted.org/packages/3b/f7/dc27806fdee158ca3f30d043ef1c1b18b5f846266d5adf4989d97cc571cc/cmake-4.4.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e58296c6e0c04dec37fc28cbf56ca7150646c948dddab2b0d6f8a0a466e7f1ca", size = 27432198, upload-time = "2026-08-04T06:13:58.614Z" }, - { url = "https://files.pythonhosted.org/packages/97/ff/b3f135c8a28a2ee2b57c2f671342a0c0f3cb1b78ea62a633815483eb4acd/cmake-4.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:00a0a207efc83019b55f617b93b2592c2616aebd9c4eeab83ec076dc2a9b84a4", size = 39474065, upload-time = "2026-08-04T06:14:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b5/463afc4ec6ae535661d6a50918efff9e165ef4793ae6c14c376f0660d756/cmake-4.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0220135cceb78530e79e2b5cd0392672e4c524178db768a5f940ea24520e1359", size = 36109755, upload-time = "2026-08-04T06:14:08.512Z" }, - { url = "https://files.pythonhosted.org/packages/c4/e8/052a01a2c3362d04cb545c456ab26a8776c683f9a97f4082508c6d8cc506/cmake-4.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4eb0e17af8344d3063ce0c1a38a156eb7bbe3447f984ad12629a40f5c967fedd", size = 42239493, upload-time = "2026-08-04T06:14:14.295Z" }, - { url = "https://files.pythonhosted.org/packages/0e/30/c9b5bcd20411793c26838191a73e0e820da64d8f872ecba5364ebc2a3538/cmake-4.4.2-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:00195668e40e5dd0d51244e31d15fabb79b97c5e154f9f78b4240f152198c2eb", size = 41399147, upload-time = "2026-08-04T06:14:19.396Z" }, - { url = "https://files.pythonhosted.org/packages/31/d4/56f18d34b11981031f7bdb0215f05e8e43982d7848dc39a8a96b141d4e6a/cmake-4.4.2-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:41e2a04663685304222ba03fb5bed8db52480854aa873cbae1478eedf3a8ec1a", size = 36322600, upload-time = "2026-08-04T06:14:24.013Z" }, - { url = "https://files.pythonhosted.org/packages/34/4a/582268f8468d0f49b4b73423364af7ee82dba28eef63886e9c32f34761a2/cmake-4.4.2-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:269f84ede6543c5d65249dd685db6125a962e5928b7eafd0ed3acdd2b600aa9e", size = 38668384, upload-time = "2026-08-04T06:14:28.633Z" }, - { url = "https://files.pythonhosted.org/packages/45/24/620930e1ddf0832ac688e00aad2568dd876d71f3637fa98f917dfec25df0/cmake-4.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5b51faffe02ca78ed4f6b9afbe6dee8d25ab36e9a9365f510e890a16db76013", size = 39444623, upload-time = "2026-08-04T06:14:33.525Z" }, - { url = "https://files.pythonhosted.org/packages/70/a4/2f2af96afacfb0f4e5fc02f6f491d4cde4ce8e51d914311f2492e22ed8d9/cmake-4.4.2-py3-none-win32.whl", hash = "sha256:109af09f308fd53ddc44bbc23536b6ecb72db53f0218f611efccd9871b19f39f", size = 38774551, upload-time = "2026-08-04T06:14:38.493Z" }, - { url = "https://files.pythonhosted.org/packages/06/9e/3e572a9a8966eec43b6d75b8b8d9543ca2182ec4006a538fb239e004a3cf/cmake-4.4.2-py3-none-win_amd64.whl", hash = "sha256:c28388fe95298486169c45c0ec8bdf067aabcb59273b98a4cdae8be5cd9c74f3", size = 42325289, upload-time = "2026-08-04T06:14:42.919Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b9/2f0b9b355a5293d73db62cefab46a7d0f3b151962d58fb284f340e3685c4/cmake-4.4.2-py3-none-win_arm64.whl", hash = "sha256:1358f355578d19397f87955d4204f737bb399ba36cce59be5853976912836b32", size = 40497534, upload-time = "2026-08-04T06:14:47.366Z" }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "crossbuild-jpype1" -version = "0.0.0" -source = { virtual = "." } -dependencies = [ - { name = "build" }, - { name = "cmake" }, - { name = "jpype1" }, - { name = "ninja" }, - { name = "scikit-build-core" }, - { name = "setuptools" }, - { name = "wheel" }, -] - -[package.metadata] -requires-dist = [ - { name = "build" }, - { name = "cmake" }, - { name = "jpype1", specifier = "==1.7.1" }, - { name = "ninja" }, - { name = "scikit-build-core" }, - { name = "setuptools" }, - { name = "wheel" }, -] - -[[package]] -name = "jpype1" -version = "1.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/48/a2/5d27e81d24eef64668bf702bfe0e091cc48388b4666f36e025243eb9d827/jpype1-1.7.1.tar.gz", hash = "sha256:3cd88838dc3d2d546f7eaeadaaff864e590010c15f2b6a44b6f37e60796a14b2", size = 783791, upload-time = "2026-05-06T23:55:10.664Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/5e/5611d50222d146a060dbf22e69c4017545341ea6b289a591d5a9bdaad718/jpype1-1.7.1-1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:4c81ee11aee5ed938d7415877cd9c7a0cc9cbf1dac87f7eab928e641323a385b", size = 571633, upload-time = "2026-05-19T20:19:33.536Z" }, - { url = "https://files.pythonhosted.org/packages/79/32/8b2279b12364f260111c7843bf9ede7dc442d5521d6d2ca728b3d522d445/jpype1-1.7.1-1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:b3ddd9f9099202212a34679dfb95dda590bcfbd23289559d104e24abec9120d1", size = 569654, upload-time = "2026-05-19T20:19:36.41Z" }, - { url = "https://files.pythonhosted.org/packages/b5/67/5caa0de30bcb1c8786cc988144a68908e0624de20cfed470a67b1dd1f60c/jpype1-1.7.1-1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:6d491a81281407f8a68552eb3c0e635e576e066c069268dc29a1ea27bb4778ae", size = 569800, upload-time = "2026-05-19T20:19:38.877Z" }, - { url = "https://files.pythonhosted.org/packages/5b/1d/9ee10b1aad9f01ea6ac6159981120eb5ace01962f9cfaa7de6b911de3eb8/jpype1-1.7.1-1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:ace0ba1a67561358fa5b57b8e93ed8bcf16f0a8d5cba79c875089c56827adf8e", size = 569753, upload-time = "2026-05-19T20:19:41.514Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c8/f0f306866dfa2bae97f83db48aa084ed049583f61dfba713124211b08fdf/jpype1-1.7.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2e1459738e9baf560548965b364206890acf34e42673efcfe5048c2c1203e4cf", size = 375606, upload-time = "2026-05-06T23:54:01.62Z" }, - { url = "https://files.pythonhosted.org/packages/28/a9/08eb2c8556598043981692251180479babc56086c5464bb2631929b94acf/jpype1-1.7.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc68b8e94ba5981e6142b4bcbbfa262ebe41438a679e0ebc2daf0759cc8d3e19", size = 408134, upload-time = "2026-05-06T23:54:04.251Z" }, - { url = "https://files.pythonhosted.org/packages/e2/61/36001f0979fa0fffa28dac49f44cbb642cfcbd9f67e090d7fb9a8ace9e80/jpype1-1.7.1-cp311-cp311-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:47bc10f263fc8ea3f97e46a753e355a565c317a61109f298169fcc4365ff415f", size = 454588, upload-time = "2026-05-06T23:54:06.804Z" }, - { url = "https://files.pythonhosted.org/packages/c0/e7/140c78ee6c0804b1ff5eb8313eb76a29e49e973da810539cabf6d454e6bc/jpype1-1.7.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4cabb1d0c23bd8455ab0ef027a6a4b62d6e49c95b96ef8ff652ea83cbba6de6c", size = 439352, upload-time = "2026-05-06T23:54:09.416Z" }, - { url = "https://files.pythonhosted.org/packages/f2/38/8efa98a77f028895bb2cd6eb134b670334e376011f24e6c0f502f515987e/jpype1-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:3af59fdbf1798158b01f1a68b7b19ff805a2d18175542434d6aa89e45d5e53b5", size = 357971, upload-time = "2026-05-06T23:54:11.74Z" }, - { url = "https://files.pythonhosted.org/packages/87/76/6a3aef14a4f21e0254a20f3ae446566274cf84e6079bad00ec784dab4dfa/jpype1-1.7.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7328a61ae4945bd2963c15b7d7ead1d8dfc71ea784dec43dedbea4437d645843", size = 374560, upload-time = "2026-05-06T23:54:14.007Z" }, - { url = "https://files.pythonhosted.org/packages/72/ad/e2db5dae7cd821385096f607deb79bcdd25331c07a58608318d4dade2e48/jpype1-1.7.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158aee356b2c0bf489939d85f6fb31e54a800bd2d95a89b83e5bd7c07fdb048e", size = 407331, upload-time = "2026-05-06T23:54:15.87Z" }, - { url = "https://files.pythonhosted.org/packages/c3/97/f54c66ed8a9ce33fdc87991712260169c1f9ec514110e266b3a56b73ef13/jpype1-1.7.1-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:1cde7f185ef36c2840daf9293423d609eace5b79c632e2267023d6c75ef52988", size = 453957, upload-time = "2026-05-06T23:54:18.684Z" }, - { url = "https://files.pythonhosted.org/packages/03/ed/bc55cc34dd54864a5a717c3f76ff2771961154325aef683d8e4b85b7c51a/jpype1-1.7.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4de86ec7f9f381c7aea8cbbecaa189c020e5fb700620bd96f4762f954757656b", size = 438525, upload-time = "2026-05-06T23:54:21.395Z" }, - { url = "https://files.pythonhosted.org/packages/ca/80/c0098bedd014bc9a1a8a349e40a1fc1408c79af28f6c32bdbb1a2b839c7b/jpype1-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:d7dad528c73d02987358485dc37fab36edb9ad8bce53533e65f54cff1b68a4bc", size = 356985, upload-time = "2026-05-06T23:54:23.663Z" }, - { url = "https://files.pythonhosted.org/packages/22/1c/d3e60c3fefb0ed22afc27e7ed6032565f9c5cbf1452ff03129b8f7354195/jpype1-1.7.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2c54e9c7b7df819631db2cc8e64eaded7884d7dfaa67c035c70de512a8987b34", size = 374581, upload-time = "2026-05-06T23:54:25.801Z" }, - { url = "https://files.pythonhosted.org/packages/6f/10/47d8327d96f6aa9049ea84189508ed446e81b233d8978d49b737b4a0df51/jpype1-1.7.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:988d2db564b61ffcc4fa9533fb65e98037d869b866e02c145e49125554cad6cc", size = 407509, upload-time = "2026-05-06T23:54:27.94Z" }, - { url = "https://files.pythonhosted.org/packages/47/bd/995f4ac18eb3016c3819af5ce0c1a89e94f1cbefc560db688118b32eab3d/jpype1-1.7.1-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:1c387dc58f28aefce50955eb7f24403f05b8a2942ef22c7f08d731d1fc753a50", size = 454093, upload-time = "2026-05-06T23:54:30.702Z" }, - { url = "https://files.pythonhosted.org/packages/86/34/1a45d77fc164daef989b650254144c323462ba00895cedfcb794a7a5dbab/jpype1-1.7.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:907a4dcc89cca1655fe3fad389e9f60d5c681ddf070927a9013a6d0f64ccf118", size = 438527, upload-time = "2026-05-06T23:54:33.033Z" }, - { url = "https://files.pythonhosted.org/packages/dd/10/1f47deb971c20519233577474d397255bbdc4717aa7f0192b0b505d7b47b/jpype1-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:969e160c15ab83b21c657837797ddae3701482d3db54f57ae81c75b558942533", size = 357069, upload-time = "2026-05-06T23:54:42.379Z" }, - { url = "https://files.pythonhosted.org/packages/83/79/760198389ce7e3a6048fd54e1ab5e31139298e2d253cbb9181b1a2cbe48f/jpype1-1.7.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0486725034916270f1c28e27bd74ef793f96d41b822956e3edf5666f99058665", size = 409596, upload-time = "2026-05-06T23:54:35.07Z" }, - { url = "https://files.pythonhosted.org/packages/7c/4e/175b0d0c8e29f7ba6e00f0588e2df06773796bd3c58fa5910cee3aefe40b/jpype1-1.7.1-cp313-cp313t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:39b57767ed33bba453e4c81f2dfcb39be8b3ad25eaeedd96391e171bde3c765f", size = 455365, upload-time = "2026-05-06T23:54:37.672Z" }, - { url = "https://files.pythonhosted.org/packages/29/a9/0576c3d54bfa0bd6b9392f4624bd39bc9cc924a5362ba95d16e3ad77778a/jpype1-1.7.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7605e33971f8f16634e4786ce0a4b2d1691aebd09ca21fdc7a700e9a0f3dd6a7", size = 439563, upload-time = "2026-05-06T23:54:40.188Z" }, - { url = "https://files.pythonhosted.org/packages/91/4e/3bc23e8f50e7bbec2e0f7479346ca17fbc4811df2c710ae6be573ad9317d/jpype1-1.7.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b5e87d88523354d3e46769e4d3244318571d6d35a170febf4f82e3ce408d54b1", size = 374428, upload-time = "2026-05-06T23:54:44.457Z" }, - { url = "https://files.pythonhosted.org/packages/59/1f/0cf0b34e73dd8622ae6fd0e2393edbc5ba5365d76349486ba02292c3cc98/jpype1-1.7.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d32ace75bfc63ccac22258e1d2de33210cfb20d2520db0b413f2b9b1318dd96", size = 407388, upload-time = "2026-05-06T23:54:46.634Z" }, - { url = "https://files.pythonhosted.org/packages/2d/70/6c800d4e3a00200c5c8f52f32db4400623e0d9c1c5136834acb9230478ce/jpype1-1.7.1-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:295934261cede86a6d47b3ad6fd4c259aefe07d4f292a23ea6b33a75f40b3153", size = 454007, upload-time = "2026-05-06T23:54:49.442Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7f/858a229a9525bc717594dc394cc1d0677c786513285da54d0c0ba90d9342/jpype1-1.7.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29977b16a6f88a617fb274994108d816b59680fdab10edb03fd57b1da4ff3e61", size = 438408, upload-time = "2026-05-06T23:54:52.404Z" }, - { url = "https://files.pythonhosted.org/packages/09/d0/adba12d654a84c8e2af8c401acf3fe6b85d98f2ee1f6c29afecae826e871/jpype1-1.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:bff1d3561afb5fdd38f8a69d03669450662c242ec245804240c1ce82c2fc5398", size = 364457, upload-time = "2026-05-06T23:55:01.661Z" }, - { url = "https://files.pythonhosted.org/packages/c2/06/e9b4c867381b0c2573e5080464586b4956de9e3b0c1f40c551f17d1052c9/jpype1-1.7.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:906381e076b2dbbbbef830a7d1be7bdde4f35e59c3c058e40f1e4a36024bcde5", size = 409453, upload-time = "2026-05-06T23:54:54.866Z" }, - { url = "https://files.pythonhosted.org/packages/2f/43/c3cb7b6c82d9f901c1316d25016d18bfad0381eb55cfc960b7f999a42ef3/jpype1-1.7.1-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:7bef4ac17e0b0dbb96ee6afbd8878a5fa85353e3eb3eba4fe86e1df3dd62eb1b", size = 455217, upload-time = "2026-05-06T23:54:57.552Z" }, - { url = "https://files.pythonhosted.org/packages/9f/87/f5b46e288dc3a0c7c6fb02e00f68a621035fa03cac3b6b489effd4170b13/jpype1-1.7.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b230c9475525b29114e6396b864c154f02f7cb041f2ac6bde006ed569e579aea", size = 439454, upload-time = "2026-05-06T23:54:59.609Z" }, -] - -[[package]] -name = "ninja" -version = "1.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/73/79a0b22fc731989c708068427579e840a6cf4e937fe7ae5c5d0b7356ac22/ninja-1.13.0.tar.gz", hash = "sha256:4a40ce995ded54d9dc24f8ea37ff3bf62ad192b547f6c7126e7e25045e76f978", size = 242558, upload-time = "2025-08-11T15:10:19.421Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/74/d02409ed2aa865e051b7edda22ad416a39d81a84980f544f8de717cab133/ninja-1.13.0-py3-none-macosx_10_9_universal2.whl", hash = "sha256:fa2a8bfc62e31b08f83127d1613d10821775a0eb334197154c4d6067b7068ff1", size = 310125, upload-time = "2025-08-11T15:09:50.971Z" }, - { url = "https://files.pythonhosted.org/packages/8e/de/6e1cd6b84b412ac1ef327b76f0641aeb5dcc01e9d3f9eee0286d0c34fd93/ninja-1.13.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3d00c692fb717fd511abeb44b8c5d00340c36938c12d6538ba989fe764e79630", size = 177467, upload-time = "2025-08-11T15:09:52.767Z" }, - { url = "https://files.pythonhosted.org/packages/c8/83/49320fb6e58ae3c079381e333575fdbcf1cca3506ee160a2dcce775046fa/ninja-1.13.0-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:be7f478ff9f96a128b599a964fc60a6a87b9fa332ee1bd44fa243ac88d50291c", size = 187834, upload-time = "2025-08-11T15:09:54.115Z" }, - { url = "https://files.pythonhosted.org/packages/56/c7/ba22748fb59f7f896b609cd3e568d28a0a367a6d953c24c461fe04fc4433/ninja-1.13.0-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:60056592cf495e9a6a4bea3cd178903056ecb0943e4de45a2ea825edb6dc8d3e", size = 202736, upload-time = "2025-08-11T15:09:55.745Z" }, - { url = "https://files.pythonhosted.org/packages/79/22/d1de07632b78ac8e6b785f41fa9aad7a978ec8c0a1bf15772def36d77aac/ninja-1.13.0-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1c97223cdda0417f414bf864cfb73b72d8777e57ebb279c5f6de368de0062988", size = 179034, upload-time = "2025-08-11T15:09:57.394Z" }, - { url = "https://files.pythonhosted.org/packages/ed/de/0e6edf44d6a04dabd0318a519125ed0415ce437ad5a1ec9b9be03d9048cf/ninja-1.13.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa", size = 180716, upload-time = "2025-08-11T15:09:58.696Z" }, - { url = "https://files.pythonhosted.org/packages/54/28/938b562f9057aaa4d6bfbeaa05e81899a47aebb3ba6751e36c027a7f5ff7/ninja-1.13.0-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4be9c1b082d244b1ad7ef41eb8ab088aae8c109a9f3f0b3e56a252d3e00f42c1", size = 146843, upload-time = "2025-08-11T15:10:00.046Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fb/d06a3838de4f8ab866e44ee52a797b5491df823901c54943b2adb0389fbb/ninja-1.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6739d3352073341ad284246f81339a384eec091d9851a886dfa5b00a6d48b3e2", size = 154402, upload-time = "2025-08-11T15:10:01.657Z" }, - { url = "https://files.pythonhosted.org/packages/31/bf/0d7808af695ceddc763cf251b84a9892cd7f51622dc8b4c89d5012779f06/ninja-1.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11be2d22027bde06f14c343f01d31446747dbb51e72d00decca2eb99be911e2f", size = 552388, upload-time = "2025-08-11T15:10:03.349Z" }, - { url = "https://files.pythonhosted.org/packages/9d/70/c99d0c2c809f992752453cce312848abb3b1607e56d4cd1b6cded317351a/ninja-1.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aa45b4037b313c2f698bc13306239b8b93b4680eb47e287773156ac9e9304714", size = 472501, upload-time = "2025-08-11T15:10:04.735Z" }, - { url = "https://files.pythonhosted.org/packages/9f/43/c217b1153f0e499652f5e0766da8523ce3480f0a951039c7af115e224d55/ninja-1.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f8e1e8a1a30835eeb51db05cf5a67151ad37542f5a4af2a438e9490915e5b72", size = 638280, upload-time = "2025-08-11T15:10:06.512Z" }, - { url = "https://files.pythonhosted.org/packages/8c/45/9151bba2c8d0ae2b6260f71696330590de5850e5574b7b5694dce6023e20/ninja-1.13.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:3d7d7779d12cb20c6d054c61b702139fd23a7a964ec8f2c823f1ab1b084150db", size = 642420, upload-time = "2025-08-11T15:10:08.35Z" }, - { url = "https://files.pythonhosted.org/packages/3c/fb/95752eb635bb8ad27d101d71bef15bc63049de23f299e312878fc21cb2da/ninja-1.13.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:d741a5e6754e0bda767e3274a0f0deeef4807f1fec6c0d7921a0244018926ae5", size = 585106, upload-time = "2025-08-11T15:10:09.818Z" }, - { url = "https://files.pythonhosted.org/packages/c1/31/aa56a1a286703800c0cbe39fb4e82811c277772dc8cd084f442dd8e2938a/ninja-1.13.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:e8bad11f8a00b64137e9b315b137d8bb6cbf3086fbdc43bf1f90fd33324d2e96", size = 707138, upload-time = "2025-08-11T15:10:11.366Z" }, - { url = "https://files.pythonhosted.org/packages/34/6f/5f5a54a1041af945130abdb2b8529cbef0cdcbbf9bcf3f4195378319d29a/ninja-1.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4f2a072db3c0f944c32793e91532d8948d20d9ab83da9c0c7c15b5768072200", size = 581758, upload-time = "2025-08-11T15:10:13.295Z" }, - { url = "https://files.pythonhosted.org/packages/95/97/51359c77527d45943fe7a94d00a3843b81162e6c4244b3579fe8fc54cb9c/ninja-1.13.0-py3-none-win32.whl", hash = "sha256:8cfbb80b4a53456ae8a39f90ae3d7a2129f45ea164f43fadfa15dc38c4aef1c9", size = 267201, upload-time = "2025-08-11T15:10:15.158Z" }, - { url = "https://files.pythonhosted.org/packages/29/45/c0adfbfb0b5895aa18cec400c535b4f7ff3e52536e0403602fc1a23f7de9/ninja-1.13.0-py3-none-win_amd64.whl", hash = "sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e", size = 309975, upload-time = "2025-08-11T15:10:16.697Z" }, - { url = "https://files.pythonhosted.org/packages/df/93/a7b983643d1253bb223234b5b226e69de6cda02b76cdca7770f684b795f5/ninja-1.13.0-py3-none-win_arm64.whl", hash = "sha256:3c0b40b1f0bba764644385319028650087b4c1b18cdfa6f45cb39a3669b81aa9", size = 290806, upload-time = "2025-08-11T15:10:18.018Z" }, -] - -[[package]] -name = "packaging" -version = "26.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, -] - -[[package]] -name = "pathspec" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, -] - -[[package]] -name = "pyproject-hooks" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, -] - -[[package]] -name = "scikit-build-core" -version = "1.0.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, - { name = "pathspec" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8d/7c/0f69b0c7150ce4bcee78c199fe3b7e03a6e01578451bd5d5d1a58beb32f9/scikit_build_core-1.0.3.tar.gz", hash = "sha256:a4d7a05978ee37975c37743510c8991e2debce7ef83afb0a07c0c576fd4f16e8", size = 477539, upload-time = "2026-07-12T05:08:30.298Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b0/7ad8fa9aebb0835b2e20afebf1483cbe175d1612fe01e85042ce9ced8755/scikit_build_core-1.0.3-py3-none-any.whl", hash = "sha256:ae95427b7d3c14a6cf8bbfd4d901f6138ab64c99e20cbe8ea7d75cd26093f085", size = 278294, upload-time = "2026-07-12T05:08:28.725Z" }, -] - -[[package]] -name = "setuptools" -version = "83.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, -] - -[[package]] -name = "wheel" -version = "0.47.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, -] From 50104d562fee74f56f5fe510b93d6841daa03ec2 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Fri, 28 Aug 2026 12:56:26 -0600 Subject: [PATCH 067/103] ci(spike): remove all QEMU emulation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nothing in the workspace executes foreign-arch code: whl_install runs compileall with the exec-platform interpreter (the compile_pyc case guards that regression), the container smoke tests run on native-hardware runners (ubuntu-24.04-arm for arm64), and the setup-qemu-action installs are vestiges of the discarded same-host docker+QEMU design (see cross_case.bzl's docstring). Also drop the now-dead meson exe_wrapper machinery (_MESON_EXE_WRAPPER, RULES_PY_TARGET_GCC_SYSROOT) — its consumer was superseded by main's needs_exe_wrapper=true limitation, which is the honest story: probes are never executed, emulated or not. --- .github/workflows/ci-workflows.yaml | 11 ----------- uv/private/pep517_whl/tools/build_helper.py | 17 ----------------- 2 files changed, 28 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 8fa82ceb5..fd391e57e 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -106,11 +106,6 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - # e2e/crossbuild runs an arm64 container from this amd64 runner - - if: matrix.workspace.slug == 'e2e-crossbuild' - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - with: - platforms: arm64 # Run `test //...`, then the workspace's test.sh if it has one - name: Test working-directory: ${{ matrix.workspace.path }} @@ -188,9 +183,6 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - with: - platforms: arm64 - name: Cross-build arm64 image tarballs working-directory: e2e/crossbuild run: | @@ -235,9 +227,6 @@ jobs: - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 with: aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} - - uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 - with: - platforms: amd64 - name: Cross-build amd64 image tarballs from arm64 working-directory: e2e/crossbuild run: | diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 348e9b425..1d89f87bf 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -661,12 +661,6 @@ def _compiler_env( cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path, is_darwin=is_darwin, exe_link_flags=exe_link_flags, static_runtime_archives=static_runtime) cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path, is_cxx=True, is_darwin=is_darwin, exe_link_flags=exe_link_flags, static_runtime_archives=static_runtime) - # gcc_toolchain layout (/xbin/gcc, /sysroot/...): a - # target-arch binary needs THIS toolchain's glibc/loader to run. - # Consumed only by meson's exe_wrapper (_generate_meson_cross_file). - target_gcc_sysroot = path.join(path.dirname(path.dirname(cc_path)), "sysroot") - if not is_darwin and path.isdir(target_gcc_sysroot): - env["RULES_PY_TARGET_GCC_SYSROOT"] = target_gcc_sysroot # apple_support's wrapped_clang hard-fails without DEVELOPER_DIR / # SDKROOT; Bazel injects them only into actions with Xcode execution @@ -792,17 +786,6 @@ def _load_pyproject_data(worktree: str) -> Optional[Dict[str, object]]: _SYS_PLATFORM = {"linux": "linux", "darwin": "darwin", "windows": "win32"} -_MESON_EXE_WRAPPER = """#!/usr/bin/env python3 -import os -import sys - -qemu_ld_prefix = {qemu_ld_prefix!r} -if qemu_ld_prefix: - os.environ["QEMU_LD_PREFIX"] = qemu_ld_prefix -os.execv(sys.argv[1], sys.argv[1:]) -""" - - # numpy's longdouble probe outputs (numpy/_core/meson.build), keyed by the # target ABI: x86 keeps the 80-bit x87 format padded to 16 bytes, aarch64 # glibc uses IEEE binary128, and Apple aarch64 aliases long double to double. From 5ba3f3ec85fc460aee3843e149aca468ce9d45a8 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Fri, 28 Aug 2026 16:04:48 -0600 Subject: [PATCH 068/103] feat(uv): port remaining crossbuild e2e cases with wheel-only cross validation Adds pycross-{bcrypt,geohash,msgpack,numpy,psutil,rpds_py,tiktoken,compile_pyc} with their corresponding BUILD, setup.MODULE, pyproject, uv.lock and tests. Build helper gains setuptools-rust detection and meson setup-args merging. Replaces OCI exec-image verification with a wheel-only flow modeled after the spike's crossbuild CI: - pycross_wheel_export (tools/wheel_export.bzl) exports per-arch wheels via a platform transition and a predictable bazel-bin path. - crossbuild-wheels-amd64 builds arm64 wheels on an amd64 runner. - crossbuild-wheels-arm64 builds amd64 wheels on an arm64 runner. - crossbuild-run-amd64-built installs and runs the amd64-built arm64 wheels on a native arm64 runner with Python 3.12 + pip. - crossbuild-run-arm64-built installs and runs the arm64-built amd64 wheels on a native amd64 runner with Python 3.12 + pip. - crossbuild-wheels-darwin / crossbuild-run-darwin-built provide the same darwin->linux coverage, gated to main and '*macos*' branches. Removes rules_oci and the ubuntu base image from the crossbuild workspace since containers are no longer used. Validated in e2e/crossbuild: 47 pass, 1 skipped (compile_pyc on non-Linux). --- .github/workflows/ci-workflows.yaml | 214 +++++++- e2e/crossbuild/MODULE.bazel | 8 + e2e/crossbuild/pycross-bcrypt/BUILD.bazel | 70 +++ e2e/crossbuild/pycross-bcrypt/pyproject.toml | 14 + .../pycross-bcrypt/setup.MODULE.bazel | 38 ++ e2e/crossbuild/pycross-bcrypt/test_bcrypt.py | 17 + e2e/crossbuild/pycross-bcrypt/uv.lock | 178 +++++++ .../pycross-compile_pyc/BUILD.bazel | 61 +++ .../pycross-compile_pyc/compile_pyc_main.py | 3 + .../pycross-compile_pyc/test_compile_pyc.sh | 24 + e2e/crossbuild/pycross-geohash/BUILD.bazel | 69 +++ e2e/crossbuild/pycross-geohash/pyproject.toml | 16 + .../pycross-geohash/require_cxx_driver.patch | 25 + .../pycross-geohash/setup.MODULE.bazel | 31 ++ .../pycross-geohash/test_geohash.py | 20 + e2e/crossbuild/pycross-geohash/uv.lock | 199 ++++++++ e2e/crossbuild/pycross-meson/BUILD.bazel | 11 + e2e/crossbuild/pycross-msgpack/BUILD.bazel | 72 +++ e2e/crossbuild/pycross-msgpack/pyproject.toml | 12 + .../pycross-msgpack/setup.MODULE.bazel | 25 + .../pycross-msgpack/test_msgpack.py | 21 + e2e/crossbuild/pycross-msgpack/uv.lock | 133 +++++ e2e/crossbuild/pycross-numpy/BUILD.bazel | 74 +++ e2e/crossbuild/pycross-numpy/pyproject.toml | 14 + .../pycross-numpy/setup.MODULE.bazel | 31 ++ e2e/crossbuild/pycross-numpy/test_numpy.py | 28 ++ e2e/crossbuild/pycross-numpy/uv.lock | 215 +++++++++ e2e/crossbuild/pycross-psutil/BUILD.bazel | 69 +++ e2e/crossbuild/pycross-psutil/pyproject.toml | 13 + .../pycross-psutil/setup.MODULE.bazel | 24 + e2e/crossbuild/pycross-psutil/test_psutil.py | 26 + e2e/crossbuild/pycross-psutil/uv.lock | 112 +++++ e2e/crossbuild/pycross-rpds_py/BUILD.bazel | 65 +++ e2e/crossbuild/pycross-rpds_py/pyproject.toml | 12 + .../pycross-rpds_py/setup.MODULE.bazel | 38 ++ .../pycross-rpds_py/test_rpds_py.py | 14 + e2e/crossbuild/pycross-rpds_py/uv.lock | 205 ++++++++ e2e/crossbuild/pycross-rust/BUILD.bazel | 11 + e2e/crossbuild/pycross-setuptools/BUILD.bazel | 11 + e2e/crossbuild/pycross-tiktoken/BUILD.bazel | 69 +++ .../pycross-tiktoken/pyproject.toml | 14 + .../pycross-tiktoken/setup.MODULE.bazel | 38 ++ .../pycross-tiktoken/test_tiktoken.py | 29 ++ e2e/crossbuild/pycross-tiktoken/uv.lock | 455 ++++++++++++++++++ e2e/crossbuild/tools/wheel_export.bzl | 76 +++ .../pep517_whl/tests/build_helper_test.py | 23 + uv/private/pep517_whl/tools/build_helper.py | 45 +- 47 files changed, 2961 insertions(+), 11 deletions(-) create mode 100644 e2e/crossbuild/pycross-bcrypt/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-bcrypt/pyproject.toml create mode 100644 e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-bcrypt/test_bcrypt.py create mode 100644 e2e/crossbuild/pycross-bcrypt/uv.lock create mode 100644 e2e/crossbuild/pycross-compile_pyc/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-compile_pyc/compile_pyc_main.py create mode 100755 e2e/crossbuild/pycross-compile_pyc/test_compile_pyc.sh create mode 100644 e2e/crossbuild/pycross-geohash/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-geohash/pyproject.toml create mode 100644 e2e/crossbuild/pycross-geohash/require_cxx_driver.patch create mode 100644 e2e/crossbuild/pycross-geohash/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-geohash/test_geohash.py create mode 100644 e2e/crossbuild/pycross-geohash/uv.lock create mode 100644 e2e/crossbuild/pycross-msgpack/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-msgpack/pyproject.toml create mode 100644 e2e/crossbuild/pycross-msgpack/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-msgpack/test_msgpack.py create mode 100644 e2e/crossbuild/pycross-msgpack/uv.lock create mode 100644 e2e/crossbuild/pycross-numpy/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-numpy/pyproject.toml create mode 100644 e2e/crossbuild/pycross-numpy/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-numpy/test_numpy.py create mode 100644 e2e/crossbuild/pycross-numpy/uv.lock create mode 100644 e2e/crossbuild/pycross-psutil/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-psutil/pyproject.toml create mode 100644 e2e/crossbuild/pycross-psutil/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-psutil/test_psutil.py create mode 100644 e2e/crossbuild/pycross-psutil/uv.lock create mode 100644 e2e/crossbuild/pycross-rpds_py/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-rpds_py/pyproject.toml create mode 100644 e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-rpds_py/test_rpds_py.py create mode 100644 e2e/crossbuild/pycross-rpds_py/uv.lock create mode 100644 e2e/crossbuild/pycross-tiktoken/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-tiktoken/pyproject.toml create mode 100644 e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-tiktoken/test_tiktoken.py create mode 100644 e2e/crossbuild/pycross-tiktoken/uv.lock create mode 100644 e2e/crossbuild/tools/wheel_export.bzl diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index d2e003edb..0c0bec389 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -153,19 +153,215 @@ jobs: if [ -f test.sh ]; then bash test.sh fi + # Cross-build validation: build wheels for the opposite architecture on + # each Linux runner, then install and run the case's standalone test on a + # native runner of the target architecture. No OCI containers — just pip + # install the wheel and `python test_.py`. + + crossbuild-wheels-darwin: + name: build wheels on darwin + if: >- + ${{ github.ref_name == 'main' + || contains(github.head_ref || github.ref_name, 'macos') }} + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + with: + bazelisk-cache: true + disk-cache: macos-crossbuild-wheels + repository-cache: true + - name: Cross-build linux wheels from macOS + working-directory: e2e/crossbuild + shell: bash + run: | + set -euo pipefail + mkdir -p "${RUNNER_TEMP}/wheels" + targets=$(bazel query 'filter(".*_(amd64|arm64)_bundle$", //...)') + bazel build --config=ci ${targets} + for target in ${targets}; do + pkg="${target#//}" + pkg="${pkg%:*}" + target_name="${target##*:}" + cp "bazel-bin/${pkg}/${target_name%_bundle}.tar.gz" "${RUNNER_TEMP}/wheels/" + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-wheels-darwin + path: ${{ runner.temp }}/wheels/* + retention-days: 1 + + crossbuild-run-darwin-built: + name: run darwin-built wheels on linux ${{ matrix.arch }} + needs: crossbuild-wheels-darwin + strategy: + fail-fast: false + matrix: + include: + - { runner: "ubuntu-latest", arch: "amd64" } + - { runner: "ubuntu-24.04-arm", arch: "arm64" } + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-wheels-darwin + path: wheels + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Install and run tests + run: | + set -euo pipefail + cd wheels + status=0 + for bundle in *_${{ matrix.arch }}.tar.gz; do + [ -e "${bundle}" ] || continue + case_name="${bundle%_${{ matrix.arch }}.tar.gz}" + echo "::group::${case_name}" + tmp=$(mktemp -d) + tar -xzf "${bundle}" -C "${tmp}" + (cd "${tmp}" && pip install *.whl && python "test_${case_name}.py") || status=1 + rm -rf "${tmp}" + echo "::endgroup::" + done + exit "${status}" + + crossbuild-wheels-amd64: + name: build wheels on amd64 + runs-on: ubuntu-22.04-32core + steps: + - uses: actions/checkout@v6 + - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 + with: + aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + - name: Cross-build arm64 wheels + working-directory: e2e/crossbuild + run: | + set -euo pipefail + mkdir -p "${RUNNER_TEMP}/wheels" + targets=$(bazel query 'filter(".*_arm64_bundle$", //...)') + bazel build --config=ci ${targets} + for target in ${targets}; do + pkg="${target#//}" + pkg="${pkg%:*}" + target_name="${target##*:}" + cp "bazel-bin/${pkg}/${target_name%_bundle}.tar.gz" "${RUNNER_TEMP}/wheels/" + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-wheels-amd64-built + path: ${{ runner.temp }}/wheels/* + retention-days: 1 + + crossbuild-run-amd64-built: + name: run amd64-built wheels on arm64 + needs: crossbuild-wheels-amd64 + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-wheels-amd64-built + path: wheels + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Install and run tests + run: | + set -euo pipefail + cd wheels + status=0 + for bundle in *_arm64.tar.gz; do + [ -e "${bundle}" ] || continue + case_name="${bundle%_arm64.tar.gz}" + echo "::group::${case_name}" + tmp=$(mktemp -d) + tar -xzf "${bundle}" -C "${tmp}" + (cd "${tmp}" && pip install *.whl && python "test_${case_name}.py") || status=1 + rm -rf "${tmp}" + echo "::endgroup::" + done + exit "${status}" + + crossbuild-wheels-arm64: + name: build wheels on arm64 + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/checkout@v6 + - uses: aspect-build/setup-aspect@c22a8f64fb38f82f59ce809cd7eb9f8ae096da44 # v2026.23.2 + with: + aspect-api-token: ${{ secrets.ASPECT_API_TOKEN }} + - name: Cross-build amd64 wheels + working-directory: e2e/crossbuild + run: | + set -euo pipefail + mkdir -p "${RUNNER_TEMP}/wheels" + targets=$(bazel query 'filter(".*_amd64_bundle$", //...)') + bazel build --config=ci ${targets} + for target in ${targets}; do + pkg="${target#//}" + pkg="${pkg%:*}" + target_name="${target##*:}" + cp "bazel-bin/${pkg}/${target_name%_bundle}.tar.gz" "${RUNNER_TEMP}/wheels/" + done + - uses: actions/upload-artifact@v4 + with: + name: crossbuild-wheels-arm-built + path: ${{ runner.temp }}/wheels/* + retention-days: 1 + + crossbuild-run-arm64-built: + name: run arm64-built wheels on amd64 + needs: crossbuild-wheels-arm64 + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + name: crossbuild-wheels-arm-built + path: wheels + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Install and run tests + run: | + set -euo pipefail + cd wheels + status=0 + for bundle in *_amd64.tar.gz; do + [ -e "${bundle}" ] || continue + case_name="${bundle%_amd64.tar.gz}" + echo "::group::${case_name}" + tmp=$(mktemp -d) + tar -xzf "${bundle}" -C "${tmp}" + (cd "${tmp}" && pip install *.whl && python "test_${case_name}.py") || status=1 + rm -rf "${tmp}" + echo "::endgroup::" + done + exit "${status}" + test-all: name: test-all runs-on: ubuntu-latest - needs: [test, typecheck] + needs: [test, typecheck, crossbuild-run-amd64-built, crossbuild-run-arm64-built, crossbuild-run-darwin-built] if: always() steps: - name: All required jobs succeeded run: | - if [ "${{ needs.test.result }}" != "success" ]; then - echo "One or more test matrix jobs did not succeed: ${{ needs.test.result }}" - exit 1 - fi - if [ "${{ needs.typecheck.result }}" != "success" ]; then - echo "Typecheck did not succeed: ${{ needs.typecheck.result }}" - exit 1 - fi + for result in \ + "typecheck=${{ needs.typecheck.result }}" \ + "test=${{ needs.test.result }}" \ + "crossbuild-run-amd64-built=${{ needs['crossbuild-run-amd64-built'].result }}" \ + "crossbuild-run-arm64-built=${{ needs['crossbuild-run-arm64-built'].result }}"; do + if [ "${result#*=}" != "success" ]; then + echo "Required job did not succeed: ${result}" + exit 1 + fi + done + # The darwin pipeline is gated to main and '*macos*' branches: + # skipped is expected elsewhere; anything that ran must pass. + case "${{ needs['crossbuild-run-darwin-built'].result }}" in + success|skipped) ;; + *) + echo "crossbuild-run-darwin-built did not succeed: ${{ needs['crossbuild-run-darwin-built'].result }}" + exit 1 + ;; + esac diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index a6dc6499e..3b3685581 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -14,6 +14,7 @@ bazel_dep(name = "bazel_lib", version = "3.0.0") bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "llvm", version = "0.8.3") bazel_dep(name = "rules_rust", version = "0.68.0") +bazel_dep(name = "rules_shell", version = "0.4.1") local_path_override( module_name = "aspect_rules_py", @@ -68,7 +69,14 @@ include("//pycross-distutils-probe:setup.MODULE.bazel") include("//pycross-cmake:setup.MODULE.bazel") include("//pycross-jdk:setup.MODULE.bazel") include("//pycross-meson:setup.MODULE.bazel") +include("//pycross-msgpack:setup.MODULE.bazel") include("//pycross-patches:setup.MODULE.bazel") include("//pycross-pure-python:setup.MODULE.bazel") include("//pycross-rust:setup.MODULE.bazel") include("//pycross-setuptools:setup.MODULE.bazel") +include("//pycross-psutil:setup.MODULE.bazel") +include("//pycross-geohash:setup.MODULE.bazel") +include("//pycross-bcrypt:setup.MODULE.bazel") +include("//pycross-numpy:setup.MODULE.bazel") +include("//pycross-tiktoken:setup.MODULE.bazel") +include("//pycross-rpds_py:setup.MODULE.bazel") diff --git a/e2e/crossbuild/pycross-bcrypt/BUILD.bazel b/e2e/crossbuild/pycross-bcrypt/BUILD.bazel new file mode 100644 index 000000000..d0a1969e8 --- /dev/null +++ b/e2e/crossbuild/pycross-bcrypt/BUILD.bazel @@ -0,0 +1,70 @@ +# bcrypt ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# [tool.uv] no-binary-package forces it to build from sdist here. This is a +# setuptools + setuptools-rust package, exercising the real-world Rust-in-Python +# integration path used by bcrypt (and cryptography, pydantic-core's sibling +# ecosystem). + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") + +_PY = "3.12" + +_DEP_GROUP = "pycross_bcrypt" + +py_test( + name = "test_bcrypt", + srcs = ["test_bcrypt.py"], + dep_group = _DEP_GROUP, + main = "test_bcrypt.py", + python_version = _PY, + deps = ["@pypi_pycross_bcrypt//bcrypt"], +) + +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "bcrypt_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = [ + "@sdist_build__pycross_bcrypt__bcrypt__5_0_0//:whl", + ], +) + +pycross_wheel_export( + name = "bcrypt", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_bcrypt.py", + wheel = "@sdist_build__pycross_bcrypt__bcrypt__5_0_0//:whl", +) diff --git a/e2e/crossbuild/pycross-bcrypt/pyproject.toml b/e2e/crossbuild/pycross-bcrypt/pyproject.toml new file mode 100644 index 000000000..b44b310cd --- /dev/null +++ b/e2e/crossbuild/pycross-bcrypt/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "pycross_bcrypt" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "bcrypt==5.0.0", + "build", + "setuptools", + "setuptools-rust", + "wheel", +] + +[tool.uv] +no-binary-package = ["bcrypt"] diff --git a/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel b/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel new file mode 100644 index 000000000..e7ebc6991 --- /dev/null +++ b/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel @@ -0,0 +1,38 @@ +"""bcrypt: setuptools-rust sdist build. + +Ported from the spike workspace's //bcrypt case. The Cargo cross env/toolchain +wiring stays identical to the other rust suites — see //tools:rust_host_sysroot +for why CARGO/RUSTC alone are not enough. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_bcrypt") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + "setuptools-rust", + "wheel", + ], + hub_name = "pypi_pycross_bcrypt", + lock = "//pycross-bcrypt:uv.lock", + pyproject = "//pycross-bcrypt:pyproject.toml", +) +uv.override_package( + name = "bcrypt", + env = { + "CARGO": "$(CARGO)", + "RUSTC": "$(RUSTC)", + "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", + }, + lock = "//pycross-bcrypt:uv.lock", + toolchains = [ + "@rules_rust//rust/toolchain:current_rust_toolchain", + "//tools:rust_host_sysroot", + ], +) +use_repo( + uv, + "pypi_pycross_bcrypt", + "sdist_build__pycross_bcrypt__bcrypt__5_0_0", +) diff --git a/e2e/crossbuild/pycross-bcrypt/test_bcrypt.py b/e2e/crossbuild/pycross-bcrypt/test_bcrypt.py new file mode 100644 index 000000000..d9b098299 --- /dev/null +++ b/e2e/crossbuild/pycross-bcrypt/test_bcrypt.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +import bcrypt + + +def main() -> None: + password = b"correct horse battery staple" + hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=4)) + # A hash must verify against the password it was made from, and reject a + # different one — deterministic regardless of the random salt gensalt() + # picks. + assert bcrypt.checkpw(password, hashed) is True, "checkpw rejected the password that produced this hash" + assert bcrypt.checkpw(b"wrong password", hashed) is False, "checkpw accepted the wrong password" + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pycross-bcrypt/uv.lock b/e2e/crossbuild/pycross-bcrypt/uv.lock new file mode 100644 index 000000000..2f85827f1 --- /dev/null +++ b/e2e/crossbuild/pycross-bcrypt/uv.lock @@ -0,0 +1,178 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "bcrypt" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/36/3329e2518d70ad8e2e5817d5a4cac6bba05a47767ec416c7d020a965f408/bcrypt-5.0.0.tar.gz", hash = "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", size = 25386, upload-time = "2025-09-25T19:50:47.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/85/3e65e01985fddf25b64ca67275bb5bdb4040bd1a53b66d355c6c37c8a680/bcrypt-5.0.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f3c08197f3039bec79cee59a606d62b96b16669cff3949f21e74796b6e3cd2be", size = 481806, upload-time = "2025-09-25T19:49:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/44/dc/01eb79f12b177017a726cbf78330eb0eb442fae0e7b3dfd84ea2849552f3/bcrypt-5.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:200af71bc25f22006f4069060c88ed36f8aa4ff7f53e67ff04d2ab3f1e79a5b2", size = 268626, upload-time = "2025-09-25T19:49:06.723Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/e82388ad5959c40d6afd94fb4743cc077129d45b952d46bdc3180310e2df/bcrypt-5.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:baade0a5657654c2984468efb7d6c110db87ea63ef5a4b54732e7e337253e44f", size = 271853, upload-time = "2025-09-25T19:49:08.028Z" }, + { url = "https://files.pythonhosted.org/packages/ec/86/7134b9dae7cf0efa85671651341f6afa695857fae172615e960fb6a466fa/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c58b56cdfb03202b3bcc9fd8daee8e8e9b6d7e3163aa97c631dfcfcc24d36c86", size = 269793, upload-time = "2025-09-25T19:49:09.727Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/6296688ac1b9e503d034e7d0614d56e80c5d1a08402ff856a4549cb59207/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bfd2a34de661f34d0bda43c3e4e79df586e4716ef401fe31ea39d69d581ef23", size = 289930, upload-time = "2025-09-25T19:49:11.204Z" }, + { url = "https://files.pythonhosted.org/packages/d1/18/884a44aa47f2a3b88dd09bc05a1e40b57878ecd111d17e5bba6f09f8bb77/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ed2e1365e31fc73f1825fa830f1c8f8917ca1b3ca6185773b349c20fd606cec2", size = 272194, upload-time = "2025-09-25T19:49:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/0e/8f/371a3ab33c6982070b674f1788e05b656cfbf5685894acbfef0c65483a59/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:83e787d7a84dbbfba6f250dd7a5efd689e935f03dd83b0f919d39349e1f23f83", size = 269381, upload-time = "2025-09-25T19:49:14.308Z" }, + { url = "https://files.pythonhosted.org/packages/b1/34/7e4e6abb7a8778db6422e88b1f06eb07c47682313997ee8a8f9352e5a6f1/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:137c5156524328a24b9fac1cb5db0ba618bc97d11970b39184c1d87dc4bf1746", size = 271750, upload-time = "2025-09-25T19:49:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/54f416be2499bd72123c70d98d36c6cd61a4e33d9b89562c22481c81bb30/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:38cac74101777a6a7d3b3e3cfefa57089b5ada650dce2baf0cbdd9d65db22a9e", size = 303757, upload-time = "2025-09-25T19:49:17.244Z" }, + { url = "https://files.pythonhosted.org/packages/13/62/062c24c7bcf9d2826a1a843d0d605c65a755bc98002923d01fd61270705a/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d8d65b564ec849643d9f7ea05c6d9f0cd7ca23bdd4ac0c2dbef1104ab504543d", size = 306740, upload-time = "2025-09-25T19:49:18.693Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/1fdbfc8c0f20875b6b4020f3c7dc447b8de60aa0be5faaf009d24242aec9/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:741449132f64b3524e95cd30e5cd3343006ce146088f074f31ab26b94e6c75ba", size = 334197, upload-time = "2025-09-25T19:49:20.523Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c1/8b84545382d75bef226fbc6588af0f7b7d095f7cd6a670b42a86243183cd/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:212139484ab3207b1f0c00633d3be92fef3c5f0af17cad155679d03ff2ee1e41", size = 352974, upload-time = "2025-09-25T19:49:22.254Z" }, + { url = "https://files.pythonhosted.org/packages/10/a6/ffb49d4254ed085e62e3e5dd05982b4393e32fe1e49bb1130186617c29cd/bcrypt-5.0.0-cp313-cp313t-win32.whl", hash = "sha256:9d52ed507c2488eddd6a95bccee4e808d3234fa78dd370e24bac65a21212b861", size = 148498, upload-time = "2025-09-25T19:49:24.134Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/259559edc85258b6d5fc5471a62a3299a6aa37a6611a169756bf4689323c/bcrypt-5.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f6984a24db30548fd39a44360532898c33528b74aedf81c26cf29c51ee47057e", size = 145853, upload-time = "2025-09-25T19:49:25.702Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/9714173403c7e8b245acf8e4be8876aac64a209d1b392af457c79e60492e/bcrypt-5.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9fffdb387abe6aa775af36ef16f55e318dcda4194ddbf82007a6f21da29de8f5", size = 139626, upload-time = "2025-09-25T19:49:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/f8/14/c18006f91816606a4abe294ccc5d1e6f0e42304df5a33710e9e8e95416e1/bcrypt-5.0.0-cp314-cp314t-macosx_10_12_universal2.whl", hash = "sha256:4870a52610537037adb382444fefd3706d96d663ac44cbb2f37e3919dca3d7ef", size = 481862, upload-time = "2025-09-25T19:49:28.365Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/dd074d831f00e589537e07a0725cf0e220d1f0d5d8e85ad5bbff251c45aa/bcrypt-5.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48f753100931605686f74e27a7b49238122aa761a9aefe9373265b8b7aa43ea4", size = 268544, upload-time = "2025-09-25T19:49:30.39Z" }, + { url = "https://files.pythonhosted.org/packages/f5/91/50ccba088b8c474545b034a1424d05195d9fcbaaf802ab8bfe2be5a4e0d7/bcrypt-5.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70aadb7a809305226daedf75d90379c397b094755a710d7014b8b117df1ebbf", size = 271787, upload-time = "2025-09-25T19:49:32.144Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e7/d7dba133e02abcda3b52087a7eea8c0d4f64d3e593b4fffc10c31b7061f3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:744d3c6b164caa658adcb72cb8cc9ad9b4b75c7db507ab4bc2480474a51989da", size = 269753, upload-time = "2025-09-25T19:49:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/33/fc/5b145673c4b8d01018307b5c2c1fc87a6f5a436f0ad56607aee389de8ee3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a28bc05039bdf3289d757f49d616ab3efe8cf40d8e8001ccdd621cd4f98f4fc9", size = 289587, upload-time = "2025-09-25T19:49:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/27/d7/1ff22703ec6d4f90e62f1a5654b8867ef96bafb8e8102c2288333e1a6ca6/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7f277a4b3390ab4bebe597800a90da0edae882c6196d3038a73adf446c4f969f", size = 272178, upload-time = "2025-09-25T19:49:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/c8/88/815b6d558a1e4d40ece04a2f84865b0fef233513bd85fd0e40c294272d62/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:79cfa161eda8d2ddf29acad370356b47f02387153b11d46042e93a0a95127493", size = 269295, upload-time = "2025-09-25T19:49:38.164Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/e0db387c79ab4931fc89827d37608c31cc57b6edc08ccd2386139028dc0d/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a5393eae5722bcef046a990b84dff02b954904c36a194f6cfc817d7dca6c6f0b", size = 271700, upload-time = "2025-09-25T19:49:39.917Z" }, + { url = "https://files.pythonhosted.org/packages/06/83/1570edddd150f572dbe9fc00f6203a89fc7d4226821f67328a85c330f239/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f4c94dec1b5ab5d522750cb059bb9409ea8872d4494fd152b53cca99f1ddd8c", size = 334034, upload-time = "2025-09-25T19:49:41.227Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/ea64e51a65e56ae7a8a4ec236c2bfbdd4b23008abd50ac33fbb2d1d15424/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0cae4cb350934dfd74c020525eeae0a5f79257e8a201c0c176f4b84fdbf2a4b4", size = 352766, upload-time = "2025-09-25T19:49:43.08Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/1a388d21ee66876f27d1a1f41287897d0c0f1712ef97d395d708ba93004c/bcrypt-5.0.0-cp314-cp314t-win32.whl", hash = "sha256:b17366316c654e1ad0306a6858e189fc835eca39f7eb2cafd6aaca8ce0c40a2e", size = 152449, upload-time = "2025-09-25T19:49:44.971Z" }, + { url = "https://files.pythonhosted.org/packages/3f/61/3291c2243ae0229e5bca5d19f4032cecad5dfb05a2557169d3a69dc0ba91/bcrypt-5.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:92864f54fb48b4c718fc92a32825d0e42265a627f956bc0361fe869f1adc3e7d", size = 149310, upload-time = "2025-09-25T19:49:46.162Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/4b01c52ae0c1a681d4021e5dd3e45b111a8fb47254a274fa9a378d8d834b/bcrypt-5.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dd19cf5184a90c873009244586396a6a884d591a5323f0e8a5922560718d4993", size = 143761, upload-time = "2025-09-25T19:49:47.345Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/6237f151fbfe295fe3e074ecc6d44228faa1e842a81f6d34a02937ee1736/bcrypt-5.0.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b", size = 494553, upload-time = "2025-09-25T19:49:49.006Z" }, + { url = "https://files.pythonhosted.org/packages/45/b6/4c1205dde5e464ea3bd88e8742e19f899c16fa8916fb8510a851fae985b5/bcrypt-5.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", size = 275009, upload-time = "2025-09-25T19:49:50.581Z" }, + { url = "https://files.pythonhosted.org/packages/3b/71/427945e6ead72ccffe77894b2655b695ccf14ae1866cd977e185d606dd2f/bcrypt-5.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", size = 278029, upload-time = "2025-09-25T19:49:52.533Z" }, + { url = "https://files.pythonhosted.org/packages/17/72/c344825e3b83c5389a369c8a8e58ffe1480b8a699f46c127c34580c4666b/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", size = 275907, upload-time = "2025-09-25T19:49:54.709Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7e/d4e47d2df1641a36d1212e5c0514f5291e1a956a7749f1e595c07a972038/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", size = 296500, upload-time = "2025-09-25T19:49:56.013Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c3/0ae57a68be2039287ec28bc463b82e4b8dc23f9d12c0be331f4782e19108/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", size = 278412, upload-time = "2025-09-25T19:49:57.356Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/77424511adb11e6a99e3a00dcc7745034bee89036ad7d7e255a7e47be7d8/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", size = 275486, upload-time = "2025-09-25T19:49:59.116Z" }, + { url = "https://files.pythonhosted.org/packages/43/0a/405c753f6158e0f3f14b00b462d8bca31296f7ecfc8fc8bc7919c0c7d73a/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", size = 277940, upload-time = "2025-09-25T19:50:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/b3efc285d4aadc1fa83db385ec64dcfa1707e890eb42f03b127d66ac1b7b/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", size = 310776, upload-time = "2025-09-25T19:50:02.393Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/47ee337dacecde6d234890fe929936cb03ebc4c3a7460854bbd9c97780b8/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", size = 312922, upload-time = "2025-09-25T19:50:04.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3a/43d494dfb728f55f4e1cf8fd435d50c16a2d75493225b54c8d06122523c6/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", size = 341367, upload-time = "2025-09-25T19:50:05.559Z" }, + { url = "https://files.pythonhosted.org/packages/55/ab/a0727a4547e383e2e22a630e0f908113db37904f58719dc48d4622139b5c/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", size = 359187, upload-time = "2025-09-25T19:50:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/461f352fdca663524b4643d8b09e8435b4990f17fbf4fea6bc2a90aa0cc7/bcrypt-5.0.0-cp38-abi3-win32.whl", hash = "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", size = 153752, upload-time = "2025-09-25T19:50:08.515Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/4190e60921927b7056820291f56fc57d00d04757c8b316b2d3c0d1d6da2c/bcrypt-5.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", size = 150881, upload-time = "2025-09-25T19:50:09.742Z" }, + { url = "https://files.pythonhosted.org/packages/54/12/cd77221719d0b39ac0b55dbd39358db1cd1246e0282e104366ebbfb8266a/bcrypt-5.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", size = 144931, upload-time = "2025-09-25T19:50:11.016Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/2af136406e1c3839aea9ecadc2f6be2bcd1eff255bd451dd39bcf302c47a/bcrypt-5.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", size = 495313, upload-time = "2025-09-25T19:50:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ee/2f4985dbad090ace5ad1f7dd8ff94477fe089b5fab2040bd784a3d5f187b/bcrypt-5.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", size = 275290, upload-time = "2025-09-25T19:50:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/b77ade812672d15cf50842e167eead80ac3514f3beacac8902915417f8b7/bcrypt-5.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", size = 278253, upload-time = "2025-09-25T19:50:15.089Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/ed00ed32f1040f7990dac7115f82273e3c03da1e1a1587a778d8cea496d8/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", size = 276084, upload-time = "2025-09-25T19:50:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fa6e16145e145e87f1fa351bbd54b429354fd72145cd3d4e0c5157cf4c70/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", size = 297185, upload-time = "2025-09-25T19:50:18.525Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/11f8a31d8b67cca3371e046db49baa7c0594d71eb40ac8121e2fc0888db0/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", size = 278656, upload-time = "2025-09-25T19:50:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/ac/31/79f11865f8078e192847d2cb526e3fa27c200933c982c5b2869720fa5fce/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", size = 275662, upload-time = "2025-09-25T19:50:21.567Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8d/5e43d9584b3b3591a6f9b68f755a4da879a59712981ef5ad2a0ac1379f7a/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", size = 278240, upload-time = "2025-09-25T19:50:23.305Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/44590e3fc158620f680a978aafe8f87a4c4320da81ed11552f0323aa9a57/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", size = 311152, upload-time = "2025-09-25T19:50:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/e4fbfc46f14f47b0d20493669a625da5827d07e8a88ee460af6cd9768b44/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", size = 313284, upload-time = "2025-09-25T19:50:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/25/ae/479f81d3f4594456a01ea2f05b132a519eff9ab5768a70430fa1132384b1/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", size = 341643, upload-time = "2025-09-25T19:50:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/df/d2/36a086dee1473b14276cd6ea7f61aef3b2648710b5d7f1c9e032c29b859f/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", size = 359698, upload-time = "2025-09-25T19:50:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f6/688d2cd64bfd0b14d805ddb8a565e11ca1fb0fd6817175d58b10052b6d88/bcrypt-5.0.0-cp39-abi3-win32.whl", hash = "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", size = 153725, upload-time = "2025-09-25T19:50:34.384Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/9d9a641194a730bda138b3dfe53f584d61c58cd5230e37566e83ec2ffa0d/bcrypt-5.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", size = 150912, upload-time = "2025-09-25T19:50:35.69Z" }, + { url = "https://files.pythonhosted.org/packages/27/44/d2ef5e87509158ad2187f4dd0852df80695bb1ee0cfe0a684727b01a69e0/bcrypt-5.0.0-cp39-abi3-win_arm64.whl", hash = "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", size = 144953, upload-time = "2025-09-25T19:50:37.32Z" }, + { url = "https://files.pythonhosted.org/packages/8a/75/4aa9f5a4d40d762892066ba1046000b329c7cd58e888a6db878019b282dc/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7edda91d5ab52b15636d9c30da87d2cc84f426c72b9dba7a9b4fe142ba11f534", size = 271180, upload-time = "2025-09-25T19:50:38.575Z" }, + { url = "https://files.pythonhosted.org/packages/54/79/875f9558179573d40a9cc743038ac2bf67dfb79cecb1e8b5d70e88c94c3d/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:046ad6db88edb3c5ece4369af997938fb1c19d6a699b9c1b27b0db432faae4c4", size = 273791, upload-time = "2025-09-25T19:50:39.913Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fe/975adb8c216174bf70fc17535f75e85ac06ed5252ea077be10d9cff5ce24/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:dcd58e2b3a908b5ecc9b9df2f0085592506ac2d5110786018ee5e160f28e0911", size = 270746, upload-time = "2025-09-25T19:50:43.306Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f8/972c96f5a2b6c4b3deca57009d93e946bbdbe2241dca9806d502f29dd3ee/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:6b8f520b61e8781efee73cba14e3e8c9556ccfb375623f4f97429544734545b4", size = 273375, upload-time = "2025-09-25T19:50:45.43Z" }, +] + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-bcrypt" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "bcrypt" }, + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "bcrypt", specifier = "==5.0.0" }, + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "wheel" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, +] + +[[package]] +name = "setuptools" +version = "84.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, +] + +[[package]] +name = "setuptools-rust" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "semantic-version" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/ba/b31781d61bf9ee3c232a1d1160db11c11cdeae1d44e06c90723b25a8279f/setuptools_rust-1.13.0.tar.gz", hash = "sha256:f2afcf4baeee689910ce49cfa8aad4e08cce72f417449bcc32891b8664fdc726", size = 314100, upload-time = "2026-06-27T21:45:02.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/80/909e46e684e47b116ed145bf2a1a8f5f7c9d90e8c3f8f7fce6a529c0068d/setuptools_rust-1.13.0-py3-none-any.whl", hash = "sha256:666439c4d90e968bb625bcf87ec0aa02b4f49e599d2f5dc255c633a04e8eca99", size = 30536, upload-time = "2026-06-27T21:45:01.583Z" }, +] + +[[package]] +name = "wheel" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/20/50ed6bdf27dec98b568a8ae25dc599f35baa3d9709f9e83fd1edb56b9a90/wheel-0.48.0.tar.gz", hash = "sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322", size = 66471, upload-time = "2026-08-11T22:02:27.327Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/29/69cfbb602cd91690c55d38ba9fe53e6a7e76a6fa647bf38f19c138d25449/wheel-0.48.0-py3-none-any.whl", hash = "sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab", size = 33320, upload-time = "2026-08-11T22:02:26.1Z" }, +] diff --git a/e2e/crossbuild/pycross-compile_pyc/BUILD.bazel b/e2e/crossbuild/pycross-compile_pyc/BUILD.bazel new file mode 100644 index 000000000..7f60afe8c --- /dev/null +++ b/e2e/crossbuild/pycross-compile_pyc/BUILD.bazel @@ -0,0 +1,61 @@ +# Regression guard for cross-arch whl_install pyc precompilation. +# +# Ported from uv-deps-650/crossbuild's test_crossbuild_pyc.sh, strengthened: +# building the arm64 binary on an amd64 host runs whl_install's compileall +# for a non-host wheel, which must use the exec-platform interpreter (the +# original regression was "Exec format error" from selecting the arm64 one). +# Two silent-decay modes the original "it builds" check missed are covered: +# +# - the //uv/private/pyc:precompile default flipping to False would drain +# this coverage from every other case in the workspace without a failure, +# so the platform pins the flag True regardless of the default; +# - whl_install skips compileall without failing when exec_matches_target +# misdetects (see uv/private/whl_install/rule.bzl), so the assertion is +# ".pyc files exist in the install tree", not "the build succeeded". +# +# The assertion walks the binary's runfiles rather than an image layer: +# py_image_layer deliberately drops __pycache__ from layer mtrees (see +# _should_skip_pkg_path in py/private/py_image_layer.bzl), so layers can +# never witness this. +# +# filelock rides along from the pycross-pure-python hub: anyarch, built from +# sdist, no CC toolchain — the cheapest wheel in the workspace. + +load("@aspect_rules_py//py:defs.bzl", "py_binary") +load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") +load("@rules_shell//shell:sh_test.bzl", "sh_test") + +platform( + name = "arm64_linux_precompile", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/pyc:precompile=True", + ], +) + +py_binary( + name = "pyc_probe_bin", + srcs = ["compile_pyc_main.py"], + dep_group = "pycross_pure_python", + main = "compile_pyc_main.py", + python_version = "3.12", + deps = ["@pypi_pycross_pure_python//filelock"], +) + +platform_transition_filegroup( + name = "arm64_pyc_probe", + srcs = [":pyc_probe_bin"], + target_platform = ":arm64_linux_precompile", +) + +sh_test( + name = "compile_pyc_arm64_test", + srcs = ["test_compile_pyc.sh"], + data = [":arm64_pyc_probe"], + target_compatible_with = ["@platforms//os:linux"], +) diff --git a/e2e/crossbuild/pycross-compile_pyc/compile_pyc_main.py b/e2e/crossbuild/pycross-compile_pyc/compile_pyc_main.py new file mode 100644 index 000000000..6608fcdf9 --- /dev/null +++ b/e2e/crossbuild/pycross-compile_pyc/compile_pyc_main.py @@ -0,0 +1,3 @@ +import filelock + +print(filelock.__version__) diff --git a/e2e/crossbuild/pycross-compile_pyc/test_compile_pyc.sh b/e2e/crossbuild/pycross-compile_pyc/test_compile_pyc.sh new file mode 100755 index 000000000..18d31662a --- /dev/null +++ b/e2e/crossbuild/pycross-compile_pyc/test_compile_pyc.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# Assert the cross-built (arm64) filelock install tree carries precompiled +# .pyc files. The data dep building at all already proves compileall did not +# pick the target-arch interpreter (the original "Exec format error" +# regression); the count check below additionally catches compileall being +# silently skipped. +set -euo pipefail + +install_root="$(find "$TEST_SRCDIR" -type d -path '*whl_install__pycross_pure_python__filelock*' -name '*.install' | head -1)" +if [ -z "$install_root" ]; then + echo "FAIL: filelock whl_install tree not found under TEST_SRCDIR" + exit 1 +fi + +count="$(find "$install_root" -path '*/filelock/__pycache__/*.pyc' | wc -l)" +if [ "$count" -lt 1 ]; then + echo "FAIL: no precompiled .pyc under $install_root" + echo "whl_install's compileall either failed to run for this configuration" + echo "or was silently skipped (see exec_matches_target in" + echo "uv/private/whl_install/rule.bzl)." + exit 1 +fi + +echo "PASS: $count precompiled .pyc files in the cross-built filelock install" diff --git a/e2e/crossbuild/pycross-geohash/BUILD.bazel b/e2e/crossbuild/pycross-geohash/BUILD.bazel new file mode 100644 index 000000000..f8268d0ef --- /dev/null +++ b/e2e/crossbuild/pycross-geohash/BUILD.bazel @@ -0,0 +1,69 @@ +# python-geohash has no prebuilt wheel — this package covers the actual +# cross-compilation of its C++ extension for linux/amd64 and linux/arm64. + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") + +exports_files(["require_cxx_driver.patch"]) + +_PY = "3.12" + +_DEP_GROUP = "pycross_geohash" + +py_test( + name = "test_geohash", + srcs = ["test_geohash.py"], + dep_group = _DEP_GROUP, + main = "test_geohash.py", + python_version = _PY, + deps = ["@pypi_pycross_geohash//python_geohash"], +) + +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "geohash_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = [ + "@sdist_build__pycross_geohash__python_geohash__0_8_5//:whl", + ], +) + +pycross_wheel_export( + name = "geohash", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_geohash.py", + wheel = "@sdist_build__pycross_geohash__python_geohash__0_8_5//:whl", +) diff --git a/e2e/crossbuild/pycross-geohash/pyproject.toml b/e2e/crossbuild/pycross-geohash/pyproject.toml new file mode 100644 index 000000000..7e69be8ca --- /dev/null +++ b/e2e/crossbuild/pycross-geohash/pyproject.toml @@ -0,0 +1,16 @@ +[project] +name = "pycross_geohash" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "setuptools", + "wheel", + "cffi", + "python-geohash==0.8.5", +] + +[tool.uv] +no-binary-package = [ + "python-geohash", +] diff --git a/e2e/crossbuild/pycross-geohash/require_cxx_driver.patch b/e2e/crossbuild/pycross-geohash/require_cxx_driver.patch new file mode 100644 index 000000000..87e257707 --- /dev/null +++ b/e2e/crossbuild/pycross-geohash/require_cxx_driver.patch @@ -0,0 +1,25 @@ +diff --git a/src/geohash.cpp b/src/geohash.cpp +--- a/src/geohash.cpp ++++ b/src/geohash.cpp +@@ -0,0 +1,21 @@ ++#include ++ ++class RulesPyBase { ++public: ++ virtual ~RulesPyBase() {} ++}; ++ ++class RulesPyValue : public RulesPyBase { ++public: ++ std::string value; ++ ++ RulesPyValue(const char *value) : value(value) {} ++}; ++ ++extern "C" const char *rules_py_cxx_runtime_probe(void) { ++ static RulesPyValue value("rules_py_cxx_runtime_probe"); ++ RulesPyBase *base = &value; ++ RulesPyValue *derived = dynamic_cast(base); ++ return derived ? derived->value.c_str() : "dynamic_cast failed"; ++} ++ diff --git a/e2e/crossbuild/pycross-geohash/setup.MODULE.bazel b/e2e/crossbuild/pycross-geohash/setup.MODULE.bazel new file mode 100644 index 000000000..138e162cb --- /dev/null +++ b/e2e/crossbuild/pycross-geohash/setup.MODULE.bazel @@ -0,0 +1,31 @@ +"""python-geohash: setuptools sdist with both C and C++ extensions. + +The pre-build patch injects a C++ probe (require_cxx_driver.patch) so the +build fails outright if the cross toolchain can only drive C — geohash's own +setup.py would otherwise fall back silently. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_geohash") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + "wheel", + ], + hub_name = "pypi_pycross_geohash", + lock = "//pycross-geohash:uv.lock", + pyproject = "//pycross-geohash:pyproject.toml", +) +uv.override_package( + name = "python-geohash", + lock = "//pycross-geohash:uv.lock", + pre_build_patch_strip = 1, + pre_build_patches = ["//pycross-geohash:require_cxx_driver.patch"], + resource_set = "mem_4g", +) +use_repo( + uv, + "pypi_pycross_geohash", + "sdist_build__pycross_geohash__python_geohash__0_8_5", +) diff --git a/e2e/crossbuild/pycross-geohash/test_geohash.py b/e2e/crossbuild/pycross-geohash/test_geohash.py new file mode 100644 index 000000000..0c69d2419 --- /dev/null +++ b/e2e/crossbuild/pycross-geohash/test_geohash.py @@ -0,0 +1,20 @@ +"""Smoke test for python-geohash built from its sdist. + +require_cxx_driver.patch makes the C++ extension mandatory, so a passing +import and encode here means the native build ran — the upstream pure-Python +fallback cannot have papered over a compile failure. +""" + +import unittest + +import geohash + + +class TestGeohash(unittest.TestCase): + def test_encode(self) -> None: + encoded = geohash.encode(37.7749, -122.4194) + self.assertEqual(encoded, "9q8yyk8ytpxr") + + +if __name__ == "__main__": + unittest.main() diff --git a/e2e/crossbuild/pycross-geohash/uv.lock b/e2e/crossbuild/pycross-geohash/uv.lock new file mode 100644 index 000000000..1f02ceb37 --- /dev/null +++ b/e2e/crossbuild/pycross-geohash/uv.lock @@ -0,0 +1,199 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, + { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" }, + { url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" }, + { url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" }, + { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" }, + { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" }, + { url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" }, + { url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" }, + { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, + { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, + { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, + { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, + { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, + { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" }, + { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" }, + { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, + { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, + { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, + { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, + { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, + { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, + { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, + { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, + { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, + { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, + { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, + { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, + { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, + { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" }, + { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" }, + { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, + { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, + { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" }, + { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" }, + { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" }, + { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, + { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" }, + { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pycross-geohash" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "cffi" }, + { name = "python-geohash" }, + { name = "setuptools" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "cffi" }, + { name = "python-geohash", specifier = "==0.8.5" }, + { name = "setuptools" }, + { name = "wheel" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "python-geohash" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/e2/1a3507af7c8f91f8a4975d651d4aeb6a846dfdf74713954186ade4205850/python-geohash-0.8.5.tar.gz", hash = "sha256:05a21fcf4eda1a5eddbd291890ade23fc5ddaa6bb98f2ee23d2d384ed14f086d", size = 17636, upload-time = "2014-08-13T07:09:57.318Z" } + +[[package]] +name = "setuptools" +version = "84.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, +] + +[[package]] +name = "wheel" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/20/50ed6bdf27dec98b568a8ae25dc599f35baa3d9709f9e83fd1edb56b9a90/wheel-0.48.0.tar.gz", hash = "sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322", size = 66471, upload-time = "2026-08-11T22:02:27.327Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/29/69cfbb602cd91690c55d38ba9fe53e6a7e76a6fa647bf38f19c138d25449/wheel-0.48.0-py3-none-any.whl", hash = "sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab", size = 33320, upload-time = "2026-08-11T22:02:26.1Z" }, +] diff --git a/e2e/crossbuild/pycross-meson/BUILD.bazel b/e2e/crossbuild/pycross-meson/BUILD.bazel index 1356bee05..2ccfe5e5e 100644 --- a/e2e/crossbuild/pycross-meson/BUILD.bazel +++ b/e2e/crossbuild/pycross-meson/BUILD.bazel @@ -4,6 +4,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") _PY = "3.12" @@ -59,3 +60,13 @@ collect_wheels( ], wheels = ["@sdist_build__pycross_meson__contourpy__1_3_3//:whl"], ) + +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. +pycross_wheel_export( + name = "contourpy", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_contourpy.py", + wheel = "@sdist_build__pycross_meson__contourpy__1_3_3//:whl", +) diff --git a/e2e/crossbuild/pycross-msgpack/BUILD.bazel b/e2e/crossbuild/pycross-msgpack/BUILD.bazel new file mode 100644 index 000000000..71d1a97d5 --- /dev/null +++ b/e2e/crossbuild/pycross-msgpack/BUILD.bazel @@ -0,0 +1,72 @@ +# msgpack-python ships official prebuilt wheels for linux/amd64 and +# linux/arm64, but [tool.uv] no-binary-package forces it to build from +# sdist here. Same setuptools/distutils backend as //pycross-setuptools, +# but its extension (_cmsgpack) is generated by Cython — committed as +# pre-Cythonized .c in the sdist, so no Cython build dependency is needed — +# exercising that code-generation path's symbol/link pattern rather than a +# second hand-written-C or hand-written-C++ package. + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") + +_PY = "3.12" + +_DEP_GROUP = "pycross_msgpack" + +py_test( + name = "test_msgpack", + srcs = ["test_msgpack.py"], + dep_group = _DEP_GROUP, + main = "test_msgpack.py", + python_version = _PY, + deps = ["@pypi_pycross_msgpack//msgpack"], +) + +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "msgpack_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = [ + "@sdist_build__pycross_msgpack__msgpack__1_2_1//:whl", + ], +) + +pycross_wheel_export( + name = "msgpack", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_msgpack.py", + wheel = "@sdist_build__pycross_msgpack__msgpack__1_2_1//:whl", +) diff --git a/e2e/crossbuild/pycross-msgpack/pyproject.toml b/e2e/crossbuild/pycross-msgpack/pyproject.toml new file mode 100644 index 000000000..e482d70eb --- /dev/null +++ b/e2e/crossbuild/pycross-msgpack/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "pycross_msgpack" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "msgpack==1.2.1", + "setuptools", +] + +[tool.uv] +no-binary-package = ["msgpack"] diff --git a/e2e/crossbuild/pycross-msgpack/setup.MODULE.bazel b/e2e/crossbuild/pycross-msgpack/setup.MODULE.bazel new file mode 100644 index 000000000..b696ac293 --- /dev/null +++ b/e2e/crossbuild/pycross-msgpack/setup.MODULE.bazel @@ -0,0 +1,25 @@ +"""msgpack: setuptools C-extension sdist build. + +msgpack-python ships official prebuilt wheels for linux/amd64 and +linux/arm64, but [tool.uv] no-binary-package forces it to build from +sdist here. Its extension (_cmsgpack) is generated by Cython — committed as +pre-Cythonized .c in the sdist, so no Cython build dependency is needed — +exercising the setuptools/distutils code-generation path's symbol/link pattern. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_msgpack") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + ], + hub_name = "pypi_pycross_msgpack", + lock = "//pycross-msgpack:uv.lock", + pyproject = "//pycross-msgpack:pyproject.toml", +) +use_repo( + uv, + "pypi_pycross_msgpack", + "sdist_build__pycross_msgpack__msgpack__1_2_1", +) diff --git a/e2e/crossbuild/pycross-msgpack/test_msgpack.py b/e2e/crossbuild/pycross-msgpack/test_msgpack.py new file mode 100644 index 000000000..fcb6c3035 --- /dev/null +++ b/e2e/crossbuild/pycross-msgpack/test_msgpack.py @@ -0,0 +1,21 @@ +"""Smoke test for msgpack built from its sdist. + +A round-trip through msgpack's compiled Cython extension (_cmsgpack) +must reproduce the exact same structure, including nested types. +""" + +import unittest + +import msgpack + + +class TestMsgpack(unittest.TestCase): + def test_round_trip(self) -> None: + payload = {"a": 1, "b": [1, 2, 3], "c": "text", "d": None, "e": True} + packed = msgpack.packb(payload) + unpacked = msgpack.unpackb(packed, raw=False) + self.assertEqual(unpacked, payload) + + +if __name__ == "__main__": + unittest.main() diff --git a/e2e/crossbuild/pycross-msgpack/uv.lock b/e2e/crossbuild/pycross-msgpack/uv.lock new file mode 100644 index 000000000..68f3bb438 --- /dev/null +++ b/e2e/crossbuild/pycross-msgpack/uv.lock @@ -0,0 +1,133 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "msgpack" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/6b/e9b1cdc042c4458801d2545ed782a95f3d6ba8e270cce8745b8603c7f748/msgpack-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29a3f6e9667868429d8240dfd063ea5ffdc1321c13d783aa23827a38de0dcb22", size = 82812, upload-time = "2026-06-18T16:12:45.022Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3a/dd518a1bf78ed1e9ad8afe57307c079a00eafe4b3068932a27ca1ea56b4f/msgpack-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aded5bdf32609dc7987a49bbbd15a8ef096193f96dd8bbeb791de729e650acf5", size = 82739, upload-time = "2026-06-18T16:12:46.025Z" }, + { url = "https://files.pythonhosted.org/packages/70/e0/7ba9e1542bf0771a27b8b37c1316e3f95ae9d748fd765284655c476ad4ef/msgpack-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:146ee4e9ce80b365c6d4c47073da9da7bcec473e58194ceee5dd7620ace77e06", size = 414233, upload-time = "2026-06-18T16:12:47.029Z" }, + { url = "https://files.pythonhosted.org/packages/03/8d/671d81534ea0e2b0e8a121be100020da09eb78861fe3aa8f3ef7dcd3bed1/msgpack-1.2.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a28d076ca7c82b9c8728ad90b7147489449557038bed50e4241eb832395169b4", size = 423843, upload-time = "2026-06-18T16:12:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b6/e5c737515ed1f166664b87601b532f58cbb73d8aa6a90b99f7c2c5037e8e/msgpack-1.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7d31c0ac0c640f877804c67cb2bc9f4e23dc2db97e96c2e67fa27d38283b41f8", size = 390772, upload-time = "2026-06-18T16:12:49.624Z" }, + { url = "https://files.pythonhosted.org/packages/a8/46/62ed8c2e87d7021eab19921594d961ef3aa3794eec76c716dc30f3bfd433/msgpack-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ff92d7feeaf5bc26c51495b69e2f99ed97ab79346fb6555f44be7dd2ac6503b", size = 409559, upload-time = "2026-06-18T16:12:50.936Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/59aa3887b860bbf43532835e192b1c388a17590d6068ae4f8b2bc74c906e/msgpack-1.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:779197a6513bab3c3632265e3d0f7cb3227e62510841a6f34f1eaa37efbb345e", size = 387838, upload-time = "2026-06-18T16:12:52.161Z" }, + { url = "https://files.pythonhosted.org/packages/09/11/f8563e471093420cf6478cb3271a0175d8402b82d879783d4035d2d03360/msgpack-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:67f6dd22fa72a93752643f07889796d62739a13415ee630169a8ce764f86cf9f", size = 421732, upload-time = "2026-06-18T16:12:53.556Z" }, + { url = "https://files.pythonhosted.org/packages/57/cf/e673683c4c6c90c1022b24c65af4b03eda72b182a1176ef6449069d66acc/msgpack-1.2.1-cp311-cp311-win32.whl", hash = "sha256:91054a783328e0ea7954b8771095705c8d2243b814743fbaadf14552c9c52c5d", size = 64091, upload-time = "2026-06-18T16:12:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/ca212739d179f9083bff2c7c08c24101c3555a334fadc2b876b18768a3ae/msgpack-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2eda0b7ebb1283a98d3e4492ac933c8af6aff59fd3df1c3ed024f536af4b1dc8", size = 70462, upload-time = "2026-06-18T16:12:55.898Z" }, + { url = "https://files.pythonhosted.org/packages/6d/be/6798347b425e26f35db82e69dd83c09716c856a3714e7bffc4c0860fd830/msgpack-1.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ee967f7c7e1df2890c671ff2ee51a28ded0efc95da3e507176dee881ce36c66", size = 65059, upload-time = "2026-06-18T16:12:57.053Z" }, + { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, + { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504, upload-time = "2026-06-18T16:13:08.822Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421, upload-time = "2026-06-18T16:13:09.828Z" }, + { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775, upload-time = "2026-06-18T16:13:11.056Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ac/dcddcab6f6c20ecb387ca5e980371cdb3f87ff69aeca388be97eebc4c074/msgpack-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a70e3cf2804a300d921bb0940426e35f4e489a23adfb77a808892241db0a064", size = 83151, upload-time = "2026-06-18T16:13:12.173Z" }, + { url = "https://files.pythonhosted.org/packages/64/71/fbcfa83a1d6a9c6091942d1cfd070962244664b87427a9a49a6897b1b219/msgpack-1.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:491cc39455ca765fad51fb451bf2915eb2cf41192ab5801ce8d67c1d614fe056", size = 82351, upload-time = "2026-06-18T16:13:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518, upload-time = "2026-06-18T16:13:14.233Z" }, + { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405, upload-time = "2026-06-18T16:13:15.435Z" }, + { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257, upload-time = "2026-06-18T16:13:17.022Z" }, + { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469, upload-time = "2026-06-18T16:13:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802, upload-time = "2026-06-18T16:13:19.685Z" }, + { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273, upload-time = "2026-06-18T16:13:21.028Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c5/133f4512a56e983a93445c836c9d94d88f3bc2e0980ff4b9e577bd8416ce/msgpack-1.2.1-cp313-cp313-win32.whl", hash = "sha256:6d09badf350af2be9d189184e04e64cf54ad93569ab3d96fca58bd3e84aad707", size = 64471, upload-time = "2026-06-18T16:13:22.293Z" }, + { url = "https://files.pythonhosted.org/packages/e2/98/577e10b055096a7dd40732358cabaf7180a20c79ed1dcdbb618e4b9deac7/msgpack-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:33f14fba63278b714efe6ad07e50ea5f03d91537aa6a1c5f1ceca4cf44013ca9", size = 71274, upload-time = "2026-06-18T16:13:23.455Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ee/0c0048e7cfbef23c6a94791b8959ab28155232e7956de8a305b5ff588f05/msgpack-1.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc5febcd4c99effbc02b528e49d6fd0760b2b7d48c05239e345a5fa6e743d9a", size = 64795, upload-time = "2026-06-18T16:13:24.687Z" }, + { url = "https://files.pythonhosted.org/packages/77/58/cce442852c6b9e1639c7c8ac8fd9143121cb32dab0f308df4d1426a8eb9c/msgpack-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:05f340e47e7e47d2da8db9b53e1bb1d294369e9ef45a747441309f6650b8351d", size = 83610, upload-time = "2026-06-18T16:13:25.724Z" }, + { url = "https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:810b916696c86ef0deb3b74588480224df4c1b071136c34183e4a2a4284d7ac7", size = 83138, upload-time = "2026-06-18T16:13:26.781Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/99e58722feaffc5f2fbcc0c8c0d1451ab9f84097f7af87291b46af2390f4/msgpack-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca0dacff965c47afdc3749a8469d7302a8f801d6a28758d55120d75e66ce6889", size = 406090, upload-time = "2026-06-18T16:13:28.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/03/8c63e8cf52958534ef688625965ab04c269a6cadd8caef16758b380a821a/msgpack-1.2.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e2bf9280bceb5efca998435904b5d3e9fdbcc11d90dc9df30aec7973252b720", size = 412106, upload-time = "2026-06-18T16:13:29.427Z" }, + { url = "https://files.pythonhosted.org/packages/63/d2/155d9e71b40e41fd934bc0c48b9b2770f22263e1ac20aad8e29fdca7be3f/msgpack-1.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6c4be5d1c02a42b066ca6ddb71adf36432868fdcdb6ee87e634e86e0674190", size = 374851, upload-time = "2026-06-18T16:13:30.631Z" }, + { url = "https://files.pythonhosted.org/packages/98/48/deaf2326262a8d5ea3295ce9649912ecd3f551ba7ec8e33c665d2ba583f3/msgpack-1.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec0e675d59150a6269ddc9139087c722292664a37d071a849c05c473350f1f2d", size = 396168, upload-time = "2026-06-18T16:13:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/2a/b4410f906c2ec0008f1608d3ab5143afc3ad3f4e6da0fed3ea2231d0bef4/msgpack-1.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dd3bfe82d53edfe4b7fc9a7ec9761e23a7a5b1dac22264505af428253c29ed24", size = 371959, upload-time = "2026-06-18T16:13:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/59/86/1edc67270099a528fa2093ea60fe191233cd238e4bd30cfacf7db79fc959/msgpack-1.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ad5467fc3f68b5468e06c5f788d712e9f8ffc8b0cd1bcb160c105c1ee92dae7", size = 408457, upload-time = "2026-06-18T16:13:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/82/90/8b630fef07d8c5ab457b71ff2c217910c83d333c7a68472c186e87cc504a/msgpack-1.2.1-cp314-cp314-win32.whl", hash = "sha256:98b58bdb89c46190e4609bb36abe17c6d4105ad13f9c5f8f6f64d320f8ced3fb", size = 65942, upload-time = "2026-06-18T16:13:36.056Z" }, + { url = "https://files.pythonhosted.org/packages/16/f1/467b81e98b24dd3885d7b1857728797b4ffc76a7a7483af4fb321a07de3c/msgpack-1.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:74847557e28ce71bd3c438a447ca90e4b507e997ddbdef8a12a7b283b86c156b", size = 72627, upload-time = "2026-06-18T16:13:37.079Z" }, + { url = "https://files.pythonhosted.org/packages/a7/1d/5d8c4c89985feb6acefb82a09e501c60392261856d2408d20bfe4f0360b1/msgpack-1.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:b50b727bd652bdc37d950336c848ef20ec54a4cafc38dce19b1cd86ad625d0f7", size = 66908, upload-time = "2026-06-18T16:13:38.23Z" }, + { url = "https://files.pythonhosted.org/packages/1b/02/ad2afb678b4de94496cd432b581759b756a92c1192d8c767edd6b132efdc/msgpack-1.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8d00f177ca88a77c1cf848d204a38f249751650b601cb6532acc68805d8a8273", size = 86000, upload-time = "2026-06-18T16:13:39.44Z" }, + { url = "https://files.pythonhosted.org/packages/54/74/0b797484013128837f3b1cbb6cea019277c4de4e377dc512b4d9a0f92940/msgpack-1.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5bb9c386f0a329c035ddbab4b72d1028bf9627add8dda41070288563d57ed1b1", size = 86544, upload-time = "2026-06-18T16:13:40.447Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b4/b774d7eb95561739907fec675582f83203cf41c597a418c2589b4bfb8e9d/msgpack-1.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20466cca18c49c7292a8984bc15d65857b171e7264bdcb5f96baf8be238791fc", size = 427661, upload-time = "2026-06-18T16:13:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f9/3243191dc9937e00756c8bc1b0272fed8f23758e43df2a3b46f533e5090f/msgpack-1.2.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:196300e7e5d6e74d50f1607ab9c06c4a1484c383cd22defd727902591f7e8dde", size = 426375, upload-time = "2026-06-18T16:13:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/23/c7/1693111db9944ba4ad4b67a1e788400d78a0b6af7a6523dc7e4e58f8274b/msgpack-1.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575957e79cd51903a4e8495a242442949641e08f1efd5197b43bebd3ea7682b4", size = 380495, upload-time = "2026-06-18T16:13:44.306Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2b/92f86956a0c13e8662f7e2ad630c4eb4db07497b967589bd5245e018b2c1/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8c2ed1e48cc0f460bf3c7780e7137ff21a4e18433451916f2442c1b21036cd7d", size = 410897, upload-time = "2026-06-18T16:13:45.629Z" }, + { url = "https://files.pythonhosted.org/packages/da/ea/1479f72d200313a76fc2f823a79d1e07ed052ab7b8a0280640aa7b95de42/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f6277e5f783c36786a145e0247fc189a03f35f84b251646e53592d2bc12b355", size = 378519, upload-time = "2026-06-18T16:13:46.998Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/fa006060ffa1011d32bfae826fe766fe73e02982183601633b7121058ab3/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9389552ecf4784886345ead0647e4edc96bee37cbab05b75540f542f766c48c", size = 419815, upload-time = "2026-06-18T16:13:48.205Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/aab6c946570496b78e67804721f3d5e2d62a93081b9b37df77764ef56347/msgpack-1.2.1-cp314-cp314t-win32.whl", hash = "sha256:c1c79a604a2969a868a78b6ebd27a887e00c624f14f66b3038e0590cb23332d1", size = 70914, upload-time = "2026-06-18T16:13:49.385Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/e608956488a2af014cfe6e3d665e090b8ee42aa14b07f8f95b8880d66b09/msgpack-1.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f12038a35fabd52e56a3547bab42401af49a45caa6dd00b34c44de235bc93ee2", size = 77999, upload-time = "2026-06-18T16:13:50.467Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8a/27e2e57055176e366a46b85d02d68e7a5bcfbdd8474c9706375d965f24d3/msgpack-1.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0adcf06ffde0777c0e1a9b771a2b1c4226ba1bbf748c8efcc02fcdeca3299107", size = 71160, upload-time = "2026-06-18T16:13:51.498Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-msgpack" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "msgpack" }, + { name = "setuptools" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "msgpack", specifier = "==1.2.1" }, + { name = "setuptools" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "setuptools" +version = "84.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, +] diff --git a/e2e/crossbuild/pycross-numpy/BUILD.bazel b/e2e/crossbuild/pycross-numpy/BUILD.bazel new file mode 100644 index 000000000..4ddf446a1 --- /dev/null +++ b/e2e/crossbuild/pycross-numpy/BUILD.bazel @@ -0,0 +1,74 @@ +# numpy ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# [tool.uv] no-binary-package forces it to build from sdist here. Numpy uses +# meson-python (vendored meson), Cython, and needs -Dblas=none -Dlapack=none +# because this sandbox has no system BLAS/LAPACK (see setup.MODULE.bazel's +# RULES_PY_MESON_SETUP_ARGS override). + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") + +_PY = "3.12" + +_DEP_GROUP = "pycross_numpy" + +py_test( + name = "test_numpy", + srcs = ["test_numpy.py"], + dep_group = _DEP_GROUP, + main = "test_numpy.py", + python_version = _PY, + deps = ["@pypi_pycross_numpy//numpy"], +) + +# The wheel targets under `collect_wheels` are reached through a platform +# transition rather than a py_venv, so nothing sets the dep_group flag for +# them — the platform carries it alongside the libc/version flags the wheel +# resolver needs. +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "numpy_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = ["@sdist_build__pycross_numpy__numpy__2_5_1//:whl"], +) + +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. +pycross_wheel_export( + name = "numpy", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_numpy.py", + wheel = "@sdist_build__pycross_numpy__numpy__2_5_1//:whl", +) diff --git a/e2e/crossbuild/pycross-numpy/pyproject.toml b/e2e/crossbuild/pycross-numpy/pyproject.toml new file mode 100644 index 000000000..b5bf8bfee --- /dev/null +++ b/e2e/crossbuild/pycross-numpy/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "pycross_numpy" +version = "0.0.0" +requires-python = ">=3.12" +dependencies = [ + "build", + "cython>=3.0.6", + "meson-python>=0.18.0", + "ninja", + "numpy==2.5.1", +] + +[tool.uv] +no-binary-package = ["numpy"] diff --git a/e2e/crossbuild/pycross-numpy/setup.MODULE.bazel b/e2e/crossbuild/pycross-numpy/setup.MODULE.bazel new file mode 100644 index 000000000..511889ee0 --- /dev/null +++ b/e2e/crossbuild/pycross-numpy/setup.MODULE.bazel @@ -0,0 +1,31 @@ +"""numpy: meson-python + cython sdist build.""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_numpy") +uv.project( + default_build_dependencies = [ + "build", + "cython", + "meson-python", + "ninja", + ], + hub_name = "pypi_pycross_numpy", + lock = "//pycross-numpy:uv.lock", + pyproject = "//pycross-numpy:pyproject.toml", +) +uv.override_package( + # numpy has no system BLAS/LAPACK in this sandbox (native build) or in + # the cross toolchain (cross build) — no toolchain needed, just a + # literal extra meson setup-args value, same as numpy's own documented + # no-BLAS cross recipe (see its emscripten cibuildwheel config). + name = "numpy", + env = { + "RULES_PY_MESON_SETUP_ARGS": "-Dblas=none -Dlapack=none", + }, + lock = "//pycross-numpy:uv.lock", +) +use_repo( + uv, + "pypi_pycross_numpy", + "sdist_build__pycross_numpy__numpy__2_5_1", +) diff --git a/e2e/crossbuild/pycross-numpy/test_numpy.py b/e2e/crossbuild/pycross-numpy/test_numpy.py new file mode 100644 index 000000000..df1777fb0 --- /dev/null +++ b/e2e/crossbuild/pycross-numpy/test_numpy.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +import numpy as np + + +def main() -> None: + # Plain elementwise arithmetic never touches BLAS regardless of build + # config — a baseline sanity check that the compiled core imported and + # runs at all. + a = np.array([1, 2, 3], dtype=np.int64) + b = np.array([4, 5, 6], dtype=np.int64) + result = (a + b).tolist() + assert result == [5, 7, 9], "elementwise add: got {}, expected [5, 7, 9]".format(result) + + # Matrix multiplication normally routes through BLAS (dgemm) when one is + # linked; built with -Dblas=none, numpy falls back to its own internal + # gemm loop instead — this specifically exercises that fallback path is + # numerically correct, not just present. + m1 = np.array([[1.0, 2.0], [3.0, 4.0]]) + m2 = np.array([[5.0, 6.0], [7.0, 8.0]]) + product = (m1 @ m2).tolist() + expected = [[19.0, 22.0], [43.0, 50.0]] + assert product == expected, "matmul (no-BLAS fallback): got {}, expected {}".format(product, expected) + + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pycross-numpy/uv.lock b/e2e/crossbuild/pycross-numpy/uv.lock new file mode 100644 index 000000000..cff461268 --- /dev/null +++ b/e2e/crossbuild/pycross-numpy/uv.lock @@ -0,0 +1,215 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" +resolution-markers = [ + "sys_platform != 'ios'", + "sys_platform == 'ios'", +] + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cython" +version = "3.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/d8/4981ef716ad0e3ff0d3ef383aefc6b03c4a88dee33b272bf8e0d833001ca/cython-3.3.0.tar.gz", hash = "sha256:eed0d93fbca7087f143b42c34b05a825849bdf17f101572c2105acfa49aa88b8", size = 3727515, upload-time = "2026-08-22T05:16:39.493Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/0f/95bad838a80ac52c9e982dad00bd9a0b2bad57fb4c688e5f53ac3ef65ff0/cython-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03bc5333932f5dda3ba9315298ecdd21daa1b58410bb1f8ce04c78ec8337130a", size = 3143472, upload-time = "2026-08-22T05:17:07.956Z" }, + { url = "https://files.pythonhosted.org/packages/91/8b/53d4a84de853b39940a0e35a6a2a9ed5f54cb05468daee95bc0fd1c2a178/cython-3.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e321ae700995a16dc3055ada06ffb8d61e1a7434e5d0e811547a45ac1015ebd", size = 3258974, upload-time = "2026-08-22T05:17:09.908Z" }, + { url = "https://files.pythonhosted.org/packages/6a/4e/6b1c5a4e6bbe1726104de007aa2fdf01a3e2e386b4ec93c7be5f5085d53f/cython-3.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:428fafed98ea26927000a287b4dfc9ef07339f56656a5329a34eaa593f79a4f8", size = 3412225, upload-time = "2026-08-22T05:17:12.281Z" }, + { url = "https://files.pythonhosted.org/packages/f4/9b/cd724d91c500116769bdb853450a2197ba3d640dbbe3b02fc54ebdfdbd1b/cython-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:333449cc0350baedee5a6af27929eac8a71eac4ec59333c45ff476b33c6c660d", size = 2872123, upload-time = "2026-08-22T05:17:14.322Z" }, + { url = "https://files.pythonhosted.org/packages/2f/cc/abc977cf683140e372714acea42164ecfc5cd3d3984ed025860e6d830ee4/cython-3.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:03056533fe4fdbc4f1d34a39178f9a4937ff35196f8bcdde2a67b5b5809c61fe", size = 3134892, upload-time = "2026-08-22T05:17:16.675Z" }, + { url = "https://files.pythonhosted.org/packages/a3/60/5367e7c80776a185ac11e0ea738fdaf18b9d0bc21d2c2bafc4d87eb19964/cython-3.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc2f2a6b65a991666cfd35a35bab0cd88ffba4df2f601edb6e76cc8116de24b9", size = 3251835, upload-time = "2026-08-22T05:17:18.458Z" }, + { url = "https://files.pythonhosted.org/packages/bc/b8/fc595c60a7b6f5f08b4f6ad65e60688e8c61f76064ebe847eaf85d0c59fa/cython-3.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23942b0662642927a55676e4b26e6840fb166dd7d76436384685227e7e8619a4", size = 3407705, upload-time = "2026-08-22T05:17:20.387Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d7/376572ff69ef39a9bdcd727124f6c38aa066300e97734a4902a3ae0d2af0/cython-3.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:ab24d1a4fb6aaf0b5b6fcd75a6d70255fbd3130fa78884c26991f8d5502616b5", size = 2866216, upload-time = "2026-08-22T05:17:22.348Z" }, + { url = "https://files.pythonhosted.org/packages/8a/7f/e409f76bb955ecdcb746b80350b945fbb808846d797346d647a37e1790ca/cython-3.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0deedc2e9a5a664e1adfa4c2d310aa7b54903e1a647c274b6c9213f77a02d637", size = 3186700, upload-time = "2026-08-22T05:17:24.288Z" }, + { url = "https://files.pythonhosted.org/packages/0e/6b/4a623ab6e4a5b9814b22849665cb212273f9735399a7ebca4f3e8c254f1a/cython-3.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46072c0d404616b5e652a63882c79cc3f8a1d62635a8692f56ed0e416a4dfed8", size = 3330606, upload-time = "2026-08-22T05:17:26.041Z" }, + { url = "https://files.pythonhosted.org/packages/9f/57/6d620ebee4fc24d89340427702f6ceaf7b956511d1f2222a88c92c1a72b7/cython-3.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:82f94565b6001bab8e31bf52a0911672910b5735910612a2c0f772c719670006", size = 3454681, upload-time = "2026-08-22T05:17:28.449Z" }, + { url = "https://files.pythonhosted.org/packages/73/4e/26e0a584d06c5b3f345df491d2546479606c89217627ee163f1aa55e899f/cython-3.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:51999fb834365721b6c7f689cf6e2ec7c8667aae783df9eb5e589c290a414d9c", size = 2925966, upload-time = "2026-08-22T05:17:30.549Z" }, + { url = "https://files.pythonhosted.org/packages/ea/45/7f6988070013e16918e39b1b3dab9c5f2c8e404253a7fd10ee685bbd6902/cython-3.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:596e8df019372a2cd417805015022d42cb8ee4e1803ccdc11ed00e451625fb66", size = 3177681, upload-time = "2026-08-22T05:17:32.523Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5d/afb6866ab10236bb208dff0f172ea4b397c9693c5250280c4d9d26057218/cython-3.3.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a36c34d1950845b8ac148653b07cdc62421a4b0d9abfcc849e69f1c4ff9919d", size = 3328312, upload-time = "2026-08-22T05:17:34.511Z" }, + { url = "https://files.pythonhosted.org/packages/c9/aa/4c0b6773ecf6bc1ec6cda7db8312a566611b330fb6dae87d740e44a47822/cython-3.3.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b447f6906e0555f05dc4742ef1f99091b1e5d9aa9f16616e772fbf9ff6271616", size = 3454285, upload-time = "2026-08-22T05:17:36.538Z" }, + { url = "https://files.pythonhosted.org/packages/44/bb/3e2631122f96300723d6fc42b9cf65550bdcda570a6ad5c4e0226e2e787c/cython-3.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:b55c72e8eccdd508c8de3cf3bbc543aafbb3bf6a518e1ee20358d3241cd780ef", size = 2924709, upload-time = "2026-08-22T05:17:38.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/59/bc1a84b434cb5bebb0cd6f50da8f239d35a5c141b20fdeafc2817fd87778/cython-3.3.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e0d2713d2b292c826bc21dc8732bd9e47628103aa3764180c881e04b3fef95dc", size = 3063660, upload-time = "2026-08-22T05:17:40.923Z" }, + { url = "https://files.pythonhosted.org/packages/ba/6d/542e32908fb421d88354f327ed6450e14240f9825d25393065bc65f4723f/cython-3.3.0-cp39-abi3-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:169e56fd411f4cd5bba51c82f8239421d547a846099db2b261e4aed48ba9f51f", size = 3358395, upload-time = "2026-08-22T05:17:43.036Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7c/ddaf197bc65b581e1891657940bc4f7cb1f740e822115e828920b3a119ce/cython-3.3.0-cp39-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:29f38ebafdf23e3da2516f40c4d065da38bfe002181bf93e2b8cf1262449aba6", size = 3041760, upload-time = "2026-08-22T05:17:44.907Z" }, + { url = "https://files.pythonhosted.org/packages/19/a7/ae5ec3e34d43da846ed4c425734752d83aae0dae49feb929f09c90fc9afa/cython-3.3.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:75c4ae8a6d3a5ccf3cdaba8ab32e6a8d0cd38e3a476aa7ac12df8f8171a8d570", size = 3156152, upload-time = "2026-08-22T05:17:46.884Z" }, + { url = "https://files.pythonhosted.org/packages/31/44/c60b601fc43f0b08e9d6f14b94e0dd02eb0ca8d60f46e242ace7191ac1be/cython-3.3.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b94fb5613b9fe34c27d13ec9972dc0dcd2a2155db2902e93921cadc162610a38", size = 3046690, upload-time = "2026-08-22T05:17:48.731Z" }, + { url = "https://files.pythonhosted.org/packages/b0/9e/d735c26ed907563d3365534006acb263651c2d3b87fee804f7a483dd1714/cython-3.3.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c4558ba85849ab65dc57e10fd0efb13fabd9d3c09981a2566e18dec7cf47586a", size = 3373534, upload-time = "2026-08-22T05:17:50.7Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e8/aa7b4f3a28d6e8117c76e2cf78a0df7a503486cdf7243c5b53200c9533a1/cython-3.3.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:311a016369adfd1e0015c4f9819168fc0e518451d7efb4435c30d65a3a26d52b", size = 3265110, upload-time = "2026-08-22T05:17:52.577Z" }, + { url = "https://files.pythonhosted.org/packages/9c/66/37892a8999d6bbd3f92d691a9701cb720c8ddd6171e16f5148eee6e8cb7f/cython-3.3.0-cp39-abi3-win32.whl", hash = "sha256:90869072e50b7c8904fe1dd7810321ae901fd5637a6eec6646ed9c57f9eb1081", size = 2587733, upload-time = "2026-08-22T05:17:54.547Z" }, + { url = "https://files.pythonhosted.org/packages/19/a2/5f4d305cbd4489d21570e5491ad5c483c478cdab032853e2125c280e3bd5/cython-3.3.0-cp39-abi3-win_arm64.whl", hash = "sha256:dce56c26d388f00a19426371b6926bf2f77c5c03b71d5273e4556c68be98c2dd", size = 2608078, upload-time = "2026-08-22T05:17:56.386Z" }, + { url = "https://files.pythonhosted.org/packages/bf/77/67b0b24e45073a699610e50f00c18474ff9b09ea29ecc95083bdf5e60acd/cython-3.3.0-py3-none-any.whl", hash = "sha256:9b24b5c8cd536946b62086fcafee6d5509d3f549f72d553d2336af87ffbe0da1", size = 1349151, upload-time = "2026-08-22T05:16:36.741Z" }, +] + +[[package]] +name = "meson" +version = "1.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/48/91/d58a3eb45ed54bf32b96806dd2f4efd407f7a9675953e15e8ef257840a0d/meson-1.12.0.tar.gz", hash = "sha256:88afe0c20e52030218924ac37d0c81c59b4b5f3ae3752c8c6d7470c7d365886c", size = 2518280, upload-time = "2026-08-10T22:10:27.439Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/68/b0117422eb0a46d9d8d9e328f0c5b5c835179bfc058688bca35c90c89eba/meson-1.12.0-py3-none-any.whl", hash = "sha256:71f133147fa0fcfe8f4df49fa1045771064947834538409e5d97b3613aac8b4e", size = 1106208, upload-time = "2026-08-10T22:10:23.093Z" }, +] + +[[package]] +name = "meson-python" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "meson" }, + { name = "packaging" }, + { name = "pyproject-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/f0/d794d7ed8a843a8a8947768f3b329d1e8601222dc95d930f4a5f9706cd6c/meson_python-0.20.0.tar.gz", hash = "sha256:6d9726ae6cd37e22f210c74b364b30180a68c20442e97ff09f3c566a414af738", size = 102641, upload-time = "2026-06-10T19:42:52.132Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/ad/77f9483e180cabab2772ac222aedd3dfab858e60d992f40414a3f08e7494/meson_python-0.20.0-py3-none-any.whl", hash = "sha256:6a744cf0c09e76ecbdc58cfa374b48c8902dac1b74479628238634efbf36aec9", size = 29386, upload-time = "2026-06-10T19:42:50.614Z" }, +] + +[[package]] +name = "ninja" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/73/79a0b22fc731989c708068427579e840a6cf4e937fe7ae5c5d0b7356ac22/ninja-1.13.0.tar.gz", hash = "sha256:4a40ce995ded54d9dc24f8ea37ff3bf62ad192b547f6c7126e7e25045e76f978", size = 242558, upload-time = "2025-08-11T15:10:19.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/74/d02409ed2aa865e051b7edda22ad416a39d81a84980f544f8de717cab133/ninja-1.13.0-py3-none-macosx_10_9_universal2.whl", hash = "sha256:fa2a8bfc62e31b08f83127d1613d10821775a0eb334197154c4d6067b7068ff1", size = 310125, upload-time = "2025-08-11T15:09:50.971Z" }, + { url = "https://files.pythonhosted.org/packages/8e/de/6e1cd6b84b412ac1ef327b76f0641aeb5dcc01e9d3f9eee0286d0c34fd93/ninja-1.13.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3d00c692fb717fd511abeb44b8c5d00340c36938c12d6538ba989fe764e79630", size = 177467, upload-time = "2025-08-11T15:09:52.767Z" }, + { url = "https://files.pythonhosted.org/packages/c8/83/49320fb6e58ae3c079381e333575fdbcf1cca3506ee160a2dcce775046fa/ninja-1.13.0-py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:be7f478ff9f96a128b599a964fc60a6a87b9fa332ee1bd44fa243ac88d50291c", size = 187834, upload-time = "2025-08-11T15:09:54.115Z" }, + { url = "https://files.pythonhosted.org/packages/56/c7/ba22748fb59f7f896b609cd3e568d28a0a367a6d953c24c461fe04fc4433/ninja-1.13.0-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:60056592cf495e9a6a4bea3cd178903056ecb0943e4de45a2ea825edb6dc8d3e", size = 202736, upload-time = "2025-08-11T15:09:55.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/22/d1de07632b78ac8e6b785f41fa9aad7a978ec8c0a1bf15772def36d77aac/ninja-1.13.0-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1c97223cdda0417f414bf864cfb73b72d8777e57ebb279c5f6de368de0062988", size = 179034, upload-time = "2025-08-11T15:09:57.394Z" }, + { url = "https://files.pythonhosted.org/packages/ed/de/0e6edf44d6a04dabd0318a519125ed0415ce437ad5a1ec9b9be03d9048cf/ninja-1.13.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa", size = 180716, upload-time = "2025-08-11T15:09:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/938b562f9057aaa4d6bfbeaa05e81899a47aebb3ba6751e36c027a7f5ff7/ninja-1.13.0-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4be9c1b082d244b1ad7ef41eb8ab088aae8c109a9f3f0b3e56a252d3e00f42c1", size = 146843, upload-time = "2025-08-11T15:10:00.046Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fb/d06a3838de4f8ab866e44ee52a797b5491df823901c54943b2adb0389fbb/ninja-1.13.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6739d3352073341ad284246f81339a384eec091d9851a886dfa5b00a6d48b3e2", size = 154402, upload-time = "2025-08-11T15:10:01.657Z" }, + { url = "https://files.pythonhosted.org/packages/31/bf/0d7808af695ceddc763cf251b84a9892cd7f51622dc8b4c89d5012779f06/ninja-1.13.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11be2d22027bde06f14c343f01d31446747dbb51e72d00decca2eb99be911e2f", size = 552388, upload-time = "2025-08-11T15:10:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/9d/70/c99d0c2c809f992752453cce312848abb3b1607e56d4cd1b6cded317351a/ninja-1.13.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aa45b4037b313c2f698bc13306239b8b93b4680eb47e287773156ac9e9304714", size = 472501, upload-time = "2025-08-11T15:10:04.735Z" }, + { url = "https://files.pythonhosted.org/packages/9f/43/c217b1153f0e499652f5e0766da8523ce3480f0a951039c7af115e224d55/ninja-1.13.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f8e1e8a1a30835eeb51db05cf5a67151ad37542f5a4af2a438e9490915e5b72", size = 638280, upload-time = "2025-08-11T15:10:06.512Z" }, + { url = "https://files.pythonhosted.org/packages/8c/45/9151bba2c8d0ae2b6260f71696330590de5850e5574b7b5694dce6023e20/ninja-1.13.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:3d7d7779d12cb20c6d054c61b702139fd23a7a964ec8f2c823f1ab1b084150db", size = 642420, upload-time = "2025-08-11T15:10:08.35Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/95752eb635bb8ad27d101d71bef15bc63049de23f299e312878fc21cb2da/ninja-1.13.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:d741a5e6754e0bda767e3274a0f0deeef4807f1fec6c0d7921a0244018926ae5", size = 585106, upload-time = "2025-08-11T15:10:09.818Z" }, + { url = "https://files.pythonhosted.org/packages/c1/31/aa56a1a286703800c0cbe39fb4e82811c277772dc8cd084f442dd8e2938a/ninja-1.13.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:e8bad11f8a00b64137e9b315b137d8bb6cbf3086fbdc43bf1f90fd33324d2e96", size = 707138, upload-time = "2025-08-11T15:10:11.366Z" }, + { url = "https://files.pythonhosted.org/packages/34/6f/5f5a54a1041af945130abdb2b8529cbef0cdcbbf9bcf3f4195378319d29a/ninja-1.13.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b4f2a072db3c0f944c32793e91532d8948d20d9ab83da9c0c7c15b5768072200", size = 581758, upload-time = "2025-08-11T15:10:13.295Z" }, + { url = "https://files.pythonhosted.org/packages/95/97/51359c77527d45943fe7a94d00a3843b81162e6c4244b3579fe8fc54cb9c/ninja-1.13.0-py3-none-win32.whl", hash = "sha256:8cfbb80b4a53456ae8a39f90ae3d7a2129f45ea164f43fadfa15dc38c4aef1c9", size = 267201, upload-time = "2025-08-11T15:10:15.158Z" }, + { url = "https://files.pythonhosted.org/packages/29/45/c0adfbfb0b5895aa18cec400c535b4f7ff3e52536e0403602fc1a23f7de9/ninja-1.13.0-py3-none-win_amd64.whl", hash = "sha256:fb8ee8719f8af47fed145cced4a85f0755dd55d45b2bddaf7431fa89803c5f3e", size = 309975, upload-time = "2025-08-11T15:10:16.697Z" }, + { url = "https://files.pythonhosted.org/packages/df/93/a7b983643d1253bb223234b5b226e69de6cda02b76cdca7770f684b795f5/ninja-1.13.0-py3-none-win_arm64.whl", hash = "sha256:3c0b40b1f0bba764644385319028650087b4c1b18cdfa6f45cb39a3669b81aa9", size = 290806, upload-time = "2025-08-11T15:10:18.018Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, + { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, + { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, + { url = "https://files.pythonhosted.org/packages/eb/07/ec2a3f0c91761581d4b7104a740791800025983f9a4dc4e73f91a99aeac4/numpy-2.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bfebd8695f9863592fe744be833a258120b14a9f39da255e8aa8fade2c0ddd1", size = 16796419, upload-time = "2026-07-04T17:06:40.37Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ab/ddb499fc4f8780354395face5b65c7fd107bcd6e1d667a5f07d046956f6f/numpy-2.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30b44a6b53a7ae63c54c089a8726e5563ed302716c5b7ccc85afade40b0e7ff6", size = 11765832, upload-time = "2026-07-04T17:06:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/88/b3/3c28c558a09fc72100c646dac6d2fce8e834c471b0edca01a29996706117/numpy-2.5.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6165343f81b56ef8f514f396989e529b61d9dc709b99421b07e9f3e698e2287d", size = 5325143, upload-time = "2026-07-04T17:06:45.466Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0e/ce19b985bb15c596f4f05954e76cccc77c845083b3b8f938a6c68e523128/numpy-2.5.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4939237038ada79308dda3204ac6462df056b5672b2e25db1149cf873668b3e1", size = 6659749, upload-time = "2026-07-04T17:06:47.288Z" }, + { url = "https://files.pythonhosted.org/packages/2e/20/1ee6614d64332a1bba6411f38e68cb79eec1b2459e20a623777c5c5492a2/numpy-2.5.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c6759f538fb912fc46de0a6b1758ccf7b57bc7c7ebebc23974fdac3de8db0cd", size = 15164716, upload-time = "2026-07-04T17:06:49.494Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a7/2bcd3fdbb87804755c35b729bf8709d62025c5f4cfd7d5b2415997097515/numpy-2.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726558e8db4a5bf7929a70ae50f63abda4daf0efe810e3bfbab95976f75fc1a", size = 16661440, upload-time = "2026-07-04T17:06:52.061Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d7/a41e3310c886fe457d36e670bbf24fae411aca8a7b6ad92a32afd924077c/numpy-2.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3935f3b419b244a02732676fa5317a9193cc596a4c0646db07e5b421229ac9f7", size = 16526305, upload-time = "2026-07-04T17:06:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/53/75/4333a9a707c1edd3a4e1a0c58eca52c0f31e55089fa80db02b5565b24df7/numpy-2.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc932a65ded7ce9013d120845a2514dcccb1a67bfc8deb8d37633762951904a6", size = 18423008, upload-time = "2026-07-04T17:06:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/e314a32b1c11a2ffe818ddad3a57b50b4b6e1b6c487192eb50cdef0415d0/numpy-2.5.1-cp313-cp313-win32.whl", hash = "sha256:4b4ff1608417eb7a59da7b967bbb798cacfe071d2caf526a24281cd562072ed9", size = 6063885, upload-time = "2026-07-04T17:07:00.14Z" }, + { url = "https://files.pythonhosted.org/packages/10/70/800b3fca480af32df9e8ea9f3d4a0c8feb4b32d7f195d174eabbda4829ad/numpy-2.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:6c3fe51bc6a16453d452997053454f309e8e0ed7b42d6b361ce4ac8c32913d74", size = 12425674, upload-time = "2026-07-04T17:07:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/196350c122f50f6ca56846f2d71efd5e0d24b7b2e07355e019b2e2c7a11e/numpy-2.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:f7feb014281029e628ba2d5a007407443b06e418b6fe451d1e2adcbc8eba0107", size = 10350256, upload-time = "2026-07-04T17:07:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/db/f4/731b6085a83faf6ca843394cbd5e217280c214399f7e8b21b9f552af0ae2/numpy-2.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c786fe9a5bbe360022e584c5a34cf6b54265c71bd7ec8ac3d8fec38968071f8", size = 16795063, upload-time = "2026-07-04T17:07:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32985c896d897419ef8da6917872d80b78ad0ea26d85b23245c7366ffde76d75", size = 11776652, upload-time = "2026-07-04T17:07:09.907Z" }, + { url = "https://files.pythonhosted.org/packages/b5/59/2b844c7a6e9deff69b404a66221e1542937734f65d5e6e39411876053862/numpy-2.5.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:efd736408cc97c79b9e6917338dfc8f06013b2274f992e96b1d9a81a71e2a2c2", size = 5335944, upload-time = "2026-07-04T17:07:12.227Z" }, + { url = "https://files.pythonhosted.org/packages/86/51/9bf7cb2cabcebc9e017e4ec7e6322b378317a542c08b4cb68479c1efc716/numpy-2.5.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ab84dc6b074fa881cae55bea94cc4f68e285181ba7f32497bf7dee6b1496165b", size = 6656266, upload-time = "2026-07-04T17:07:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/fb7615b211b82a32f44d5180a6d421b61f84d4fadd578b48ba4ac34e189f/numpy-2.5.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caf3e317d33d60c37986b452613f4ab51246d0691350c03d0cb4a898627f4a95", size = 15179720, upload-time = "2026-07-04T17:07:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21", size = 16664835, upload-time = "2026-07-04T17:07:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/97d6475ee91afe2587797d09446f9d3e475ad4cb681662d824809327b75a/numpy-2.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c12afb53450fa976d4c681c50a7423729a4c51c0465ed9f32b8a9cabbc472373", size = 16539135, upload-time = "2026-07-04T17:07:22.015Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/4db81e4ba0be7e2776b1de68c82aa862c7f8ec27e1b4927d4ae075e20678/numpy-2.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c11c405efc5ff6816d5983c96cdfa215bab3428961243af3ff59b228490438", size = 18426684, upload-time = "2026-07-04T17:07:24.941Z" }, + { url = "https://files.pythonhosted.org/packages/1f/64/c0ba2d90724d450279a7df8f32057241070250a26a7e2b5337d77347f481/numpy-2.5.1-cp314-cp314-win32.whl", hash = "sha256:f2479a47f8d5932d1718168a681ad6e536a9df484c83cfcf9de365e164537ace", size = 6116103, upload-time = "2026-07-04T17:07:27.622Z" }, + { url = "https://files.pythonhosted.org/packages/c1/1a/837f9ed7405adcd7a40538792eb169eddd8fa5630c16a1ef49dae71a30f4/numpy-2.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:24d0eb82c0541d3415a33425db64ae439dffccd7b4dbcb30e7c35120205c506a", size = 12562177, upload-time = "2026-07-04T17:07:29.887Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/49707938b6dd0a78a9178dd93227dc89e4c11af47f5c798d70366e8d0483/numpy-2.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:5a4c988b38d261deeeaad9954e3deb091ad905c94e8bb6708654ef1d97f286b0", size = 10627739, upload-time = "2026-07-04T17:07:32.568Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c7/bb4b882cfe7f299cbc8b66e42e7dd78cf9d14e40f9469fc5e3db7e15b3bd/numpy-2.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a33276be12fa045805f477f22482088b66bb758ffbe89a9d21457de863a32e22", size = 11894709, upload-time = "2026-07-04T17:07:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/40/3f/5af7f4a7f6224aef48017aa82bb6174c7a659d724be0c75017b7e64a55b4/numpy-2.5.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f089d7b00756190aacf1f5d34bdf38c3c430ac82b4f868f8cede73380460fce7", size = 5453810, upload-time = "2026-07-04T17:07:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/20/c9/3474309bc94d634d3f9c3eddf03250ecb8c22cd948ef16fef69a77cc5d7b/numpy-2.5.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:09e9bfd8d2cf479c7d174804fb3811c53a8e9f20a37444008606b57d6b7a826d", size = 6761189, upload-time = "2026-07-04T17:07:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/90/8a/558ae39fdd55d7e7f7fef9a84a6e964ac6b23edbd2a07e52bb084500507d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e68d8dd1e7eba712948f2053a29ec86917bc70ba1358df869d9f06649ef9cf09", size = 15225039, upload-time = "2026-07-04T17:07:41.682Z" }, + { url = "https://files.pythonhosted.org/packages/63/27/ca7392b2d030277bdf0273e7d23255b3ee57d57a7c170a6f4fb3981e1e5d/numpy-2.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d5095fa265a0c4152e7bb12759e14381ef5496152f1ce58f44bdf55c44beb4", size = 16701306, upload-time = "2026-07-04T17:07:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/02/42/03d53ae7996c44d4374a8262e9dc41671fd56cbb98f7d47ef85cf5da4c6b/numpy-2.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ab87a91b3cc3382b8956095bd8f95e00cf679bb81554339be1a2ba404a1473c1", size = 16589955, upload-time = "2026-07-04T17:07:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/7b/15/6c1784ae469640e65db111e9a34b3d0f14d91e8a38b9ce34810ced370dbb/numpy-2.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:224ca51130ef7da85bea2191625181cb4f337f9cb64b471f10c1a12aa8b60077", size = 18464252, upload-time = "2026-07-04T17:07:50.684Z" }, + { url = "https://files.pythonhosted.org/packages/94/a8/f98e50356cf167df656c526c2dfeec2d7dde182f2a3da4b458a5938e2776/numpy-2.5.1-cp314-cp314t-win32.whl", hash = "sha256:6eab239876581b2b3c5a242281b6007bbdbcd1c7085d7709bb57c5929b11e6bf", size = 6263298, upload-time = "2026-07-04T17:07:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/72/ac/96ae880cdecad0b3275d9359fcec72667b49a4863c9f12942e43679dda02/numpy-2.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:83ce9c80d5b521b0d77ddcbe5447c218d247929b6cc056ca5351342accfff0af", size = 12748623, upload-time = "2026-07-04T17:07:55.384Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5a/4d2b1601df3602dba7a14f3348ba9bfe94a18adb428e693df6154c293831/numpy-2.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:5a6db61f9aaa57e369905c67d852045d3c4f7126405b29d09b19dec118e9c9cb", size = 10697674, upload-time = "2026-07-04T17:07:58.506Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-numpy" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "cython" }, + { name = "meson-python" }, + { name = "ninja" }, + { name = "numpy" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "cython", specifier = ">=3.0.6" }, + { name = "meson-python", specifier = ">=0.18.0" }, + { name = "ninja" }, + { name = "numpy", specifier = "==2.5.1" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "pyproject-metadata" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/76/1cae539918a7b1746d624c2f01560b793c22cd8c081157505bb9bbf0e34d/pyproject_metadata-0.12.1.tar.gz", hash = "sha256:8809a4df6fe08279b39a8890669506ed3158e0617855ac9aff098fcbe772ae4c", size = 48457, upload-time = "2026-07-04T02:19:32.029Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/8e/d883718e872abc214ba053f60f7e6edc2abd5ffbd1544beb01a9c92ddd3c/pyproject_metadata-0.12.1-py3-none-any.whl", hash = "sha256:f7162d580a96386a8eb096da06215f981f547d1490f03055ef99e323bc2da427", size = 23452, upload-time = "2026-07-04T02:19:30.657Z" }, +] diff --git a/e2e/crossbuild/pycross-psutil/BUILD.bazel b/e2e/crossbuild/pycross-psutil/BUILD.bazel new file mode 100644 index 000000000..873d96352 --- /dev/null +++ b/e2e/crossbuild/pycross-psutil/BUILD.bazel @@ -0,0 +1,69 @@ +# psutil ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# `[tool.uv] no-binary-package` forces it to build from sdist here. A widely- +# used plain setuptools/distutils C-extension package so the setuptools +# backend's cross support isn't validated by niche packages alone. + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") + +_PY = "3.12" + +_DEP_GROUP = "pycross_psutil" + +py_test( + name = "test_psutil", + srcs = ["test_psutil.py"], + dep_group = _DEP_GROUP, + main = "test_psutil.py", + python_version = _PY, + deps = ["@pypi_pycross_psutil//psutil"], +) + +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "psutil_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = [ + "@sdist_build__pycross_psutil__psutil__7_2_2//:whl", + ], +) + +pycross_wheel_export( + name = "psutil", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_psutil.py", + wheel = "@sdist_build__pycross_psutil__psutil__7_2_2//:whl", +) diff --git a/e2e/crossbuild/pycross-psutil/pyproject.toml b/e2e/crossbuild/pycross-psutil/pyproject.toml new file mode 100644 index 000000000..48e6ce895 --- /dev/null +++ b/e2e/crossbuild/pycross-psutil/pyproject.toml @@ -0,0 +1,13 @@ +[project] +name = "pycross_psutil" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "psutil==7.2.2", + "setuptools", + "wheel", +] + +[tool.uv] +no-binary-package = ["psutil"] diff --git a/e2e/crossbuild/pycross-psutil/setup.MODULE.bazel b/e2e/crossbuild/pycross-psutil/setup.MODULE.bazel new file mode 100644 index 000000000..724bd41ca --- /dev/null +++ b/e2e/crossbuild/pycross-psutil/setup.MODULE.bazel @@ -0,0 +1,24 @@ +"""psutil: plain setuptools C-extension sdist build. + +Ported from rules_py/e2e/crossbuild/psutil. psutil ships official prebuilt +wheels for linux/amd64 and linux/arm64, but `[tool.uv] no-binary-package` +forces it to build from sdist here. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_psutil") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + "wheel", + ], + hub_name = "pypi_pycross_psutil", + lock = "//pycross-psutil:uv.lock", + pyproject = "//pycross-psutil:pyproject.toml", +) +use_repo( + uv, + "pypi_pycross_psutil", + "sdist_build__pycross_psutil__psutil__7_2_2", +) diff --git a/e2e/crossbuild/pycross-psutil/test_psutil.py b/e2e/crossbuild/pycross-psutil/test_psutil.py new file mode 100644 index 000000000..eefd3b9ad --- /dev/null +++ b/e2e/crossbuild/pycross-psutil/test_psutil.py @@ -0,0 +1,26 @@ +"""Smoke test for psutil built from its sdist. + +Ported from rules_py/e2e/crossbuild/psutil/psutil_main.py. cpu_count() and +virtual_memory().total read real /proc/cpuinfo and /proc/meminfo via psutil's +compiled Linux backend (_psutil_linux.so) — both must be positive on any real +(or QEMU-emulated) Linux system. +""" + +import unittest + +import psutil + + +class TestPsutil(unittest.TestCase): + def test_cpu_count(self) -> None: + cpu_count = psutil.cpu_count() + self.assertIsNotNone(cpu_count) + self.assertGreaterEqual(cpu_count, 1) + + def test_virtual_memory(self) -> None: + mem_total = psutil.virtual_memory().total + self.assertGreater(mem_total, 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/e2e/crossbuild/pycross-psutil/uv.lock b/e2e/crossbuild/pycross-psutil/uv.lock new file mode 100644 index 000000000..d714755b3 --- /dev/null +++ b/e2e/crossbuild/pycross-psutil/uv.lock @@ -0,0 +1,112 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "pycross-psutil" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "psutil" }, + { name = "setuptools" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "psutil", specifier = "==7.2.2" }, + { name = "setuptools" }, + { name = "wheel" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "setuptools" +version = "84.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, +] + +[[package]] +name = "wheel" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/20/50ed6bdf27dec98b568a8ae25dc599f35baa3d9709f9e83fd1edb56b9a90/wheel-0.48.0.tar.gz", hash = "sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322", size = 66471, upload-time = "2026-08-11T22:02:27.327Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/29/69cfbb602cd91690c55d38ba9fe53e6a7e76a6fa647bf38f19c138d25449/wheel-0.48.0-py3-none-any.whl", hash = "sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab", size = 33320, upload-time = "2026-08-11T22:02:26.1Z" }, +] diff --git a/e2e/crossbuild/pycross-rpds_py/BUILD.bazel b/e2e/crossbuild/pycross-rpds_py/BUILD.bazel new file mode 100644 index 000000000..dca56a23f --- /dev/null +++ b/e2e/crossbuild/pycross-rpds_py/BUILD.bazel @@ -0,0 +1,65 @@ +# maturin (Cargo/PyO3) cross case: rpds-py built from its sdist for the host +# at runtime, and cross-compiled for both linux CPUs with the cargo cross env. + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") + +_PY = "3.12" + +_DEP_GROUP = "pycross_rpds_py" + +py_test( + name = "test_rpds_py", + srcs = ["test_rpds_py.py"], + dep_group = _DEP_GROUP, + main = "test_rpds_py.py", + python_version = _PY, + deps = ["@pypi_pycross_rpds_py//rpds_py"], +) + +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "rpds_py_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = ["@sdist_build__pycross_rpds_py__rpds_py__2026_6_3//:whl"], +) + +pycross_wheel_export( + name = "rpds_py", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_rpds_py.py", + wheel = "@sdist_build__pycross_rpds_py__rpds_py__2026_6_3//:whl", +) diff --git a/e2e/crossbuild/pycross-rpds_py/pyproject.toml b/e2e/crossbuild/pycross-rpds_py/pyproject.toml new file mode 100644 index 000000000..798039d70 --- /dev/null +++ b/e2e/crossbuild/pycross-rpds_py/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "pycross_rpds_py" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "maturin", + "rpds-py==2026.6.3", +] + +[tool.uv] +no-binary-package = ["rpds-py"] diff --git a/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel b/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel new file mode 100644 index 000000000..9350cf92d --- /dev/null +++ b/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel @@ -0,0 +1,38 @@ +"""rpds-py: maturin/PyO3 sdist build (hub dir underscores what PyPI +hyphenates, hence override name != hub name). + +The Cargo cross env/toolchains wiring mirrors the other Rust/maturin +suites: CARGO/RUSTC are forwarded from the resolved rust toolchain and +//tools:rust_host_sysroot supplies the exec-platform std needed by build +scripts and proc-macros. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_rpds_py") +uv.project( + default_build_dependencies = [ + "build", + "maturin", + ], + hub_name = "pypi_pycross_rpds_py", + lock = "//pycross-rpds_py:uv.lock", + pyproject = "//pycross-rpds_py:pyproject.toml", +) +uv.override_package( + name = "rpds-py", + env = { + "CARGO": "$(CARGO)", + "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", + "RUSTC": "$(RUSTC)", + }, + lock = "//pycross-rpds_py:uv.lock", + toolchains = [ + "@rules_rust//rust/toolchain:current_rust_toolchain", + "//tools:rust_host_sysroot", + ], +) +use_repo( + uv, + "pypi_pycross_rpds_py", + "sdist_build__pycross_rpds_py__rpds_py__2026_6_3", +) diff --git a/e2e/crossbuild/pycross-rpds_py/test_rpds_py.py b/e2e/crossbuild/pycross-rpds_py/test_rpds_py.py new file mode 100644 index 000000000..be25fa5ca --- /dev/null +++ b/e2e/crossbuild/pycross-rpds_py/test_rpds_py.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +"""Exercises the cross-compiled rpds extension.""" +import rpds + + +def main() -> None: + # push_front(0) onto [1, 2, 3] must yield 0, 1, 2, 3 in iteration order. + values = list(rpds.List([1, 2, 3]).push_front(0)) + assert values == [0, 1, 2, 3], "expected [0, 1, 2, 3], got {}".format(values) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pycross-rpds_py/uv.lock b/e2e/crossbuild/pycross-rpds_py/uv.lock new file mode 100644 index 000000000..d2081e171 --- /dev/null +++ b/e2e/crossbuild/pycross-rpds_py/uv.lock @@ -0,0 +1,205 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "maturin" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/c8/22e5e21b2679c9bce6415ca578034ca2cc9316be0642ae21e051a2d5198c/maturin-1.15.0.tar.gz", hash = "sha256:94b26cc8e8aba61a5f2099715fe640e18c5f678e9a500408b38761263954228a", size = 385504, upload-time = "2026-08-24T12:11:22.665Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/69/5c01b461044eb1f45ddcce006706eb88110c793cdb11c7ae0b5e08492e94/maturin-1.15.0-py3-none-linux_armv6l.whl", hash = "sha256:6bf6dc62e22d4dcfd5a51244ff0d58975fa4979c48209fe84159617648956d82", size = 10206220, upload-time = "2026-08-24T12:10:53.327Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1f/2b431554e11687cdb1077e0cdadcc118c53f611086b3af00c8545a67c6a5/maturin-1.15.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd35772633f489841132bc8e71d6fc7f842df30b9c05cd5cdf1ee1ddcb744cc7", size = 19416513, upload-time = "2026-08-24T12:10:56.126Z" }, + { url = "https://files.pythonhosted.org/packages/51/36/e23a21cb34a648b711036b9b2fe1d4f3f4ee24f8db54215d73f1a9a3a3ec/maturin-1.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c40b4eae7bf5ef1f4b1af8d623fe4105016f93578fb15b764e741d08ec3b92dd", size = 10014962, upload-time = "2026-08-24T12:10:58.486Z" }, + { url = "https://files.pythonhosted.org/packages/8c/80/33b15cb2d8f30f12c807955e8f2fd775027692904e30ec0784744ce8cd83/maturin-1.15.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:7eb066372f541f8eb4909c79c5d9bd0b9e8125980bdf1ec9e8aba23c6c8d6c55", size = 10196223, upload-time = "2026-08-24T12:11:00.696Z" }, + { url = "https://files.pythonhosted.org/packages/fe/91/b495e19e2f5c503b540452b2039115e7b2363867e8c5ad4179eb752fa92c/maturin-1.15.0-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:653020a63525bb224e5ab0adf02e17a2e08bc86dbea7fc1399c9a56d7529b99e", size = 10541186, upload-time = "2026-08-24T12:11:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/5d/2b/2abff58037188d852b124871b1f0d720e1c2bfb3d4f1b03d87c52cd66488/maturin-1.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0ebf9767892725083138e671c34482c660317a2f3d6a29fc0e0f34e9d8c99136", size = 10083468, upload-time = "2026-08-24T12:11:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/b7e9f8be99a6627849e81ac7b6694876bce8f50a92995fe17e3cf2610f0a/maturin-1.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7ab7eebffd7b8debca2265985de4eaeb332141276d24b9560b5ad484d4b3add1", size = 10047786, upload-time = "2026-08-24T12:11:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ab/167e3cb7accee11b507dbe53e0e87aeccb376d44ae66284c96ee4df3a9fd/maturin-1.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:126e12e618b4db42f68c779a56d41f82a390145ba36ac3f621d057eb34f5ad9d", size = 13315332, upload-time = "2026-08-24T12:11:09.433Z" }, + { url = "https://files.pythonhosted.org/packages/14/4d/801379f646cbc6b00998e5289b0630a886be3a4ee4c75b6bc9b87478a7f1/maturin-1.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f9d33e6c3f9615c8caceecbbbd440f8eb25a3ddeb687077682cd5eca2e9ae15", size = 10807183, upload-time = "2026-08-24T12:11:11.73Z" }, + { url = "https://files.pythonhosted.org/packages/89/27/2e612e1cbd1580e9e94d4722c227b5180dca27b32b955a34b79918aa1292/maturin-1.15.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:bf29beddd0c6708f112db51d5275fc28b28b9e9c9c5faae387eaef662918b176", size = 10413274, upload-time = "2026-08-24T12:11:14.04Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/202a7b4d75a51f20f84ec9ce3b7345b12b822207072164e2b1c6ef665125/maturin-1.15.0-py3-none-win32.whl", hash = "sha256:da649988be98e87e009e51b1bf0d301b6a301bc0cecbdd60d40d8ba60748d1ca", size = 8928744, upload-time = "2026-08-24T12:11:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/40/dc/4e90da594986ba78dd3bc8a5921ecdcdb11085b22b02a412caab3b225601/maturin-1.15.0-py3-none-win_amd64.whl", hash = "sha256:552c2be4afd43fe8d5c9f3ec8d4c4756d973b8dcbe94c14084390301f50243e1", size = 10335085, upload-time = "2026-08-24T12:11:18.326Z" }, + { url = "https://files.pythonhosted.org/packages/8b/10/15d4314edf130955edf2dc237aa393a8a7c10f2b9b57b89fa2f61f915659/maturin-1.15.0-py3-none-win_arm64.whl", hash = "sha256:c7dc0c66c78d3debdd9c5aa807e861fbcbf07f3505d34b125df74c03986b0f48", size = 9713795, upload-time = "2026-08-24T12:11:20.83Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-rpds-py" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "maturin" }, + { name = "rpds-py" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "maturin" }, + { name = "rpds-py", specifier = "==2026.6.3" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/1f/a2dca5ffdbf1d475ffc4e80e4d5d720ff3a00f691795910116960ee12511/rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7", size = 342174, upload-time = "2026-06-30T07:14:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/323d08583c0832911768663d1944f0107fcd4088704858d84b5e06d105a0/rpds_py-2026.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db08f45aecde626498fb3df07bcf6d2ec040af42e859a4f5040d79c200342911", size = 345513, upload-time = "2026-06-30T07:14:56.515Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2a/e31989834d18d2f26ec1d2774c5b1eb3331df4ea8ada525175294c94b48a/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc992ab27b15f852c76755eb2ab7dce86585ddadba6fa5946e58556088845b4", size = 373783, upload-time = "2026-06-30T07:14:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/fe/e80107ee3639585c9941c17d6a42cd65325022f656c023191fce78c324c8/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f88d653e7b3b779d71ae7454e20dcc9b6bae903f33c269db9f2be41bda3f261", size = 378316, upload-time = "2026-06-30T07:14:59.077Z" }, + { url = "https://files.pythonhosted.org/packages/22/6f/81e3adf81acfb6fa694de2a6e4e7d8863121e3e0799e0a7725e6cf5679c4/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e52655eaf81e32593abedaa4bfe33170c8cfedf3365ed9be6e11e07f148f0278", size = 499423, upload-time = "2026-06-30T07:15:00.488Z" }, + { url = "https://files.pythonhosted.org/packages/2d/9a/41263969df0ce3d9af2a96d5005a288200af1989aed3354bfceb5fc0b21f/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfcc8b909769d19db55c7cc9541eb64b9b774b1057ffffb4f1048070475bb9f9", size = 386077, upload-time = "2026-06-30T07:15:01.911Z" }, + { url = "https://files.pythonhosted.org/packages/5e/19/7e98f468bd50346faff5b10e5297374b443bfdddacc8e9fbc65984539597/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1255b302953c86a486b81d330d5ee1d5bd937691ce271b6be0ef0e299eaab7", size = 371315, upload-time = "2026-06-30T07:15:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/99/3c/2b973b4d371906a134b03decfea7f5d9835a2c6d263454392e15b64b5b18/rpds_py-2026.6.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8d2294a31386bfa251d8c8a39472beee17db67d4f1a6eabea665d35c9a4461c3", size = 383502, upload-time = "2026-06-30T07:15:04.627Z" }, + { url = "https://files.pythonhosted.org/packages/98/2a/12e2799500af0a307bca76b63361c51f9fe479223561489c29eea1f2ee41/rpds_py-2026.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8f23ead891a3b762f35ab3b04623da7056545b48aa60d59957e6789914545da", size = 402673, upload-time = "2026-06-30T07:15:05.856Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e3/21e5872d165fe08be4f229e3d5ee9d90019c0bf0e5538de60dbd54009450/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:421aba32367055614287a4292b6a17f1939c9452299f7a0209c117e990b646d4", size = 549964, upload-time = "2026-06-30T07:15:07.159Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d0/5ee0fe36844297de8123bee27bc12078c1a7416ad9f1b8a8ca18d6b0c0ac/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e5822dfc2f0d4ab7e745eaa6d85945069329beeccef965af3f3bb26058fcab6", size = 615446, upload-time = "2026-06-30T07:15:08.531Z" }, + { url = "https://files.pythonhosted.org/packages/b1/80/1ea5873cb683f2fbe5f21b23ea1f6d179ead19f3c5b249b7eb5dca568ef2/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83e35b57523816c8613fd0776b40cd8bb9f596b37ddd2692eb4a6bb5ab2f8c93", size = 576975, upload-time = "2026-06-30T07:15:09.97Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e1/90ef639217a5ddb15b7f4f61b1c33911fd044ad03c311bafdd2bcab85582/rpds_py-2026.6.3-cp311-cp311-win32.whl", hash = "sha256:de3eceba0b683bcbb1ab93da016d0270df1f9ae7be716b40214c5dafac6ea45a", size = 204453, upload-time = "2026-06-30T07:15:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b7/b7a1695d7af36f521fb11e80d6d3adbd744f73b921859bd3c2a2c0dc706f/rpds_py-2026.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:2c54a076ca4d370980ab57bc0e31df57bbe8d41340436a90ef8b1219a3cbb127", size = 223219, upload-time = "2026-06-30T07:15:12.476Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a2/145afacf796e4506062825941176ad9445c2dcf2b3b6a1f13d3030a15e19/rpds_py-2026.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:168c733a7112e071bb7a66460e667edfcff06c017a3c523f7a8a8e08d0140804", size = 219137, upload-time = "2026-06-30T07:15:13.631Z" }, + { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, + { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, + { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, + { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, + { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, + { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, + { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, + { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, + { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, + { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, + { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, + { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, + { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, + { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, + { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/08/ae/f23a2697e6ee6340a578b0f136be6483657bef0c6f9497b752bb5c0964bb/rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13", size = 344726, upload-time = "2026-06-30T07:16:44.5Z" }, + { url = "https://files.pythonhosted.org/packages/c3/63/e7b3a1a5358dd32c930a1062d8e15b67fd6e8922e81df9e91706d66ee5c8/rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05", size = 339587, upload-time = "2026-06-30T07:16:46.255Z" }, + { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, + { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, + { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, + { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, + { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, + { url = "https://files.pythonhosted.org/packages/29/71/4d8fcf700931815594bce892255bbd973b94efaf0fc1932b0590df18d886/rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369", size = 202864, upload-time = "2026-06-30T07:17:05.746Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/b577562de0edbb55b2be85ce5fd09c33e386b9b13eee09833af4240fd5c4/rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146", size = 220430, upload-time = "2026-06-30T07:17:07.471Z" }, + { url = "https://files.pythonhosted.org/packages/c8/95/d6d0b2509825141eef60669a5739eec88dbc6a48053d6c92993a5704defe/rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e", size = 215877, upload-time = "2026-06-30T07:17:09.008Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bf/f3ea278f0afd615c1d0f19cb69043a41526e2bb600c2b536eb192218eb27/rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b", size = 346933, upload-time = "2026-06-30T07:17:10.762Z" }, + { url = "https://files.pythonhosted.org/packages/9d/29/9907bdf1c5346763cf10b7f6852aad86652168c259def904cbe0082c5864/rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690", size = 340274, upload-time = "2026-06-30T07:17:12.266Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, + { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, + { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, + { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, + { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/ba/76/65002b08596c389105720a8c0d22298b8dc25a4baf89b2ce431343c8b1de/rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577", size = 201204, upload-time = "2026-06-30T07:17:30.193Z" }, + { url = "https://files.pythonhosted.org/packages/8c/97/d855d6b3c322d1f27e26f5241c42016b56cf01377ea8ed348285f54652f0/rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324", size = 220719, upload-time = "2026-06-30T07:17:31.788Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9c/f0d19ac587fd0e4ab6b72cda355e9c5a6166b01ef7e064e437aef8eb9fef/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4cf2d36a2357e4d07bb5a4f98801265327b48256867816cfd2ceb001e9754a8f", size = 349791, upload-time = "2026-06-30T07:17:33.315Z" }, + { url = "https://files.pythonhosted.org/packages/38/c7/1d49d204c9fd2ee6c537601dc4c1ba921e03363ca576bfab94a00254ac9a/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30c6dc199b24a5e3e81d50da0f00858c5bbdb2617a750395687f4339c5818171", size = 352842, upload-time = "2026-06-30T07:17:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e5/c0b5dc93cd0d4c06ce1f438907649514e2ea077bcd911e3154a51e96c38e/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9891e594296ab9dada6551c8e7b387b2721f27a67eecd528412e8906247a7b90", size = 382094, upload-time = "2026-06-30T07:17:36.514Z" }, + { url = "https://files.pythonhosted.org/packages/0d/54/ec0e907b4ca8d541112db352409bd15f871c9b243e0c92c9b5a46ae96f01/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5c2dc92304aa48a4a60443b548bb12f12e119d4b72f314015e67b9e1be97fca", size = 388662, upload-time = "2026-06-30T07:17:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f4/921c22a4fd0f1c1ac13a3996ffbf0aa67951e2c8ad0d1d9574938a2932e8/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:127e08c0642d880cf32ca47ec2a4a77b901f7e2dd1ad9762adb13955d72ffcc9", size = 504896, upload-time = "2026-06-30T07:17:39.689Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1b/a114b972cefa1ab1cdb3c7bb177cd3844a12826c507c722d3a73516dbbaf/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bb68f03f395eb793220b45c097bd4d8c32944393da0fad8b999efac0868fc8c", size = 391545, upload-time = "2026-06-30T07:17:41.336Z" }, + { url = "https://files.pythonhosted.org/packages/4e/98/af9b3db77d47fcbe6c8c1f36e2c2147ec70292819e99c325f871584a1c11/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3450b693fde92133e9f51060568a4c31fcca76d5e53bbd611e689ca446517e9", size = 380059, upload-time = "2026-06-30T07:17:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ba/0efd8668b97c1d26a61566386c636a7a7a09829e474fdf807caa15a2c844/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:5e8d07bddee435a2ff6f1920e18feff28d0bc4533e42f4bf6927fbd073312c41", size = 393235, upload-time = "2026-06-30T07:17:44.637Z" }, + { url = "https://files.pythonhosted.org/packages/62/90/8c139ee9690f73b0829f32647de6f40d826f8f443af6fa72644f96351aac/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a83ae6c67b7676b9878378547ca8e93ed77a580037bcbcd1d32f739e1e6089c", size = 413008, upload-time = "2026-06-30T07:17:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/0043896fdd7828ce09a1d9a8b06433714d0960fc4ff3fc4aa72b666b764e/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2bfd04c19ddbd6640de0b51894d764bd2758854d5b75bd102d2ef10cb9c293a9", size = 558118, upload-time = "2026-06-30T07:17:47.759Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/02355f0e134f783a8f9814c4680a1bd311d37671577a5964ea838573ff37/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ca6546b66be9dc4738b1b043d5ebd5488c66c578c5ff0fd0e8065313fe3afb76", size = 623138, upload-time = "2026-06-30T07:17:49.355Z" }, + { url = "https://files.pythonhosted.org/packages/10/85/48f0abdcef5cce4e034c7a5b0ceeceba0b01bf0d942824f4bb720afe2dec/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8e65860d238379ed982fd9ba690579b5e95af2f4840f99c772816dbe573cb826", size = 586486, upload-time = "2026-06-30T07:17:51.141Z" }, +] diff --git a/e2e/crossbuild/pycross-rust/BUILD.bazel b/e2e/crossbuild/pycross-rust/BUILD.bazel index 89be3e313..9d2b872d4 100644 --- a/e2e/crossbuild/pycross-rust/BUILD.bazel +++ b/e2e/crossbuild/pycross-rust/BUILD.bazel @@ -5,6 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") _PY = "3.12" @@ -60,3 +61,13 @@ collect_wheels( ], wheels = ["@sdist_build__pycross_rust__pydantic_core__2_47_0//:whl"], ) + +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. +pycross_wheel_export( + name = "pydantic_core", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_pydantic_core.py", + wheel = "@sdist_build__pycross_rust__pydantic_core__2_47_0//:whl", +) diff --git a/e2e/crossbuild/pycross-setuptools/BUILD.bazel b/e2e/crossbuild/pycross-setuptools/BUILD.bazel index cee14705c..bf498f69a 100644 --- a/e2e/crossbuild/pycross-setuptools/BUILD.bazel +++ b/e2e/crossbuild/pycross-setuptools/BUILD.bazel @@ -5,6 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") exports_files(["require_extension.patch"]) @@ -89,3 +90,13 @@ collect_wheels( "@sdist_build__pycross_setuptools__zstandard__0_22_0//:whl", ], ) + +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. +pycross_wheel_export( + name = "setproctitle", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_setproctitle.py", + wheel = "@sdist_build__pycross_setuptools__setproctitle__1_3_2//:whl", +) diff --git a/e2e/crossbuild/pycross-tiktoken/BUILD.bazel b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel new file mode 100644 index 000000000..fbc4eb05b --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel @@ -0,0 +1,69 @@ +# tiktoken ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# [tool.uv] no-binary-package forces it to build from sdist here. A second +# setuptools-rust package alongside //pycross-bcrypt, exercising OpenAI's BPE +# tokenizer core on the same build-backend path. + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") + +_PY = "3.12" + +_DEP_GROUP = "pycross_tiktoken" + +py_test( + name = "test_tiktoken", + srcs = ["test_tiktoken.py"], + dep_group = _DEP_GROUP, + main = "test_tiktoken.py", + python_version = _PY, + deps = ["@pypi_pycross_tiktoken//tiktoken"], +) + +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "tiktoken_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = [ + "@sdist_build__pycross_tiktoken__tiktoken__0_13_0//:whl", + ], +) + +pycross_wheel_export( + name = "tiktoken", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_tiktoken.py", + wheel = "@sdist_build__pycross_tiktoken__tiktoken__0_13_0//:whl", +) diff --git a/e2e/crossbuild/pycross-tiktoken/pyproject.toml b/e2e/crossbuild/pycross-tiktoken/pyproject.toml new file mode 100644 index 000000000..e9f8e5375 --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "pycross_tiktoken" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "setuptools", + "setuptools-rust", + "tiktoken==0.13.0", + "wheel", +] + +[tool.uv] +no-binary-package = ["tiktoken"] diff --git a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel new file mode 100644 index 000000000..03f7eb733 --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel @@ -0,0 +1,38 @@ +"""tiktoken: setuptools-rust sdist build. + +Ported from the spike workspace's //tiktoken case. The Cargo cross env/toolchain +wiring stays identical to the other rust suites — see //tools:rust_host_sysroot +for why CARGO/RUSTC alone are not enough. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_tiktoken") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + "setuptools-rust", + "wheel", + ], + hub_name = "pypi_pycross_tiktoken", + lock = "//pycross-tiktoken:uv.lock", + pyproject = "//pycross-tiktoken:pyproject.toml", +) +uv.override_package( + name = "tiktoken", + env = { + "CARGO": "$(CARGO)", + "RUSTC": "$(RUSTC)", + "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", + }, + lock = "//pycross-tiktoken:uv.lock", + toolchains = [ + "@rules_rust//rust/toolchain:current_rust_toolchain", + "//tools:rust_host_sysroot", + ], +) +use_repo( + uv, + "pypi_pycross_tiktoken", + "sdist_build__pycross_tiktoken__tiktoken__0_13_0", +) diff --git a/e2e/crossbuild/pycross-tiktoken/test_tiktoken.py b/e2e/crossbuild/pycross-tiktoken/test_tiktoken.py new file mode 100644 index 000000000..adcd5a463 --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/test_tiktoken.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +"""Round-trip encode/decode through tiktoken built from its sdist. + +Ported from the spike workspace's //tiktoken:tiktoken_main.py. tiktoken's real +encodings download their BPE vocab over the network on first use, which is not +available in a sandboxed cross build. We build a minimal byte-level encoding so +encode() must exercise the compiled Rust core (_tiktoken.CoreBPE). +""" + +import tiktoken + + +def main() -> None: + mergeable_ranks = {bytes([i]): i for i in range(256)} + enc = tiktoken.Encoding( + name="byte-level-test", + pat_str=r".+", + mergeable_ranks=mergeable_ranks, + special_tokens={}, + ) + tokens = enc.encode("hi") + assert tokens == [104, 105], "expected [104, 105], got {}".format(tokens) + decoded = enc.decode(tokens) + assert decoded == "hi", "expected 'hi', got {!r}".format(decoded) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pycross-tiktoken/uv.lock b/e2e/crossbuild/pycross-tiktoken/uv.lock new file mode 100644 index 000000000..ceb9b108f --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/uv.lock @@ -0,0 +1,455 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", size = 363585, upload-time = "2026-08-15T08:16:46.646Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", size = 251189, upload-time = "2026-08-15T08:16:48.287Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", size = 239724, upload-time = "2026-08-15T08:16:49.67Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", size = 280078, upload-time = "2026-08-15T08:16:51.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", size = 276650, upload-time = "2026-08-15T08:16:52.625Z" }, + { url = "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", size = 262325, upload-time = "2026-08-15T08:16:54.085Z" }, + { url = "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", size = 261140, upload-time = "2026-08-15T08:16:55.604Z" }, + { url = "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", size = 252791, upload-time = "2026-08-15T08:16:57.103Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", size = 240730, upload-time = "2026-08-15T08:16:58.418Z" }, + { url = "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", size = 280791, upload-time = "2026-08-15T08:16:59.918Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", size = 259598, upload-time = "2026-08-15T08:17:01.421Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", size = 278217, upload-time = "2026-08-15T08:17:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", size = 263417, upload-time = "2026-08-15T08:17:04.216Z" }, + { url = "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl", hash = "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", size = 181774, upload-time = "2026-08-15T08:17:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", size = 206653, upload-time = "2026-08-15T08:17:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", size = 185630, upload-time = "2026-08-15T08:17:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, + { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, + { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, + { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, + { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, + { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, + { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, + { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "idna" +version = "3.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-tiktoken" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "tiktoken" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "tiktoken", specifier = "==0.13.0" }, + { name = "wheel" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "regex" +version = "2026.7.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e5/cef4de2bac939280b68d32adc659478845238a8274f2f79c465063f590ad/regex-2026.7.19-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ac777001cdfc28b72477d93c8564bb7583081ea8fb45cdca3d568e0a4f87183c", size = 494012, upload-time = "2026-07-19T00:16:39.927Z" }, + { url = "https://files.pythonhosted.org/packages/ff/87/e86f51eb117457bb7803132ffe5cb6e2841e2b5bea4cc85d397f3c6e257d/regex-2026.7.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:59787bd5f8c70aa339084e961d2996b53fbdeab4d5393bba5c1fe1fc32e02bae", size = 295281, upload-time = "2026-07-19T00:16:41.433Z" }, + { url = "https://files.pythonhosted.org/packages/41/2e/2360c41d8080a3d9ec7e5c90fad6eab3b50192869d10e9a5609e48c8177b/regex-2026.7.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:90c633e7e8d6bf4e992b8b36ce69e018f834b641dd6de8cea6d78c06ffa119c5", size = 290615, upload-time = "2026-07-19T00:16:43.058Z" }, + { url = "https://files.pythonhosted.org/packages/cf/69/b65ba4344efbc771b28fe5dde84cbbb6c8f9551165952fe78def5b9dde6a/regex-2026.7.19-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:87ccab0db8d5f4fbb0272642113c1adb2ffc698c16d3a0944580222331fa7a20", size = 791804, upload-time = "2026-07-19T00:16:44.662Z" }, + { url = "https://files.pythonhosted.org/packages/81/b6/a40dfa0dc6224b36f620c00296eacc830489cbf8c2837b6750dfe6170375/regex-2026.7.19-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e50d748a32da622f256e8d505867f5d3c43a837c6a9f0efb149655fadd1042a", size = 861723, upload-time = "2026-07-19T00:16:46.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/02/735991dee71abd83196a7962f7ed8bf5aa05720ff06e2d3ff896a85e2bbb/regex-2026.7.19-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf1516fe58fc104f39b2d1dbe2d5e27d0cd45c4be2e42ba6ee0cc763701ec3c7", size = 905932, upload-time = "2026-07-19T00:16:47.956Z" }, + { url = "https://files.pythonhosted.org/packages/45/6c/e7098d8b846ccdbf431d8c081b61e496526a27a28094ed09e0dce21b3f54/regex-2026.7.19-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09f3e5287f94f17b709dc9a9e70865855feee835c861613be144218ce4ca82cc", size = 801407, upload-time = "2026-07-19T00:16:49.43Z" }, + { url = "https://files.pythonhosted.org/packages/8a/18/34b69274e2649bcc7d9b089c2b2983fb2632d8ecf667e359593be9072e79/regex-2026.7.19-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6383cd2ed53a646c659ba1fe65727db76437fdaa069e697a0b44a51d5843d864", size = 774448, upload-time = "2026-07-19T00:16:51.352Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e6/0a72247d025585fd3800b98e040b84d562a88af6303347100484849f4f01/regex-2026.7.19-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:09d3007fc76249a83cdd33de160d50e6cb77f54e09d8fa9e7148e10607ce24af", size = 783297, upload-time = "2026-07-19T00:16:53.071Z" }, + { url = "https://files.pythonhosted.org/packages/b1/aa/c4f65ae7dd02a36b323a70c4cff326e1f3442361aaebc9311100a130d54f/regex-2026.7.19-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f8c6e7a1cfa3dc9d0ee2de0e65e834537fa29992cc3976ffec914afc35c5dd5", size = 854736, upload-time = "2026-07-19T00:16:54.607Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/668082bcc817b9e694189b84997aeba7385b7779faa6711788679c482e35/regex-2026.7.19-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b2ea4a3e8357be8849e833beeae757ac3c7a6b3fc055c03c808a53c91ad30d82", size = 763298, upload-time = "2026-07-19T00:16:56.289Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fb/2d07ad555e7af88aa5f867fdafa47a8d945ee237c20af3ebceb46a820835/regex-2026.7.19-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:80115dd39481fd3a4b4080220799dbcacb921a844de4b827264ececacbe17c78", size = 844430, upload-time = "2026-07-19T00:16:57.933Z" }, + { url = "https://files.pythonhosted.org/packages/51/15/c82a471fe3dce56f03745635b43aa456c40dc0db089e07ef148b331507d1/regex-2026.7.19-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6ce43a0269d68cee79a7d1ade7def53c20f8f2a047b92d7b5d5bcc73ae88327", size = 789683, upload-time = "2026-07-19T00:16:59.583Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f4/7532a2c59d56f5398902c20de60f0c9a5d1cd364e42a051b48e1b210be7b/regex-2026.7.19-cp311-cp311-win32.whl", hash = "sha256:9be2a6647740dd3cca6acb24e87f03d7632cd280dbce9bbe40c26353a215a45d", size = 266778, upload-time = "2026-07-19T00:17:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/cf1bc631db154eb95520d9d5dbc2371ff77a0f014bbf7d748fed8496aa63/regex-2026.7.19-cp311-cp311-win_amd64.whl", hash = "sha256:8d3469c91dd92ee41b7c95280edbd975ef1ba9195086686623a1c6e8935ce965", size = 277983, upload-time = "2026-07-19T00:17:02.571Z" }, + { url = "https://files.pythonhosted.org/packages/8d/bd/56ceaf170e875d5a6761bf2bfd0d040f1cacc896850d5e40cb29b11bbd06/regex-2026.7.19-cp311-cp311-win_arm64.whl", hash = "sha256:36aacfb15faaff3ced55afbf35ec72f50d4aee22082c4f7fe0573a33e2fca92e", size = 276961, upload-time = "2026-07-19T00:17:04.135Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b9/d11d7e501ac8fd7d617684423ebb9561e0b998481c1e4cbc0cb212c5d74a/regex-2026.7.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2cc3460cedf7579948486eab03bc9ad7089df4d7281c0f47f4afe03e8d13f02d", size = 496778, upload-time = "2026-07-19T00:17:05.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a9/a5ab6f312f24318019170dc485d5421fe4f89e43a98640da50d95a8a7041/regex-2026.7.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0e9554c8785eac5cffe6300f69a91f58ba72bc88a5f8d661235ad7c6aa5b8ccd", size = 297122, upload-time = "2026-07-19T00:17:07.59Z" }, + { url = "https://files.pythonhosted.org/packages/b3/63/4cab4d7f2d384a144d420b763d97674cb70619c878ea6fcd7640d0e62143/regex-2026.7.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7da47a0f248977f08e2cb659ff3c17ddc13a4d39b3a7baa0a81bf5b415430f6", size = 292009, upload-time = "2026-07-19T00:17:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/102a81b218298957d4ea7d2f084fae537a71add9d6ff93c8e67284c5f45e/regex-2026.7.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93db40c8de0815baab96a06e08a984bac71f989d13bab789e382158c5d426797", size = 796708, upload-time = "2026-07-19T00:17:11.542Z" }, + { url = "https://files.pythonhosted.org/packages/78/b5/dc136af5629938a037cd2b304c12240e132ec92f38be8ff9cc89af2a1f2d/regex-2026.7.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:66bd62c59a5427746e8c44becae1d9b99d22fb13f30f492083dfb9ad7c45cc18", size = 865651, upload-time = "2026-07-19T00:17:13.312Z" }, + { url = "https://files.pythonhosted.org/packages/e0/75/67402ae3cd9c8c988a4c805d15ee3eef015e7ca4cb112cf3e640fc1f4153/regex-2026.7.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1649eb39fcc9ea80c4d2f110fde2b8ab2aef3877b98f02ab9b14e961f418c511", size = 911756, upload-time = "2026-07-19T00:17:15.015Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8e/096d00c7c480ef2ff4265349b14e2261d4ab787ba1f74e2e80d1c58079c3/regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dce8ec9695f531a1b8a6f314fd4b393adcccf2ea861db480cdf97a301d01a68", size = 801798, upload-time = "2026-07-19T00:17:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/41/e7ecac6edb5722417f85cc67eaf386322fbe8acf6918ec2fdc37c20dd9d0/regex-2026.7.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3080a7fd38ef049bd489e01c970c97dd84ff446a885b0f1f6b26d9b1ad13ce11", size = 776933, upload-time = "2026-07-19T00:17:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/6f/69/03c9b3f058d66403e0ca2c938696e81d51cd4c6d47ec5265f02f96948d9a/regex-2026.7.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d793a7988e04fcb1e2e135567443d82173225d657419ec09414a9b5a145b986", size = 784338, upload-time = "2026-07-19T00:17:21.057Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f7/b38ab3d43f284afbb618fcd15d0e77eb786ae461ce1f6bc7494619ddc0f2/regex-2026.7.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e8b0abe7d870f53ca5143895fef7d1041a0c831a140d3dc2c760dd7ba25d4a8b", size = 860452, upload-time = "2026-07-19T00:17:23.119Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/ff60ef0571121714f3cf9920bc183071e384a10b556d042e0fdb06cc07a5/regex-2026.7.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4e5413bd5f13d3a4e3539ca98f70f75e7fca92518dd7f117f030ebedd10b60cb", size = 765958, upload-time = "2026-07-19T00:17:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0f/bd34021162c0ab47f9a315bd56cd5642e920c8e5668a75ef6c6a6fca590d/regex-2026.7.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:73b133a9e6fb512858e7f065e96f1180aa46646bc74a83aea62f1d314f3dd035", size = 851765, upload-time = "2026-07-19T00:17:26.993Z" }, + { url = "https://files.pythonhosted.org/packages/2a/20/a2ca43edade0595cccfdc98636739f536d9e26898e7dbddc2b9e98898953/regex-2026.7.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbe6493fbd27321b1d1f2dd4f5c7e5bd4d8b1d7cab7f32fd67db3d0b2ed8248a", size = 789714, upload-time = "2026-07-19T00:17:28.699Z" }, + { url = "https://files.pythonhosted.org/packages/5d/47/e02db4015d424fc83c00ea0ac8c5e5ec14397943de9abf909d5ce3a25931/regex-2026.7.19-cp312-cp312-win32.whl", hash = "sha256:ddd67571c10869f65a5d7dde536d1e066e306cc90de57d7de4d5f34802428bb5", size = 267157, upload-time = "2026-07-19T00:17:31.051Z" }, + { url = "https://files.pythonhosted.org/packages/08/8e/c780c131f79b42ed22d1bd7da4096c2c35f813e835acd02ef0f018bd892c/regex-2026.7.19-cp312-cp312-win_amd64.whl", hash = "sha256:e30d40268a28d54ce0437031750497004c22602b8e3ab891f759b795a003b312", size = 277777, upload-time = "2026-07-19T00:17:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3d/84165e4299ff76f3a40fe1f2abf939e976f693383a08d2beea6af62bd2c1/regex-2026.7.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f035d9dc1d25eff9d361456572231c7d27b5ccd473ca7dc0adfce732bd006d40", size = 496552, upload-time = "2026-07-19T00:17:36.808Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/a65293e6e4cf28eb7ee1be5335a5386c40d6742e9f47fafc8fec785e16c7/regex-2026.7.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42572142ed0b9d5d261ba727157c426510da78e20828b66bbb855098b8a4e38", size = 296983, upload-time = "2026-07-19T00:17:38.816Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/2d0564e93d87bc48618360ddca232a2ca612bbdf53ce8465d45ca5ce14ee/regex-2026.7.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40b34dd88658e4fedd2fddbf0275ac970d00614b731357f425722a3ed1983d11", size = 291832, upload-time = "2026-07-19T00:17:40.726Z" }, + { url = "https://files.pythonhosted.org/packages/07/cd/42dfbabff3dfc9603c501c0e2e2c5adbb09d127b267bf5348de0af338c15/regex-2026.7.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c41c63992bf1874cebb6e7f56fd7d3c007924659a604ae3d90e427d40d4fd13", size = 796775, upload-time = "2026-07-19T00:17:42.382Z" }, + { url = "https://files.pythonhosted.org/packages/df/5d/f6a4839f2b934e3eed5973fd07f5929ee97d4c98939fb275ea23c274ee16/regex-2026.7.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d3372064506b94dd2c67c845f2db8062e9e9ba84d04e33cb96d7d33c11fe1ae", size = 865687, upload-time = "2026-07-19T00:17:44.185Z" }, + { url = "https://files.pythonhosted.org/packages/14/b0/b47d6c36049bc59806a50bd4c86ced70bbe058d787f80281b1d7a9b0e024/regex-2026.7.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fce7760bf283405b2c7999cab3da4e72f7deca6396013115e3f7a955db9760da", size = 911962, upload-time = "2026-07-19T00:17:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/2a/be/ff61f28f9273658cfe23acbbac5217221f6519960ed401e61dfdab12bc35/regex-2026.7.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0d702548d89d572b2929879bc883bb7a4c4709efafe4512cadee56c55c9bd15", size = 801817, upload-time = "2026-07-19T00:17:48.25Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bb/8b4f7f26b333f9f79e1b453613c39bb4776f51d38ae66dd0ba31d6b354ca/regex-2026.7.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d446c6ac40bb6e05025ccee55b84d80fe9bf8e93010ffc4bb9484f13d498835f", size = 776908, upload-time = "2026-07-19T00:17:50.183Z" }, + { url = "https://files.pythonhosted.org/packages/09/13/610110fc5921d380516d03c26b652555f08aa0d23ea78a771231873c3638/regex-2026.7.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c3501bfa814ab07b5580741f9bf78dfdfe146a04057f82df9e2402d2a975939", size = 784426, upload-time = "2026-07-19T00:17:52.454Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f5/1ef9e2a83a5947c57ebff0b377cb5727c3d5ec1992317a320d035cd0dbb6/regex-2026.7.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c4585c3e64b4f9e583b4d2683f18f5d5d872b3d71dcf24594b74ecc23602fa96", size = 860600, upload-time = "2026-07-19T00:17:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/a0/02/073af33a3ec149241d11c80acea91e722aa0adbf05addd50f251c4fe89c3/regex-2026.7.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:571fde9741eb0ccde23dd4e0c1d50fbae910e901fa7e629faf39b2dda740d220", size = 765950, upload-time = "2026-07-19T00:17:56.041Z" }, + { url = "https://files.pythonhosted.org/packages/81/a9/d1e9f819dc394a568ef370cd56cf25394e957a2235f8370f23b576e5a475/regex-2026.7.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:15b364b9b98d6d2fe1a85034c23a3180ff913f46caddc3895f6fd65186255ccc", size = 851794, upload-time = "2026-07-19T00:17:57.897Z" }, + { url = "https://files.pythonhosted.org/packages/03/3a/8ae83eda7579feacdf984e71fb9e70635fb6f832eeddca58427ec4fca926/regex-2026.7.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffd8893ccc1c2fce6e0d6ca402d716fe1b29db70c7132609a05955e31b2aa8f2", size = 789845, upload-time = "2026-07-19T00:17:59.97Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/c195cbfe5a75fdec64d8f6554fd15237b837919d2c61bdc141d7c807b08b/regex-2026.7.19-cp313-cp313-win32.whl", hash = "sha256:f0fa4fa9c3632d708742baf2282f2055c11d888a790362670a403cbf48a2c404", size = 267135, upload-time = "2026-07-19T00:18:01.958Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/a11de8404b7272b70acb45c1c05987cce60b45d5693da2e176f0e390d564/regex-2026.7.19-cp313-cp313-win_amd64.whl", hash = "sha256:d51ffd3427640fa2da6ade574ceba932f210ad095f65fcc450a2b0a0d454868e", size = 277747, upload-time = "2026-07-19T00:18:04.121Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/0f5c8eff1b4f1f3d83276d365fccecf666afcc7d947420943bf394d07adb/regex-2026.7.19-cp313-cp313-win_arm64.whl", hash = "sha256:c670fe7be5b6020b76bc6e8d2196074657e1327595bca93a389e1a76ab130ad8", size = 277129, upload-time = "2026-07-19T00:18:05.821Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4c/44b74742052cedda40f9ae469532a037112f7311a36669a891fba8984bb0/regex-2026.7.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db47b561c9afd884baa1f96f797c9ca369872c4b65912bc691cfa99e68340af2", size = 501134, upload-time = "2026-07-19T00:18:07.567Z" }, + { url = "https://files.pythonhosted.org/packages/f0/45/bbd038b5e39ee5613a5a689290145b40058cc152c41de9cc23639d2b9734/regex-2026.7.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65dcd28d3eba2ab7c2fd906485cc301392b47cc2234790d27d4e4814e02cdfda", size = 299418, upload-time = "2026-07-19T00:18:09.38Z" }, + { url = "https://files.pythonhosted.org/packages/65/38/c5bde94b4cedfd5850d64c3f08222d8e1600e84f6ee71d9b44b4b8163f74/regex-2026.7.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f2e7f8e2ab6c2922be02c7ec45185aa5bd771e2e57b95455ee343a44d8130dff", size = 294486, upload-time = "2026-07-19T00:18:11.188Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6a/2f5e107cb26c960b781967178899daf2787a7ab151844ed3c01d6fc95474/regex-2026.7.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe31f28c94402043161876a258a9c6f757cb485905c7614ce8d6cd40e6b7bdc1", size = 811643, upload-time = "2026-07-19T00:18:12.975Z" }, + { url = "https://files.pythonhosted.org/packages/37/d4/a2f963406d7d73a62eed84ba05a258afb6cad1b21aa4517443ce40506b78/regex-2026.7.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f8f6fa298bb4f7f58a33334406218ba74716e68feddf5e4e54cd5d8082705abf", size = 871081, upload-time = "2026-07-19T00:18:14.733Z" }, + { url = "https://files.pythonhosted.org/packages/45/a3/44be546340bedb15f13063f5e7fe16793ea4d9ea2e805d09bd174ac27724/regex-2026.7.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cc1b2440423a851fad781309dd87843868f4f66a6bcd1ddb9225cf4ec2c84732", size = 917372, upload-time = "2026-07-19T00:18:16.724Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f6/e0870b0fd2a40dba0074e4b76e514b21313d37946c9248453e34ec43923e/regex-2026.7.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ac59a0900474a52b7c04af8196affc22bd9842acb0950df12f7b813e983609a", size = 816089, upload-time = "2026-07-19T00:18:18.617Z" }, + { url = "https://files.pythonhosted.org/packages/ae/27/957e8e22690ad6634572b39b71f130a6105f4d0718bb16849eac00fff147/regex-2026.7.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4896db1f4ce0576765b8272aa922df324e0f5b9bb2c3d03044ff32a7234a9aba", size = 785206, upload-time = "2026-07-19T00:18:20.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/a4/186e410941e731037c01166069ab86da9f65e8f8110c18009ccf4bd623ee/regex-2026.7.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4e6883a021db30511d9fb8cfb0f222ce1f2c369f7d4d8b0448f449a93ba0bdfc", size = 800431, upload-time = "2026-07-19T00:18:22.716Z" }, + { url = "https://files.pythonhosted.org/packages/73/9f/e4e10e023d291d64a33e246610b724493bf1ce98e0e59c9b7c837e5acfb7/regex-2026.7.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:09523a592938aa9f587fb74467c63ff0cf88fc3df14c82ab0f0517dcf76aaa62", size = 864906, upload-time = "2026-07-19T00:18:24.772Z" }, + { url = "https://files.pythonhosted.org/packages/24/57/ccb20b6be5f1f52a053d1ba2a8f7a077edb9d918248b8490d7506c6832b3/regex-2026.7.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1ebac3474b8589fce2f9b225b650afd61448f7c73a5d0255a10cc6366471aed1", size = 773559, upload-time = "2026-07-19T00:18:27.008Z" }, + { url = "https://files.pythonhosted.org/packages/a3/82/f3b263cf8fad927dc102891da8502e718b7ff9d19af7a2a07c03865d7188/regex-2026.7.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4a0530bb1b8c1c985e7e2122e2b4d3aedd8a3c21c6bfddae6767c4405668b56e", size = 857739, upload-time = "2026-07-19T00:18:29.107Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/1687bd1b6c2aed5e672ccf845fc11557821fe7366d921b50889ea5ce57bf/regex-2026.7.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef7eeb108c47ce7bcc9513e51bcb1bf57e8f483d52fce68a8642e3527141ae0", size = 804522, upload-time = "2026-07-19T00:18:31.362Z" }, + { url = "https://files.pythonhosted.org/packages/76/7c/cc4e7655181b2d9235b704f2c5e19d8eff002bbc437bae59baee0e381aca/regex-2026.7.19-cp313-cp313t-win32.whl", hash = "sha256:64b6ca7391a1395c2638dd5c7456d67bea44fc6c5e8e92c5dc8aa6a8f23292b4", size = 269141, upload-time = "2026-07-19T00:18:33.479Z" }, + { url = "https://files.pythonhosted.org/packages/bb/14/961b4c7b05a2391c32dbc85e27773076671ef8f97f36cec70fe414734c02/regex-2026.7.19-cp313-cp313t-win_amd64.whl", hash = "sha256:f04b9f56b0e0614c0126be12c2c2d9f8850c1e57af302bd0a63bed379d4af974", size = 280036, upload-time = "2026-07-19T00:18:35.419Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/795644550d788ddbb6dc458c95895f8009978ea6d6ea76b005eb3f45e8c9/regex-2026.7.19-cp313-cp313t-win_arm64.whl", hash = "sha256:fcee38cd8e5089d6d4f048ba1233b3ad76e5954f545382180889112ff5cb712d", size = 279394, upload-time = "2026-07-19T00:18:37.454Z" }, + { url = "https://files.pythonhosted.org/packages/d2/25/0c4c452f8ef3efe456745b2f33195f5904b573fb4c2ff3f0cb9ec188461e/regex-2026.7.19-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a81758ed242b861b72e778ba34d41366441a2e10b16b472784c88da2dea7e2dd", size = 496750, upload-time = "2026-07-19T00:18:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/24/9e/b70ca6c1704f6c7cd32a9e143c86cc5968d10981eca284bad670c245ea7d/regex-2026.7.19-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4aa5435cdb3eb6f55fe98a171b05e3fbcd95fadaa4aa32acf62afd9b0cfdbcac", size = 297093, upload-time = "2026-07-19T00:18:41.583Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/0b692da2520d51fbff19c88b83d97e4c702909dd02386c585998b7e2dbed/regex-2026.7.19-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:60be8693a1dadc210bbcbc0db3e26da5f7d01d1d5a3da594e99b4fa42df404f5", size = 292043, upload-time = "2026-07-19T00:18:43.347Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a7/1d478e614016045a33feae57446215f9fd65b665a5ceb2f891fb3183bc52/regex-2026.7.19-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d19662dbedbe783d323196312d38f5ba53cf56296378252171985da6899887d3", size = 797214, upload-time = "2026-07-19T00:18:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ae/11b9c9411d92c30e3d2db32df5a31133e4a99a8fc397a604fd08f6c4bffb/regex-2026.7.19-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d15df07081d91b76ff20d43f94592ee110330152d617b730fdbe5ef9fb680053", size = 866433, upload-time = "2026-07-19T00:18:47.315Z" }, + { url = "https://files.pythonhosted.org/packages/b1/62/2b2efc4992f91d6d204b24c647c9f9412e85379d92b7c0ab9fdae622327e/regex-2026.7.19-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:56ad4d9f77df871a99e25c37091052a02528ec0eb059de928ee33956b854b45b", size = 911360, upload-time = "2026-07-19T00:18:49.588Z" }, + { url = "https://files.pythonhosted.org/packages/14/71/986ceea9aa3da548bf1357cad89b63915ec6d21ec957c8113b29ece567df/regex-2026.7.19-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7322ec6cc9fba9d49ab888bb82d67ac5625627aa168f0165139b17018df3fb8a", size = 801275, upload-time = "2026-07-19T00:18:51.767Z" }, + { url = "https://files.pythonhosted.org/packages/15/be/ce9d9534b2cda96eab32c548261224b9b4e220a4126f098f60f42ae7b4cd/regex-2026.7.19-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9c7472192ebfad53a6be7c4a8bfb2d64b81c0e93a1fc8c57e1dd0b638297b5d1", size = 777131, upload-time = "2026-07-19T00:18:54.053Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/58b5c710f2c3929515a25f3a1ca0dad0dcd4518d4fff3cf23bc7adb8dcd2/regex-2026.7.19-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c10b82c2634df08dfb13b1f04e38fe310d086ee092f4f69c0c8da234251e556e", size = 785020, upload-time = "2026-07-19T00:18:56.579Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/5fe091935b74f15fe0f97998c215cae418d1c0413f6258c7d4d2e83aa37f/regex-2026.7.19-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:17ed5692f6acc4183e98331101a5f9e4f64d72fe58b753da4d444a2c77d05b12", size = 861263, upload-time = "2026-07-19T00:18:58.64Z" }, + { url = "https://files.pythonhosted.org/packages/d8/fa/d60bf82e10841eef62a9e32aac401468f05fddfbcb2942e342b1ba3d2433/regex-2026.7.19-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:22a992de9a0d91bda927bf02b94351d737a0302905432c88a53de7c4b9ce62e2", size = 766199, upload-time = "2026-07-19T00:19:00.705Z" }, + { url = "https://files.pythonhosted.org/packages/bf/5d/11e64d151b0662b81d6bf644c74dc118d461df85bdf2577fadbbf751788a/regex-2026.7.19-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:618a0aed532be87294c4477b0481f3aa0f1520f4014a4374dd4cf789b4cd2c97", size = 851317, upload-time = "2026-07-19T00:19:03.015Z" }, + { url = "https://files.pythonhosted.org/packages/7c/34/532efb87488d90807bae6a443d357ee5e2728a478c597619c8aaa17cc0bd/regex-2026.7.19-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ce9e679f776649746729b6c86382da519ef649c8e34cc41df0d2e5e0f6c36d4", size = 789557, upload-time = "2026-07-19T00:19:05.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/90/3a8d5ca977171ec3ae21a71207d2228b2663bde14d7f7ef0e6363ecf9290/regex-2026.7.19-cp314-cp314-win32.whl", hash = "sha256:73f272fba87b8ccfe70a137d02a54af386f6d27aa509fbffdd978f5947aae1aa", size = 272531, upload-time = "2026-07-19T00:19:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/96/e1/8862885e70409de70e8c005f57fb2e7be8d9ef0317250d60f4c9660a300d/regex-2026.7.19-cp314-cp314-win_amd64.whl", hash = "sha256:d721e53758b2cca74990185eb0671dd466d7a388a1a45d0c6f4c13cef41a68ac", size = 280831, upload-time = "2026-07-19T00:19:09.46Z" }, + { url = "https://files.pythonhosted.org/packages/08/82/2693e53e29f9104d9de95d37ce4dd826bd32d5f9c0085d3aa6ac042675c4/regex-2026.7.19-cp314-cp314-win_arm64.whl", hash = "sha256:65fa6cb38ed5e9c3637e68e544f598b39c3b86b808ed0627a67b68320384b459", size = 281099, upload-time = "2026-07-19T00:19:11.398Z" }, + { url = "https://files.pythonhosted.org/packages/92/b7/9a01aa16461a18cde9d7b9c3ab21e501db2ce33725f53014342b91df2b0a/regex-2026.7.19-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:5a2721c8720e2cb3c209925dfb9200199b4b07361c9e01d321719404b21458b3", size = 501121, upload-time = "2026-07-19T00:19:13.425Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/bbaeca815dc9191c424c94a4fdc5c87c75748a64a6271821212ebdd4e1a3/regex-2026.7.19-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:199535629f25caf89698039af3d1ad5fcae7f933e2112c73f1cdf49165c99518", size = 299415, upload-time = "2026-07-19T00:19:15.43Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d6/0dd1a321afaab95eb7ff44aa0f637301786f1dc71c6b797b9ed236ed8890/regex-2026.7.19-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9b60d7814174f059e5de4ab98271cc5ba9259cfea55273a81544dceea32dc8d9", size = 294483, upload-time = "2026-07-19T00:19:17.879Z" }, + { url = "https://files.pythonhosted.org/packages/92/5f/40bacf91d0904f812e13bbbab3864604c463eced8afdc54aeaa50492ea95/regex-2026.7.19-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbece16025afda5e3031af0c4059207e61dcf73ef13af844964f57f387d1c435", size = 811833, upload-time = "2026-07-19T00:19:20.102Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/4902744261f775aeede8b5627314b38482da29cf49a57b66a6fb753246c5/regex-2026.7.19-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d24ecb4f5e009ea0bd275ee37ad9953b32005e2e5e60f8bbae16da0dbbf0d3a0", size = 871270, upload-time = "2026-07-19T00:19:22.365Z" }, + { url = "https://files.pythonhosted.org/packages/16/70/6980c9be6bf21c0a60ed3e0aea39cf419ecf3b08d1d9947bc56e196ef186/regex-2026.7.19-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8cae6fd77a5b72dae505084b1a2ee0360139faf72fedbab667cd7cc65aae7a6a", size = 917534, upload-time = "2026-07-19T00:19:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/52/92/8b2bd872782ce8c42691e39acb38eb8efe014e5ddb78ad7d943d6f197ce9/regex-2026.7.19-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9724e6cb5e478cd7d8cabf027826178739cb18cf0e117d0e32814d479fa02276", size = 816135, upload-time = "2026-07-19T00:19:26.919Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/33a602f657bdc4041f17d79f92ab18261d255d91a06117a6e29df023e5e2/regex-2026.7.19-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:572fc57b0009c735ee56c175ea021b637a15551a312f56734277f923d6fd0f6c", size = 785492, upload-time = "2026-07-19T00:19:29.192Z" }, + { url = "https://files.pythonhosted.org/packages/9e/36/0987cf4cb271680064a70d24a475873775a151d0b7058698a006cb0cae4a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:20568e182eb82d39a6bf7cff3fd58566f14c75c6f74b2c8c96537eecf9010e3a", size = 800658, upload-time = "2026-07-19T00:19:31.392Z" }, + { url = "https://files.pythonhosted.org/packages/a8/24/c14f31c135e1ba55fa4f9a58ca98d0842512bf6188230763c31c8f449e3b/regex-2026.7.19-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:1d58561843f0ff7dc78b4c28b5e2dc388f3eff94ebc8a232a3adba961fc00009", size = 865073, upload-time = "2026-07-19T00:19:33.485Z" }, + { url = "https://files.pythonhosted.org/packages/14/85/181a12211f22469f24d2de1ebddfe397d2396e2c29013b9a58134a91069a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:61bb1bd45520aacd56dd80943bd34991fb5350afdd1f36f2282230fd5154a218", size = 773684, upload-time = "2026-07-19T00:19:35.599Z" }, + { url = "https://files.pythonhosted.org/packages/23/58/bd1a0c1a62251366f8d21f41b1ea3c76994962071b8b6ea42f72d505c0f0/regex-2026.7.19-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:cd3584591ea4429026cdb931b054342c2bcf189b44ff367f8d5c15bc092a2966", size = 857769, upload-time = "2026-07-19T00:19:37.738Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4f/f7e2dad6756b2fe1fe75dd90a628c3b45f249d39f948dd90cd2476325417/regex-2026.7.19-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cc26a66e212fa5d6c6170c3a40d99d888db3020c6fdab1523250d4341382e44", size = 804546, upload-time = "2026-07-19T00:19:40.229Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d7/01d31d5bdb09bc026fab77f59a371fdf8f9b292e4810546c56182ca70498/regex-2026.7.19-cp314-cp314t-win32.whl", hash = "sha256:2c4e61e2e1be56f63ec3cc618aa9e0de81ef6f43d177205451840022e24f5b78", size = 274526, upload-time = "2026-07-19T00:19:42.398Z" }, + { url = "https://files.pythonhosted.org/packages/52/0e/cea4ce73bc0a8247a0748228ae6669984c7e1f8134b6fa66e59c0572e0ea/regex-2026.7.19-cp314-cp314t-win_amd64.whl", hash = "sha256:c639ea314df70a7b2811e8020448c75af8c9445f5a60f8a4ced81c306a9380c2", size = 283763, upload-time = "2026-07-19T00:19:44.644Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b6/26e41975febae63b7a6e3e02f32cff6cff2e4f10d19c929082f56aebf7c6/regex-2026.7.19-cp314-cp314t-win_arm64.whl", hash = "sha256:9a15e785f244f3e07847b984ce8773fc3da10a9f3c131cc49a4c5b4d672b4547", size = 283451, upload-time = "2026-07-19T00:19:46.639Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, +] + +[[package]] +name = "setuptools" +version = "84.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, +] + +[[package]] +name = "setuptools-rust" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "semantic-version" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/ba/b31781d61bf9ee3c232a1d1160db11c11cdeae1d44e06c90723b25a8279f/setuptools_rust-1.13.0.tar.gz", hash = "sha256:f2afcf4baeee689910ce49cfa8aad4e08cce72f417449bcc32891b8664fdc726", size = 314100, upload-time = "2026-06-27T21:45:02.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/80/909e46e684e47b116ed145bf2a1a8f5f7c9d90e8c3f8f7fce6a529c0068d/setuptools_rust-1.13.0-py3-none-any.whl", hash = "sha256:666439c4d90e968bb625bcf87ec0aa02b4f49e599d2f5dc255c633a04e8eca99", size = 30536, upload-time = "2026-06-27T21:45:01.583Z" }, +] + +[[package]] +name = "tiktoken" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/4c/1bc81f4cd53e827c4ee67ca951b5935724716049452d8dfa09b8b82372bb/tiktoken-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7bfe1849caa65d1e1d9871817170ec497bbb7984e182012e1bdce72f66608cdb", size = 1036353, upload-time = "2026-05-15T04:50:21.757Z" }, + { url = "https://files.pythonhosted.org/packages/75/91/10b9c7076bc02c246c853201fdbbe300a4b8c5ed7b84c25f7403f4e32655/tiktoken-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26", size = 984644, upload-time = "2026-05-15T04:50:23.256Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e4/fceae98015fab47fcd49b8bd7f46145bcd187a47e0add1e5378ed67ef980/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4", size = 1119261, upload-time = "2026-05-15T04:50:24.348Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/fe42ad00de01a8c4a49ad8649a2c8a316835a9cad5961b11d21eac0020a5/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173", size = 1138253, upload-time = "2026-05-15T04:50:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/ccee1ecccca107e9a16efcecdeeb964c325305038554d466ece65b42338f/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff", size = 1185747, upload-time = "2026-05-15T04:50:27.02Z" }, + { url = "https://files.pythonhosted.org/packages/9d/03/cd0cba295522b91eb55c6b2704f1df895f8226cfe60ab10d4d51d0cc9e69/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed", size = 1241265, upload-time = "2026-05-15T04:50:28.815Z" }, + { url = "https://files.pythonhosted.org/packages/7e/25/a10efd564402d82c2ff50d12057353ace447aa8007deceaa48641f63d35c/tiktoken-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc1c44cd37b43fc46bae593129164f4f281e82ea116b57a85aa81bda57eafc94", size = 876509, upload-time = "2026-05-15T04:50:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/85/8e/144bde4e01df66b34bb865557c7cd754ed08b036217ebd79c9db5e9048a9/tiktoken-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:32ac870a806cfb260a02d0cb70426aef02e038297f8ad50df5040bb5af360791", size = 1034888, upload-time = "2026-05-15T04:50:31.579Z" }, + { url = "https://files.pythonhosted.org/packages/36/18/d4ac9d20956cdebca04841316660ed584c2fecdc2b81722a28bc7ad3b1e4/tiktoken-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b", size = 982970, upload-time = "2026-05-15T04:50:32.961Z" }, + { url = "https://files.pythonhosted.org/packages/74/ed/6bb8d05b9f731f749fee5c6f5ca63e981143c826a5985877330507bd13b7/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7", size = 1115741, upload-time = "2026-05-15T04:50:34.475Z" }, + { url = "https://files.pythonhosted.org/packages/34/de/2ca96b07a82d972b74fe4b46de055b79c904e45c7eab699354a0bfa697dc/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649", size = 1136523, upload-time = "2026-05-15T04:50:35.782Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/9dafec002c2d4424378563cf4cf5c7fb93631d2a55013c8b87554ee4012c/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b", size = 1181954, upload-time = "2026-05-15T04:50:36.99Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d0/1f8578c45b2f24759b46f0b50d31878c63c73e6bf0f2227e10ec5c5408dc/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91", size = 1240069, upload-time = "2026-05-15T04:50:38.221Z" }, + { url = "https://files.pythonhosted.org/packages/aa/90/28d7f154888610aa9237e541986beb62b479df29d193a5a0617dbb1514d0/tiktoken-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f2d16e7a7c783ad81f36e457d046d1f1c8af70b22aec8a13238efe531977c41", size = 874748, upload-time = "2026-05-15T04:50:39.587Z" }, + { url = "https://files.pythonhosted.org/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228, upload-time = "2026-05-15T04:50:40.988Z" }, + { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978, upload-time = "2026-05-15T04:50:42.195Z" }, + { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355, upload-time = "2026-05-15T04:50:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772, upload-time = "2026-05-15T04:50:44.782Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415, upload-time = "2026-05-15T04:50:46.422Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879, upload-time = "2026-05-15T04:50:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829, upload-time = "2026-05-15T04:50:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600, upload-time = "2026-05-15T04:50:50.4Z" }, + { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516, upload-time = "2026-05-15T04:50:52.03Z" }, + { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518, upload-time = "2026-05-15T04:50:53.543Z" }, + { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867, upload-time = "2026-05-15T04:50:55.191Z" }, + { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826, upload-time = "2026-05-15T04:50:56.296Z" }, + { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, + { url = "https://files.pythonhosted.org/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820, upload-time = "2026-05-15T04:50:59.528Z" }, + { url = "https://files.pythonhosted.org/packages/8c/93/0dd6adca026a616c3a92974566b43381eea4b475ce1f36c062b8271a9ac5/tiktoken-0.13.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaaaef47c2406277181d2086484c317bf7fc433e2d5d03ff94f56b0dcec87471", size = 1034977, upload-time = "2026-05-15T04:51:00.957Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5ec6e6bc5b30bed6d93f7f2162d8f6b32437b3ba27cb527cfe004f6109c9/tiktoken-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ca8b310bd93b3772cb1b7922d915446864860f562bdfe4825c63a0aed3fb28cd", size = 983635, upload-time = "2026-05-15T04:51:02.629Z" }, + { url = "https://files.pythonhosted.org/packages/94/b0/c8ae9aff00d625c50659b4513e707a0462c4bf5d4d6cc1b802103225c02e/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:32e0c12305105002c047b3bb1070b0dd9a73b0cb3b2856a8972b810e7a4f5881", size = 1116036, upload-time = "2026-05-15T04:51:04.082Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ac/6a5dddd1d0a6018ecb389bd0353e6b4a515eb4d2286611bd0ace1937b9e1/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:5ba5fd62507a932d1241346179e3b39bc7bf7408f03c272652d93b3bedf5db24", size = 1135544, upload-time = "2026-05-15T04:51:05.229Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b8/585032b4384b2f7dcdaddcb52865c83a701a420d09e3c2b4a2be1c450c57/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d108bc2d470fc53c8ecd24f2c0fd2b5f98c33e87cdb6aa2e9b8c5dced703d273", size = 1182217, upload-time = "2026-05-15T04:51:06.517Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b6/993ff1ded3958215fd341a847b8e5ffeb5de473f435296870d314fc91ac4/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb99cb5127449f58d0a2d5f5ccfb390d8dbdfd919c221246caaee29d8725ed51", size = 1239404, upload-time = "2026-05-15T04:51:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3d/fef7e06e3b33e7538db0ced734cf9fe23b6832d2ac4990c119c377aec55e/tiktoken-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:115c4f26ffa11caac8b54eea35c2ad38c612c20a48d35dd15d70a02ac6f51f58", size = 918686, upload-time = "2026-05-15T04:51:08.925Z" }, + { url = "https://files.pythonhosted.org/packages/c1/82/a7fc44582bc32ab00de988a2299bf77c077f59068b233109e34b7d6ca7e6/tiktoken-0.13.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:472527e9132952f2fbf77cd290658bacf003d4d5a3fabc18e5fbd407cbae4d9b", size = 1034454, upload-time = "2026-05-15T04:51:10.035Z" }, + { url = "https://files.pythonhosted.org/packages/37/d0/24d8a890c14f432a05cea669c17bebeaa99f96a7c79523b590f564246411/tiktoken-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e2f67d27c9626cdd25fe33d9313c5cdb3d8d82da646b68d6eb8e7e9c20e6448", size = 982976, upload-time = "2026-05-15T04:51:11.23Z" }, + { url = "https://files.pythonhosted.org/packages/49/b7/2ab43f62788a9266187a9bfc1d3af99ad83e5eaa25fbef168a69cd5ad14f/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2b920b35805cd64585a37c3dc7ce65fba4d2d36016be01e1d7942482ca29093a", size = 1115526, upload-time = "2026-05-15T04:51:12.608Z" }, + { url = "https://files.pythonhosted.org/packages/64/39/1494321ed323ce7a14d88e3cd6cb9058625977df1c6961ddc492bd10a9f3/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:493af3aa28a4aaf2e3d2600a2ee717252c9bf5ab38fff94eb5a02db5ab77e5ad", size = 1136466, upload-time = "2026-05-15T04:51:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/96/d9/dfd086aa2d918c563a140720e0ce296cada1634efd2783d5cf51e05f984e/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6644c9c2b5cf3916f5a3641d7d12fdb3f006a7b3d9ff6acdaec44e29ab1ff91e", size = 1181863, upload-time = "2026-05-15T04:51:15.025Z" }, + { url = "https://files.pythonhosted.org/packages/2f/68/a18b4f307086954fdae32714cb4f85562e34f9d34ab206e61f1816aa6018/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cb65b60b9408563676d874a3a4ee573370066f0dc4e29d84e82e989c6517424", size = 1239218, upload-time = "2026-05-15T04:51:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/16/5b/f2aa703a4fc5d2dff73460a7d46cc2f3f44aa0f3dd8eeb20d2a0ecf68862/tiktoken-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:85b78cc3a2c3d48723ca751fa981f1fedccd54194ca0471b957364353a898b07", size = 918110, upload-time = "2026-05-15T04:51:17.237Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "wheel" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/20/50ed6bdf27dec98b568a8ae25dc599f35baa3d9709f9e83fd1edb56b9a90/wheel-0.48.0.tar.gz", hash = "sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322", size = 66471, upload-time = "2026-08-11T22:02:27.327Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/29/69cfbb602cd91690c55d38ba9fe53e6a7e76a6fa647bf38f19c138d25449/wheel-0.48.0-py3-none-any.whl", hash = "sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab", size = 33320, upload-time = "2026-08-11T22:02:26.1Z" }, +] diff --git a/e2e/crossbuild/tools/wheel_export.bzl b/e2e/crossbuild/tools/wheel_export.bzl new file mode 100644 index 000000000..1cf6bb2ec --- /dev/null +++ b/e2e/crossbuild/tools/wheel_export.bzl @@ -0,0 +1,76 @@ +"""Export cross-built wheels for verification on native hardware. + +Replaces the OCI-image exec verification with a lighter wheel-only flow: +CI builds wheels for the opposite architecture on each Linux runner, uploads +them as tarballs, and the native runner of that architecture extracts each +tarball, installs the wheel with pip, and runs the case's standalone Python +test. +""" + +load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") + +def pycross_wheel_export(name, wheel, main, amd64_platform, arm64_platform): + """Declares per-arch bundle targets for one cross case. + + Produces "_amd64_bundle" and "_arm64_bundle" targets whose + output is a "_.tar.gz" tarball under bazel-bin/. + The tarball contains the cross-built wheel renamed to a valid PEP 491 + filename (derived from the wheel's own dist-info metadata) plus the + standalone test file. The wheel is built for the requested target platform + via a transition, so an amd64 host can produce an arm64 wheel and vice + versa. + + Args: + name: prefix for the produced targets, e.g. "msgpack". + wheel: label of the sdist-build wheel target to re-export + (typically @sdist_build______//:whl). + main: the case's runtime test file, runnable with `python
`. + amd64_platform: platform label for linux/amd64. + arm64_platform: platform label for linux/arm64. + """ + for arch, platform in (("amd64", amd64_platform), ("arm64", arm64_platform)): + transitioned_name = "{}_{}_wheel_src".format(name, arch) + platform_transition_filegroup( + name = transitioned_name, + srcs = [wheel], + target_platform = platform, + ) + + native.genrule( + name = "{}_{}_bundle".format(name, arch), + srcs = [":" + transitioned_name, ":" + main], + outs = ["{}_{}.tar.gz".format(name, arch)], + cmd = """ + wheel=$$(find $(SRCS) -name '*.whl' | head -1) + main=$(location :""" + main + """) + python3 - "$$wheel" "$$main" "$(@D)" "$@" <<'PY' +import os, sys, tarfile, zipfile, shutil +wheel_path, main_path, out_dir, out_tar = sys.argv[1:] +with zipfile.ZipFile(wheel_path) as zf: + names = zf.namelist() + wheel_info_path = next(n for n in names if n.endswith(".dist-info/WHEEL")) + meta_path = next(n for n in names if n.endswith(".dist-info/METADATA")) + wheel_info = zf.read(wheel_info_path).decode("utf-8") + meta = zf.read(meta_path).decode("utf-8") + +def _value(text, prefix): + for line in text.splitlines(): + if line.startswith(prefix): + return line.split(":", 1)[1].strip() + raise ValueError(prefix + " not found in wheel") + +dist = _value(meta, "Name:").replace("-", "_") +version = _value(meta, "Version:") +tag = _value(wheel_info, "Tag:") +new_name = "{}-{}-{}.whl".format(dist, version, tag) + +shutil.copy(wheel_path, os.path.join(out_dir, new_name)) +main_name = os.path.basename(main_path) +shutil.copy(main_path, os.path.join(out_dir, main_name)) + +with tarfile.open(out_tar, "w:gz") as tar: + tar.add(os.path.join(out_dir, new_name), arcname=new_name) + tar.add(os.path.join(out_dir, main_name), arcname=main_name) +PY + """, + ) diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index e98b89df7..367b88556 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -766,6 +766,29 @@ def test_missing_cases(self) -> None: self.assertIsNone(build_helper._build_backend(data)) +class UsesSetuptoolsRustTest(unittest.TestCase): + def test_setuptools_rust_requirement_detected(self) -> None: + data = {"build-system": {"build-backend": "setuptools.build_meta", "requires": ["setuptools", "setuptools-rust>=1.8"]}} + self.assertTrue(build_helper._uses_setuptools_rust(data)) + + def test_no_backend_value_also_matches(self) -> None: + data = {"build-system": {"requires": ["setuptools-rust"]}} + self.assertTrue(build_helper._uses_setuptools_rust(data)) + + def test_plain_setuptools_does_not_match(self) -> None: + data = {"build-system": {"build-backend": "setuptools.build_meta", "requires": ["setuptools", "wheel"]}} + self.assertFalse(build_helper._uses_setuptools_rust(data)) + + def test_maturin_does_not_match(self) -> None: + data = {"build-system": {"build-backend": "maturin", "requires": ["maturin"]}} + self.assertFalse(build_helper._uses_setuptools_rust(data)) + + def test_requirement_name_strips_specifiers(self) -> None: + self.assertEqual("setuptools-rust", build_helper._requirement_name("setuptools-rust>=1.8")) + self.assertEqual("setuptools-rust", build_helper._requirement_name("setuptools-rust[extras] ~= 1.0 ; python_version > '3.9'")) + self.assertEqual("", build_helper._requirement_name(">=bogus")) + + class StaticRuntimeArchivesTest(unittest.TestCase): def _wrapper(self, tmp: str, archives: list[str]) -> str: echo = path.join(tmp, "echo_cc") diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 73ee703d7..3e0b624d0 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -1015,6 +1015,36 @@ def _build_backend(pyproject_data: dict[str, object] | None) -> str | None: return backend if isinstance(backend, str) else None +_SETUPTOOLS_BACKENDS = ( + None, + "setuptools.build_meta", + "setuptools.build_meta:__legacy__", +) + +_REQUIREMENT_NAME_RE = re.compile(r"^\s*([A-Za-z0-9][A-Za-z0-9._-]*)") + + +def _requirement_name(requirement: str) -> str: + """PEP 508 requirement string -> bare package name, extras/specifiers/markers stripped.""" + match = _REQUIREMENT_NAME_RE.match(requirement) + return match.group(1) if match else "" + + +def _uses_setuptools_rust(pyproject_data: dict[str, object] | None) -> bool: + """setuptools-rust has no build-backend of its own (it's + setuptools.build_meta plus a build requirement) — detect it there.""" + build_system = (pyproject_data or {}).get("build-system", {}) + if not isinstance(build_system, dict): + return False + backend = build_system.get("build-backend") + if (backend if isinstance(backend, str) else None) not in _SETUPTOOLS_BACKENDS: + return False + requires = build_system.get("requires", []) + if not isinstance(requires, list): + return False + return any(isinstance(req, str) and _requirement_name(req) == "setuptools-rust" for req in requires) + + def _legacy_metadata_conflicts_with_pyproject(worktree: str) -> bool: setup_py = path.join(worktree, "setup.py") pyproject_data = _load_pyproject_data(worktree) @@ -1223,19 +1253,30 @@ def main() -> None: "--outdir", outdir, ] + pyproject_data = _load_pyproject_data(t) + backend = _build_backend(pyproject_data) + + # Packages needing -D setup-args (numpy's -Dblas=none — the hermetic + # venv has no system BLAS) pass them via this env var. `build`'s -C + # accumulates repeated keys, so it can't collide with the + # --cross-file the cross branch adds separately. Native too: the + # setup-args are about the package, not the mode. + if backend == "mesonpy": + for arg in shlex.split(build_env.get("RULES_PY_MESON_SETUP_ARGS", "")): + cmd += ["-C", "setup-args=" + arg] + # meson-python only synthesizes its own cross file for macOS # ARCHFLAGS/cibuildwheel shapes; everything else configures as a # native build and fails meson's compiler sanity checks. Hand it # ours (see _generate_meson_cross_file). if opts.cross: - backend = _build_backend(_load_pyproject_data(t)) if backend == "mesonpy": cross_file = _generate_meson_cross_file(tmp_root, build_env, opts.target_os, opts.target_cpu) cmd += ["-C", "setup-args=--cross-file=" + cross_file] elif backend == "scikit_build_core.build": toolchain = _generate_cmake_toolchain_file(tmp_root, build_env, opts.target_os, opts.target_cpu) cmd += ["-C", "cmake.toolchain-file=" + toolchain] - elif backend == "maturin" and build_env.get("CARGO"): + elif (backend == "maturin" or _uses_setuptools_rust(pyproject_data)) and build_env.get("CARGO"): _configure_cargo_cross_env(build_env, tmp_root, opts.target_os, opts.target_cpu, opts.target_libc) else: print("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!", file=sys.stderr) From 99c73eb73088f5ec9506e73070f655f42b623674 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 3 Sep 2026 05:16:48 -0600 Subject: [PATCH 069/103] feat(uv): derive Rust and JDK build env from toolchains Add `rust_toolchain` to `uv.project`. When set, sdist repos whose build backend is maturin or whose build requirements include setuptools-rust get the toolchain plus an exec-configured `rust_host_sysroot` in their `toolchains`, emitted by the sdist_build template. pep517_native_whl maps the CARGO/RUSTC/RUST_HOST_SYSROOT and JAVA/JAVABASE/ANT_HOME/ANT_BIN_DIR make variables of its toolchains into the build env, so callers no longer spell them out in `env`. Explicit `env` entries still win. rust_layer.bzl moves into uv/private/pep517_whl; ant_layer.bzl stays a consumer-side helper in e2e/crossbuild/tools. The e2e rust cases drop their uv.override_package blocks in favor of `rust_toolchain`, and the JDK cases drop their `env` dicts. --- docs/uv.md | 14 ++++++ .../build_graph.cycle_override.query | 0 .../snapshots/build_graph.fork_order.query | 0 ...uild.uv_sdist_jdk_build.jpype1.BUILD.bazel | 4 -- .../uv-sdist-jdk-build/setup.MODULE.bazel | 11 ++--- e2e/crossbuild/bcrypt/setup.MODULE.bazel | 14 +----- e2e/crossbuild/pycross-jdk/setup.MODULE.bazel | 5 --- .../pycross-rust/setup.MODULE.bazel | 14 +----- .../pydantic_core/setup.MODULE.bazel | 14 +----- e2e/crossbuild/rpds_py/setup.MODULE.bazel | 14 +----- e2e/crossbuild/tiktoken/setup.MODULE.bazel | 14 +----- e2e/crossbuild/tools/BUILD.bazel | 11 ----- uv/private/extension/defs.bzl | 10 +++++ uv/private/pep517_whl/BUILD.bazel | 6 +++ uv/private/pep517_whl/pep517_native_whl.bzl | 23 ++++++++++ .../private/pep517_whl}/rust_layer.bzl | 0 uv/private/sdist_build/repository.bzl | 43 +++++++++++++++++-- 17 files changed, 102 insertions(+), 95 deletions(-) mode change 100755 => 100644 e2e/cases/snapshots/build_graph.cycle_override.query mode change 100755 => 100644 e2e/cases/snapshots/build_graph.fork_order.query rename {e2e/crossbuild/tools => uv/private/pep517_whl}/rust_layer.bzl (100%) diff --git a/docs/uv.md b/docs/uv.md index 94157bfc6..5b4c5d831 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -313,6 +313,20 @@ Under cross mode the build action: 4. Validates the produced wheel's platform tag against the target OS/CPU and fails the action if the backend leaked the exec platform into the tag. +Cargo-based backends need a Rust toolchain that runs on the exec platform. +Declare it once per project with +`uv.project(rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain")`; +sdist repos whose build backend is maturin, or whose build requirements +include setuptools-rust, then receive `CARGO`, `RUSTC` and the exec-platform +sysroot automatically. No per-package `uv.override_package` `env` or +`toolchains` entries are needed for Rust. + +Other build-time toolchains are still layered per package through +`uv.override_package(toolchains = [...])`. Toolchains exporting the JDK +(`$(JAVA)`, `$(JAVABASE)`) or Ant (`$(ANT_HOME)`) make variables are mapped +into the build environment automatically; any other make variable still needs +an explicit `env` entry. + A working end-to-end suite lives in `e2e/crossbuild/`: real packages forced to build from sdist (`[tool.uv] no-binary-package`) and cross-compiled for linux/amd64 and linux/arm64, covering setuptools (`python-geohash`, diff --git a/e2e/cases/snapshots/build_graph.cycle_override.query b/e2e/cases/snapshots/build_graph.cycle_override.query old mode 100755 new mode 100644 diff --git a/e2e/cases/snapshots/build_graph.fork_order.query b/e2e/cases/snapshots/build_graph.fork_order.query old mode 100755 new mode 100644 diff --git a/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel b/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel index 81cf0ebb4..af5546818 100644 --- a/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel +++ b/e2e/cases/snapshots/sdist_build.uv_sdist_jdk_build.jpype1.BUILD.bazel @@ -23,10 +23,6 @@ pep517_native_whl( toolchains = [ "@@bazel_tools//tools/jdk:current_java_runtime", ], - env = { - "JAVA": "$(JAVA)", - "JAVA_HOME": "$(JAVABASE)", - }, visibility = ["//visibility:public"], ) diff --git a/e2e/cases/uv-sdist-jdk-build/setup.MODULE.bazel b/e2e/cases/uv-sdist-jdk-build/setup.MODULE.bazel index 873eb37ef..9556a3097 100644 --- a/e2e/cases/uv-sdist-jdk-build/setup.MODULE.bazel +++ b/e2e/cases/uv-sdist-jdk-build/setup.MODULE.bazel @@ -23,15 +23,12 @@ uv.annotate_packages( lock = "//uv-sdist-jdk-build:uv.lock", ) -# Layer a JDK runtime toolchain into the build env. `toolchains` and -# `env` here are additive — these entries are appended to whatever -# sdist_build's BUILD template emits by default. +# Layer a JDK runtime toolchain into the build env. `toolchains` is +# additive — appended to whatever sdist_build's BUILD template emits by +# default. The JDK's $(JAVA)/$(JAVABASE) make variables reach the build as +# JAVA/JAVA_HOME without an explicit `env` mapping. uv.override_package( name = "jpype1", - env = { - "JAVA": "$(JAVA)", - "JAVA_HOME": "$(JAVABASE)", - }, lock = "//uv-sdist-jdk-build:uv.lock", toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"], ) diff --git a/e2e/crossbuild/bcrypt/setup.MODULE.bazel b/e2e/crossbuild/bcrypt/setup.MODULE.bazel index 41b3b87c6..277a8ce56 100644 --- a/e2e/crossbuild/bcrypt/setup.MODULE.bazel +++ b/e2e/crossbuild/bcrypt/setup.MODULE.bazel @@ -17,18 +17,6 @@ uv.project( hub_name = "pypi_crossbuild_bcrypt", lock = "//bcrypt:uv.lock", pyproject = "//bcrypt:pyproject.toml", -) -uv.override_package( - name = "bcrypt", - env = { - "CARGO": "$(CARGO)", - "RUSTC": "$(RUSTC)", - "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", - }, - lock = "//bcrypt:uv.lock", - toolchains = [ - "@rules_rust//rust/toolchain:current_rust_toolchain", - "//tools:rust_host_sysroot", - ], + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo(uv, "pypi_crossbuild_bcrypt") diff --git a/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel b/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel index 704fa0aa6..6ea63a6a7 100644 --- a/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel @@ -21,11 +21,6 @@ uv.project( ) uv.override_package( name = "jpype1", - env = { - "JAVA": "$(JAVA)", - "JAVA_HOME": "$(JAVABASE)", - "RULES_PY_ANT_BIN_DIR": "$(ANT_BIN_DIR)", - }, lock = "//pycross-jdk:uv.lock", toolchains = [ "//pycross-jdk:jdk", diff --git a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel index 9f2ee025c..2a140817e 100644 --- a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel @@ -23,19 +23,7 @@ uv.project( hub_name = "pypi_pycross_rust", lock = "//pycross-rust:uv.lock", pyproject = "//pycross-rust:pyproject.toml", -) -uv.override_package( - name = "pydantic-core", - env = { - "CARGO": "$(CARGO)", - "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", - "RUSTC": "$(RUSTC)", - }, - lock = "//pycross-rust:uv.lock", - toolchains = [ - "@rules_rust//rust/toolchain:current_rust_toolchain", - "//tools:rust_host_sysroot", - ], + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pydantic_core/setup.MODULE.bazel b/e2e/crossbuild/pydantic_core/setup.MODULE.bazel index 2fdc23f6d..8a18c4799 100644 --- a/e2e/crossbuild/pydantic_core/setup.MODULE.bazel +++ b/e2e/crossbuild/pydantic_core/setup.MODULE.bazel @@ -16,18 +16,6 @@ uv.project( hub_name = "pypi_crossbuild_pydantic_core", lock = "//pydantic_core:uv.lock", pyproject = "//pydantic_core:pyproject.toml", -) -uv.override_package( - name = "pydantic-core", - env = { - "CARGO": "$(CARGO)", - "RUSTC": "$(RUSTC)", - "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", - }, - lock = "//pydantic_core:uv.lock", - toolchains = [ - "@rules_rust//rust/toolchain:current_rust_toolchain", - "//tools:rust_host_sysroot", - ], + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo(uv, "pypi_crossbuild_pydantic_core") diff --git a/e2e/crossbuild/rpds_py/setup.MODULE.bazel b/e2e/crossbuild/rpds_py/setup.MODULE.bazel index e02036b84..37fb01e4e 100644 --- a/e2e/crossbuild/rpds_py/setup.MODULE.bazel +++ b/e2e/crossbuild/rpds_py/setup.MODULE.bazel @@ -16,18 +16,6 @@ uv.project( hub_name = "pypi_crossbuild_rpds_py", lock = "//rpds_py:uv.lock", pyproject = "//rpds_py:pyproject.toml", -) -uv.override_package( - name = "rpds-py", - env = { - "CARGO": "$(CARGO)", - "RUSTC": "$(RUSTC)", - "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", - }, - lock = "//rpds_py:uv.lock", - toolchains = [ - "@rules_rust//rust/toolchain:current_rust_toolchain", - "//tools:rust_host_sysroot", - ], + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo(uv, "pypi_crossbuild_rpds_py") diff --git a/e2e/crossbuild/tiktoken/setup.MODULE.bazel b/e2e/crossbuild/tiktoken/setup.MODULE.bazel index d6625e951..65266b31b 100644 --- a/e2e/crossbuild/tiktoken/setup.MODULE.bazel +++ b/e2e/crossbuild/tiktoken/setup.MODULE.bazel @@ -17,18 +17,6 @@ uv.project( hub_name = "pypi_crossbuild_tiktoken", lock = "//tiktoken:uv.lock", pyproject = "//tiktoken:pyproject.toml", -) -uv.override_package( - name = "tiktoken", - env = { - "CARGO": "$(CARGO)", - "RUSTC": "$(RUSTC)", - "RULES_PY_RUST_HOST_SYSROOT": "$(RUST_HOST_SYSROOT)", - }, - lock = "//tiktoken:uv.lock", - toolchains = [ - "@rules_rust//rust/toolchain:current_rust_toolchain", - "//tools:rust_host_sysroot", - ], + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo(uv, "pypi_crossbuild_tiktoken") diff --git a/e2e/crossbuild/tools/BUILD.bazel b/e2e/crossbuild/tools/BUILD.bazel index d21a6b47c..c3563972c 100644 --- a/e2e/crossbuild/tools/BUILD.bazel +++ b/e2e/crossbuild/tools/BUILD.bazel @@ -4,7 +4,6 @@ load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_library", "py_test") load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") load("@rules_shell//shell:sh_test.bzl", "sh_test") load(":ant_layer.bzl", "ant_home") -load(":rust_layer.bzl", "rust_host_sysroot") load(":toolchain_test.bzl", "exec_python_path") exports_files([ @@ -37,16 +36,6 @@ py_binary( visibility = ["//visibility:public"], ) -# Re-resolves current_rust_toolchain in the exec configuration: under a -# cross transition the plain label would return the *target*-targeting -# toolchain, whose sysroot lacks the exec platform's rust-std that build -# scripts/proc-macros need (see rust_layer.bzl). -rust_host_sysroot( - name = "rust_host_sysroot", - actual = "@rules_rust//rust/toolchain:current_rust_toolchain", - visibility = ["//visibility:public"], -) - # Ant is architecture-independent (bytecode + launcher scripts), so unlike # the Rust sysroot there's no exec/target split — one $(ANT_HOME) covers # both. Used by //pycross-jdk (jpype1's build shells out to Ant). diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index a50bb1b8e..388176793 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -602,6 +602,7 @@ def _parse_projects(module_ctx, hub_specs): extra_env = extra_env, monitor_memory = monitor_memory, resource_set = resource_set, + rust_toolchain = str(project.rust_toolchain) if project.rust_toolchain else "", ) has_sbuild = True @@ -878,6 +879,8 @@ def _uv_impl(module_ctx): sbuild_kwargs["extra_toolchains"] = sbuild_cfg.extra_toolchains if sbuild_cfg.extra_env: sbuild_kwargs["extra_env"] = sbuild_cfg.extra_env + if sbuild_cfg.rust_toolchain: + sbuild_kwargs["rust_toolchain"] = sbuild_cfg.rust_toolchain if sbuild_cfg.monitor_memory: sbuild_kwargs["monitor_memory"] = True if sbuild_cfg.resource_set != "default": @@ -952,6 +955,13 @@ _project_tag = tag_class( mandatory = True, doc = "The `uv.lock` pinning this project's dependency graph.", ), + "rust_toolchain": attr.label( + mandatory = False, + doc = "A rules_rust `current_rust_toolchain`-style target. When set, every sdist in " + + "this project whose build backend is maturin or setuptools-rust gets it (plus " + + "rules_py's exec-configured sysroot layer) wired into its build automatically " + + "— no per-package `uv.override_package(toolchains = ..., env = ...)`.", + ), "default_build_dependencies": attr.string_list( mandatory = False, default = [ diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 5a17deff8..993c31667 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -59,3 +59,9 @@ bzl_library( srcs = ["exec_transition.bzl"], deps = ["@aspect_rules_py_uv_host//:defs"], ) + +bzl_library( + name = "rust_layer", + srcs = ["rust_layer.bzl"], + visibility = ["//visibility:public"], +) diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index b942a410a..6a51ffe97 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -20,6 +20,20 @@ load( load(":exec_transition.bzl", "exec_transition") _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") + +# TemplateVariableInfo make-variable -> build helper env key. Sources: +# rules_rust's current_rust_toolchain (CARGO/RUSTC), rules_py's +# rust_host_sysroot layer (RUST_HOST_SYSROOT), @bazel_tools' java runtime +# (JAVA/JAVABASE) and rules_py's ant_home layer (ANT_HOME/ANT_BIN_DIR). +_DERIVED_ENV = { + "CARGO": "CARGO", + "RUSTC": "RUSTC", + "RUST_HOST_SYSROOT": "RULES_PY_RUST_HOST_SYSROOT", + "JAVA": "JAVA", + "JAVABASE": "JAVA_HOME", + "ANT_HOME": "ANT_HOME", + "ANT_BIN_DIR": "RULES_PY_ANT_BIN_DIR", +} _EXECROOT_MARKER = "__ASPECT_RULES_PY_EXECROOT__" _INFER_CXX_COMPANION = "ASPECT_RULES_PY_INFER_CXX_COMPANION" @@ -271,6 +285,15 @@ def _pep517_native_whl(ctx): extra_inputs.append(cc_files) known_variables.update({key: value for key, value in cc_tools.items() if key not in known_variables}) + # Well-known make-variables exported by `toolchains` become the env keys + # the build helper consumes, so listing a toolchain is enough — no + # `"CARGO": "$(CARGO)"` boilerplate, and the RULES_PY_* names stay an + # internal contract between this rule and the helper. Explicit `env` + # entries win. + for make_var, env_key in _DERIVED_ENV.items(): + if make_var in known_variables and env_key not in ctx.attr.env: + env[env_key] = known_variables[make_var] + for k, v in ctx.attr.env.items(): env[k] = ctx.expand_make_variables("env", v, known_variables) diff --git a/e2e/crossbuild/tools/rust_layer.bzl b/uv/private/pep517_whl/rust_layer.bzl similarity index 100% rename from e2e/crossbuild/tools/rust_layer.bzl rename to uv/private/pep517_whl/rust_layer.bzl diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 84ca5fb89..934159c75 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -139,6 +139,17 @@ def _resolve_archive_path(repository_ctx): # --- Repository rule implementation --- +def _normalize_requirement(name): + return name.lower().replace("_", "-").replace(".", "-") + +def _is_rust_build(inspection): + """maturin backend, or setuptools with setuptools-rust among its build requirements.""" + if not inspection: + return False + if inspection.get("build_backend") == "maturin": + return True + return "setuptools-rust" in [_normalize_requirement(r) for r in inspection.get("build_requires", [])] + def _sdist_build_impl(repository_ctx): """Prepares a repository for building a wheel from a source distribution (sdist). @@ -267,9 +278,29 @@ def _sdist_build_impl(repository_ctx): # AR, LD, and STRIP make variables can be synthetic. Only forward explicit # toolchains/env for JDK, Rust, and other package-specific overrides. toolchain_attrs = "" + rust_layer_load = "" + rust_layer_target = "" if is_native: - toolchains = repository_ctx.attr.extra_toolchains + toolchains = list(repository_ctx.attr.extra_toolchains) extra_env = repository_ctx.attr.extra_env + + # Backend-driven defaults: the configure tool already detected the + # build backend and its declared requirements, so a Rust-based build + # (maturin, or setuptools + setuptools-rust) gets the project's Rust + # toolchain plus the exec-configured sysroot layer without the user + # spelling either out per package. The generated pep517_native_whl + # derives CARGO/RUSTC/RULES_PY_RUST_HOST_SYSROOT from their + # make-variables. + rust_toolchain = repository_ctx.attr.rust_toolchain + if rust_toolchain and _is_rust_build(inspection): + rust_layer_load = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" + rust_layer_target = """ +rust_host_sysroot( + name = "rust_host_sysroot", + actual = "{rust_toolchain}", +) +""".format(rust_toolchain = rust_toolchain) + toolchains = [rust_toolchain, ":rust_host_sysroot"] + [t for t in toolchains if t != rust_toolchain] env_attr = "" if extra_env: env_attr = """ @@ -318,7 +349,7 @@ pep517_frontend( tool = ":frontend" repository_ctx.file("BUILD.bazel", content = """ -load("@aspect_rules_py//uv/private/pep517_whl:{rule}.bzl", "{rule}"){frontend_load} +load("@aspect_rules_py//uv/private/pep517_whl:{rule}.bzl", "{rule}"){frontend_load}{rust_layer_load} load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( @@ -327,7 +358,7 @@ py_binary( srcs = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], deps = {deps}, ) -{frontend_target} +{frontend_target}{rust_layer_target} {rule}( name = "whl", src = "{src}", @@ -347,6 +378,8 @@ exports_files( monitor_memory_attr = monitor_memory_attr, rule = "pep517_native_whl" if is_native else "pep517_whl", frontend_load = frontend_load, + rust_layer_load = rust_layer_load, + rust_layer_target = rust_layer_target, frontend_target = frontend_target, tool = tool, version = repository_ctx.attr.version, @@ -393,6 +426,10 @@ sdist_build = repository_rule( ), "pre_build_patches": attr.label_list(default = []), "pre_build_patch_strip": attr.int(default = 0), + "rust_toolchain": attr.string( + default = "", + doc = "Project-level Rust toolchain label; applied when the sdist's build backend is Rust-based.", + ), "extra_toolchains": attr.string_list( default = [], doc = "Toolchain labels forwarded to the generated pep517_native_whl(...) `toolchains` list. Set via `uv.override_package(toolchains = [...])`.", From d35c7d587095a433b5c9111f03f61568bf1c57bb Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 3 Sep 2026 05:17:37 -0600 Subject: [PATCH 070/103] chore(e2e): restore build_graph snapshot file modes --- e2e/cases/snapshots/build_graph.cycle_override.query | 0 e2e/cases/snapshots/build_graph.fork_order.query | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 e2e/cases/snapshots/build_graph.cycle_override.query mode change 100644 => 100755 e2e/cases/snapshots/build_graph.fork_order.query diff --git a/e2e/cases/snapshots/build_graph.cycle_override.query b/e2e/cases/snapshots/build_graph.cycle_override.query old mode 100644 new mode 100755 diff --git a/e2e/cases/snapshots/build_graph.fork_order.query b/e2e/cases/snapshots/build_graph.fork_order.query old mode 100644 new mode 100755 From 87e8b4d4ce27574f45141acc5bca12481fcea735 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 3 Sep 2026 05:27:44 -0600 Subject: [PATCH 071/103] chore(uv): let gazelle own rust_layer bzl_library visibility --- uv/private/pep517_whl/BUILD.bazel | 1 - 1 file changed, 1 deletion(-) diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 993c31667..25560b5dc 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -63,5 +63,4 @@ bzl_library( bzl_library( name = "rust_layer", srcs = ["rust_layer.bzl"], - visibility = ["//visibility:public"], ) From 590b916ee7075768f75528ba09d28cae4646104e Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 3 Sep 2026 07:12:55 -0600 Subject: [PATCH 072/103] refactor: rebase spike internals onto main's pep517 mechanisms uv/private now differs from main only by the pending pieces: _DERIVED_ENV in pep517_native_whl, rust_layer + uv.project(rust_toolchain) wiring in sdist_build/extension, the setuptools-rust / meson setup-args hunks from the crossbuild-exec-verify branch, and build_helper_cross_test. Dropped the spike-era exec_transition (main's config.exec + pep517_frontend supersedes it; frontend_config_test and the e2e frontend-exec-group case go back to main's assertions) and the helper's older layout plus its darwin extras (_find_lld, _xcode_developer_dir, _darwin_sysroot, libtool wrapper): the full crossbuild suite and the macOS arm64 -> amd64 geohash cross pass on main's helper. README/doc text updated for the wheel-bundle design. --- e2e/README.md | 48 +- .../pep517-frontend-exec-group/BUILD.bazel | 14 +- e2e/cases/uv-sdist-jdk-build/BUILD.bazel | 2 +- uv/private/pep517_whl/BUILD.bazel | 8 - uv/private/pep517_whl/common.bzl | 21 +- uv/private/pep517_whl/exec_transition.bzl | 34 - uv/private/pep517_whl/pep517_native_whl.bzl | 128 ++- uv/private/pep517_whl/pep517_whl.bzl | 6 +- uv/private/pep517_whl/tests/BUILD.bazel | 18 +- .../pep517_whl/tests/frontend_config_test.bzl | 13 +- uv/private/pep517_whl/tools/build_helper.py | 1000 ++++++++--------- 11 files changed, 569 insertions(+), 723 deletions(-) delete mode 100644 uv/private/pep517_whl/exec_transition.bzl diff --git a/e2e/README.md b/e2e/README.md index 9f5508aaa..5fc08eb0a 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -35,36 +35,24 @@ workspace above must not carry: its `.bazelrc` turns on the rules_python provide compatibility layer, so rules_python `py_*` targets can depend on a rules_py `py_library`. Its `test.sh` asserts the same dependency is rejected with the flag off. -`crossbuild` covers `pep517_native_whl`'s cross-compilation path across five -PEP 517 backends, each with more than one real, popular package so no -backend's cross support rests on a single lucky case: two plain -setuptools/distutils C extensions (`geohash`, `psutil`), `contourpy` -(meson-python), two scikit-build-core/CMake packages (`awkward_cpp`, -`jpype1` — the latter also needing a real Eclipse Temurin JDK and a -hermetically vendored Apache Ant, both fetched directly rather than relying -on rules_java's default remotejdk, which is actually Azul Zulu, or a system -`ant`), two maturin/PyO3 Rust packages (`rpds_py`, `pydantic_core`), and -`bcrypt` (setuptools-rust — a different real-world Rust-in-Python -integration than maturin, with no build-backend value of its own to detect -it by). Every case is built and packaged for linux/amd64 and linux/arm64. -In-suite verification is structural (ELF arch, ABI tags, byte-diffs); -execution happens in CI's crossbuild-verify pipelines, which upload each -case's OCI tarball and `docker run` it on NATIVE amd64 and arm64 runners — -no emulation in the verdict. The same workspace hosts the rules_pycross -ports (`pycross-*`), which force packages to build from their sdists and -assert properties of the resulting wheels, including rebuilding them under -non-host target platforms via `collect_wheels`. One more package -(`zstandard`) also ships official prebuilt wheels; its case diffs our -cross-compiled output against theirs byte-for-byte instead of checking -against a hardcoded expected value. These suites are isolated rather than -packages under `e2e/cases` because their pip hubs need package-specific -configuration (`default_build_dependencies`, pre-build patches, a larger -`resource_set`) that would otherwise leak onto unrelated packages sharing -the hub — see the module docstring in its `MODULE.bazel`. On a macOS runner -(the `smoke` job, see below) it additionally builds and runs for -arm64/amd64 macOS via the Xcode SDK, executing the amd64 one under -Rosetta 2 — see its `test.sh` for why that half can't just be more -`platform_transition_filegroup` targets under `//...`. +`crossbuild` covers `pep517_native_whl`'s cross-compilation path across the +PEP 517 backends, each with more than one real package so no backend's cross +support rests on a single case: setuptools/distutils C extensions +(`pycross-geohash`, `pycross-psutil`, `pycross-msgpack`, `pycross-setuptools`), +meson-python (`pycross-meson`, `pycross-numpy`), scikit-build-core/CMake +(`pycross-cmake`, `pycross-jdk` — the latter also needing a JDK and a +hermetically vendored Apache Ant), maturin/PyO3 (`pycross-rust`, +`pycross-rpds_py`) and setuptools-rust (`pycross-bcrypt`, `pycross-tiktoken`). +Every case builds for linux/amd64 and linux/arm64; in-suite verification is +structural (`Tag:` metadata, ELF arch of every bundled `.so`), and each case +exports a wheel bundle that CI installs and runs on NATIVE amd64 and arm64 +runners — no emulation in the verdict. The suites are isolated from +`e2e/cases` because their hubs need package-specific configuration +(`default_build_dependencies`, pre-build patches, a larger `resource_set`) +that would otherwise leak onto unrelated packages sharing the hub. On a macOS +host, `test.sh` additionally cross-builds `pycross-geohash` for macOS amd64 +(a manual target: the platform transition always resolves to os:macos, so +`target_compatible_with` cannot tell hosts apart). Each isolated workspace points back at repo-root rules_py with `local_path_override(path = "../..")`. diff --git a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel index 935603481..f17dac4c4 100644 --- a/e2e/cases/pep517-frontend-exec-group/BUILD.bazel +++ b/e2e/cases/pep517-frontend-exec-group/BUILD.bazel @@ -479,7 +479,16 @@ write_file( content = [ "#!/usr/bin/env bash", "set -euo pipefail", + ] + select({ + ":linux_aarch64_config": ["actual=aarch64"], + ":linux_x86_64_config": ["actual=x86_64"], + "//conditions:default": ["actual=default"], + }) + [ "expected=\"$1\"", + "if [[ \"${actual}\" != \"${expected}\" ]]; then", + " echo \"frontend used ${actual}; expected ${expected}\" >&2", + " exit 1", + "fi", "compiler_actual=\"$(\"${CC}\")\"", "if [[ \"${compiler_actual}\" != \"${expected}\" ]]; then", " echo \"compiler ${CC} reported ${compiler_actual}; expected ${expected}\" >&2", @@ -725,11 +734,6 @@ build_test( ], ) -# NOTE: the frontend tool itself is configured for the host platform (see -# exec_transition.bzl); this test verifies the CC toolchain of the "target" -# exec group is exposed to the build, not that the tool runs in the exec -# group's platform configuration. - build_test( name = "configured_compiler_tools_test", targets = [":wheel_linux_configured"], diff --git a/e2e/cases/uv-sdist-jdk-build/BUILD.bazel b/e2e/cases/uv-sdist-jdk-build/BUILD.bazel index 6064e0bb3..b1a88c6e9 100644 --- a/e2e/cases/uv-sdist-jdk-build/BUILD.bazel +++ b/e2e/cases/uv-sdist-jdk-build/BUILD.bazel @@ -6,7 +6,7 @@ # detection but then fails needing `ant` on PATH — this hub has no Ant # vendored. The full, working end-to-end version (real Eclipse Temurin JDK, # hermetically vendored Apache Ant, actual cross-compile + QEMU execution) -# lives in `//e2e/crossbuild/jpype1`; that's the real regression coverage +# lives in `e2e/crossbuild/pycross-jdk`; that's the real regression coverage # for this toolchain combination now. This target and its analysis-level # siblings (//uv/private/pep517_whl:toolchain_env_test, //:snapshots_*_test) # stay for the narrower "does the env/toolchain plumbing reach the action" diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 25560b5dc..c3f0eb88e 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -20,7 +20,6 @@ bzl_library( deps = [ ":cc_layer", ":common", - ":exec_transition", "//py/private/interpreter:versions", "//py/private/toolchain:types", "@bazel_lib//lib:resource_sets", @@ -48,18 +47,11 @@ bzl_library( name = "common", srcs = ["common.bzl"], deps = [ - ":exec_transition", "//uv/private:source_built_wheel", "@bazel_lib//lib:resource_sets", ], ) -bzl_library( - name = "exec_transition", - srcs = ["exec_transition.bzl"], - deps = ["@aspect_rules_py_uv_host//:defs"], -) - bzl_library( name = "rust_layer", srcs = ["rust_layer.bzl"], diff --git a/uv/private/pep517_whl/common.bzl b/uv/private/pep517_whl/common.bzl index 16a22be1b..db675e53b 100644 --- a/uv/private/pep517_whl/common.bzl +++ b/uv/private/pep517_whl/common.bzl @@ -2,7 +2,6 @@ load("@bazel_lib//lib:resource_sets.bzl", "resource_set_attr") load("//uv/private:source_built_wheel.bzl", "SourceBuiltWheelInfo") -load(":exec_transition.bzl", "exec_transition") TARGET_EXEC_GROUP = "target" @@ -18,12 +17,6 @@ def wheel_providers(wheel_file, console_scripts): SourceBuiltWheelInfo(console_scripts = tuple(console_scripts)), ] -def tool_files_to_run(ctx): - tool = ctx.attr.tool - if type(tool) == "list": - tool = tool[0] - return tool[DefaultInfo].files_to_run - def common_env(ctx): # pyproject_hooks copies the build process environment and launches its # Python executable without -I: @@ -72,16 +65,10 @@ _PATCH_ATTRS = { PEP517_WHL_ATTRS = { "src": attr.label(allow_single_file = True), - # The wheel action runs in the "target" exec group; its frontend must run - # on the exec (host) platform but resolve its Python build dependencies - # for the *target* Python version. exec_transition pins --platforms to the - # host and resets the platform_libc/platform_version flags to host values - # (Starlark flags otherwise leak from the target configuration and break - # wheel selection for build deps). See exec_transition.bzl. - "tool": attr.label(executable = True, cfg = exec_transition), - "_allowlist_function_transition": attr.label( - default = "@bazel_tools//tools/allowlists/function_transition_allowlist", - ), + # The wheel action uses the named group below, so its frontend must use the + # same execution platform: + # https://bazel.build/extending/exec-groups#defining-exec-groups + "tool": attr.label(executable = True, cfg = config.exec(TARGET_EXEC_GROUP)), "version": attr.string(), "console_scripts": attr.string_list( doc = "Console scripts discovered from the source distribution's entry-point metadata.", diff --git a/uv/private/pep517_whl/exec_transition.bzl b/uv/private/pep517_whl/exec_transition.bzl deleted file mode 100644 index 610710c3f..000000000 --- a/uv/private/pep517_whl/exec_transition.bzl +++ /dev/null @@ -1,34 +0,0 @@ -load("@aspect_rules_py_uv_host//:defs.bzl", "CURRENT_PLATFORM_LIBC", "CURRENT_PLATFORM_VERSION") - -_PLATFORM_LIBC_FLAG = str(Label("@aspect_rules_py//uv/private/constraints/platform:platform_libc")) -_PLATFORM_VERSION_FLAG = str(Label("@aspect_rules_py//uv/private/constraints/platform:platform_version")) - -_INPUTS = [ - "//command_line_option:platforms", - "//command_line_option:host_platform", - _PLATFORM_LIBC_FLAG, - _PLATFORM_VERSION_FLAG, -] - -_OUTPUTS = [ - "//command_line_option:platforms", - _PLATFORM_LIBC_FLAG, - _PLATFORM_VERSION_FLAG, -] - -def _exec_transition_impl(settings, _attr): - if settings["//command_line_option:platforms"] == [settings["//command_line_option:host_platform"]] and \ - settings[_PLATFORM_LIBC_FLAG] == CURRENT_PLATFORM_LIBC and \ - settings[_PLATFORM_VERSION_FLAG] == CURRENT_PLATFORM_VERSION: - return {} - return { - "//command_line_option:platforms": [settings["//command_line_option:host_platform"]], - _PLATFORM_LIBC_FLAG: CURRENT_PLATFORM_LIBC, - _PLATFORM_VERSION_FLAG: CURRENT_PLATFORM_VERSION, - } - -exec_transition = transition( - implementation = _exec_transition_impl, - inputs = _INPUTS, - outputs = _OUTPUTS, -) diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index 6a51ffe97..eaabbd198 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -1,4 +1,8 @@ -"""PEP 517 sdist to platform-specific whl build rule.""" +"""PEP 517 sdist to platform-specific whl build rule. + +Uses `python -m build` (the pypa/build frontend) which delegates to whatever +build backend the sdist declares in its `[build-system]` table. +""" load("@bazel_lib//lib:resource_sets.bzl", "resource_set") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") @@ -14,17 +18,15 @@ load( "common_env", "memory_args", "patch_args_and_inputs", - "tool_files_to_run", "wheel_providers", ) -load(":exec_transition.bzl", "exec_transition") _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") # TemplateVariableInfo make-variable -> build helper env key. Sources: # rules_rust's current_rust_toolchain (CARGO/RUSTC), rules_py's # rust_host_sysroot layer (RUST_HOST_SYSROOT), @bazel_tools' java runtime -# (JAVA/JAVABASE) and rules_py's ant_home layer (ANT_HOME/ANT_BIN_DIR). +# (JAVA/JAVABASE) and an Ant layer exporting ANT_HOME/ANT_BIN_DIR. _DERIVED_ENV = { "CARGO": "CARGO", "RUSTC": "RUSTC", @@ -140,6 +142,13 @@ _PYTHON_CPU_MAP = { "arm": "armv7l", } +# Deployment-target floor for the macOS platform string when the real value +# is unknown: 11.0 is the first macOS release with arm64 support, so it is +# the most conservative version every hermetic arm64 interpreter satisfies. +# build_helper re-derives the real value from the target sysconfigdata's +# MACOSX_DEPLOYMENT_TARGET whenever that file is available. +_MACOS_DEPLOYMENT_FALLBACK = "11.0" + def _target_python_artifacts(runtime): """Collect the target interpreter files a cross build must see. @@ -174,17 +183,15 @@ def _derive_python_host_platform(target_os, target_cpu): """Derive _PYTHON_HOST_PLATFORM from target platform constraints. Linux: libc does not affect the platform string — always linux-{cpu}. - macOS: uses arm64 (not aarch64) and requires a version component. The - version here is only an analysis-time fallback: the deployment target is - a property of the target interpreter, which analysis can't read, so - build_helper re-derives it at build time from the target sysconfigdata's - MACOSX_DEPLOYMENT_TARGET whenever that file is available. + macOS: uses arm64 (not aarch64) and requires a version component, + defaulting to _MACOS_DEPLOYMENT_FALLBACK when the interpreter's real + deployment target is not known. """ if target_os == "linux": return "linux-" + _PYTHON_CPU_MAP.get(target_cpu, target_cpu) if target_os == "darwin": cpu = "arm64" if target_cpu == "aarch64" else target_cpu - return "macosx-11.0-" + cpu + return "macosx-{}-{}".format(_MACOS_DEPLOYMENT_FALLBACK, cpu) return None def _interpreter_platform_triple(runtime): @@ -242,36 +249,29 @@ cross_identity_test_util = struct( def _pep517_native_whl(ctx): archive = ctx.file.src - # Fixed name; the backend picks the real filename at build time and the - # helper renames onto this. Consumers read identity from dist-info only. - wheel_file = ctx.actions.declare_file(ctx.label.name + ".whl") - patch_args, patch_inputs = patch_args_and_inputs(ctx) - eg_toolchains = ctx.exec_groups[TARGET_EXEC_GROUP].toolchains cross, _exec_triple, _target_triple = _cross_compile(ctx, eg_toolchains) - cc_toolchain_raw = eg_toolchains[_CC_TOOLCHAIN_TYPE] + # A missing C++ toolchain must stay an explicit analysis error (it used + # to be a resolution failure when the type was mandatory) — otherwise the + # backend compiles with whatever ambient compiler the sandbox exposes, + # or fails at execution time. + cc_toolchain_raw = eg_toolchains[_CC_TOOLCHAIN_TYPE] if cc_toolchain_raw == None: if cross: fail( - ("Cross-compilation of sdist '{}' requires a CC toolchain " + - "registered for the target platform. No toolchain of type {} " + - "resolved against the current exec/target platform combination.\n" + - "Register a cross CC toolchain (e.g., toolchains_llvm with " + - "matching target_compatible_with) via register_toolchains.").format( - ctx.attr.src.label, - _CC_TOOLCHAIN_TYPE, - ), + "{}: cross-compiling this sdist requires a C++ toolchain that ".format(ctx.label) + + "can target the destination platform (e.g. the BCR llvm module); " + + "none resolved for the current exec/target combination.", ) fail( - ("sdist '{}' requires a CC toolchain but none resolved. " + - "Register a CC toolchain (e.g., rules_cc, toolchains_llvm) " + - "via register_toolchains.").format(ctx.attr.src.label), + "{}: no C++ toolchain resolved for this native sdist build. ".format(ctx.label) + + "Building native extensions requires a registered C++ toolchain " + + "usable on the selected execution platform.", ) - cc_toolchain = cc_toolchain_raw - if hasattr(cc_toolchain, "cc_provider_in_toolchain") and hasattr(cc_toolchain, "cc"): - cc_toolchain = cc_toolchain.cc + wheel_file = ctx.actions.declare_file(ctx.label.name + ".whl") + patch_args, patch_inputs = patch_args_and_inputs(ctx) env = common_env(ctx) extra_inputs, known_variables = _collect_toolchain_inputs_and_vars(ctx) @@ -286,10 +286,9 @@ def _pep517_native_whl(ctx): known_variables.update({key: value for key, value in cc_tools.items() if key not in known_variables}) # Well-known make-variables exported by `toolchains` become the env keys - # the build helper consumes, so listing a toolchain is enough — no - # `"CARGO": "$(CARGO)"` boilerplate, and the RULES_PY_* names stay an - # internal contract between this rule and the helper. Explicit `env` - # entries win. + # the build helper consumes, so listing a toolchain is enough and the + # RULES_PY_* names stay a contract between this rule and the helper. + # Explicit `env` entries win. for make_var, env_key in _DERIVED_ENV.items(): if make_var in known_variables and env_key not in ctx.attr.env: env[env_key] = known_variables[make_var] @@ -305,15 +304,12 @@ def _pep517_native_whl(ctx): if "CXX" not in ctx.attr.env and cc_tools.get("CXX") and infer_cxx: env[_INFER_CXX_COMPANION] = "1" + cross_args = [] if cross: + cc_toolchain = cc_toolchain_raw + if hasattr(cc_toolchain, "cc_provider_in_toolchain") and hasattr(cc_toolchain, "cc"): + cc_toolchain = cc_toolchain.cc cc_layer = extract_cc_layer(ctx, cc_toolchain) - env["RULES_PY_CROSS_COMPILE"] = "1" - env["RULES_PY_TARGET_OS"] = cc_layer.target_os or "" - env["RULES_PY_TARGET_CPU"] = cc_layer.target_cpu or "" - if cc_layer.static_runtime_files: - extra_inputs.append(cc_layer.static_runtime_files) - if cc_layer.static_runtime_paths: - env["RULES_PY_CXX_STATIC_RUNTIME"] = ":".join(cc_layer.static_runtime_paths) # Toolchain flags first, then any flags the package set via `env` # (uv.override_package): the package's -D/-std/feature-baseline @@ -333,6 +329,12 @@ def _pep517_native_whl(ctx): if cc_layer.ccshared: env["CFLAGS"] = (env.get("CFLAGS", "") + " " + cc_layer.ccshared).strip() env["CXXFLAGS"] = (env.get("CXXFLAGS", "") + " " + cc_layer.ccshared).strip() + + if cc_layer.static_runtime_files: + extra_inputs.append(cc_layer.static_runtime_files) + if cc_layer.static_runtime_paths: + env["RULES_PY_CXX_STATIC_RUNTIME"] = ":".join(cc_layer.static_runtime_paths) + cross_args = [ "--cross", "--target-os", @@ -358,17 +360,12 @@ def _pep517_native_whl(ctx): host_platform = _derive_python_host_platform(cc_layer.target_os, cc_layer.target_cpu) if host_platform: env["_PYTHON_HOST_PLATFORM"] = host_platform - else: - cross_args = [] - tool = tool_files_to_run(ctx) + tool = ctx.attr.tool[DefaultInfo].files_to_run ctx.actions.run( mnemonic = "PySdistNativeBuild", - progress_message = "{} source compiling {} to a whl".format( - "Cross" if cross else "Native", - archive.basename, - ), + progress_message = "Native source compiling {} to a whl".format(archive.basename), executable = tool, toolchain = None, arguments = ctx.attr.args + [patch_args] + memory_args(ctx) + cross_args + [ @@ -405,15 +402,8 @@ attribute maps environment variable names to strings that may reference `$(VAR)` make-variables sourced from those toolchains. This mirrors the pattern used by `rules_rust`'s `cargo_build_script`. -In native mode (exec platform == target platform) the build uses the host -CC toolchain. Cross mode is decided by comparing the platform triples of the -exec interpreter (exec-tools toolchain) and the target interpreter (Python -toolchain): differing triples enter cross mode, where the CC toolchain of -the "target" exec group resolves against a user-registered cross CC toolchain -(e.g., toolchains_llvm). If no cross CC toolchain is found, analysis fails -with a diagnostic naming the required toolchain type. When the interpreter -origins are unrecognizable, the optional NATIVE_BUILD_TOOLCHAIN sentinel's -absence is used as the cross signal. +The build is guaranteed to occur on an execution platform matching the +constraints of the target platform. """, attrs = PEP517_WHL_ATTRS | { @@ -428,7 +418,6 @@ absence is used as the cross signal. "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + "configured C++ action tools.", ), - "tool": attr.label(executable = True, cfg = exec_transition), "_platform_libc": attr.label( default = "//uv/private/constraints/platform:platform_libc", doc = "Read in cross mode to pick the rust target triple (gnu vs musl).", @@ -436,27 +425,36 @@ absence is used as the cross signal. } | CC_LAYER_ATTRS, fragments = ["cpp"], toolchains = [ - # Target-configured interpreter, read for its platform triple in the - # cross detection and for the target sysconfigdata in cross mode; - # optional so unresolvable targets surface the rule's own error - # instead of a toolchain-resolution one. + # Target-configured interpreter, read only for its platform triple in + # the cross detection; optional so unresolvable targets surface the + # rule's own error instead of a toolchain-resolution one. config_common.toolchain_type(PY_TOOLCHAIN, mandatory = False), ], exec_groups = { + # Cross-compilation of sdists is intentionally unsupported: PEP 517 + # build backends (setuptools, meson-python, etc.) have no standard + # mechanism for cross-compilation, Python headers for the target + # platform are not readily available, and output wheel tags would + # need to encode the target platform with no upstream tooling + # support. Packages that need cross-compiled native extensions should + # publish pre-built wheels for their target platforms instead. + # # Detection inputs: NATIVE_BUILD_TOOLCHAIN has matching # exec_compatible_with and target_compatible_with, so it resolves # exactly when the exec and target platforms match — optional, its # absence is a cross signal, not a resolution error. The exec- and # target-configured interpreters' platform triples refine that signal # (see _cross_decision); a cross decision switches the action into - # cross mode instead of failing. + # cross mode (cc_layer extraction + target-identity env) instead of + # failing. TARGET_EXEC_GROUP: exec_group( toolchains = [ PY_TOOLCHAIN, config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN, mandatory = False), config_common.toolchain_type(NATIVE_BUILD_TOOLCHAIN, mandatory = False), - # Optional so the rule's own per-mode message wins when no - # C++ toolchain resolves (see the cc_toolchain_raw check). + # Optional for the same reason: on a cross target no C++ + # toolchain may resolve, and the rule's own error must win + # over a resolution failure. config_common.toolchain_type(_CC_TOOLCHAIN_TYPE, mandatory = False), ], ), diff --git a/uv/private/pep517_whl/pep517_whl.bzl b/uv/private/pep517_whl/pep517_whl.bzl index 64aec4524..0082eb51e 100644 --- a/uv/private/pep517_whl/pep517_whl.bzl +++ b/uv/private/pep517_whl/pep517_whl.bzl @@ -13,7 +13,6 @@ load( "common_env", "memory_args", "patch_args_and_inputs", - "tool_files_to_run", "wheel_providers", ) @@ -30,18 +29,17 @@ def _pep517_whl(ctx): # the action sandbox, which means the venv shim can find the interpreter # via the standard runfiles mechanism regardless of whether the interpreter # comes from an external repo or the main workspace. - tool = tool_files_to_run(ctx) ctx.actions.run( mnemonic = "PySdistBuild", progress_message = "Source compiling {} to a whl".format(archive.basename), - executable = tool, + executable = ctx.executable.tool, toolchain = None, arguments = ctx.attr.args + [patch_args] + memory_args(ctx) + [ archive.path, wheel_file.path, ], inputs = depset([archive], transitive = [patch_inputs]), - tools = [tool], + tools = [ctx.attr.tool[DefaultInfo].files_to_run], outputs = [wheel_file], env = common_env(ctx), exec_group = TARGET_EXEC_GROUP, diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index bb1525f4c..adf64c39c 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -62,8 +62,8 @@ config_setting( ], ) -# Minimal fixture: no extra toolchains, so cross-configuration analysis -# tests observe only the rule's own behavior. +# Minimal fixture: no extra toolchains, so under the cross transition the +# only analysis-time failure can be the rule's own cross-unsupported error. pep517_native_whl( name = "__cross_fixture", src = ":__stub_sdist", @@ -118,6 +118,13 @@ py_test( deps = ["//uv/private/pep517_whl/tools"], ) +py_test( + name = "build_helper_test", + srcs = ["build_helper_test.py"], + main = "build_helper_test.py", + deps = ["//uv/private/pep517_whl/tools"], +) + py_test( name = "build_helper_cross_test", srcs = ["build_helper_cross_test.py"], @@ -130,13 +137,6 @@ py_test( ], ) -py_test( - name = "build_helper_test", - srcs = ["build_helper_test.py"], - main = "build_helper_test.py", - deps = ["//uv/private/pep517_whl/tools"], -) - py_test( name = "local_cxx_companion_test", srcs = ["local_cxx_companion_test.py"], diff --git a/uv/private/pep517_whl/tests/frontend_config_test.bzl b/uv/private/pep517_whl/tests/frontend_config_test.bzl index 061f19c47..1ace329fc 100644 --- a/uv/private/pep517_whl/tests/frontend_config_test.bzl +++ b/uv/private/pep517_whl/tests/frontend_config_test.bzl @@ -62,16 +62,11 @@ def _frontend_exec_config_test_impl(ctx): action = _build_action(env) if action: tool_path = action.argv[0] - - # SPIKE DIVERGENCE from main: exec_transition is a target-config - # transition pinned to --host_platform, so the frontend does NOT - # live in an -exec output directory. Known RBE limitation of the - # spike; main asserts the opposite. asserts.true( env, - "-exec" not in tool_path, - "exec_transition pins the frontend to the host in target " + - "configuration; got: " + tool_path, + "-exec" in tool_path, + "the frontend must be built in an exec configuration " + + "(its binary runs on the execution platform); got: " + tool_path, ) return analysistest.end(env) @@ -81,8 +76,6 @@ def _frontend_libc_leak_test_impl(ctx): env = analysistest.begin(ctx) action = _build_action(env) if action: - # On the spike both resets agree: the tool attr's exec_transition and - # the pep517_frontend wrapper each pin the flag to the host's value. asserts.equals( env, CURRENT_PLATFORM_LIBC, diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index c40db4262..34f02587d 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -1,12 +1,9 @@ #!/usr/bin/env python3 -"""Drive a PEP 517 sdist-to-wheel build inside a Bazel action. +""" +A minimal python3 -m build wrapper -Unpacks the sdist, assembles a build environment that survives the backend's -chdir (compiler wrappers, absolutized toolchain paths) and — in cross mode — -fakes the target platform's identity for the backend, then runs the -pypa/build frontend. Deliberately a single self-contained script: it is the -`main` of the py_binary each sdist_build repo generates. +Mostly exists to allow debugging. """ from __future__ import annotations @@ -23,7 +20,6 @@ from os import chmod, defpath, listdir, makedirs, path, pathsep from subprocess import CalledProcessError, check_call, check_output, STDOUT, run from tempfile import TemporaryFile -from typing import Dict, NoReturn, Optional try: tomllib = importlib.import_module("tomllib") @@ -37,199 +33,24 @@ ) -def _die(message: str) -> NoReturn: - print(message, file=sys.stderr) - sys.exit(1) - - -# Clang-only DWARF flag some Bazel toolchains inject; stripped by the -# wrappers because non-clang drivers reject it. +# Compiler commands must remain valid across working-directory changes. +# argv[0] must name the resolved driver because compilers may use its directory +# to locate sibling tools and resources. Clang does so under -no-canonical-prefixes: +# https://github.com/llvm/llvm-project/blob/llvmorg-22.1.4/clang/tools/driver/driver.cpp#L63-L78 _DEBUG_FLAG = "-fdebug-default-version=4" - -# Forces the static libstdc++ archive regardless of driver name. Plain -# `-static-libstdc++` is a no-op under gcc_toolchain, whose tool_path is -# "gcc" (not "g++"): that flag only modifies the implicit libstdc++ link the -# "g++" argv[0] spec adds. Without this, C++ extensions can build and even -# import (borrowing symbols another loaded .so pulled in) yet fail at -# runtime. GNU-ld-only syntax: skipped on Darwin, where clang++ links libc++ -# implicitly. -_STATIC_LIBSTDCXX_FLAGS = ("-Wl,-Bstatic", "-lstdc++", "-Wl,-Bdynamic") - _COMPILER_WRAPPER = """#!/usr/bin/env python3 import os import sys filtered_args = [arg for arg in sys.argv[1:] if arg != "{debug_flag}"] -is_cxx = {is_cxx!r} -is_darwin = {is_darwin!r} -# Same non-link detection as the cross wrapper: compiles, preprocessing, -# and compiler-introspection probes must not receive link-only flags. -is_link = True -for _arg in filtered_args: - if _arg in ("-c", "-E", "-S", "-fsyntax-only", "--version", "-dumpmachine", "-dumpversion", "-###") or _arg.startswith("-print-"): - is_link = False - break -if is_cxx and is_link and not is_darwin: - filtered_args = filtered_args + {static_libstdcxx_flags!r} sysroot = {sysroot!r} if sysroot and "-isysroot" not in filtered_args: filtered_args = ["-isysroot", sysroot] + filtered_args - -# argv[0] must be the compiler's full path, not just its basename: GCC's -# driver resolves prefix-relative resources (libstdc++.a, LTO plugins) off -# argv[0], not /proc/self/exe. A basename-only argv[0] makes it silently -# search relative to our wrapper's own directory instead and miss them. os.execv("{compiler_path}", ["{compiler_path}"] + filtered_args) """ -_IDENTITY_FLAG_PREFIXES = ( - "-target", - "--target", - "--sysroot", - "-isysroot", - "-mmacosx-version-min", -) - -_DROP_LINKER_FLAGS = frozenset({ - "-Wl,--start-group", - "-Wl,--end-group", - "-Wl,--as-needed", - "-Wl,--allow-shlib-undefined", - "-Wl,-O1", - "-Wl,-start_group", - "-Wl,-end_group", - "-bundle", - "STRIP_DEBUG_SYMBOLS", -}) - -_DROP_LINKER_PAIRS = frozenset({ - "-arch", - "-undefined", - "-current_version", - "-compatibility_version", - "-install_name", -}) - -_DROP_LINKER_PREFIXES = ( - "-mmacosx-version-min", -) - -_CROSS_COMPILER_WRAPPER = """#!/usr/bin/env python3 -import os -import sys - -args = sys.argv[1:] -wrapper_flags = {wrapper_flags!r} -drop_exact = {drop_exact!r} -drop_pairs = {drop_pairs!r} -drop_prefixes = {drop_prefixes!r} -lld_path = {lld_path!r} -debug_flag = {debug_flag!r} -is_cxx = {is_cxx!r} -is_darwin = {is_darwin!r} -static_libstdcxx_flags = {static_libstdcxx_flags!r} -exe_link_flags = {exe_link_flags!r} -static_runtime_archives = {static_runtime_archives!r} -exe_link_flags = {exe_link_flags!r} - -# Not a link if compiling/preprocessing (-c/-E/-S/-fsyntax-only) or if this -# is a compiler-introspection probe (meson runs "-E -v -", "-print-*", -# "--version" through us): appending link inputs there is at best noise and -# at worst catastrophic — "-E" *preprocesses* positional inputs, so an -# appended static archive becomes megabytes of binary on stdout that -# meson then strictly utf-8 decodes. -is_link = True -for a in args: - if a in ("-c", "-E", "-S", "-fsyntax-only", "--version", "-dumpmachine", "-dumpversion", "-###") or a.startswith("-print-"): - is_link = False - break -filtered = [] -i = 0 -while i < len(args): - a = args[i] - if a == debug_flag or a in drop_exact or any(a.startswith(p) for p in drop_prefixes): - i += 1 - continue - if a in drop_pairs and i + 1 < len(args): - i += 2 - continue - filtered.append(a) - i += 1 - -# Standalone (non-"-shared") executables built here are never the wheel -# deliverable — only throwaway feature probes (meson sanity checks, -# cc.run()) executed under QEMU, where dynamically-linked target-arch PIE -# binaries hit a real qemu-user/glibc startup bug ("Inconsistency detected -# by ld.so: ... DT_VERSYM"), reproducible with a single-toolchain -# hello-world. "-static" sidesteps ld.so entirely; the .so deliverables -# always pass "-shared" and load via dlopen's unrelated path. Mutually -# exclusive with the static-libstdc++ trick: its trailing "-Wl,-Bdynamic" -# would undo a bare "-static" for driver-appended libs (libc included). -# Shared-link spellings: "-shared" (ELF), "-bundle"/"-dynamiclib" (ld64). -# Scanned pre-filter: the darwin spellings are host-leak-dropped from -# `filtered` when the target is not darwin. -is_shared = any(a in ("-shared", "-bundle", "-dynamiclib") for a in args) -if is_link and is_shared and static_runtime_archives: - # A -nostdlib++ toolchain (the BCR llvm module) carries its C++/unwind - # runtime as toolchain inputs, never as link flags: without these - # archives a C++ extension links with std::__1/_Unwind_* unresolved and - # only explodes at dlopen time on the target. Archive semantics make - # this safe on pure-C links: unused members are simply not pulled. - filtered.extend(static_runtime_archives) -if is_darwin and is_link and is_shared: - # Extension modules leave _Py* unresolved until dlopen; ld64 errors on - # them by default (ELF linkers don't), so mirror CPython's own LDSHARED - # unless the backend already passed it. Takes precedence over the - # exe_link_flags branch: target identity beats toolchain plumbing. - if "dynamic_lookup" not in filtered and "-Wl,-undefined,dynamic_lookup" not in filtered: - filtered.append("-Wl,-undefined,dynamic_lookup") -elif is_link and exe_link_flags: - # LLVM-style toolchain (see the "-nostdlib++" detection in - # _compiler_env): clang only reaches its crt objects and runtime - # libraries through the link action's -B/-L/--sysroot flags, and not - # every caller threads $LDSHARED through — rustc invokes this wrapper - # as "-C linker" with cargo's own argv, meson links its probes bare. - # Bake the flags into every link; duplicates are harmless to clang. - # rustc hardcodes "-lgcc_s" on *-linux-gnu but this toolchain ships no - # libgcc: the unwinder comes from the static runtime archives (or, - # without them, from folding in "-lunwind" — cargo-zigbuild's trick, - # same ABI surface). - if static_runtime_archives: - filtered = [a for a in filtered if a != "-lgcc_s"] - else: - filtered = ["-lunwind" if a == "-lgcc_s" else a for a in filtered] - filtered.extend(exe_link_flags) - if static_runtime_archives and not is_darwin and not is_shared: - # The toolchain's C++/unwind runtime (libc++.a, libc++abi.a, - # libunwind.a) travels as toolchain inputs, never as link flags — - # link the archives explicitly, in dependency order, after every - # object. Shared links already got them above; don't list them - # twice. Archive semantics make this safe on pure-C links: unused - # members are simply not pulled. - filtered.extend(static_runtime_archives) - elif is_cxx: - # No implicit C++ stdlib under -nostdlib++; statically embed - # libc++ so the produced .so has no host-libstdc++ dependency - # (only static archives exist on the toolchain's search path). - filtered.extend(["-lc++", "-lc++abi"]) -elif is_link and not is_shared and not is_darwin: - filtered.append("-static") -elif is_cxx and is_link and not is_darwin: - filtered.extend(static_libstdcxx_flags) - -if is_link and lld_path: - os.environ.setdefault("PATH", "") - os.environ["PATH"] = os.path.dirname(lld_path) + os.pathsep + os.environ["PATH"] - if "-fuse-ld=lld" not in filtered: - filtered.insert(0, "-fuse-ld=lld") - -real = {compiler_path!r} -os.execv(real, [real] + wrapper_flags + filtered) -""" - - -def _darwin_sysroot() -> Optional[str]: +def _darwin_sysroot() -> str | None: """Return the macOS SDK path, or None if unavailable.""" if _platform.system() != "Darwin": return None @@ -239,61 +60,18 @@ def _darwin_sysroot() -> Optional[str]: return None -def _xcode_developer_dir() -> Optional[str]: - """Return the active Xcode Developer directory, or None if unavailable.""" - try: - return check_output(["xcode-select", "-p"], text=True).strip() - except Exception: - return None - - -_MACOSX_DEPLOYMENT_TARGET_RE = re.compile( - r"[\"']MACOSX_DEPLOYMENT_TARGET[\"']\s*:\s*[\"']?([0-9][0-9.]*)" -) - - -def _macosx_deployment_target(sysconfigdata_path: str) -> Optional[str]: - """The target interpreter's deployment target, from its sysconfigdata. - - The deployment version in wheel/platform tags is a property of the target - interpreter's build, not a constant — regex the build_time_vars literal - rather than importing it, since the file belongs to a foreign-platform - interpreter this process must not execute code from. - """ - try: - with open(sysconfigdata_path, encoding="utf-8") as f: - match = _MACOSX_DEPLOYMENT_TARGET_RE.search(f.read()) - except OSError: - return None - return match.group(1) if match else None - - -def _darwin_kernel_release(macos_deployment_target: Optional[str]) -> str: - """Fake os.uname() release consistent with the macOS deployment target. +def _absolutize_path(value: str) -> str: + """Resolve a relative path to absolute, leaving absolute/empty values untouched. - Darwin kernel majors track macOS marketing versions as 11→20 … 15→24; - from the year-based scheme (26 = Darwin 25) it's major−1. Only consumers - parsing a plausible kernel version matter here (ctypes' import does), - so unknown/missing values fall back to the macOS 11 baseline. + Shared by _resolve_compiler_path (CC/CXX) and _absolutize_tool_paths. + Toolchain execroot-relative paths break once the PEP 517 backend chdirs into the + unpacked sdist. Centralizing the policy keeps the two paths in lockstep + and gives future toolchains (FC, RUSTC, ...) a single primitive to call. """ - try: - major = int((macos_deployment_target or "").split(".")[0]) - except ValueError: - major = 0 - if 11 <= major <= 15: - return "{}.0.0".format(major + 9) - if major >= 26: - return "{}.0.0".format(major - 1) - return "20.0.0" - - -def _absolutize_path(value: str) -> str: - """Make a relative path absolute: execroot-relative toolchain paths stop - resolving once the PEP 517 backend chdirs into the unpacked sdist.""" return path.abspath(value) if value and not path.isabs(value) else value -def _resolve_compiler_path(env: Dict[str, str], key: str, default: str) -> str: +def _resolve_compiler_path(env: dict[str, str], key: str, default: str) -> str: """Extract the real compiler from the environment and resolve it to an absolute path.""" current = env.get(key) if not current: @@ -307,7 +85,7 @@ def _resolve_compiler_path(env: Dict[str, str], key: str, default: str) -> str: return shutil.which(compiler, path=env.get("PATH", defpath)) or compiler -def _local_cxx_companion(current: Optional[str], compiler_path: str) -> str: +def _local_cxx_companion(current: str | None, compiler_path: str) -> str: """Select an executable same-directory C++ peer for a direct local C driver.""" parts = shlex.split(current or "") if not parts or not path.isabs(parts[0]): @@ -332,39 +110,118 @@ def _local_cxx_companion(current: Optional[str], compiler_path: str) -> str: return compiler_path -def _write_generated_file(file_path: str, content: str, executable: bool = False) -> str: - """Write content to file_path, creating parent dirs. Returns file_path for chaining.""" - makedirs(path.dirname(file_path), exist_ok=True) - with open(file_path, "w") as f: - f.write(content) - if executable: - chmod(file_path, 0o755) - return file_path - - def _make_compiler_wrapper( tmpdir: str, name: str, compiler_path: str, - sysroot: Optional[str] = None, - is_cxx: bool = False, - is_darwin: bool = False, + sysroot: str | None = None, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) - return _write_generated_file( - wrapper, - _COMPILER_WRAPPER.format( + makedirs(path.dirname(wrapper), exist_ok=True) + with open(wrapper, "w") as f: + f.write(_COMPILER_WRAPPER.format( debug_flag=_DEBUG_FLAG, compiler_path=compiler_path, sysroot=sysroot, - is_cxx=is_cxx, - is_darwin=is_darwin, - static_libstdcxx_flags=list(_STATIC_LIBSTDCXX_FLAGS), - ), + )) + chmod(wrapper, 0o755) + return wrapper + + +_AR_LIBTOOL_WRAPPER = """#!/usr/bin/env python3 +import os +import subprocess +import sys + +libtool = {libtool!r} +args = sys.argv[1:] + +# Tool probes ("--version", "-V", ...) hand through untouched. +if not args or args[0].startswith("--") or args[0] in ("-V", "-v", "-h"): + os.execv(libtool, [libtool] + args) + +# ar-style " " — the ops' leading dash is +# optional (ar's grammar is [-]{{dmpqrstx}}: meson "csr", CMake "qc"/"q", +# distutils "rcs", "ar -rcs" all mean the same). libtool -static always +# rewrites the whole symbol-tabled archive. +ops = args[0].lstrip("-") +archive = args[1] +members = args[2:] + +if ops and ops[0] in ("q", "r", "a", "s") and os.path.exists(archive): + # Append/replace/index-only keep the members already in the archive, + # but libtool only knows full rewrites: feed the archive back as an + # input. Write beside it first — reading an input while overwriting it + # is not a hazard to discover. ("s" alone is ranlib-mode: rewriting the + # archive from itself refreshes the index, which is all that mode asks.) + tmp = archive + ".libtool.tmp" + try: + subprocess.check_call([libtool, "-static", "-o", tmp, archive] + members) + os.replace(tmp, archive) + finally: + if os.path.exists(tmp): + os.remove(tmp) + sys.exit(0) + +# Create-from-scratch (or a missing archive): plain rewrite. +os.execv(libtool, [libtool, "-static", "-o", archive] + members) +""" + + +def _make_ar_libtool_wrapper(tmpdir: str, libtool_path: str) -> str: + wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", "ar") + return _write_generated_file( + wrapper, + _AR_LIBTOOL_WRAPPER.format(libtool=libtool_path), executable=True, ) +def _override_tool(env: dict[str, str], key: str, wrapper: str) -> None: + current = env.get(key) + if not current: + return + parts = shlex.split(current) + if parts: + parts[0] = wrapper + env[key] = shlex.join(parts) + + +def _absolutize_tool_paths(env: dict[str, str]) -> None: + """Resolve toolchain paths before the backend changes cwd.""" + for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): + value = env.get(key) + if value: + env[key] = _absolutize_path(value) + + for key in ("AR", "LD", "STRIP"): + value = env.get(key) + if not value: + continue + parts = shlex.split(value) + if parts and path.dirname(parts[0]): + parts[0] = _absolutize_path(parts[0]) + env[key] = shlex.join(parts) + + +# --- Cross-compilation support ------------------------------------------- +# +# Reduced to what setuptools-family backends need. Deferred to the slices +# that exercise them: meson cross files, CMake toolchain files, cargo env, +# lld discovery, -nostdlib++ static runtime archives, probe-executable +# static linking, and the darwin-exec ar/libtool translation. + + +def _write_generated_file(file_path: str, content: str, executable: bool = False) -> str: + """Write content to file_path, creating parent dirs. Returns file_path for chaining.""" + makedirs(path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + f.write(content) + if executable: + chmod(file_path, 0o755) + return file_path + + _SYSROOT_FLAG_PREFIXES = ("--sysroot", "-isysroot") @@ -395,6 +252,15 @@ def _absolutize_sysroot_flags(flags: str) -> str: return shlex.join(result) +_IDENTITY_FLAG_PREFIXES = ( + "-target", + "--target", + "--sysroot", + "-isysroot", + "-mmacosx-version-min", +) + + def _get_wrapper_flags(cflags: str) -> list[str]: """Extract identity flags (-target, --sysroot, -isysroot, ...) from CFLAGS. @@ -418,16 +284,108 @@ def _get_wrapper_flags(cflags: str) -> list[str]: return result -def _find_lld(compiler_path: str) -> Optional[str]: - """Locate ld.lld or ld64.lld next to the compiler, if present.""" - d = path.dirname(compiler_path) - if not d: - return None - for name in ("ld.lld", "ld64.lld", "lld"): - candidate = path.join(d, name) - if path.isfile(candidate) and os.access(candidate, os.X_OK): - return candidate - return None +_DROP_LINKER_FLAGS = frozenset({ + "-Wl,--start-group", + "-Wl,--end-group", + "-Wl,--as-needed", + "-Wl,--allow-shlib-undefined", + "-Wl,-O1", + "-Wl,-start_group", + "-Wl,-end_group", + "-bundle", + "STRIP_DEBUG_SYMBOLS", +}) + +_DROP_LINKER_PAIRS = frozenset({ + "-arch", + "-undefined", + "-current_version", + "-compatibility_version", + "-install_name", +}) + +_DROP_LINKER_PREFIXES = ( + "-mmacosx-version-min", +) + +_CROSS_COMPILER_WRAPPER = """#!/usr/bin/env python3 +import os +import sys + +args = sys.argv[1:] +wrapper_flags = {wrapper_flags!r} +drop_exact = {drop_exact!r} +drop_pairs = {drop_pairs!r} +drop_prefixes = {drop_prefixes!r} +debug_flag = {debug_flag!r} +is_darwin = {is_darwin!r} +static_runtime_archives = {static_runtime_archives!r} +exe_link_flags = {exe_link_flags!r} + +# Not a link if compiling/preprocessing (-c/-E/-S/-fsyntax-only) or if this +# is a compiler-introspection probe ("-print-*", "--version"): appending +# link-only flags there is noise at best. +is_link = True +for a in args: + if a in ("-c", "-E", "-S", "-fsyntax-only", "--version", "-dumpmachine", "-dumpversion", "-###") or a.startswith("-print-"): + is_link = False + break + +filtered = [] +i = 0 +while i < len(args): + a = args[i] + if a == debug_flag or a in drop_exact or any(a.startswith(p) for p in drop_prefixes): + i += 1 + continue + if a in drop_pairs and i + 1 < len(args): + i += 2 + continue + filtered.append(a) + i += 1 + +# Shared-link spellings: "-shared" (ELF), "-bundle"/"-dynamiclib" (ld64). +# Scanned pre-filter: the darwin spellings are host-leak-dropped from +# `filtered` when the target is not darwin. +is_shared = any(a in ("-shared", "-bundle", "-dynamiclib") for a in args) +if is_link and is_shared and static_runtime_archives: + # A -nostdlib++ toolchain (the BCR llvm module) carries its C++/unwind + # runtime as toolchain inputs, never as link flags: without these + # archives a C++ extension links with std::__1/_Unwind_* unresolved and + # only explodes at dlopen time on the target. Archive semantics make + # this safe on pure-C links: unused members are simply not pulled. + filtered.extend(static_runtime_archives) +if is_darwin and is_link and is_shared: + # Extension modules leave _Py* unresolved until dlopen; ld64 errors on + # them by default (ELF linkers don't), so mirror CPython's own LDSHARED + # unless the backend already passed it. + if "dynamic_lookup" not in filtered and "-Wl,-undefined,dynamic_lookup" not in filtered: + filtered.append("-Wl,-undefined,dynamic_lookup") +elif is_link and exe_link_flags: + # LLVM-style toolchain (see the "-nostdlib++" detection in + # _compiler_env): clang only reaches its crt objects and runtime + # libraries through the link action's -B/-L/--sysroot flags, and not + # every caller threads $LDSHARED through — rustc invokes this wrapper + # as "-C linker" with cargo's own argv, meson links its probes bare. + # Bake the flags into every link; duplicates are harmless to clang. + # rustc hardcodes "-lgcc_s" on *-linux-gnu but this toolchain ships no + # libgcc: the unwinder comes from the static runtime archives (or, + # without them, from folding in "-lunwind" — cargo-zigbuild's trick, + # same ABI surface). + if static_runtime_archives: + filtered = [a for a in filtered if a != "-lgcc_s"] + else: + filtered = ["-lunwind" if a == "-lgcc_s" else a for a in filtered] + filtered.extend(exe_link_flags) + if not is_shared: + # Executable-style links (probes, build-script binaries) also need + # the C++/unwind runtime; shared links already got the archives + # above, so don't list them twice. + filtered.extend(static_runtime_archives) + +real = {compiler_path!r} +os.execv(real, [real] + wrapper_flags + filtered) +""" def _make_cross_compiler_wrapper( @@ -435,11 +393,9 @@ def _make_cross_compiler_wrapper( name: str, compiler_path: str, wrapper_flags: list[str], - lld_path: Optional[str] = None, - is_cxx: bool = False, is_darwin: bool = False, - exe_link_flags: Optional[list[str]] = None, - static_runtime_archives: Optional[list[str]] = None, + static_runtime_archives: list[str] | None = None, + exe_link_flags: list[str] | None = None, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) @@ -461,108 +417,182 @@ def _make_cross_compiler_wrapper( drop_exact=sorted(drop_exact), drop_pairs=sorted(drop_pairs), drop_prefixes=list(_DROP_LINKER_PREFIXES), - lld_path=lld_path, debug_flag=_DEBUG_FLAG, - is_cxx=is_cxx, is_darwin=is_darwin, - static_libstdcxx_flags=list(_STATIC_LIBSTDCXX_FLAGS), - exe_link_flags=list(exe_link_flags or []), static_runtime_archives=list(static_runtime_archives or []), + exe_link_flags=list(exe_link_flags or []), ), executable=True, ) -_AR_LIBTOOL_WRAPPER = """#!/usr/bin/env python3 +_MACOSX_DEPLOYMENT_TARGET_RE = re.compile( + r"[\"']MACOSX_DEPLOYMENT_TARGET[\"']\s*:\s*[\"']?([0-9][0-9.]*)" +) + + +def _macosx_deployment_target(sysconfigdata_path: str) -> str | None: + """The target interpreter's deployment target, from its sysconfigdata. + + The deployment version in wheel/platform tags is a property of the target + interpreter's build, not a constant — regex the build_time_vars literal + rather than importing it, since the file belongs to a foreign-platform + interpreter this process must not execute code from. + """ + try: + with open(sysconfigdata_path, encoding="utf-8") as f: + match = _MACOSX_DEPLOYMENT_TARGET_RE.search(f.read()) + except OSError: + return None + return match.group(1) if match else None + + +def _darwin_kernel_release(macos_deployment_target: str | None) -> str: + """Fake os.uname() release consistent with the macOS deployment target. + + Darwin kernel majors track macOS marketing versions as 11→20 … 15→24; + from the year-based scheme (26 = Darwin 25) it's major−1. Only consumers + parsing a plausible kernel version matter here (ctypes' import does), + so unknown/missing values fall back to the macOS 11 baseline. + """ + try: + major = int((macos_deployment_target or "").split(".")[0]) + except ValueError: + major = 0 + if 11 <= major <= 15: + return "{}.0.0".format(major + 9) + if major >= 26: + return "{}.0.0".format(major - 1) + return "20.0.0" + + +_TITLECASE_OS = {"linux": "Linux", "darwin": "Darwin", "windows": "Windows"} +_SYS_PLATFORM = {"linux": "linux", "darwin": "darwin", "windows": "win32"} + + +_SITECUSTOMIZE_TEMPLATE = """\ import os -import subprocess +import platform import sys +import collections -libtool = {libtool!r} -args = sys.argv[1:] +# ctypes parses os.uname().release at import time when the *host* is Darwin. +# Import it while uname and sys.platform are still real so the target's +# faked values never reach that parse. +try: + import ctypes +except ImportError: + pass -# Tool probes ("--version", "-V", ...) hand through untouched. -if not args or args[0].startswith("--") or args[0] in ("-V", "-v", "-h"): - os.execv(libtool, [libtool] + args) +_machine = {machine!r} +_sysname = {sysname!r} +_release = {release!r} -# ar-style " " — the ops' leading dash is -# optional (ar's grammar is [-]{{dmpqrstx}}: meson "csr", CMake "qc"/"q", -# distutils "rcs", "ar -rcs" all mean the same). libtool -static always -# rewrites the whole symbol-tabled archive. -ops = args[0].lstrip("-") -archive = args[1] -members = args[2:] +# setup.py scripts branch on sys.platform to decide which sources to compile +# (psutil picks _psutil_osx.c vs _psutil_linux.c this way). +sys.platform = {sys_platform!r} + +os.uname = lambda: os.uname_result((_sysname, "build", _release, "", _machine)) + +# CS_GLIBC_LIB_VERSION otherwise leaks the *host's* glibc version, which +# feeds manylinux-tag determination in pip/packaging/subprocess. +if hasattr(os, "confstr"): + _real_confstr = os.confstr + + def _confstr(name): + if name == "CS_GLIBC_LIB_VERSION": + return "glibc_unknown" + return _real_confstr(name) -if ops and ops[0] in ("q", "r", "a", "s") and os.path.exists(archive): - # Append/replace/index-only keep the members already in the archive, - # but libtool only knows full rewrites: feed the archive back as an - # input. Write beside it first — reading an input while overwriting it - # is not a hazard to discover. ("s" alone is ranlib-mode: rewriting the - # archive from itself refreshes the index, which is all that mode asks.) - tmp = archive + ".libtool.tmp" - try: - subprocess.check_call([libtool, "-static", "-o", tmp, archive] + members) - os.replace(tmp, archive) - finally: - if os.path.exists(tmp): - os.remove(tmp) - sys.exit(0) + os.confstr = _confstr -# Create-from-scratch (or a missing archive): plain rewrite. -os.execv(libtool, [libtool, "-static", "-o", archive] + members) +# platform.uname_result.processor is a lazily-computed property that falls +# back to the real host on this field, so build our own namedtuple instead +# of the real type (mirrors crossenv's platform-patch.py). +_PlatformUname = collections.namedtuple("uname_result", "system node release version machine processor") +_platform_uname = _PlatformUname(_sysname, "build", _release, "", _machine, _machine) + +platform.uname = lambda: _platform_uname +platform.system = lambda: _sysname +platform.machine = lambda: _machine +platform.libc_ver = lambda *a, **k: ("", "") + +# packaging.tags derives its arch from sysconfig.get_platform() (already +# faked via $_PYTHON_HOST_PLATFORM); only the manylinux gate needs the +# top-level _manylinux hook packaging itself looks for. """ +_MANYLINUX_HOOK = """\ +# Cross build: we have no verified manylinux compatibility for the target +# (no target glibc version is threaded through yet), so refuse rather than +# silently claim host-arch manylinux tags are usable on the target. +def manylinux_compatible(tag_major, tag_minor, tag_arch): + return False -def _make_ar_libtool_wrapper(tmpdir: str, libtool_path: str) -> str: - wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", "ar") - return _write_generated_file( - wrapper, - _AR_LIBTOOL_WRAPPER.format(libtool=libtool_path), - executable=True, - ) +manylinux1_compatible = False +manylinux2010_compatible = False +manylinux2014_compatible = False +""" -def _override_tool(env: Dict[str, str], key: str, wrapper: str) -> None: - current = env.get(key) - if not current: - return - parts = shlex.split(current) - if parts: - parts[0] = wrapper - env[key] = shlex.join(parts) +def _generate_cross_site( + tmpdir: str, + target_os: str, + target_cpu: str, + macos_deployment_target: str | None = None, +) -> str: + """sitecustomize + _manylinux hook faking the target's runtime identity. -def _absolutize_tool_paths(env: Dict[str, str]) -> None: - """Resolve toolchain paths before the backend changes cwd.""" - for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): - value = env.get(key) - if value: - env[key] = _absolutize_path(value) + sysconfig is already faked via env vars CPython itself reads + (_PYTHON_HOST_PLATFORM, _PYTHON_SYSCONFIGDATA_NAME), but setup.py + scripts also branch on os.uname()/platform.machine() directly, which + env vars can't reach. sitecustomize.py runs on interpreter startup — + before any backend code — and patches os/platform in place. Modeled on + crossenv, minus what rules_py doesn't need. + """ + site_dir = path.join(tmpdir, ".cross_site") - for key in ("AR", "LD", "STRIP"): - value = env.get(key) - if not value: - continue - parts = shlex.split(value) - if parts and path.dirname(parts[0]): - parts[0] = _absolutize_path(parts[0]) - env[key] = shlex.join(parts) + # ctypes' own import does int(os.uname().release.split(".")[0]) on Darwin, + # so the faked release must parse as a Darwin kernel version there — + # derived from the target's deployment target so both stay consistent. + # Linux keeps "": nothing on that path parses it. + release = _darwin_kernel_release(macos_deployment_target) if target_os == "darwin" else "" + # macOS reports "arm64", never the Bazel constraint's "aarch64" — + # setup.py scripts branch on platform.machine() == "arm64", and the + # faked identity must agree with the wheel tag derived elsewhere. + machine = "arm64" if target_os == "darwin" and target_cpu == "aarch64" else target_cpu + _write_generated_file( + path.join(site_dir, "sitecustomize.py"), + _SITECUSTOMIZE_TEMPLATE.format( + machine=machine, + sysname=_TITLECASE_OS.get(target_os, target_os), + release=release, + sys_platform=_SYS_PLATFORM.get(target_os, target_os), + ), + ) + _write_generated_file(path.join(site_dir, "_manylinux.py"), _MANYLINUX_HOOK) + return site_dir def _compiler_env( tmpdir: str, - execroot_marker: Optional[str] = None, + execroot_marker: str | None = None, cross: bool = False, target_os: str = "", target_cpu: str = "", -) -> Dict[str, str]: +) -> dict[str, str]: env = dict(os.environ) if execroot_marker: execroot = os.getcwd() env = {key: value.replace(execroot_marker, execroot) for key, value in env.items()} - # The helper's own launcher exported this runfiles identity; nested Bazel - # executables launched by package code would trust it over their adjacent - # runfiles, so strip it before any package code runs. + # The helper's launcher exports RUNFILES_DIR, RUNFILES_MANIFEST_FILE, and + # JAVA_RUNFILES: + # https://github.com/hermeticbuild/hermetic-launcher/blob/381814d0818af0573263323dc0dd0e4e208fc3fa/README.md#runfiles-discovery + # Bazel adds RUNFILES_MANIFEST_ONLY when runfiles trees are disabled: + # https://github.com/bazelbuild/bazel/blob/9.1.1/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java#L192-L201 + # Nested Bazel executables check that inherited state before adjacent + # runfiles, so remove the parent's identity before package code runs. for key in ( "JAVA_RUNFILES", "RUNFILES_DIR", @@ -570,11 +600,11 @@ def _compiler_env( "RUNFILES_MANIFEST_ONLY", ): env.pop(key, None) - # Some build deps (maturin) ship plain wheel-data scripts under - # /bin, which venv assembly never merges (it only - # merges lib/site-packages) — so they land on neither sys.path nor PATH. - # They are still real runfiles; walk the runfiles roots for whl_install - # bin/ dirs and put those on PATH. + # Some build deps (meson-python's ninja, maturin) ship plain wheel-data + # executables under /bin, which venv assembly never + # merges (it only merges lib/site-packages) — so they land on neither + # sys.path nor PATH. They are still real runfiles; walk the runfiles + # roots for whl_install bin/ dirs and put those on PATH. bin_dirs = [] for runfiles_root in sys.path: if not path.isdir(runfiles_root) or "runfiles" not in runfiles_root: @@ -593,16 +623,6 @@ def _compiler_env( env["TEMP"] = tmpdir env["TEMPDIR"] = tmpdir - # PBS interpreters bake their original build-time prefix into sysconfig's - # LIBDIR ("/install/lib", nonexistent after relocation), so anything that - # links libpythonX.Y (meson's Cython sanity check) fails. The - # interpreter's own pkg-config file resolves relative to itself - # (${pcfiledir}/../..) — point PKG_CONFIG_PATH at it instead. - interpreter_root = path.dirname(path.dirname(path.realpath(sys.executable))) - pkgconfig_dir = path.join(interpreter_root, "lib", "pkgconfig") - if path.isdir(pkgconfig_dir): - env["PKG_CONFIG_PATH"] = pathsep.join([pkgconfig_dir, env.get("PKG_CONFIG_PATH", "")]).rstrip(pathsep) - # Bazel expands tool paths relative to the execroot. Resolve them while the # helper still runs there; bare tool names deliberately remain on PATH. _absolutize_tool_paths(env) @@ -613,9 +633,11 @@ def _compiler_env( cxx_path = _local_cxx_companion(env.get("CXX"), cxx_path) sysroot = _darwin_sysroot() - is_darwin = target_os == "darwin" if cross else _platform.system() == "Darwin" if cross: + # Toolchain flag strings (from cc_layer.bzl) contain execroot-relative + # sysroots; absolutize while still in the execroot, before the backend + # chdirs into the unpacked sdist. # LDFLAGS included: distutils' customize_compiler appends $LDFLAGS # after $LDSHARED, so a relative --sysroot there would override the # wrapper's absolute one (the driver honors the last occurrence). @@ -634,12 +656,23 @@ def _compiler_env( env[key] = (include_flag + " " + env.get(key, "")).strip() wrapper_flags = _get_wrapper_flags(env.get("CFLAGS", "")) - lld_path = _find_lld(cc_path) + is_darwin_target = target_os == "darwin" + + # An LLVM-style toolchain (BCR `llvm` module) reaches its crt objects + # and runtime libraries only through the link action's flags; detect + # it by the "-nostdlib++" marker in LDSHAREDFLAGS and bake those flags + # (sans "-shared") into the wrappers so every link — cargo's "-C + # linker" calls included — gets the sysroot search paths. + # gcc_toolchain's driver is self-contained: it gets an empty list. + ldshared_flag_list = env.get("LDSHAREDFLAGS", "").split() + exe_link_flags = ( + [f for f in ldshared_flag_list if f != "-shared"] if "-nostdlib++" in ldshared_flag_list else [] + ) # The -nostdlib++ toolchain's C++/unwind runtime archives, extracted - # by cc_layer.bzl from static_runtime_lib (they never appear in the - # link-action flags). Ordered for single-pass archive resolution: - # libc++ pulls from libc++abi, which pulls from libunwind. + # by cc_layer.bzl from static_runtime_lib. Ordered for single-pass + # archive resolution: libc++ pulls from libc++abi, which pulls from + # libunwind. static_runtime = [ _absolutize_path(p) for p in env.pop("RULES_PY_CXX_STATIC_RUNTIME", "").split(":") @@ -648,41 +681,19 @@ def _compiler_env( runtime_rank = {"libc++.a": 0, "libc++abi.a": 1, "libunwind.a": 2} static_runtime.sort(key=lambda p: runtime_rank.get(path.basename(p), 3)) - # An LLVM-style toolchain (BCR `llvm` module) reaches its crt objects - # and runtime archives only through the link action's flags; detect it - # by its "-nostdlib++" marker and bake those flags (sans "-shared") - # into the wrappers for probe-executable links. gcc_toolchain's driver - # is self-contained — it gets an empty list and keeps its "-static". - ldshared_flag_list = env.get("LDSHAREDFLAGS", "").split() - exe_link_flags = ( - [f for f in ldshared_flag_list if f != "-shared"] if "-nostdlib++" in ldshared_flag_list else [] - ) - - cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, lld_path, is_darwin=is_darwin, exe_link_flags=exe_link_flags, static_runtime_archives=static_runtime) - cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, lld_path, is_cxx=True, is_darwin=is_darwin, exe_link_flags=exe_link_flags, static_runtime_archives=static_runtime) - - - # apple_support's wrapped_clang hard-fails without DEVELOPER_DIR / - # SDKROOT; Bazel injects them only into actions with Xcode execution - # requirements, which this PEP 517 action is not. - if is_darwin and _platform.system() == "Darwin": - if "DEVELOPER_DIR" not in env: - developer_dir = _xcode_developer_dir() - if developer_dir: - env["DEVELOPER_DIR"] = developer_dir - if sysroot and "SDKROOT" not in env: - env["SDKROOT"] = sysroot + cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, is_darwin=is_darwin_target, static_runtime_archives=static_runtime, exe_link_flags=exe_link_flags) + cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, is_darwin=is_darwin_target, static_runtime_archives=static_runtime, exe_link_flags=exe_link_flags) else: - cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot, is_darwin=is_darwin) - cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot, is_cxx=True, is_darwin=is_darwin) + cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot) + cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot) env.setdefault("CC", cc) env.setdefault("CXX", cxx) if cross: ldshared_flags = env.get("LDSHAREDFLAGS", "") - env["LDSHARED"] = cc + (" " + ldshared_flags if ldshared_flags else "") - env["LDCXXSHARED"] = cxx + (" " + ldshared_flags if ldshared_flags else "") + env["LDSHARED"] = cc + ((" " + ldshared_flags) if ldshared_flags else "") + env["LDCXXSHARED"] = cxx + ((" " + ldshared_flags) if ldshared_flags else "") deployment_target = None target_sysconfig = env.get("RULES_PY_TARGET_SYSCONFIGDATA") @@ -694,9 +705,9 @@ def _compiler_env( env["_PYTHON_SYSCONFIGDATA_NAME"] = module_name env["PYTHONPATH"] = sysconfig_dir + pathsep + env.get("PYTHONPATH", "") - # The analysis-time _PYTHON_HOST_PLATFORM (rule.bzl) can only - # guess macosx-11.0; the target interpreter's sysconfig knows the - # real deployment version its wheel tags must carry. distutils' + # The analysis-time _PYTHON_HOST_PLATFORM can only guess + # macosx-11.0; the target interpreter's sysconfig knows the real + # deployment version its wheel tags must carry. distutils' # get_platform() also honors $MACOSX_DEPLOYMENT_TARGET directly. if target_os == "darwin": deployment_target = _macosx_deployment_target(target_sysconfig) @@ -709,12 +720,12 @@ def _compiler_env( site_dir = _generate_cross_site(tmpdir, target_os, target_cpu, deployment_target) env["PYTHONPATH"] = site_dir + pathsep + env.get("PYTHONPATH", "") - # MPI builds (mpi4py) consult $MPICC before PATH; only set it when a real - # mpicc exists, wrapped to keep the debug-flag stripping. + # MPI builds (e.g. mpi4py) consult $MPICC before searching PATH, so a + # plain C compiler here would shadow the real mpicc. Only set it when + # a system mpicc exists, wrapped to keep the debug-flag stripping. mpicc_path = shutil.which("mpicc", path=env["PATH"]) if mpicc_path: env.setdefault("MPICC", _make_compiler_wrapper(tmpdir, "mpicc", mpicc_path, sysroot)) - # $AR consumers (meson, distutils, CMake) all invoke it with ar-style # args, but the llvm toolchain's cpp_link_static_library tool on a darwin # exec host is llvm-libtool-darwin, which only accepts libtool-style @@ -740,8 +751,9 @@ def _compiler_env( ]: _override_tool(env, key, wrapper) - # maturin and setuptools-rust locate cargo via shutil.which, not $CARGO — - # without it on PATH they auto-install a Rust toolchain (puccinialin). + # maturin locates cargo via shutil.which, not $CARGO — without it on + # PATH it auto-installs a Rust toolchain (puccinialin), which fails in + # the sandbox. This bites native builds too, so it is not cross-gated. cargo_path = env.get("CARGO") if cargo_path: env["PATH"] = pathsep.join([path.dirname(cargo_path), env.get("PATH", defpath)]) @@ -767,7 +779,7 @@ def _load_text(maybe_file: str) -> str: return f.read() -def _load_pyproject_data(worktree: str) -> Optional[Dict[str, object]]: +def _load_pyproject_data(worktree: str) -> dict[str, object] | None: pyproject = path.join(worktree, "pyproject.toml") if not path.exists(pyproject): return None @@ -779,131 +791,6 @@ def _load_pyproject_data(worktree: str) -> Optional[Dict[str, object]]: return None -# Our lowercase target_os values, Title-Cased for whatever tool wants that -# spelling: CMAKE_SYSTEM_NAME and the faked platform.system()/os.uname() -# sysname both use it. -_TITLECASE_OS = {"linux": "Linux", "darwin": "Darwin", "windows": "Windows"} -_SYS_PLATFORM = {"linux": "linux", "darwin": "darwin", "windows": "win32"} - - -# numpy's longdouble probe outputs (numpy/_core/meson.build), keyed by the -# target ABI: x86 keeps the 80-bit x87 format padded to 16 bytes, aarch64 -# glibc uses IEEE binary128, and Apple aarch64 aliases long double to double. - - -_SITECUSTOMIZE_TEMPLATE = """\ -import os -import platform -import sys -import collections - -# ctypes parses os.uname().release at import time when the *host* is Darwin. -# Import it while uname and sys.platform are still real so the target's -# faked values never reach that parse. -try: - import ctypes -except ImportError: - pass - -_machine = {machine!r} -_sysname = {sysname!r} -_release = {release!r} - -# setup.py scripts branch on sys.platform to decide which sources to compile -# (psutil picks _psutil_osx.c vs _psutil_linux.c this way). -sys.platform = {sys_platform!r} - -os.uname = lambda: os.uname_result((_sysname, "build", _release, "", _machine)) - -# CS_GLIBC_LIB_VERSION otherwise leaks the *host's* glibc version, which -# feeds manylinux-tag determination in pip/packaging/subprocess. -if hasattr(os, "confstr"): - _real_confstr = os.confstr - - def _confstr(name): - if name == "CS_GLIBC_LIB_VERSION": - return "glibc_unknown" - return _real_confstr(name) - - os.confstr = _confstr - -# platform.uname_result.processor is a lazily-computed property that falls -# back to the real host on this field, so build our own namedtuple instead -# of the real type (mirrors crossenv's platform-patch.py). -_PlatformUname = collections.namedtuple("uname_result", "system node release version machine processor") -_platform_uname = _PlatformUname(_sysname, "build", _release, "", _machine, _machine) - -platform.uname = lambda: _platform_uname -platform.system = lambda: _sysname -platform.machine = lambda: _machine -platform.libc_ver = lambda *a, **k: ("", "") - -# packaging.tags derives its arch from sysconfig.get_platform() (already -# faked via $_PYTHON_HOST_PLATFORM); only the manylinux gate needs the -# top-level _manylinux hook packaging itself looks for. -""" - -_MANYLINUX_HOOK = """\ -# Cross build: we have no verified manylinux compatibility for the target -# (no target glibc version is threaded through yet), so refuse rather than -# silently claim host-arch manylinux tags are usable on the target. -def manylinux_compatible(tag_major, tag_minor, tag_arch): - return False - - -manylinux1_compatible = False -manylinux2010_compatible = False -manylinux2014_compatible = False -""" - - -def _generate_cross_site( - tmpdir: str, - target_os: str, - target_cpu: str, - macos_deployment_target: Optional[str] = None, -) -> str: - """sitecustomize + _manylinux hook faking the target's runtime identity. - - sysconfig is already faked via env vars CPython itself reads - (_PYTHON_HOST_PLATFORM, _PYTHON_SYSCONFIGDATA_NAME), but setup.py - scripts also branch on os.uname()/platform.machine() directly, which - env vars can't reach. sitecustomize.py runs on interpreter startup — - before any backend code — and patches os/platform in place. Modeled on - crossenv, minus what rules_py doesn't need. - """ - site_dir = path.join(tmpdir, ".cross_site") - - # ctypes' own import does int(os.uname().release.split(".")[0]) on Darwin, - # so the faked release must parse as a Darwin kernel version there — - # derived from the target's deployment target so both stay consistent. - # Linux keeps "": nothing on that path parses it. - release = _darwin_kernel_release(macos_deployment_target) if target_os == "darwin" else "" - # macOS reports "arm64", never the Bazel constraint's "aarch64" — - # setup.py scripts branch on platform.machine() == "arm64", and the - # faked identity must agree with the wheel tag derived elsewhere. - machine = "arm64" if target_os == "darwin" and target_cpu == "aarch64" else target_cpu - _write_generated_file( - path.join(site_dir, "sitecustomize.py"), - _SITECUSTOMIZE_TEMPLATE.format( - machine=machine, - sysname=_TITLECASE_OS.get(target_os, target_os), - release=release, - sys_platform=_SYS_PLATFORM.get(target_os, target_os), - ), - ) - _write_generated_file(path.join(site_dir, "_manylinux.py"), _MANYLINUX_HOOK) - return site_dir - - -_REQUIREMENT_NAME_RE = re.compile(r"^\s*([A-Za-z0-9][A-Za-z0-9._-]*)") - - -def _requirement_name(requirement: str) -> str: - """PEP 508 requirement string -> bare package name, extras/specifiers/markers stripped.""" - match = _REQUIREMENT_NAME_RE.match(requirement) - return match.group(1) if match else "" - # numpy's longdouble probe outputs (numpy/_core/meson.build), keyed by the # target ABI: x86 keeps the 80-bit x87 format padded to 16 bytes, aarch64 @@ -1080,7 +967,7 @@ def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> st def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os: str, target_cpu: str, target_libc: str) -> None: - """Cross env vars for maturin/setuptools-rust (Cargo-driven PyO3 builds). + """Cross env vars for maturin (Cargo-driven PyO3 builds). Cargo has no cross auto-detection: it needs an explicit target triple, and without CARGO_TARGET__LINKER it links with the host driver @@ -1128,6 +1015,15 @@ def _build_backend(pyproject_data: dict[str, object] | None) -> str | None: return backend if isinstance(backend, str) else None +_REQUIREMENT_NAME_RE = re.compile(r"^\s*([A-Za-z0-9][A-Za-z0-9._-]*)") + + +def _requirement_name(requirement: str) -> str: + """PEP 508 requirement string -> bare package name, extras/specifiers/markers stripped.""" + match = _REQUIREMENT_NAME_RE.match(requirement) + return match.group(1) if match else "" + + def _uses_setuptools_rust(pyproject_data: dict[str, object] | None) -> bool: """setuptools-rust has no build-backend of its own (it's setuptools.build_meta plus a build requirement) — detect it there.""" @@ -1263,18 +1159,15 @@ def main() -> None: opts, _ = PARSER.parse_known_args() tmp_root = path.abspath(opts.output) + ".tmp" - # Sandboxed/remote actions get a fresh root each run, but a failed run under - # --spawn_strategy=standalone leaves tmp_root behind and would mask the real - # error with FileExistsError on retry — reclaim our own scratch dir instead. - if path.isdir(tmp_root): - shutil.rmtree(tmp_root) - makedirs(tmp_root) + # Sandboxed/remote actions get a fresh root each run, so we don't expect a stale tmp_root to exist. + makedirs(tmp_root, exist_ok=False) t = path.join(tmp_root, "worktree") shutil.unpack_archive(opts.srcarchive, t) - # unpack_archive nests the sdist's own top-level directory; follow it. + # Annoyingly, unpack_archive creates a subdir in the target. Update t + # accordingly. Not worth the eng effort to prevent creating this dir. t = path.join(t, listdir(t)[0]) if opts.patches: @@ -1292,13 +1185,22 @@ def main() -> None: try: check_call(patch_cmd, cwd=t) except CalledProcessError as exc: - _die("Error: failed to apply patch {} (patch exited {}).".format(abs_patch, exc.returncode)) + # Fail with a concise reason on stderr instead of a Python traceback. + print( + "Error: failed to apply patch {} (patch exited {}).".format(abs_patch, exc.returncode), + file=sys.stderr, + ) + exit(1) # Backends take an output directory, not a file: build into a scratch dir. outdir = path.join(tmp_root, "dist") makedirs(outdir) + # Preserve PATH so native sdist builds can find compilers (clang, gcc), + # and re-point CC/CXX/etc. through wrapper scripts in tmp_root so the + # Bazel-supplied workspace-relative compiler paths survive the cwd + # change into the worktree. build_env = _compiler_env( tmp_root, opts.execroot_marker, @@ -1307,8 +1209,6 @@ def main() -> None: target_cpu=opts.target_cpu, ) - pyproject_data = _load_pyproject_data(t) - if _legacy_metadata_conflicts_with_pyproject(t): print( "Warning: falling back to setup.py because pyproject.toml omits dynamic dependency metadata " @@ -1323,6 +1223,21 @@ def main() -> None: outdir, ] elif path.exists(path.join(t, "pyproject.toml")) or path.exists(path.join(t, "setup.py")): + # Always use `python -m build` (PEP 517 frontend). For setup.py-only + # packages without a pyproject.toml, build creates a minimal PEP 517 + # shim automatically. --no-isolation ensures it uses the deps we've + # already provided in the build venv rather than trying to pip-install. + # Routing legacy setup_requires=… packages (e.g. googlemaps 4.10.0) + # through setup.py directly triggers setuptools' deprecated + # fetch_build_eggs path, which crashes on modern packaging. + # + # --skip-dependency-check disables `build`'s validation of + # `[build-system].requires` against the active venv. The + # validation is redundant under --no-isolation (we already + # commit to managing the venv) and rejects packages that pile + # unrelated dev tooling into `requires` — cdifflib 1.2.9 lists + # pytest/ruff/twine there, none of which are actually needed + # to compile its C extension. cmd = [ sys.executable, "-m", "build", @@ -1331,6 +1246,8 @@ def main() -> None: "--skip-dependency-check", "--outdir", outdir, ] + + pyproject_data = _load_pyproject_data(t) backend = _build_backend(pyproject_data) # Packages needing -D setup-args (numpy's -Dblas=none — the hermetic @@ -1356,14 +1273,14 @@ def main() -> None: elif (backend == "maturin" or _uses_setuptools_rust(pyproject_data)) and build_env.get("CARGO"): _configure_cargo_cross_env(build_env, tmp_root, opts.target_os, opts.target_cpu, opts.target_libc) else: - # raise, not _die(): ty doesn't narrow NoReturn in module-level flow and - # would flag `cmd` below as possibly unbound. - raise SystemExit("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!") + print("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!", file=sys.stderr) + raise SystemExit(1) with TemporaryFile(mode="w+") as build_log: try: if opts.monitor_memory: - # Lazy: the dependency exists only when the wheel opts in. + # Generated build tools include this dependency only when the + # corresponding wheel opts into monitoring. from uv.private.pep517_whl.tools.memory_monitor import run_with_memory_monitor run_with_memory_monitor( @@ -1382,15 +1299,18 @@ def main() -> None: sys.stderr.write(output) if not output.endswith("\n"): sys.stderr.write("\n") - _die("Error: Build failed!\nSee {} for the sandbox".format(t)) + print("Error: Build failed!\nSee {} for the sandbox".format(t), file=sys.stderr) + exit(1) inventory = listdir(outdir) if len(inventory) != 1: - _die("Error: Expected exactly one built wheel, found {}!\nSee {} for the sandbox".format(len(inventory), t)) + print("Error: Expected exactly one built wheel, found {}!\nSee {} for the sandbox".format(len(inventory), t), file=sys.stderr) + exit(1) if opts.validate_anyarch and not inventory[0].endswith("-none-any.whl"): - _die("Error: Target was anyarch but built a none-any wheel!\nSee {} for the sandbox".format(t)) + print("Error: Target was anyarch but built a none-any wheel!\nSee {} for the sandbox".format(t), file=sys.stderr) + exit(1) tag_error = _wheel_platform_error(inventory[0], opts.target_os, opts.target_cpu) if tag_error: From dbc670e80a795aff435fd46d74295bad86b02392 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 3 Sep 2026 07:20:48 -0600 Subject: [PATCH 073/103] chore(e2e): realign crossbuild .bazelrc with main (path mapping on) --- e2e/crossbuild/.bazelrc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/e2e/crossbuild/.bazelrc b/e2e/crossbuild/.bazelrc index 52f3b0277..6cb312c68 100644 --- a/e2e/crossbuild/.bazelrc +++ b/e2e/crossbuild/.bazelrc @@ -1,7 +1,15 @@ -# Without this, sdist build actions run with no PATH and clang can't find -# `ld` (not bundled with the hermetic LLVM toolchain). +# Match Bazel 9's default. Without this, PySdistNativeBuild actions on +# Bazel 8 run without a default PATH, and clang's compiled-in default +# linker (`ld`, not bundled with the hermetic LLVM toolchain) can't be +# located. With it on, Bazel injects a static PATH=/bin:/usr/bin:/usr/local/bin +# so clang's PATH search hits the runner's /usr/bin/ld. common --incompatible_strict_action_env +# Enable path mapping so WhlInstall actions are exercised with +# supports-path-mapping. Actions that declare the execution requirement get +# configuration-stripped cache keys; those that don't still work normally. +build --experimental_output_paths=strip + # Build without the bytes common:ci --remote_download_outputs=minimal common:ci --nobuild_runfile_links From fe97e093ae18c6fcf4384e8f9e07c9f1aadc3005 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 07:14:30 -0600 Subject: [PATCH 074/103] fix(uv): link libstdc++ statically for GNU C++ builds, dump meson-log on failure gcc_toolchain drives C++ through the "gcc" driver, which adds no implicit -lstdc++: C++ extensions cross-built for arm64 imported with cxxabi vtables unresolved (contourpy, numpy in the run-on-arm64 job). Both compiler wrappers now force the static libstdc++ archive into C++ links, skipping compiles and introspection probes, Darwin (libc++ is implicit) and -nostdlib++ toolchains (their runtime comes as archives). When a meson-python build fails, the helper prints the tail of every meson-log.txt in the worktree: meson keeps sanity-check and probe failures only there, and the sandbox discards the worktree. Also: numpy's meson setup-args move from RULES_PY_MESON_SETUP_ARGS to uv.override_package(config_settings), the env var handling leaves the helper, and the bundle-building CI jobs pass --remote_download_outputs=toplevel so a warm cache still materializes the tarballs they upload. --- .github/workflows/ci-workflows.yaml | 15 +++- e2e/crossbuild/pycross-numpy/BUILD.bazel | 2 +- .../pycross-numpy/setup.MODULE.bazel | 7 +- .../pep517_whl/tests/build_helper_test.py | 81 ++++++++++++++++++- uv/private/pep517_whl/tools/build_helper.py | 62 +++++++++++--- 5 files changed, 149 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index 0c0bec389..debc32945 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -178,7 +178,10 @@ jobs: set -euo pipefail mkdir -p "${RUNNER_TEMP}/wheels" targets=$(bazel query 'filter(".*_(amd64|arm64)_bundle$", //...)') - bazel build --config=ci ${targets} + # toplevel: --config=ci's build-without-the-bytes must still materialize + # the tarballs this job exists to upload (a warm disk cache otherwise + # leaves them undownloaded). + bazel build --config=ci --remote_download_outputs=toplevel ${targets} for target in ${targets}; do pkg="${target#//}" pkg="${pkg%:*}" @@ -240,7 +243,10 @@ jobs: set -euo pipefail mkdir -p "${RUNNER_TEMP}/wheels" targets=$(bazel query 'filter(".*_arm64_bundle$", //...)') - bazel build --config=ci ${targets} + # toplevel: --config=ci's build-without-the-bytes must still materialize + # the tarballs this job exists to upload (a warm disk cache otherwise + # leaves them undownloaded). + bazel build --config=ci --remote_download_outputs=toplevel ${targets} for target in ${targets}; do pkg="${target#//}" pkg="${pkg%:*}" @@ -296,7 +302,10 @@ jobs: set -euo pipefail mkdir -p "${RUNNER_TEMP}/wheels" targets=$(bazel query 'filter(".*_amd64_bundle$", //...)') - bazel build --config=ci ${targets} + # toplevel: --config=ci's build-without-the-bytes must still materialize + # the tarballs this job exists to upload (a warm disk cache otherwise + # leaves them undownloaded). + bazel build --config=ci --remote_download_outputs=toplevel ${targets} for target in ${targets}; do pkg="${target#//}" pkg="${pkg%:*}" diff --git a/e2e/crossbuild/pycross-numpy/BUILD.bazel b/e2e/crossbuild/pycross-numpy/BUILD.bazel index 4ddf446a1..e06013239 100644 --- a/e2e/crossbuild/pycross-numpy/BUILD.bazel +++ b/e2e/crossbuild/pycross-numpy/BUILD.bazel @@ -2,7 +2,7 @@ # [tool.uv] no-binary-package forces it to build from sdist here. Numpy uses # meson-python (vendored meson), Cython, and needs -Dblas=none -Dlapack=none # because this sandbox has no system BLAS/LAPACK (see setup.MODULE.bazel's -# RULES_PY_MESON_SETUP_ARGS override). +# `config_settings` override). load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") diff --git a/e2e/crossbuild/pycross-numpy/setup.MODULE.bazel b/e2e/crossbuild/pycross-numpy/setup.MODULE.bazel index 511889ee0..e768bfcd2 100644 --- a/e2e/crossbuild/pycross-numpy/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-numpy/setup.MODULE.bazel @@ -19,8 +19,11 @@ uv.override_package( # literal extra meson setup-args value, same as numpy's own documented # no-BLAS cross recipe (see its emscripten cibuildwheel config). name = "numpy", - env = { - "RULES_PY_MESON_SETUP_ARGS": "-Dblas=none -Dlapack=none", + config_settings = { + "setup-args": [ + "-Dblas=none", + "-Dlapack=none", + ], }, lock = "//pycross-numpy:uv.lock", ) diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 367b88556..91d995c5e 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -226,6 +226,58 @@ def test_wrapper_is_executable_and_bakes_the_driver(self) -> None: self.assertIn("/opt/real-cc", content) self.assertIn(build_helper._DEBUG_FLAG, content) + def _echo_wrapper(self, tmp: str, is_cxx: bool) -> str: + echo = path.join(tmp, "echo_cc") + with open(echo, "w") as f: + f.write('#!/bin/sh\nprintf \'%s\\n\' "$@"\n') + os.chmod(echo, 0o755) + return build_helper._make_compiler_wrapper(tmp, "c++" if is_cxx else "cc", echo, is_cxx=is_cxx) + + @unittest.skipIf(sys.platform == "darwin", "the native wrapper skips libstdc++ on Darwin by design") + def test_native_gnu_cxx_link_gets_static_libstdcxx(self) -> None: + static = list(build_helper._STATIC_LIBSTDCXX_FLAGS) + with tempfile.TemporaryDirectory() as tmp: + cxx = self._echo_wrapper(tmp, is_cxx=True) + self.assertEqual(["-shared", "a.o"] + static, _run_wrapper(cxx, ["-shared", "a.o"])) + self.assertEqual(["-c", "a.cc"], _run_wrapper(cxx, ["-c", "a.cc"])) + self.assertEqual(["-E", "-v", "-"], _run_wrapper(cxx, ["-E", "-v", "-"]), "meson's introspection probe") + self.assertEqual(["-shared", "a.o"], _run_wrapper(self._echo_wrapper(tmp, is_cxx=False), ["-shared", "a.o"])) + + @unittest.skipUnless(sys.platform == "darwin", "Darwin keeps libc++ implicit") + def test_native_darwin_cxx_link_is_untouched(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + cxx = self._echo_wrapper(tmp, is_cxx=True) + self.assertNotIn("-lstdc++", _run_wrapper(cxx, ["-shared", "a.o"])) + + +class DumpMesonLogTest(unittest.TestCase): + def test_prints_tail_of_every_meson_log(self) -> None: + import io + from contextlib import redirect_stderr + + with tempfile.TemporaryDirectory() as tmp: + logs = path.join(tmp, ".mesonpy-abc", "meson-logs") + makedirs(logs) + with open(path.join(logs, "meson-log.txt"), "w") as f: + f.write("".join("line {}\n".format(i) for i in range(200))) + err = io.StringIO() + with redirect_stderr(err): + build_helper._dump_meson_log(tmp, tail=5) + out = err.getvalue() + self.assertIn(".mesonpy-abc/meson-logs/meson-log.txt (last 5 lines)", out) + self.assertIn("line 199\n", out) + self.assertNotIn("line 194\n", out) + + def test_silent_without_a_meson_log(self) -> None: + import io + from contextlib import redirect_stderr + + with tempfile.TemporaryDirectory() as tmp: + err = io.StringIO() + with redirect_stderr(err): + build_helper._dump_meson_log(tmp) + self.assertEqual("", err.getvalue()) + class LegacyMetadataConflictTest(unittest.TestCase): def _worktree( @@ -443,6 +495,7 @@ def _wrapper( wrapper_flags: list[str] | None = None, static_runtime_archives: list[str] | None = None, exe_link_flags: list[str] | None = None, + is_cxx: bool = False, ) -> str: echo = path.join(tmp, "echo_cc") with open(echo, "w") as f: @@ -450,14 +503,40 @@ def _wrapper( os.chmod(echo, 0o755) return build_helper._make_cross_compiler_wrapper( tmp, - "cc", + "c++" if is_cxx else "cc", echo, wrapper_flags or [], is_darwin=is_darwin, static_runtime_archives=static_runtime_archives, exe_link_flags=exe_link_flags, + is_cxx=is_cxx, ) + def test_gnu_cxx_link_gets_static_libstdcxx(self) -> None: + # gcc_toolchain drives C++ through "gcc": no implicit -lstdc++, so + # the wrapper must force the static archive into shared and exe links. + static = list(build_helper._STATIC_LIBSTDCXX_FLAGS) + with tempfile.TemporaryDirectory() as tmp: + cxx = self._wrapper(tmp, is_cxx=True) + self.assertEqual(["-shared", "a.o", "-o", "a.so"] + static, _run_wrapper(cxx, ["-shared", "a.o", "-o", "a.so"])) + self.assertEqual(["probe.o", "-o", "probe"] + static, _run_wrapper(cxx, ["probe.o", "-o", "probe"])) + self.assertEqual(["-c", "a.cc"], _run_wrapper(cxx, ["-c", "a.cc"]), "compiles take no link flags") + self.assertEqual(["--version"], _run_wrapper(cxx, ["--version"]), "probes take no link flags") + cc = self._wrapper(tmp) + self.assertEqual(["-shared", "a.o"], _run_wrapper(cc, ["-shared", "a.o"]), "the C driver never links libstdc++") + + def test_nostdlibcxx_toolchain_uses_its_archives_not_libstdcxx(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + cxx = self._wrapper(tmp, is_cxx=True, static_runtime_archives=["/rt/libc++.a"], exe_link_flags=["-B/tc/bin"]) + argv = _run_wrapper(cxx, ["-shared", "a.o"]) + self.assertIn("/rt/libc++.a", argv) + self.assertNotIn("-lstdc++", argv) + + def test_darwin_cxx_link_keeps_libcxx_implicit(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + cxx = self._wrapper(tmp, is_cxx=True, is_darwin=True) + self.assertNotIn("-lstdc++", _run_wrapper(cxx, ["-bundle", "a.o"])) + def test_identity_flags_are_reinjected(self) -> None: with tempfile.TemporaryDirectory() as tmp: wrapper = self._wrapper(tmp, wrapper_flags=["-target", "aarch64-linux-gnu"]) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 0a1838f8c..3f9d97f48 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -9,6 +9,7 @@ from __future__ import annotations from argparse import ArgumentParser +import glob import importlib import os import platform as _platform @@ -38,11 +39,30 @@ # to locate sibling tools and resources. Clang does so under -no-canonical-prefixes: # https://github.com/llvm/llvm-project/blob/llvmorg-22.1.4/clang/tools/driver/driver.cpp#L63-L78 _DEBUG_FLAG = "-fdebug-default-version=4" + +# Forces the static libstdc++ archive into C++ links regardless of driver +# name. Plain `-static-libstdc++` is a no-op under gcc_toolchain, whose +# tool_path is "gcc" (not "g++"): that flag only modifies the implicit +# libstdc++ link the "g++" argv[0] spec adds. Without this, C++ extensions +# build and even import when another loaded .so happens to provide the +# symbols, then fail at dlopen with cxxabi vtables unresolved. GNU-ld-only +# syntax: skipped on Darwin (clang++ links libc++ implicitly) and for +# -nostdlib++ toolchains, which carry their runtime as static archives. +_STATIC_LIBSTDCXX_FLAGS = ("-Wl,-Bstatic", "-lstdc++", "-Wl,-Bdynamic") + +# Compiles, preprocessing and compiler-introspection probes must not receive +# link-only flags; meson runs "-E -v -", "-print-*" and "--version" through +# the wrappers. +_NON_LINK_ARGS = ("-c", "-E", "-S", "-fsyntax-only", "--version", "-dumpmachine", "-dumpversion", "-###") + _COMPILER_WRAPPER = """#!/usr/bin/env python3 import os import sys filtered_args = [arg for arg in sys.argv[1:] if arg != "{debug_flag}"] +is_link = not any(a in {non_link_args!r} or a.startswith("-print-") for a in filtered_args) +if {is_cxx!r} and is_link and not {is_darwin!r}: + filtered_args = filtered_args + {static_libstdcxx_flags!r} sysroot = {sysroot!r} if sysroot and "-isysroot" not in filtered_args: filtered_args = ["-isysroot", sysroot] + filtered_args @@ -115,6 +135,7 @@ def _make_compiler_wrapper( name: str, compiler_path: str, sysroot: str | None = None, + is_cxx: bool = False, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) makedirs(path.dirname(wrapper), exist_ok=True) @@ -123,6 +144,10 @@ def _make_compiler_wrapper( debug_flag=_DEBUG_FLAG, compiler_path=compiler_path, sysroot=sysroot, + is_cxx=is_cxx, + is_darwin=_platform.system() == "Darwin", + non_link_args=list(_NON_LINK_ARGS), + static_libstdcxx_flags=list(_STATIC_LIBSTDCXX_FLAGS), )) chmod(wrapper, 0o755) return wrapper @@ -321,6 +346,8 @@ def _get_wrapper_flags(cflags: str) -> list[str]: is_darwin = {is_darwin!r} static_runtime_archives = {static_runtime_archives!r} exe_link_flags = {exe_link_flags!r} +is_cxx = {is_cxx!r} +static_libstdcxx_flags = {static_libstdcxx_flags!r} # Not a link if compiling/preprocessing (-c/-E/-S/-fsyntax-only) or if this # is a compiler-introspection probe ("-print-*", "--version"): appending @@ -382,6 +409,10 @@ def _get_wrapper_flags(cflags: str) -> list[str]: # the C++/unwind runtime; shared links already got the archives # above, so don't list them twice. filtered.extend(static_runtime_archives) +elif is_cxx and is_link: + # GNU toolchain driven as "gcc" (gcc_toolchain): no implicit libstdc++, + # see _STATIC_LIBSTDCXX_FLAGS. + filtered.extend(static_libstdcxx_flags) real = {compiler_path!r} os.execv(real, [real] + wrapper_flags + filtered) @@ -396,6 +427,7 @@ def _make_cross_compiler_wrapper( is_darwin: bool = False, static_runtime_archives: list[str] | None = None, exe_link_flags: list[str] | None = None, + is_cxx: bool = False, ) -> str: wrapper = path.join(tmpdir, ".aspect_rules_py_compilers", name) @@ -421,6 +453,8 @@ def _make_cross_compiler_wrapper( is_darwin=is_darwin, static_runtime_archives=list(static_runtime_archives or []), exe_link_flags=list(exe_link_flags or []), + is_cxx=is_cxx, + static_libstdcxx_flags=list(_STATIC_LIBSTDCXX_FLAGS), ), executable=True, ) @@ -682,10 +716,10 @@ def _compiler_env( static_runtime.sort(key=lambda p: runtime_rank.get(path.basename(p), 3)) cc = _make_cross_compiler_wrapper(tmpdir, "cc", cc_path, wrapper_flags, is_darwin=is_darwin_target, static_runtime_archives=static_runtime, exe_link_flags=exe_link_flags) - cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, is_darwin=is_darwin_target, static_runtime_archives=static_runtime, exe_link_flags=exe_link_flags) + cxx = _make_cross_compiler_wrapper(tmpdir, "c++", cxx_path, wrapper_flags, is_darwin=is_darwin_target, static_runtime_archives=static_runtime, exe_link_flags=exe_link_flags, is_cxx=True) else: cc = _make_compiler_wrapper(tmpdir, "cc", cc_path, sysroot) - cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot) + cxx = _make_compiler_wrapper(tmpdir, "c++", cxx_path, sysroot, is_cxx=True) env.setdefault("CC", cc) env.setdefault("CXX", cxx) @@ -1039,6 +1073,20 @@ def _uses_setuptools_rust(pyproject_data: dict[str, object] | None) -> bool: return any(isinstance(req, str) and _requirement_name(req) == "setuptools-rust" for req in requires) +def _dump_meson_log(worktree: str, tail: int = 120) -> None: + """meson keeps compiler sanity-check and probe failures only in meson-log.txt, + which the sandbox discards with the worktree; surface its tail on failure.""" + logs = sorted(glob.glob(path.join(worktree, ".mesonpy-*", "meson-logs", "meson-log.txt"))) + for log in logs: + try: + with open(log, encoding="utf-8", errors="replace") as f: + lines = f.readlines() + except OSError: + continue + print("--- {} (last {} lines) ---".format(path.relpath(log, worktree), min(tail, len(lines))), file=sys.stderr) + sys.stderr.writelines(lines[-tail:]) + + def _legacy_metadata_conflicts_with_pyproject(worktree: str) -> bool: setup_py = path.join(worktree, "setup.py") pyproject_data = _load_pyproject_data(worktree) @@ -1266,15 +1314,6 @@ def main() -> None: pyproject_data = _load_pyproject_data(t) backend = _build_backend(pyproject_data) - # Packages needing -D setup-args (numpy's -Dblas=none — the hermetic - # venv has no system BLAS) pass them via this env var. `build`'s -C - # accumulates repeated keys, so it can't collide with the - # --cross-file the cross branch adds separately. Native too: the - # setup-args are about the package, not the mode. - if backend == "mesonpy": - for arg in shlex.split(build_env.get("RULES_PY_MESON_SETUP_ARGS", "")): - cmd += ["-C", "setup-args=" + arg] - # meson-python only synthesizes its own cross file for macOS # ARCHFLAGS/cibuildwheel shapes; everything else configures as a # native build and fails meson's compiler sanity checks. Hand it @@ -1315,6 +1354,7 @@ def main() -> None: sys.stderr.write(output) if not output.endswith("\n"): sys.stderr.write("\n") + _dump_meson_log(t) print("Error: Build failed!\nSee {} for the sandbox".format(t), file=sys.stderr) exit(1) From 8b6b72c377f9bec512e93fae38b5095d7febe4d8 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 07:26:13 -0600 Subject: [PATCH 075/103] fix(uv): keep meson-python's build dir so meson-log.txt survives a failed build mesonpy builds in a TemporaryDirectory it removes on failure, taking the only record of sanity-check and probe failures with it. Pin build-dir inside the worktree unless the package sets its own. --- uv/private/pep517_whl/tests/build_helper_test.py | 13 +++++++++++++ uv/private/pep517_whl/tools/build_helper.py | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 91d995c5e..54af6bd48 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -250,6 +250,19 @@ def test_native_darwin_cxx_link_is_untouched(self) -> None: self.assertNotIn("-lstdc++", _run_wrapper(cxx, ["-shared", "a.o"])) +class MesonBuildDirArgsTest(unittest.TestCase): + def test_pins_build_dir_for_mesonpy_only(self) -> None: + self.assertEqual( + ["-C", "build-dir=/wt/.mesonpy-build"], + build_helper._meson_build_dir_args("mesonpy", ["setup-args=-Dblas=none"], "/wt"), + ) + self.assertEqual([], build_helper._meson_build_dir_args("setuptools.build_meta", [], "/wt")) + self.assertEqual([], build_helper._meson_build_dir_args(None, [], "/wt")) + + def test_user_build_dir_wins(self) -> None: + self.assertEqual([], build_helper._meson_build_dir_args("mesonpy", ["build-dir=build"], "/wt")) + + class DumpMesonLogTest(unittest.TestCase): def test_prints_tail_of_every_meson_log(self) -> None: import io diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 3f9d97f48..efb0f99c8 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -1073,6 +1073,18 @@ def _uses_setuptools_rust(pyproject_data: dict[str, object] | None) -> bool: return any(isinstance(req, str) and _requirement_name(req) == "setuptools-rust" for req in requires) +def _meson_build_dir_args(backend: str | None, config_settings: list[str], worktree: str) -> list[str]: + """Pin meson-python's build dir inside the worktree. + + mesonpy otherwise builds in a TemporaryDirectory it removes on failure, + taking meson-log.txt (the only record of sanity-check and probe failures) + with it. A user-supplied build-dir wins. + """ + if backend != "mesonpy" or any(s.startswith("build-dir=") for s in config_settings): + return [] + return ["-C", "build-dir=" + path.join(worktree, ".mesonpy-build")] + + def _dump_meson_log(worktree: str, tail: int = 120) -> None: """meson keeps compiler sanity-check and probe failures only in meson-log.txt, which the sandbox discards with the worktree; surface its tail on failure.""" @@ -1313,6 +1325,7 @@ def main() -> None: pyproject_data = _load_pyproject_data(t) backend = _build_backend(pyproject_data) + cmd += _meson_build_dir_args(backend, opts.config_settings, t) # meson-python only synthesizes its own cross file for macOS # ARCHFLAGS/cibuildwheel shapes; everything else configures as a From 62307258474fa4b5f77e073f5f03cf30317f952a Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 07:48:33 -0600 Subject: [PATCH 076/103] fix(uv): point pkg-config's python3 at the interpreter the wheel is built for Backends resolve the `python3` dependency through pkg-config when one is on PATH; meson's Cython sanity check does so unconditionally. With the system search path that is the runner's own Python (3.10 on the Ubuntu runners), whose headers neither match the hermetic interpreter nor exist inside gcc_toolchain's sysroot: numpy failed with "Compiler cython cannot compile programs" on a missing x86_64-linux-gnu/python3.10/pyconfig.h. Under llvm it silently compiled against the wrong headers. The helper now sets PKG_CONFIG_LIBDIR, replacing the system directories: natively to the hermetic interpreter's own lib/pkgconfig (python-build- standalone ships relocatable .pc files), or to generated python3.pc / python-X.Y.pc files when it ships none; under cross to .pc files generated from the target interpreter's include directory. An explicit PKG_CONFIG_LIBDIR from the package's env wins. --- .../pep517_whl/tests/build_helper_test.py | 45 ++++++++++++ uv/private/pep517_whl/tools/build_helper.py | 72 ++++++++++++++++++- 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 54af6bd48..3abeb48ff 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -8,6 +8,7 @@ import os import sys +import sysconfig import tempfile import unittest from os import makedirs, path @@ -263,6 +264,50 @@ def test_user_build_dir_wins(self) -> None: self.assertEqual([], build_helper._meson_build_dir_args("mesonpy", ["build-dir=build"], "/wt")) +class PythonPkgconfigEnvTest(unittest.TestCase): + def test_cross_describes_the_target_interpreter(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + env: dict[str, str] = {} + build_helper._python_pkgconfig_env(env, tmp, target_include="/sysroot/py/include/python3.13t") + pc_dir = env["PKG_CONFIG_LIBDIR"] + self.assertEqual(path.join(tmp, ".pkgconfig"), pc_dir) + self.assertEqual(sorted(os.listdir(pc_dir)), ["python-3.13.pc", "python3.pc"]) + with open(path.join(pc_dir, "python3.pc")) as f: + pc = f.read() + self.assertIn("Version: 3.13\n", pc) + self.assertIn("includedir=/sysroot/py/include/python3.13t\n", pc) + self.assertIn("prefix=/sysroot/py\n", pc) + self.assertIn("Cflags: -I${includedir}\n", pc) + self.assertIn("Libs:\n", pc, "extension modules link no libpython") + + def test_native_uses_the_interpreter_pc_dir_when_shipped(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + prefix = path.join(tmp, "py") + makedirs(path.join(prefix, "lib", "pkgconfig")) + with open(path.join(prefix, "lib", "pkgconfig", "python3.pc"), "w") as f: + f.write("prefix=${pcfiledir}/../..\n") + env: dict[str, str] = {} + build_helper._python_pkgconfig_env(env, tmp, base_prefix=prefix) + self.assertEqual(path.join(prefix, "lib", "pkgconfig"), env["PKG_CONFIG_LIBDIR"]) + + def test_native_generates_pc_when_the_interpreter_ships_none(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + env: dict[str, str] = {} + build_helper._python_pkgconfig_env(env, tmp, base_prefix=path.join(tmp, "no-such-prefix")) + self.assertEqual(path.join(tmp, ".pkgconfig"), env["PKG_CONFIG_LIBDIR"]) + with open(path.join(env["PKG_CONFIG_LIBDIR"], "python3.pc")) as f: + pc = f.read() + self.assertIn("Version: {}.{}\n".format(*sys.version_info[:2]), pc) + self.assertIn("includedir=" + sysconfig.get_paths()["include"] + "\n", pc) + + def test_explicit_pkg_config_libdir_wins(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + env = {"PKG_CONFIG_LIBDIR": "/custom"} + build_helper._python_pkgconfig_env(env, tmp, target_include="/t/include/python3.12") + self.assertEqual("/custom", env["PKG_CONFIG_LIBDIR"]) + self.assertFalse(path.exists(path.join(tmp, ".pkgconfig"))) + + class DumpMesonLogTest(unittest.TestCase): def test_prints_tail_of_every_meson_log(self) -> None: import io diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index efb0f99c8..604104254 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -17,6 +17,7 @@ import shlex import shutil import sys +import sysconfig import textwrap from os import chmod, defpath, listdir, makedirs, path, pathsep from subprocess import CalledProcessError, check_call, check_output, STDOUT, run @@ -609,6 +610,71 @@ def _generate_cross_site( return site_dir +_PYTHON_PC_TEMPLATE = """\ +# Generated by rules_py's build helper for the {which} interpreter. +prefix={prefix} +exec_prefix=${{prefix}} +libdir=${{exec_prefix}}/lib +includedir={includedir} + +Name: Python +Description: Build a C extension for Python +Requires: +Version: {version} +Libs: +Cflags: -I${{includedir}} +""" + + +def _write_python_pc_files(pc_dir: str, version: str, includedir: str, which: str) -> None: + """python3.pc / python-X.Y.pc describing one interpreter's headers.""" + makedirs(pc_dir, exist_ok=True) + content = _PYTHON_PC_TEMPLATE.format( + which=which, + prefix=path.dirname(path.dirname(includedir)), + includedir=includedir, + version=version, + ) + for name in ("python3.pc", "python-{}.pc".format(version)): + with open(path.join(pc_dir, name), "w") as f: + f.write(content) + + +def _python_pkgconfig_env( + env: dict[str, str], + tmpdir: str, + target_include: str = "", + base_prefix: str = sys.base_prefix, +) -> None: + """Point pkg-config's `python3` at the interpreter the wheel is built for. + + Backends resolve `python3` through pkg-config when one is on PATH (meson's + Cython sanity check does, unconditionally). With the system search path + that is the runner's own Python, whose headers neither match the hermetic + interpreter nor exist inside a hermetic toolchain's sysroot. PKG_CONFIG_LIBDIR + replaces the system directories outright; an explicit PKG_CONFIG_LIBDIR or + PKG_CONFIG_PATH from the package's env keeps the caller in control. + """ + if env.get("PKG_CONFIG_LIBDIR"): + return + if target_include: + # Cross: describe the target interpreter from its include directory + # (.../include/python3.12 or python3.13t). Extension modules take no + # -lpython, so the .pc carries headers only. + include = _absolutize_path(target_include) + version = path.basename(include)[len("python"):].rstrip("t") + pc_dir = path.join(tmpdir, ".pkgconfig") + _write_python_pc_files(pc_dir, version, include, "target") + else: + pc_dir = path.join(base_prefix, "lib", "pkgconfig") + if not path.exists(path.join(pc_dir, "python3.pc")): + include = sysconfig.get_paths()["include"] + version = "{}.{}".format(*sys.version_info[:2]) + pc_dir = path.join(tmpdir, ".pkgconfig") + _write_python_pc_files(pc_dir, version, include, "build") + env["PKG_CONFIG_LIBDIR"] = pc_dir + + def _compiler_env( tmpdir: str, execroot_marker: str | None = None, @@ -668,6 +734,7 @@ def _compiler_env( sysroot = _darwin_sysroot() + target_include = "" if cross: # Toolchain flag strings (from cc_layer.bzl) contain execroot-relative # sysroots; absolutize while still in the execroot, before the backend @@ -685,7 +752,8 @@ def _compiler_env( # first. target_include = env.pop("RULES_PY_TARGET_INCLUDE", "") if target_include: - include_flag = "-I" + _absolutize_path(target_include) + target_include = _absolutize_path(target_include) + include_flag = "-I" + target_include for key in ("CFLAGS", "CXXFLAGS"): env[key] = (include_flag + " " + env.get(key, "")).strip() @@ -754,6 +822,8 @@ def _compiler_env( site_dir = _generate_cross_site(tmpdir, target_os, target_cpu, deployment_target) env["PYTHONPATH"] = site_dir + pathsep + env.get("PYTHONPATH", "") + _python_pkgconfig_env(env, tmpdir, target_include) + # MPI builds (e.g. mpi4py) consult $MPICC before searching PATH, so a # plain C compiler here would shadow the real mpicc. Only set it when # a system mpicc exists, wrapped to keep the debug-flag stripping. From b3e290b93acb8debec89c55792408a781ba9e1d9 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 18:00:00 -0600 Subject: [PATCH 077/103] chore: sync the spike with the rust_toolchain PR Brings xangcastle/pep517-rust-toolchain's current state onto the spike: rust_toolchain as a label down to sdist_build, inferred setuptools-rust detection, RUST_SYSROOT derived and passed to rustc explicitly, the cargo cross env keyed off the wired toolchain, and the pycross-rust-rs case on rules_rs 0.0.110. The helper's own setuptools-rust sniffing and its tests go: Starlark decides, the helper obeys. --- docs/uv.md | 28 ++- e2e/crossbuild/MODULE.bazel | 18 ++ e2e/crossbuild/MODULE.bazel.lock | 140 ++++++++++++- e2e/crossbuild/pycross-rust-rs/BUILD.bazel | 62 ++++++ e2e/crossbuild/pycross-rust-rs/pyproject.toml | 12 ++ .../pycross-rust-rs/setup.MODULE.bazel | 28 +++ .../pycross-rust-rs/test_pydantic_core.py | 19 ++ e2e/crossbuild/pycross-rust-rs/uv.lock | 194 ++++++++++++++++++ uv/private/extension/defs.bzl | 4 +- uv/private/pep517_whl/pep517_native_whl.bzl | 10 +- uv/private/pep517_whl/tests/BUILD.bazel | 45 ++++ .../pep517_whl/tests/build_helper_test.py | 79 +++++-- .../pep517_whl/tests/pep517_whl_test.bzl | 33 +++ uv/private/pep517_whl/tools/build_helper.py | 74 ++++--- uv/private/sdist_build/repository.bzl | 24 ++- uv/private/sdist_build/tests/BUILD.bazel | 12 +- .../sdist_build/tests/repository_test.bzl | 61 ++++++ 17 files changed, 768 insertions(+), 75 deletions(-) create mode 100644 e2e/crossbuild/pycross-rust-rs/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-rust-rs/pyproject.toml create mode 100644 e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py create mode 100644 e2e/crossbuild/pycross-rust-rs/uv.lock diff --git a/docs/uv.md b/docs/uv.md index 2067218a8..ed55700fe 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -474,11 +474,35 @@ uv.override_package( ``` `$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(CARGO)`, -`$(RUSTC)` and `$(RUST_HOST_SYSROOT)` as the variables the Rust build path -reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other make-variable a +`$(RUSTC)`, `$(RUST_SYSROOT)` and `$(RUST_HOST_SYSROOT)` as the variables the +Rust build path reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other make-variable a toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always wins over the derived value. +Rust needs one more step. Every sdist runs its build logic on the exec +platform, but in a cross build cargo also *compiles* code for the exec platform +and runs it there: `build.rs` scripts and proc-macro crates. Those need the +exec platform's Rust standard library in the sysroot, and a toolchain resolved +for the target platform ships only the target's. Declare the toolchain once per +project and rules_py adds an exec-configured sysroot layer next to it: + +```starlark +uv.project( + hub_name = "pypi", + lock = "//:uv.lock", + pyproject = "//:pyproject.toml", + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", +) +``` + +Every sdist in that project whose build backend is maturin, or whose build +requirements include setuptools-rust, then gets the toolchain and an +exec-configured `rust_host_sysroot` layer wired into its build. No +`uv.override_package` entry is needed for Rust packages. Any target exposing +rules_rust's toolchain providers works, so the same label serves +[rules_rs](https://github.com/hermeticbuild/rules_rs) toolchains, which are +declared with rules_rust's `rust_toolchain` rule. + ### Backend config settings PEP 517 backends take a free-form `config_settings` dictionary. Declare it diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 1f4b9ef2c..4bb9cf12c 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -8,6 +8,7 @@ bazel_dep(name = "gcc_toolchain", version = "0.11.0") bazel_dep(name = "llvm", version = "0.8.3") bazel_dep(name = "rules_shell", version = "0.4.1") bazel_dep(name = "rules_rust", version = "0.68.0") +bazel_dep(name = "rules_rs", version = "0.0.110") local_path_override( module_name = "aspect_rules_py", @@ -73,6 +74,22 @@ use_repo(rust, "rust_toolchains") register_toolchains("@rust_toolchains//:all") +# rules_rs toolchains for //pycross-rust-rs. They are rules_rust `rust_toolchain` +# instances declared in the patched rules_rust repository rules_rs fetches, so +# they register under that repository's toolchain type and never compete with +# the BCR rules_rust toolchains above. +rs_toolchains = use_extension("@rules_rs//rs/toolchains:module_extension.bzl", "toolchains") +rs_toolchains.toolchain( + edition = "2021", + version = "1.92.0", +) +use_repo(rs_toolchains, "default_rust_toolchains") + +rules_rust_rs = use_extension("@rules_rs//rs:rules_rust.bzl", "rules_rust") +use_repo(rules_rust_rs, rules_rust_rs = "rules_rust") + +register_toolchains("@default_rust_toolchains//...") + uv_bin = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv_bin") uv_bin.toolchain(version = "0.11.21") use_repo(uv_bin, "uv") @@ -85,6 +102,7 @@ include("//pycross-msgpack:setup.MODULE.bazel") include("//pycross-patches:setup.MODULE.bazel") include("//pycross-pure-python:setup.MODULE.bazel") include("//pycross-rust:setup.MODULE.bazel") +include("//pycross-rust-rs:setup.MODULE.bazel") include("//pycross-setuptools:setup.MODULE.bazel") include("//pycross-psutil:setup.MODULE.bazel") include("//pycross-geohash:setup.MODULE.bazel") diff --git a/e2e/crossbuild/MODULE.bazel.lock b/e2e/crossbuild/MODULE.bazel.lock index bbfa80331..c318e0cde 100644 --- a/e2e/crossbuild/MODULE.bazel.lock +++ b/e2e/crossbuild/MODULE.bazel.lock @@ -32,7 +32,9 @@ "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", "https://bcr.bazel.build/modules/bazel_features/1.42.0/MODULE.bazel": "e8ca15cb2639c5f12183db6dcb678735555d0cdd739b32a0418b6532b5e565f8", "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", + "https://bcr.bazel.build/modules/bazel_features/1.45.0/MODULE.bazel": "7daec6d87ab0703417486d4cb948af0b06f55d4d7c08cbb5978c80e79b538edf", + "https://bcr.bazel.build/modules/bazel_features/1.50.0/MODULE.bazel": "2083ef9c7a469f520890483ccf8e0189d6e71e2117e7752e15e6554433d5ae3e", + "https://bcr.bazel.build/modules/bazel_features/1.50.0/source.json": "e0ee3debde2789ff56e4452e612d126925ba9ab64d4bde79c67f099d2902df9b", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", @@ -44,6 +46,7 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.0/MODULE.bazel": "2ab127ef8d56a739a99bb2ce00ec4c7d1ecc7977d4370c0ca6efd0d8f03d6d99", "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", @@ -57,6 +60,7 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/bzip2/1.0.8.bcr.3/MODULE.bazel": "29ecf4babfd3c762be00d7573c288c083672ab60e79c833ff7f49ee662e54471", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", @@ -69,13 +73,16 @@ "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/MODULE.bazel": "67ff71bbfb482e58510451c4c8b8cd303c757f7ff79a2aff7cf381277be96f9f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/source.json": "475aa00426677e643e327b4b031d8816a3bc0a134c94d0d0d510cfd67b2cfd2c", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.8/MODULE.bazel": "3be7b0faca6f1e69e89197999e0b01ce058c42f3e764ef028466f7e0ff77c761", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/llvm/0.8.18/MODULE.bazel": "56d507d49c02498731fa5a95fa48a778368f2d23c0f6184a578d057e58830458", + "https://bcr.bazel.build/modules/llvm/0.8.18/source.json": "ca45abf06bdd842e88acdda4a077038bbecddd3e90050951c2aff5f89b1b522e", "https://bcr.bazel.build/modules/llvm/0.8.3/MODULE.bazel": "dbc1bc13171f8f9980a75524883abef1c491613e8d8d805cd4ffa3767ba9708e", - "https://bcr.bazel.build/modules/llvm/0.8.3/source.json": "4b11874c26a9de53c03a25a517ebc36dee6b458c920fe9ed65e3ca279ff19775", "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", + "https://bcr.bazel.build/modules/package_metadata/0.0.7/MODULE.bazel": "7adb03933fc8401f495800cf4eafcff0edc6da0ff55c7db223ef69d19f689486", + "https://bcr.bazel.build/modules/package_metadata/0.0.7/source.json": "50639625e937b56115012674c797cca7a05a96b4878c87d803c13dc2b31de8a0", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", @@ -93,7 +100,8 @@ "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", - "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/29.1/source.json": "04cca85dce26b895ed037d98336d860367fe09919208f2ad383f0df1aff63199", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", @@ -117,7 +125,8 @@ "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.22/MODULE.bazel": "94df4328edef9e44d38de5e73b037cd348e75e7ae55f4e21bf07878c41a31ebb", + "https://bcr.bazel.build/modules/rules_cc/0.2.22/source.json": "b2d6d6f9c332ce269ad75b89c6f3168d809a66173c9040210fb9bcc733ab42fa", "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", @@ -159,7 +168,8 @@ "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", - "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", @@ -167,15 +177,20 @@ "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", + "https://bcr.bazel.build/modules/rules_python/1.6.3/MODULE.bazel": "a7b80c42cb3de5ee2a5fa1abc119684593704fcd2fec83165ebe615dec76574f", "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.8.0/MODULE.bazel": "c151c025dbcc93d8f62ab68ecc313c9176a868a0e6386981bf2a12aec77cbe7b", "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_rs/0.0.110/MODULE.bazel": "c0c3c938547998dbced9aafea3c67c28d6919a33ea63707b03f1da0359840355", + "https://bcr.bazel.build/modules/rules_rs/0.0.110/source.json": "679b8aad1f16158580dbfd4aac59eea2644740ff34078bc46030a5ec3bfa62f8", "https://bcr.bazel.build/modules/rules_rust/0.68.0/MODULE.bazel": "dcb4fe4396b49d3b2d72bccf634d27499dd2a58dcdfccfe8e17ba15c4bd150ae", "https://bcr.bazel.build/modules/rules_rust/0.68.0/source.json": "e5d5f37874c4af13dbdfbf1220889607d9b3cc51f2831e10c2035b6638442f07", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_shell/0.8.0/MODULE.bazel": "f6a89f1d6a669a26f28fe814503857055d76306b79cfc11d12399af08d0b80ae", + "https://bcr.bazel.build/modules/rules_shell/0.8.0/source.json": "eb53cc815bc503c6683c5fe12d943f98883f81fc22f51403ec8a95610cba4195", "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", @@ -189,10 +204,15 @@ "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/MODULE.bazel": "b573395fe63aef4299ba095173e2f62ccfee5ad9bbf7acaa95dba73af9fc2b38", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/source.json": "3f3fbaeafecaf629877ad152a2c9def21f8d330d91aa94c5dc75bbb98c10b8b8", + "https://bcr.bazel.build/modules/xz/5.4.5.bcr.8/MODULE.bazel": "e48a69bd54053c2ec5fffc2a29fb70122afd3e83ab6c07068f63bc6553fa57cc", + "https://bcr.bazel.build/modules/zlib-ng/2.3.3.bcr.2/MODULE.bazel": "86130924115bf8dfc4aba286fb49a2ec8d32430a21771db9ccf5381acf0d10cc", + "https://bcr.bazel.build/modules/zlib-ng/2.3.3.bcr.2/source.json": "7aa4112eb2fbb99757e97cf0b7a4e2bdb3464b2b3cfb351bc807ffcb34bd349f", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198", + "https://bcr.bazel.build/modules/zstd/1.5.7.bcr.1/MODULE.bazel": "c5977176dd8555be7a9d598512ae0cae11831259c06f00a5e5e0037d5db4e3f5", + "https://bcr.bazel.build/modules/zstd/1.5.7.bcr.1/source.json": "aa95e0b5aac9d80195b9047d223beaf26b1948be55d49f0e803e180e9ccc6e75" }, "selectedYankedVersions": {}, "moduleExtensions": { @@ -1798,6 +1818,110 @@ }, "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "notice_version": "3" + }, + "@@rules_rs+//rs/toolchains:module_extension.bzl%toolchains": { + "cargo-1.92.0-aarch64-apple-darwin.tar.zst": "934faac197f1ca044b55dee59e1ca7b31c56dcdf622d3c34575ac9e99951caf2", + "cargo-1.92.0-aarch64-pc-windows-msvc.tar.zst": "6d6dc45e6c98c9afe5d5194dee36bc6ed04e2229fec32307603b1f017d0d2f36", + "cargo-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "e9d346d32d3ceb05a4fb8680da608084cd55d80a491418e53e66bd46dd582929", + "cargo-1.92.0-x86_64-apple-darwin.tar.zst": "6ad5fb1cf52ec9417334d77f408848704bbb7987d4e0f71dcbb69cde75353470", + "cargo-1.92.0-x86_64-pc-windows-msvc.tar.zst": "ad5aa56f37216bced19b15b27de116a5cdc448a15c3a30d2d8a31f14a86cc9bb", + "cargo-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "5ea83bd512d784ff495631476aee1a5422f0a22261aae311446a4b288ecded5f", + "clippy-1.92.0-aarch64-apple-darwin.tar.zst": "00f1c80d36f97fc42009315faa1881fc7ae6a060f541b7a4361bcbb03ce6cd70", + "clippy-1.92.0-aarch64-pc-windows-msvc.tar.zst": "62402d8dad087cff56f768d29994f35fa319d0f4642f608b293995f0d1324870", + "clippy-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "a7c5eff6b5d763498454dd463a0b0c100880ab8b4156f82936c05e72d1dfc6ba", + "clippy-1.92.0-x86_64-apple-darwin.tar.zst": "28076203bfa4b9cda9a2c7723d33c3debab32b65bf17a5edc253c5715042fa31", + "clippy-1.92.0-x86_64-pc-windows-msvc.tar.zst": "28bf949165fb1252b1e8d78ad1718933cc247cac7f0d6f22f55bae930a66f4f3", + "clippy-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "7f1e94c6c0ddc529ed8d3a620c0dbb6035dc4a2491f558bea1e5f850413d56a5", + "rust-analyzer-1.92.0-aarch64-apple-darwin.tar.zst": "271047fbcdfc135864919bdf8590d5416b583e87d5d688d9e1dc993032508780", + "rust-analyzer-1.92.0-aarch64-pc-windows-msvc.tar.zst": "01c0ebf593b6bf69bc3aae245d82d6a22d6319aa1452cb467b12f766d7031290", + "rust-analyzer-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "4f6bca3ad473b9db72e1cee5cb4f378b8cc48157e46a9e60b24636d62edc6c61", + "rust-analyzer-1.92.0-x86_64-apple-darwin.tar.zst": "6b162050d40da201e9beffe94afd748d7b1d2c88c6d7d23a5fcf95330c995c83", + "rust-analyzer-1.92.0-x86_64-pc-windows-msvc.tar.zst": "36d0e77c09e7297fab4df3fae286c39ee4348946b34776aa67b5b23c27d72a80", + "rust-analyzer-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "950c2f0fc51ef8f7c99d33951e4dacab4c0767e106466d9e883a8f31a9c27b62", + "rust-src-1.92.0.tar.zst": "39a65365e239f5f33db3ecac464633ee0c6a298abc2c60e4a25c127c2bf5f263", + "rust-std-1.92.0-aarch64-apple-darwin.tar.zst": "a6152db76c66b25e4846b91bdb153b57c645b9323f7c99121b8d938d05ec8756", + "rust-std-1.92.0-aarch64-apple-ios-macabi.tar.zst": "d9812a9b2ba5e8838c86abd37e1a0b78314c717029a64fc9f71c6863a0cfc16d", + "rust-std-1.92.0-aarch64-apple-ios-sim.tar.zst": "4bb0ed5ddaac0e82223b4a3173a9d29aa8f999e4f108534f7d6b6a174da49816", + "rust-std-1.92.0-aarch64-apple-ios.tar.zst": "cc7bc7c7118432c674fd372f76de67f9631873f21fc7390cbc0d48ccb8c0706a", + "rust-std-1.92.0-aarch64-linux-android.tar.zst": "342650902c8b3d497c0d152c9aa1013e5e1bc281666f00ebea13ac6c2848dd2c", + "rust-std-1.92.0-aarch64-pc-windows-gnullvm.tar.zst": "6ea57d6cfc68697ce7a6376d7c0b66191723a28ee95dd81ca9746a0c6b4f3f1c", + "rust-std-1.92.0-aarch64-pc-windows-msvc.tar.zst": "bbb6ef03ecc830260a933176610619078916e1494e5f7a3f2dba89956f9d52b3", + "rust-std-1.92.0-aarch64-unknown-fuchsia.tar.zst": "58ac7b9e74b1ced3b9640cd8b0d849824428640f03a66a3f390f9779850c4075", + "rust-std-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "db5f099c63013b558ee334f7a13c503ae256d3d3c5fb3bbabe6b513d0217e19a", + "rust-std-1.92.0-aarch64-unknown-linux-musl.tar.zst": "923384991a566d5477305d49c152d2f83911b9f06e30a53a90e62b9c0931642e", + "rust-std-1.92.0-aarch64-unknown-none-softfloat.tar.zst": "7587517944d2e19f5e0231f05989fac0ae5877778eaa6420928edc3047bda542", + "rust-std-1.92.0-aarch64-unknown-none.tar.zst": "6b8fa1a40adc80e58aa14d148ad8b652d1362c42e3f9ded24b05d4ca2c7c76dd", + "rust-std-1.92.0-aarch64-unknown-uefi.tar.zst": "5cb3f57bb7606d9cb08e55d95797491698e4c221f09c087faf28f42d169edb47", + "rust-std-1.92.0-arm-linux-androideabi.tar.zst": "e74a37f3da7cb3b29c46636b45e2af6cc6e477768cfaf22d1182fdce3998cd06", + "rust-std-1.92.0-arm-unknown-linux-gnueabi.tar.zst": "1fea2017b00227e8e1750f3f78d571e2731e949ea3a9c024f4d706c50532c4ee", + "rust-std-1.92.0-arm-unknown-linux-gnueabihf.tar.zst": "755937d472c0f77262704b80fb4d762cfe22f6fe559fe1dd7a6ffd8c9945ad52", + "rust-std-1.92.0-arm-unknown-linux-musleabi.tar.zst": "78dad339d932fe8d6b4d28f55caf0a66ac981dae65b1080b34827ad90c65820d", + "rust-std-1.92.0-arm-unknown-linux-musleabihf.tar.zst": "a1647d1ae3672d7f4a77f7c2aaef53f7c1ba1e4c04e79fef5c31fedb1624fb52", + "rust-std-1.92.0-armv7-linux-androideabi.tar.zst": "f347361f8aaa09796c81b33dd530c6df59c545e2225a9f430354602c5d3d225d", + "rust-std-1.92.0-armv7-unknown-linux-gnueabi.tar.zst": "cdc9d12195fc578c3a6890066ffe3e2f45b61bee6069b79a0723ffc01580d43e", + "rust-std-1.92.0-armv7-unknown-linux-gnueabihf.tar.zst": "3747329709be56bb493f39e148721cf47ad52e2d6f4d641e173f877069b86641", + "rust-std-1.92.0-armv7-unknown-linux-musleabi.tar.zst": "4947f6748d6b340bc44196f8db60564d75d0b244f59231d8d1b81a659131348d", + "rust-std-1.92.0-armv7-unknown-linux-musleabihf.tar.zst": "5a0836abf6946350bb3a21bba569a6732829946593037c2d8ec452eead3a98bd", + "rust-std-1.92.0-i686-linux-android.tar.zst": "272394a361ebca0a1e18ae8e2bbf51ee03abacb9492a89a5e07f44e15e11dc75", + "rust-std-1.92.0-i686-pc-windows-gnu.tar.zst": "1a7574ffe7495bc5b386af0da87b241d8f80bed44622992e65203bfad98f87d7", + "rust-std-1.92.0-i686-pc-windows-gnullvm.tar.zst": "2e332076308db6558c39986a4de0542d193d42cac4c8171ef3bcb331b010b9c7", + "rust-std-1.92.0-i686-pc-windows-msvc.tar.zst": "bb1b6313d47da6927f8be564a95cb494854c9d6e39d91947f5feb31ed92b7bbf", + "rust-std-1.92.0-i686-unknown-freebsd.tar.zst": "64799a94bd6695f2edfdbfef895605b443b702041a05a8149641c395d342867f", + "rust-std-1.92.0-i686-unknown-linux-gnu.tar.zst": "6a53e3ecf2d94d79842a4d6ee20a175860fbe2061b8702d816e7d0fb3efb2dc4", + "rust-std-1.92.0-i686-unknown-linux-musl.tar.zst": "30f96a8b910cab267c06460e3403031de1a14373da1876a031fab44b68c221dd", + "rust-std-1.92.0-i686-unknown-uefi.tar.zst": "cf28b4182d8f12ede776dc310964cebef06d1a9efcb311c98722eb10e0052f1b", + "rust-std-1.92.0-loongarch64-unknown-linux-gnu.tar.zst": "04e0a4dcf92533a240f9190bf6b8d487168df2ad4fba56fef26d9835b4abbad1", + "rust-std-1.92.0-loongarch64-unknown-linux-musl.tar.zst": "5737ceaf6492c52ad4e3bdcd6b6c99c9f88adf3d24489802d3bd5cace8c077ab", + "rust-std-1.92.0-loongarch64-unknown-none.tar.zst": "2aa371171d9a48f01d6ef4b8dc091ea6e26fbd3720da217f86e482d825b35dd8", + "rust-std-1.92.0-powerpc-unknown-linux-gnu.tar.zst": "5c813b76bab6ddc79776dc7993b628f09c0e36e98f2a2fa4225e8443e0bfe956", + "rust-std-1.92.0-powerpc64-unknown-linux-gnu.tar.zst": "ecd97d75b8ec82b2a11a414b9afa44ddab8242e402d149d176e18d3755468b9d", + "rust-std-1.92.0-powerpc64le-unknown-linux-gnu.tar.zst": "970b68e135b8fa4b7f86cd8f39173bd5c03a1223735c32bbcd5122a6b5dee13f", + "rust-std-1.92.0-powerpc64le-unknown-linux-musl.tar.zst": "1bc1904a48014c423c68a66b06a75cb7d67010a3e8fdb89b1b4621dc031a7fd0", + "rust-std-1.92.0-riscv32imac-unknown-none-elf.tar.zst": "1107e131abff8bd4426de83af64df9b45f7f713523b430792f0b72c7dbc86775", + "rust-std-1.92.0-riscv32imc-unknown-none-elf.tar.zst": "9838a8ae5f35ccf44f18bc712bd329dac6384b5d69a21bfd32832e85293db453", + "rust-std-1.92.0-riscv64gc-unknown-linux-gnu.tar.zst": "9fec2f1d31e08b5f12886385f548d02854a4df70aa74779bf17d6c582741f668", + "rust-std-1.92.0-riscv64gc-unknown-linux-musl.tar.zst": "977ddd7ad1061521eea05f7cc2742d33a7b1fe1adbf971e9bfc153973bba734d", + "rust-std-1.92.0-riscv64gc-unknown-none-elf.tar.zst": "f9c3c317d5d5ac892aad53c351cf6d31fa809a4aa366bdf1bbc9377f651535ee", + "rust-std-1.92.0-s390x-unknown-linux-gnu.tar.zst": "3fc7e9129dfc2981ec5390a2d0d1200b5ac3d1bf373b890a57624a6611dab8b8", + "rust-std-1.92.0-sparc64-unknown-linux-gnu.tar.zst": "524699c80798fb92fe06778ec20433c38a2295939577ec31f1af9aed0a229b34", + "rust-std-1.92.0-thumbv6m-none-eabi.tar.zst": "e7cc3cfc7d0e6e10a1eb90ba36773db35a25c6fa98587c5d1ae02e9aaa77978f", + "rust-std-1.92.0-thumbv7em-none-eabi.tar.zst": "99b0c00163763dc6d0f93a48840fdbf2c43ddba24a41944c0c1eda593ed867a0", + "rust-std-1.92.0-thumbv7em-none-eabihf.tar.zst": "4d0439d1d0fecd5d2590436c318b7b9d9cd84b25e494ded534ab251d52b48401", + "rust-std-1.92.0-thumbv7m-none-eabi.tar.zst": "9967cf844d7c1871a2e27a43362315bfa29ca5d1a745f3e165103bddd8c721eb", + "rust-std-1.92.0-thumbv8m.main-none-eabi.tar.zst": "c9b9b67622a3bb15a9d2bc81c9473523514848faf1784826392dc3765904c315", + "rust-std-1.92.0-thumbv8m.main-none-eabihf.tar.zst": "53cb8593ae84a982ecd7bb6b203957ebfddbd1cabeccdff93ef456103af99690", + "rust-std-1.92.0-wasm32-unknown-emscripten.tar.zst": "d7d81544d8295e68836bad16d0512285ca9113b4abe2567d61cc58ea9f9d4c72", + "rust-std-1.92.0-wasm32-unknown-unknown.tar.zst": "9e0aca6975365c914c35ad003e0058361cdf3337736d7f908c7be67258eb7589", + "rust-std-1.92.0-wasm32-wasip1-threads.tar.zst": "41e2c8b944f140285b762f73ef3e3f028b068f3f4d353b9cd48aee37aef2df98", + "rust-std-1.92.0-wasm32-wasip1.tar.zst": "ef0e481aad764cb455e3ee459547d2bb7b580969859d91c23ae2618e58791abc", + "rust-std-1.92.0-wasm32-wasip2.tar.zst": "7d3d9da3f58dd07035b3c86d4285f145e06c4247b885bad014f7976187d8cbe3", + "rust-std-1.92.0-x86_64-apple-darwin.tar.zst": "3c7c504c0cc8fdfa56125f27292c057359b1529f79a8f7807b097f9b3175f75b", + "rust-std-1.92.0-x86_64-apple-ios-macabi.tar.zst": "f3258393b78f0163cfbf0bf4f71046d72da8f794ce2e6dd062325211cfd0d2c6", + "rust-std-1.92.0-x86_64-apple-ios.tar.zst": "fd889ca97041a6a7150dd0d2ae6bff9454f55f30520e8a043b5e45b5d91e57ee", + "rust-std-1.92.0-x86_64-linux-android.tar.zst": "b223b3271b9bd9695bc9cdcf26a5b8636ce2ffeca8cd80ad00c2e57ef4af5f06", + "rust-std-1.92.0-x86_64-pc-windows-gnu.tar.zst": "a5046c33ea9b87627f8266200c5ea51ed2c6c567d4c9d1350bd1bd57db685177", + "rust-std-1.92.0-x86_64-pc-windows-gnullvm.tar.zst": "4931412aa9b5ad6340d7403cf5597876979d24fda36b422944c33f8187610a85", + "rust-std-1.92.0-x86_64-pc-windows-msvc.tar.zst": "48b550c038691aafa0de408e045d17da9dd39bc911456b7e3cd0af2762a4d403", + "rust-std-1.92.0-x86_64-unknown-freebsd.tar.zst": "21c4065536337fdabfa18fa52accdfb9c37509324ff93a45bddb53eb1254c3e8", + "rust-std-1.92.0-x86_64-unknown-fuchsia.tar.zst": "eaa3eac2a2758c77e706a3eadee52b7b27eed15bd2788e9ef922215187aecbd0", + "rust-std-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "7d28286fe72ad895a1187f7b075d7d1cf5b1d824d6f65241f121265bfe161d82", + "rust-std-1.92.0-x86_64-unknown-linux-musl.tar.zst": "4a26b05ba7c19de836bce0176858fb58bfbd475f7eec82be16009ddbbb63aed7", + "rust-std-1.92.0-x86_64-unknown-netbsd.tar.zst": "db9f91d5eb6b26b03afeffc1e9ace53c2d13f8e0e10f87be0f8f7c86ba978383", + "rust-std-1.92.0-x86_64-unknown-none.tar.zst": "ee1385827731ae293cce83a252ec43718a85df3ac9982723bb35c118fbbe8048", + "rust-std-1.92.0-x86_64-unknown-uefi.tar.zst": "a651c526a7bf8867b760763f98c8c73f93b962fc6fb220872cff64d5b42b9c7c", + "rustc-1.92.0-aarch64-apple-darwin.tar.zst": "91d29edcb82361f943bd0fe00a9027a36b99561f99fe4fb35d8b4fcf43217430", + "rustc-1.92.0-aarch64-pc-windows-msvc.tar.zst": "853d238dec9c596a9c7f677490a0b0c7e44e46384739a3fc2693bf5c60073bac", + "rustc-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "10d2d323aa0a9b0d75aa2540a14002caf5d1b3413a4c65ab936a36879eb4f621", + "rustc-1.92.0-src.tar.zst": "c895404fd5326c857a29805638513a07c6909745e1b8afbb2fbbed906c39c7ce", + "rustc-1.92.0-x86_64-apple-darwin.tar.zst": "cf537975a07c94b4913619c5209fb2d6622a77922fc51a63e09fcd75dedfd192", + "rustc-1.92.0-x86_64-pc-windows-msvc.tar.zst": "d9ba009edecca135d816ba15995696cb0e4f98c669c3759ce107526121fe9ae4", + "rustc-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "d234e767edd7f8dc0c5c8976b1f044e55594d5a11654fcf4b9a5e19dc97f349b", + "rustfmt-1.92.0-aarch64-apple-darwin.tar.zst": "ec6c9ce8053de1e69f87ff254593e3b0eca10138455bd57e388020a00af1226d", + "rustfmt-1.92.0-aarch64-pc-windows-msvc.tar.zst": "2a31a49e093427098bc242792f5b9413f60b63b27f715996291170ecfa6e7bcc", + "rustfmt-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "ef3fb38df66f3678d242f9cde30dc29b9a241900ea5e78b5c711d9afffbc06f2", + "rustfmt-1.92.0-x86_64-apple-darwin.tar.zst": "ec907b57cef4c62f5ca30f70a16b1b5182143507385c855a997064546fa88158", + "rustfmt-1.92.0-x86_64-pc-windows-msvc.tar.zst": "a3f415ce0fd1f87605a210daa82fa748ccb7d8097c258f646ed6afe180eed2c5", + "rustfmt-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "20fc854bb0b7117d08631026986616a282c900ec2cdcc065842dd8ef381bb57e" } } } diff --git a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel new file mode 100644 index 000000000..5d6adbff5 --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel @@ -0,0 +1,62 @@ +# maturin (Cargo/PyO3) cross case on rules_rs toolchains: pydantic-core built +# from its sdist for the host at runtime, and cross-compiled for both linux +# CPUs. Same assertions as //pycross-rust; only the Rust toolchain provider +# differs (see setup.MODULE.bazel). + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") + +_PY = "3.12" + +_DEP_GROUP = "pycross_rust_rs" + +py_test( + name = "test_pydantic_core", + srcs = ["test_pydantic_core.py"], + dep_group = _DEP_GROUP, + main = "test_pydantic_core.py", + python_version = _PY, + deps = ["@pypi_pycross_rust_rs//pydantic_core"], +) + +# The wheel targets under `collect_wheels` are reached through a platform +# transition rather than a py_venv, so nothing sets the dep_group flag for +# them — the platform carries it alongside the libc/version flags the wheel +# resolver needs. +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "rust_rs_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = ["@sdist_build__pycross_rust_rs__pydantic_core__2_47_0//:whl"], +) diff --git a/e2e/crossbuild/pycross-rust-rs/pyproject.toml b/e2e/crossbuild/pycross-rust-rs/pyproject.toml new file mode 100644 index 000000000..4b544807b --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "pycross_rust_rs" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "maturin", + "pydantic-core==2.47.0", +] + +[tool.uv] +no-binary-package = ["pydantic-core"] diff --git a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel new file mode 100644 index 000000000..068fd6d9f --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel @@ -0,0 +1,28 @@ +"""maturin cross case on rules_rs toolchains. + +Same package and assertions as //pycross-rust, built with the toolchains +rules_rs provisions instead of rules_rust's own. rules_rs declares them with +rules_rust's `rust_toolchain` rule inside the patched `rules_rust` repository +it fetches, so `uv.project(rust_toolchain = ...)` points at that repository's +`current_rust_toolchain`: the wiring is a provider contract, not a dependency +on one ruleset's toolchain layout. The two rulesets coexist here because each +carries its own `rules_rust` repository and therefore its own toolchain type. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_rust_rs") +uv.project( + default_build_dependencies = [ + "build", + "maturin", + ], + hub_name = "pypi_pycross_rust_rs", + lock = "//pycross-rust-rs:uv.lock", + pyproject = "//pycross-rust-rs:pyproject.toml", + rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", +) +use_repo( + uv, + "pypi_pycross_rust_rs", + "sdist_build__pycross_rust_rs__pydantic_core__2_47_0", +) diff --git a/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py new file mode 100644 index 000000000..6bf4f92b8 --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +"""Exercises the cross-compiled _pydantic_core extension. + +SchemaValidator is implemented in Rust (PyO3); constructing one and +validating through it proves the .so loads and runs on the target. +""" +from pydantic_core import SchemaValidator, core_schema + + +def main() -> None: + validator = SchemaValidator(core_schema.int_schema()) + result = validator.validate_python("123") + # pydantic-core's lax int mode coerces the numeric string to a real int. + assert result == 123 and isinstance(result, int), "expected int 123, got {!r}".format(result) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pycross-rust-rs/uv.lock b/e2e/crossbuild/pycross-rust-rs/uv.lock new file mode 100644 index 000000000..ab8b074ff --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/uv.lock @@ -0,0 +1,194 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "maturin" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/c8/22e5e21b2679c9bce6415ca578034ca2cc9316be0642ae21e051a2d5198c/maturin-1.15.0.tar.gz", hash = "sha256:94b26cc8e8aba61a5f2099715fe640e18c5f678e9a500408b38761263954228a", size = 385504, upload-time = "2026-08-24T12:11:22.665Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/69/5c01b461044eb1f45ddcce006706eb88110c793cdb11c7ae0b5e08492e94/maturin-1.15.0-py3-none-linux_armv6l.whl", hash = "sha256:6bf6dc62e22d4dcfd5a51244ff0d58975fa4979c48209fe84159617648956d82", size = 10206220, upload-time = "2026-08-24T12:10:53.327Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1f/2b431554e11687cdb1077e0cdadcc118c53f611086b3af00c8545a67c6a5/maturin-1.15.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd35772633f489841132bc8e71d6fc7f842df30b9c05cd5cdf1ee1ddcb744cc7", size = 19416513, upload-time = "2026-08-24T12:10:56.126Z" }, + { url = "https://files.pythonhosted.org/packages/51/36/e23a21cb34a648b711036b9b2fe1d4f3f4ee24f8db54215d73f1a9a3a3ec/maturin-1.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c40b4eae7bf5ef1f4b1af8d623fe4105016f93578fb15b764e741d08ec3b92dd", size = 10014962, upload-time = "2026-08-24T12:10:58.486Z" }, + { url = "https://files.pythonhosted.org/packages/8c/80/33b15cb2d8f30f12c807955e8f2fd775027692904e30ec0784744ce8cd83/maturin-1.15.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:7eb066372f541f8eb4909c79c5d9bd0b9e8125980bdf1ec9e8aba23c6c8d6c55", size = 10196223, upload-time = "2026-08-24T12:11:00.696Z" }, + { url = "https://files.pythonhosted.org/packages/fe/91/b495e19e2f5c503b540452b2039115e7b2363867e8c5ad4179eb752fa92c/maturin-1.15.0-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:653020a63525bb224e5ab0adf02e17a2e08bc86dbea7fc1399c9a56d7529b99e", size = 10541186, upload-time = "2026-08-24T12:11:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/5d/2b/2abff58037188d852b124871b1f0d720e1c2bfb3d4f1b03d87c52cd66488/maturin-1.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0ebf9767892725083138e671c34482c660317a2f3d6a29fc0e0f34e9d8c99136", size = 10083468, upload-time = "2026-08-24T12:11:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/b7e9f8be99a6627849e81ac7b6694876bce8f50a92995fe17e3cf2610f0a/maturin-1.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7ab7eebffd7b8debca2265985de4eaeb332141276d24b9560b5ad484d4b3add1", size = 10047786, upload-time = "2026-08-24T12:11:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ab/167e3cb7accee11b507dbe53e0e87aeccb376d44ae66284c96ee4df3a9fd/maturin-1.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:126e12e618b4db42f68c779a56d41f82a390145ba36ac3f621d057eb34f5ad9d", size = 13315332, upload-time = "2026-08-24T12:11:09.433Z" }, + { url = "https://files.pythonhosted.org/packages/14/4d/801379f646cbc6b00998e5289b0630a886be3a4ee4c75b6bc9b87478a7f1/maturin-1.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f9d33e6c3f9615c8caceecbbbd440f8eb25a3ddeb687077682cd5eca2e9ae15", size = 10807183, upload-time = "2026-08-24T12:11:11.73Z" }, + { url = "https://files.pythonhosted.org/packages/89/27/2e612e1cbd1580e9e94d4722c227b5180dca27b32b955a34b79918aa1292/maturin-1.15.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:bf29beddd0c6708f112db51d5275fc28b28b9e9c9c5faae387eaef662918b176", size = 10413274, upload-time = "2026-08-24T12:11:14.04Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/202a7b4d75a51f20f84ec9ce3b7345b12b822207072164e2b1c6ef665125/maturin-1.15.0-py3-none-win32.whl", hash = "sha256:da649988be98e87e009e51b1bf0d301b6a301bc0cecbdd60d40d8ba60748d1ca", size = 8928744, upload-time = "2026-08-24T12:11:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/40/dc/4e90da594986ba78dd3bc8a5921ecdcdb11085b22b02a412caab3b225601/maturin-1.15.0-py3-none-win_amd64.whl", hash = "sha256:552c2be4afd43fe8d5c9f3ec8d4c4756d973b8dcbe94c14084390301f50243e1", size = 10335085, upload-time = "2026-08-24T12:11:18.326Z" }, + { url = "https://files.pythonhosted.org/packages/8b/10/15d4314edf130955edf2dc237aa393a8a7c10f2b9b57b89fa2f61f915659/maturin-1.15.0-py3-none-win_arm64.whl", hash = "sha256:c7dc0c66c78d3debdd9c5aa807e861fbcbf07f3505d34b125df74c03986b0f48", size = 9713795, upload-time = "2026-08-24T12:11:20.83Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-rust-rs" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "maturin" }, + { name = "pydantic-core" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "maturin" }, + { name = "pydantic-core", specifier = "==2.47.0" }, +] + +[[package]] +name = "pydantic-core" +version = "2.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/74/319859f70c733f341df03823c8ca27ce9003faaac3ffa3110f3af1c8641a/pydantic_core-2.47.0.tar.gz", hash = "sha256:422c1797a7864b2a9a996435aba92fe571fb80190f67a31edbc1ac040c7b51fe", size = 476601, upload-time = "2026-05-22T13:19:00.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/e0/0da7149bbd84c438beb208e17174d03a798f2c8ce5a978cbc19fb3052be6/pydantic_core-2.47.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fe87ccbc39a103709d0a5afa75240c15a94611af129261e9484bef0bc97960b2", size = 2114007, upload-time = "2026-05-22T13:20:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/51/30/362c68ac4dc1a830066bf250850725d95be0567bb6a85434616ac68f5939/pydantic_core-2.47.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45882c24324f123037982c65eb8d60da778447e6bc87c82241f81d6c6d2c307e", size = 1948028, upload-time = "2026-05-22T13:19:25.939Z" }, + { url = "https://files.pythonhosted.org/packages/60/d6/1dd26612212fab9145a2b0d876459764ad04248331cb6f61ab4909fddc43/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983e39b39547772543f3518557d0a86dbb3b7bb58bf8e82faba1e0cfa3e816d9", size = 1972491, upload-time = "2026-05-22T13:20:35.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c4/00b31fd04acf601efff148add88cfe5f3c21f43f872e79f76e4580cfaf18/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3eb92447d3a079b945b61b8cbd6c3ec2954de3655c4efa0ebd35b069e472c2a9", size = 2045790, upload-time = "2026-05-22T13:18:25.672Z" }, + { url = "https://files.pythonhosted.org/packages/8b/33/7d1a8116bde9d259b3289090a2d93b87562001731cdf81d78bef5d1060d8/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af9600c680bec4b8d23c32ddaf7a5d91ed39a2cf758c082e34e860140cdcd87", size = 2223039, upload-time = "2026-05-22T13:20:37.64Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f6/4c94adcfe1bdaad3f8865a2115bed02e02cba809ffab25c0f85c0cc9b78a/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d6098342d4510a9034a500a53b1d737daf9cfc18a47cd21047d02d7d1587557", size = 2282031, upload-time = "2026-05-22T13:17:41.455Z" }, + { url = "https://files.pythonhosted.org/packages/b6/4f/7fe179b37f887297a5bfd7b38a4a26cd485748b6b424c43c73a36c02f57b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a891c20be5110deb1904f639f3615ec5022b3495995850d1abe7b8fa1550b5", size = 2088600, upload-time = "2026-05-22T13:17:36.643Z" }, + { url = "https://files.pythonhosted.org/packages/fa/15/daef331c1571ee986e1410511218c4d58e6ead75e0db735051925caa572b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:13990d357a50078e382b15fa3ce3f08043223b4be3eaeb340b184f54c1a2397a", size = 2112087, upload-time = "2026-05-22T13:19:30.024Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c7/7cfbb736f9ac501a92171e93bf640d065a13e12dcbcfb7effd21cce2f1ca/pydantic_core-2.47.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0f7343305387bb5884f24d384b7978ad099a277b27529e592c041a502a37c32", size = 2171199, upload-time = "2026-05-22T13:19:12.183Z" }, + { url = "https://files.pythonhosted.org/packages/5f/03/48e63b1f7d2088d747dde98b5dd7b89a46fff9173b6c10dc6189289c4aa5/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2c5e11bb1be2de2707c9367f364e73091ef30d34be54b3a4564d7421ac1a16bd", size = 2176850, upload-time = "2026-05-22T13:17:39.318Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/e653f7723f1dff5c054dada5f5d7f2c294067c087a52188847a0414cff2e/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e1b52aa981e034896712460c899ee30707c8c6a385e79bb7648aac76c748a3da", size = 2315368, upload-time = "2026-05-22T13:18:36.365Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ff/5aa6fcde3bd427648fee1a363671d8b4852c716603acd77091fb4cf1fc3d/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57d46021c20d4efc28f69b4ca4670dffbb7bdafa51d1967b747849726ec643b", size = 2351750, upload-time = "2026-05-22T13:19:28.187Z" }, + { url = "https://files.pythonhosted.org/packages/85/1d/6ee14bea4426d6bc421033d8d6ec69a6938d5773f7bd1d535b221fa48a7b/pydantic_core-2.47.0-cp311-cp311-win32.whl", hash = "sha256:d93c02ae8bd33f73624319d85cba47e754155c5bf104c0c5ca96fcd1f3094939", size = 1971464, upload-time = "2026-05-22T13:20:30.718Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6b/e466253efba866851af6e1094c488b4c5fb6adbfd8993d13e12b2a575541/pydantic_core-2.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:859ca679f00e5feb11b58b616eb7bc0efbb13654be21f5c898e510e27671c900", size = 2070625, upload-time = "2026-05-22T13:18:17.224Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/10628ab2df9f2421b6f3b88add9e026f1cb79198be417ee7d684ef0de5d7/pydantic_core-2.47.0-cp311-cp311-win_arm64.whl", hash = "sha256:482667e5b7a3e97b0836f33a716199c4ec6ba9c896ca4db6eae799ec527c1e64", size = 2052484, upload-time = "2026-05-22T13:17:32.654Z" }, + { url = "https://files.pythonhosted.org/packages/19/23/2daeff7346433ad9a3567852dd7a716329f9a7952dcf1ee74b166271bdc7/pydantic_core-2.47.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:70a7aeba54854f5d97da65cb1a61f000f53df3704cab41cd81d65ab127ddd031", size = 2108216, upload-time = "2026-05-22T13:19:31.898Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/2989cb5112b892b7dc13af570ff57d0f383f770fc88bbb644262df1b3017/pydantic_core-2.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c0e97329e38228f57fe1f2d91ba0ef39cc75cc1a84fe6ef58942d2fc6cb406bf", size = 1951502, upload-time = "2026-05-22T13:19:54.702Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a6/2417d8b1856cf7579a21e2679f02417b910e4f29120303e2c45137525072/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:faf83e50714837af72f13e9369c50377552a4a74049d4477bed51c7e5822d94b", size = 1975590, upload-time = "2026-05-22T13:17:26.586Z" }, + { url = "https://files.pythonhosted.org/packages/fc/71/0cd0813355b385bef8fa9a719982e0b44847afedc043b988c9f7c5d02ca9/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f50abe60347bf8afe2b2f58db86cf3ac6e418eec7ffa01d9dc90ba29fc64f243", size = 2055885, upload-time = "2026-05-22T13:20:42.378Z" }, + { url = "https://files.pythonhosted.org/packages/a3/33/5687c6dcf8ecca106c95b2a49f04a633320ab49961da6e57682db37b4482/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f13b18e7dec056336f29ee77dea3cc5db0271d6215cac7249cc5c61b0a49d293", size = 2235292, upload-time = "2026-05-22T13:19:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/36/98/08e81f1a0f0aa82cfa1a4d07b66eb116740fd6c82ba4baa8f96d4b377132/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3aaabbdbbbb8dff33fa053ffb2c980f39dec745fc03592f50e1e010449129841", size = 2308945, upload-time = "2026-05-22T13:18:38.113Z" }, + { url = "https://files.pythonhosted.org/packages/04/f1/6e35bdbdb79f96e630265297452d709b2ebd5facfbd83d3eb702eee24939/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d2907ee6d15cf26787bfbeb4c42e18e52f358086eab91baea961a0d909248d6", size = 2093861, upload-time = "2026-05-22T13:20:26.271Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c4/6a48e5da6a567bcf6d3ab113d2d476e1b93e3be941b4c486918f1c9d6714/pydantic_core-2.47.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:c413761260967f4dbb51135e1b49f30a1c29e15bf371fbb39754ed6475739545", size = 2124948, upload-time = "2026-05-22T13:18:15.728Z" }, + { url = "https://files.pythonhosted.org/packages/94/a1/e356c98dfc6bd5e6e166f2c832865a62941370b17a7199d35bc5999fecc8/pydantic_core-2.47.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bb527ac6e5a9721023b24615e1a55c01f47c60007f08b7d2afb89ff9c7a0e22", size = 2182065, upload-time = "2026-05-22T13:19:07.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/aa/6e99aac0a891b05cc522cc464aebeec2bb877fa4744be641a013ebc1785a/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b3abf7fd5e6abe483a63413f9cd26b7c93c20780e19c8556434c7279f6b2f10c", size = 2185830, upload-time = "2026-05-22T13:18:34.551Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/c6c5c1ad40b4d58f11d6e754e9c3990a2a3cfff20a9cf5c1f0a855a791b2/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:9cefe43d17a5a273d71697c084d3787defa7f578cd5fab4cef4c66d13c9e44b2", size = 2327330, upload-time = "2026-05-22T13:19:48.203Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f8/064747538297e385a1f197f35551d1bf6093e88c5ce9b4e15c035f0a1cfe/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:38a8b5371b7938e4f6c31060dbd51d3b3229aef7c43eaac2eb8b153e43c3f189", size = 2366505, upload-time = "2026-05-22T13:20:11.895Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d5/2d8715ef982c0b1875e42f4248b48439133a2781f0be77f0e4dbc84d147d/pydantic_core-2.47.0-cp312-cp312-win32.whl", hash = "sha256:b87e95e644df2a36bd631dd0d6e097aa73d19a55adf7b1724ebdeece3d9c76b7", size = 1957410, upload-time = "2026-05-22T13:17:38.025Z" }, + { url = "https://files.pythonhosted.org/packages/0e/ea/9d908a80798db41c7c38926259ed74d015869f0afe4be6ed56f71793a084/pydantic_core-2.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0078c5695322050ccedbc86eafaf3e2548439782c51d99e575de0e31b9fe4f4", size = 2072354, upload-time = "2026-05-22T13:17:42.779Z" }, + { url = "https://files.pythonhosted.org/packages/fe/78/5549cba47c662ec7f05d79527474786e5ff7f08ef3e65a409a8a2ab6013e/pydantic_core-2.47.0-cp312-cp312-win_arm64.whl", hash = "sha256:7eedc31996e9eba3bdfbbc380805ac6d765c889b7e93b17cd00ecb0200fd6dca", size = 2035452, upload-time = "2026-05-22T13:18:18.75Z" }, + { url = "https://files.pythonhosted.org/packages/7a/91/810cabda42f7fdd13b349702694e1140f6071fd42d1e542d606d5ad0c2d4/pydantic_core-2.47.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:263560ece98bffbbc0a8047ce60b8a278c859db6a2a4e30d9454b02891045eca", size = 2108548, upload-time = "2026-05-22T13:18:09.878Z" }, + { url = "https://files.pythonhosted.org/packages/fa/87/f444a6d63bcbdff3c45291df842941ed56c568f45dd3742f25afb567b5a2/pydantic_core-2.47.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a7fdaff39a66bf66e9037da482575513d2f20bfb02ea9d9222b5cb3b902fc695", size = 1951421, upload-time = "2026-05-22T13:20:32.973Z" }, + { url = "https://files.pythonhosted.org/packages/f5/09/c90dff5407c11e59023161c84df19dd5ed93966a23b2f08cd21d45812ab9/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e6c8ee5ce8c270bfae09763ae4bbbccfe81090c97d670a621fb86cb1ef6042", size = 1976554, upload-time = "2026-05-22T13:19:04.085Z" }, + { url = "https://files.pythonhosted.org/packages/95/cf/55fbe9f1b396f91005cd1cb7acf2bcf380a1f1b57e261ac78bcdc0ff42f3/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e38cdae682cfec4b3816722dccf6376ca59049726d57dca83c2fe7cc13665589", size = 2055005, upload-time = "2026-05-22T13:18:12.809Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c6/4f7cbaa62582e95c080cdd45fb5d4350ff05dac87ea32930c75dcb427bf1/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc3193ff0b7e2e168f84c6185e70475738c191f3154e0af8f897cd0f8f9a489", size = 2235489, upload-time = "2026-05-22T13:19:13.994Z" }, + { url = "https://files.pythonhosted.org/packages/31/75/16913c82ffd194c537222b3d0e8a05c11681e551add67308ec4af6023724/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57ff41672a615f38af528ee904602be51c653248354e5db8e9252668abe91e68", size = 2308360, upload-time = "2026-05-22T13:18:39.894Z" }, + { url = "https://files.pythonhosted.org/packages/05/9f/b24bb1b764fc360adace5df806a81fd62ef1662df2973891e487c3fd5a2c/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473b9a2b2a1f0dd55cbb32d2b902f93babe7f141a0bb48fb4d3d4d2b3e93e9a0", size = 2092549, upload-time = "2026-05-22T13:17:45.38Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d3/0268ea5972b91178250c0a573bb54c17f697665cd2aa35623087a3589fc6/pydantic_core-2.47.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:195f9c4ac43a7b2a044a7b86631c3352abdb820bed2823ea29f98f779255f459", size = 2123849, upload-time = "2026-05-22T13:18:03.817Z" }, + { url = "https://files.pythonhosted.org/packages/8f/92/26b2147738a89f78925775bb4b34ae53f981ce880ee77ee2c2ccbc49466a/pydantic_core-2.47.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c1cd10d39ef1ff8bcd68b6865bee9c434631ac0608d402fe86e678851c2e2a5", size = 2181733, upload-time = "2026-05-22T13:17:35.308Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fa/8a858dde4784c7245b7216ab9a71518cb1a898a83ffb5c0509181789de19/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7cbe66352fe2b39511d49150e5b52159429cd21f5633a3e801dd2c43829dcdca", size = 2184065, upload-time = "2026-05-22T13:18:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/69/20/ea165877f965622e021f04d63330f9ceb55ede0aefa862863e06a9a610cb/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e35192a1d53e55d510d8bb1023c988c7cdae6d94539074971741b2a7656e49a1", size = 2326881, upload-time = "2026-05-22T13:18:41.477Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d6/ad22a6f0941be5a5478e6c378d0ec3c7641be96d7a86a3ea1f9e9830a269/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81de54576de2e20baec76cc5afae2820f9049e6fdc4f357bac3391da02d0ba97", size = 2365574, upload-time = "2026-05-22T13:20:02.947Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4e/eb5e3429dd29311e75ab89313cde09b709b0637fd88838d2cb4a98760b02/pydantic_core-2.47.0-cp313-cp313-win32.whl", hash = "sha256:05da6647bdfd3888936ac10aa39b239d659f3c93dff281af0fc5943eb55629dd", size = 1955451, upload-time = "2026-05-22T13:17:31.178Z" }, + { url = "https://files.pythonhosted.org/packages/15/12/ec107c12aa8729c766285d4aa6caa5f5addf8b2ef6cfd35c455a3ca5c66e/pydantic_core-2.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:021220e0a03b66112737ee1fc49759340ce8fafb8d9ade1b7fb366b06033fa45", size = 2071285, upload-time = "2026-05-22T13:19:50.585Z" }, + { url = "https://files.pythonhosted.org/packages/f4/02/b003a55acfeb35823925d1cd502b80e3fe6c5d477865c36815fbefdf49ac/pydantic_core-2.47.0-cp313-cp313-win_arm64.whl", hash = "sha256:55156ee2f6f561ea4e25ab55f84bd70b9c9ed2546a834cb2b038fe10225aaa37", size = 2034804, upload-time = "2026-05-22T13:18:32.64Z" }, + { url = "https://files.pythonhosted.org/packages/ef/46/a4675c783822e229bf04e290ae28cf5a057b00a46039498743b066e0fefd/pydantic_core-2.47.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6e37a6974fbd8fa7cae12285a76970d50b3689ffd6ed7c7fdd176ba81dd22d0e", size = 2104537, upload-time = "2026-05-22T13:18:05.312Z" }, + { url = "https://files.pythonhosted.org/packages/67/bb/f6d6d1dd8362d616b227b55af8bc2d1b7d4ea842facb7c50a82298ba3b9d/pydantic_core-2.47.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2433b8524785cc117e602233bc574879bc8d87f09523edeec51665d5c46cf42d", size = 1951581, upload-time = "2026-05-22T13:18:14.244Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ae/7d01ed8658ccf8beae8a3fcf2cd023c3ba0ab0b19d3f456845a709cece94/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f9f2be064c8bf1189f46f7062fd42765d94f59cfb7db7ef8db19563192110a", size = 1978461, upload-time = "2026-05-22T13:19:15.829Z" }, + { url = "https://files.pythonhosted.org/packages/80/e5/dd38ccbd1e68f1c3fd7f8b413a8b32db11bd16d5999c3dc3aed4e54290df/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1f0a9659a2eb161573418e3138f616101ba21bbd2ff04916dca7b6712155e015", size = 2049444, upload-time = "2026-05-22T13:19:06.258Z" }, + { url = "https://files.pythonhosted.org/packages/7d/63/0cb998f3f4ea4255ab6d891e2537d4566cd31630df0d406ce45b00306729/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2995074b99242aa28991e0120a3c881babc139e08750a05b7ea7d140644e091d", size = 2231772, upload-time = "2026-05-22T13:20:05.22Z" }, + { url = "https://files.pythonhosted.org/packages/3f/20/2cacf5c4a1bdda1356351df38f343c6cf13af6194e6e0ee0f7967395793f/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5b224dc04c3ff9b08c24419464eb7f6ad7a1049e12284a00bf80df82bd15fdb", size = 2305322, upload-time = "2026-05-22T13:20:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/e3/8f/b7e09086bd48b1ef3f74227ed98907496924a622c7f9315cf661946233c6/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:264361b7236d4374fef6342908f87d084a0d58a2f8d0811e99f714309cb0ba7e", size = 2097748, upload-time = "2026-05-22T13:20:21.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/27/2927049e93f6fbbaa838b2bb656dbd63c6d6fcaab9909d632fd93573ebd9/pydantic_core-2.47.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:53368beaf693f6302a6e33bdefe950857534a04d282811421bd20176d0fb5636", size = 2122971, upload-time = "2026-05-22T13:19:37.977Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3b/80b58a0c7f4339f024ad5c5b6316bef895536abf75c45dc85f0c83ae1a92/pydantic_core-2.47.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5d2177b44ba7d9d86850f865f362feeaac6a2ed8517a9b505b97ff0b7fdbd7dd", size = 2181287, upload-time = "2026-05-22T13:18:20.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0a/dfcb9575603aaf113d2cae1fb622570046a210276eba2267764b3f83f4f2/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fb57a6b538ec7a01b937986bc093aec530fb056135b6bc9cfdd0bf8460c25bc2", size = 2177842, upload-time = "2026-05-22T13:17:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/57/c2/31a198c8180b417d18410e7640c505b39c51ac291aca34f71ac37093f4c4/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:18c9c7c3a18e9bdbf1215d913f6bd00e17595dc92949817935cb87a3cf5f1697", size = 2321802, upload-time = "2026-05-22T13:17:54.495Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/052d872b61f88d2f71b3d881c08abfbe33cb9d64bd988712bb4fb973001c/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2f72a382886ca85bb1247303b9134cf9978c9d454de62e710a1ebcd9d2131927", size = 2363870, upload-time = "2026-05-22T13:18:45.053Z" }, + { url = "https://files.pythonhosted.org/packages/be/60/c8c985d4081dafaa88fe6ac6a41ebe2b82d289c391b2bcbd3508f585e7a9/pydantic_core-2.47.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:cdf4dc2cdd0eacad1bd81c4d25422b4c25b206acae095d2d64e5d5cb7facc6b3", size = 1369335, upload-time = "2026-05-22T13:17:51.719Z" }, + { url = "https://files.pythonhosted.org/packages/42/70/30dfcc18dc5552f7235ae2ffd7b699a1ba0d38ebfcdb97f371c792d61601/pydantic_core-2.47.0-cp314-cp314-win32.whl", hash = "sha256:1e859dd5e06e9807080e14995db131649a77c61131cc464a7fe492a69ce82488", size = 1952107, upload-time = "2026-05-22T13:20:24.07Z" }, + { url = "https://files.pythonhosted.org/packages/fa/49/f5c517ba99b9e1036ead16cedd0fc189dbcbf900fb0b85b746b6a0b9b389/pydantic_core-2.47.0-cp314-cp314-win_amd64.whl", hash = "sha256:234ecade0e358caa1ea516c218b3f61e61e30532cad1a8bb12f2487325838548", size = 2071388, upload-time = "2026-05-22T13:18:46.74Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6c/6b95e00ed7a3c7f78cb8544bc34cb29412c05512af507fc4466912576d50/pydantic_core-2.47.0-cp314-cp314-win_arm64.whl", hash = "sha256:58158d0111e86893bc35aacabe509f951ed303cddf8cdba43533190bde317914", size = 2026046, upload-time = "2026-05-22T13:18:22.112Z" }, + { url = "https://files.pythonhosted.org/packages/22/2c/fa67f96f381ba3c83e8cd75a6eb3c538e123d8d02e19d80383bff01ffda0/pydantic_core-2.47.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:24017fd3befd4d7cc4a8c71f4a1e9a44d29fdc91723c5446b0e795ab808adee7", size = 2102407, upload-time = "2026-05-22T13:17:46.882Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e8/99abe6c33db3dda235a2095eae5fdd03266857abd9be1c50ed97a59587c3/pydantic_core-2.47.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dfa0820888cc4549fcce7e6bd8affa7d75198d885ccd0bb0760def4bb8461862", size = 1931963, upload-time = "2026-05-22T13:18:23.776Z" }, + { url = "https://files.pythonhosted.org/packages/5c/dd/96d1884f65737f793e64b6b8745ee793e3cb4735e086ead0a40e5349294e/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d507f331756f7066cde7c9f35ed78fa78223a54369dbc8a34d6da7a5074fa1", size = 1973492, upload-time = "2026-05-22T13:17:22.128Z" }, + { url = "https://files.pythonhosted.org/packages/07/8c/0504f091c75b229cd07d61b45464d7c5291c3ecf2e7d847f215fe81cf5e5/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c4a885fb50c05903bc703a00830616e680304fdcdd90fc9535a52e72debe712", size = 2035548, upload-time = "2026-05-22T13:17:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bf/e9f69c55ef6c945d29e4afb306f62a15354bfd09f1ee25d9aecd4c6cbb82/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b107cbd764bf68f12a57c7aa5846d868bc7463490a1ac2d0f19bffef624c5a9", size = 2238356, upload-time = "2026-05-22T13:19:10.309Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/dfbd214487033093f5946c1fd5915ae5dc6b278efe764397b5e2ef8092a8/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b5f46412c8226d0c8f1f423c324c75afe342e4b854836933579fb484f68598c", size = 2284799, upload-time = "2026-05-22T13:17:27.959Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ec/f80488fa26a6b27bd0d1267f35b0fce3bfeec23ca97021085a94ccd3adc3/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90cbf7e35d597503cbdb5cd85409cbb75f377290bc7e8e37cc5dfe4f5cc66cf8", size = 2107895, upload-time = "2026-05-22T13:18:27.282Z" }, + { url = "https://files.pythonhosted.org/packages/9b/1d/67ac210745f63a982b145d8f281dc76bd347d98052792f087224a178da54/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:04ee7ba7172cb4484af51b2890f19069d35773698abc8c6ebb651f52fbf41134", size = 2102797, upload-time = "2026-05-22T13:19:40.139Z" }, + { url = "https://files.pythonhosted.org/packages/6c/75/f3b9bd4d88fcaad9a5abf2ec6969f37a70e34f40a5f8d2d78077f168e83d/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a7acb3e120ddba94372b8146e62ea3a0bce203180e34641c817c87f995c91e0", size = 2160123, upload-time = "2026-05-22T13:19:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/e94ac13bd17c341e86c4b67deb47b63718208fe413034fdb01e7a4bf1dd8/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:1a2f7ceb58013d167d8c96f10ec9b3a137018c819ba356f68ff1cb74302fd22e", size = 2164386, upload-time = "2026-05-22T13:18:48.372Z" }, + { url = "https://files.pythonhosted.org/packages/36/e5/862ff195402f5b08db9ad4d9ebe7cbed993f51528aab7edcb62531442556/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:482b097637fec5037eb13fe9f9d5fe47e568a5b451d686bc2b854076cc0b50ca", size = 2303767, upload-time = "2026-05-22T13:18:50.211Z" }, + { url = "https://files.pythonhosted.org/packages/c2/05/c8ebbb97cf44686fc9cc64a6bb86ac72a8871426a9f61417e395d77c4894/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a8c7f5fad73eb404f4b84c75f3d9d3865b748ded248b7366341db6e516fc502b", size = 2361148, upload-time = "2026-05-22T13:18:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8b/4695ec6ce81eda7cc822383de993c5b2c289cfc84d3f032a30c55eb238fc/pydantic_core-2.47.0-cp314-cp314t-win32.whl", hash = "sha256:f343c39928097175acf2f7d0cba5c00b0f62265d88a173a4ce264266ac849bd9", size = 1939588, upload-time = "2026-05-22T13:19:42.151Z" }, + { url = "https://files.pythonhosted.org/packages/96/4d/bc2e188ab648b3ab284e80a0340c5d5b9723c22572c6e36ba39eb300e718/pydantic_core-2.47.0-cp314-cp314t-win_amd64.whl", hash = "sha256:52d40e074da44e42b2425aedebd513e405a31807036ef597175117a9b01743a6", size = 2049697, upload-time = "2026-05-22T13:18:08.244Z" }, + { url = "https://files.pythonhosted.org/packages/6f/46/ca1e6813e029993e57340c6a37740450c51919e3809472f79060f4d64cf0/pydantic_core-2.47.0-cp314-cp314t-win_arm64.whl", hash = "sha256:25cac08c9735e61e5c0b9f7a85c438661fc0e9da226afdfa984c3da6c5942a5a", size = 2025906, upload-time = "2026-05-22T13:17:50.322Z" }, + { url = "https://files.pythonhosted.org/packages/1e/a3/7391a9a511aba60ba119dcbc221a36109dd05ff498dcd6e6ff7222a21b76/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:dbe50ffd50c7e1b8e3bedafafd10fabe8a7cf51916f995fd57316eb1293f2439", size = 2112946, upload-time = "2026-05-22T13:18:54.846Z" }, + { url = "https://files.pythonhosted.org/packages/71/74/1d0fe337fa5a89069731206be4da2b41793b8f8fe28f34ed4d941028a62f/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:67c3f4b57a1cda846a9b6258e0ef70f99b0757d0b6a55f7e3e5b100620937d2c", size = 1940704, upload-time = "2026-05-22T13:18:00.366Z" }, + { url = "https://files.pythonhosted.org/packages/ac/75/d40231aed211f97ffc3264d7a7c98d1f52f7b9c8d165cee75c8c1c13e5c3/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1e025c83b3987784191ec5aa78cfb94686f1ba73d98ae4d520c09cdecda8d", size = 1985024, upload-time = "2026-05-22T13:17:29.331Z" }, + { url = "https://files.pythonhosted.org/packages/a6/bc/e27d3fb897c5b059a508b88eb7c4cc1f0fe600be3231728bb003e1e2b464/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547cac87585ab8a6e9495fd3be22ae8ccaabb3c909f6ae589a180677c105cc8", size = 2136202, upload-time = "2026-05-22T13:17:34.031Z" }, + { url = "https://files.pythonhosted.org/packages/4e/21/81cc7e3acbf7d4eed41e9585e81b5840aaf6ddbe65974a20946038d6516b/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:d648515c65f8871ceca6a0446be32fb1a0aae414db3907ec0df6cc2380dd0c04", size = 2098016, upload-time = "2026-05-22T13:18:56.902Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6e/c98e869e9f754f18088ad9b55887972d08606e7bf81dba088779e927eb65/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3292813ac8ed17671a5b1ac8256b6e98b96c29c1c6d061c35899e2f6e0444cac", size = 1931175, upload-time = "2026-05-22T13:20:07.566Z" }, + { url = "https://files.pythonhosted.org/packages/5d/65/ce0d773f4b51dc332764ba1bd585c81f62d5c92231a66d152aff16be8dfa/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf3cfcea028f41a9b42a47f4a53d72ca4274d04e3ee525bd58ca89ea8c5e1910", size = 1995356, upload-time = "2026-05-22T13:19:44.143Z" }, + { url = "https://files.pythonhosted.org/packages/19/2c/6e63683a77d342c93bad67bb0762ca8fe1d8418acc8617d70ccdcc5ec5ff/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52afdd8640d59890539060e91c8a494cf96b463e63b2ba499cc5c23abcb5e96b", size = 2144893, upload-time = "2026-05-22T13:17:59.008Z" }, + { url = "https://files.pythonhosted.org/packages/f1/bf/06a01e2f6668aa10646e5c9b050a609d975a93d58454e26e16fd9f82cd38/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ff201e8b93cd6a3849ec3fecb1d642d0391ca4a387f1162adaadddfd1986598c", size = 2114751, upload-time = "2026-05-22T13:18:02.245Z" }, + { url = "https://files.pythonhosted.org/packages/41/50/caf4cc67fdd664baf89bfe264d72079e901a02d903c813ced9de173cdd69/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eba39fca6e1fc7c58a5e6b5c320c6eec86014f7075dfa0fb1a79076e00304b3a", size = 1947894, upload-time = "2026-05-22T13:19:36.12Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c0/96ba102865c9ccb945a758272741d00175837bf32bb71750f6e2bf4543fb/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b494566e8e7e1a3992a550900902d6c0051538e53f5957e24003e7775638a24", size = 2131698, upload-time = "2026-05-22T13:18:58.55Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f8/ee7c5d4eafaecdeaf92ce84f48d748c139888e90fa25b2ae988c5aea874c/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c96f745745fe778a92e74f40675c57b80dd46fc98186c9020e5ba4514a0470bd", size = 2157797, upload-time = "2026-05-22T13:17:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/08/69/b3eba1d0e015cee3906f7056cfd9ed383f6cef486fde5398a002df2594e4/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dbfb8f8ac48a8fd5a9f83cdbba0a23796f3ff5f9421c735808ed134d3318046f", size = 2177829, upload-time = "2026-05-22T13:20:09.611Z" }, + { url = "https://files.pythonhosted.org/packages/8a/36/a0ceff9b7c3a0980128c9ef763db1e9fe9c2b1fcecf6ed055e88af39f123/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:4ded2d8dc3beb086623ab3256b81a0b51fc026c94eb363f480aec09b204a1cbd", size = 2307425, upload-time = "2026-05-22T13:19:46.177Z" }, + { url = "https://files.pythonhosted.org/packages/d6/0a/930e210e95ade33ecacabc4ba822aa1662a0aaf843d2cf57abce27fb95b1/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:25f8aa59fd3f85651387c37b289cd8f0bbc8f632e7dad13c6b837759e78be88d", size = 2351547, upload-time = "2026-05-22T13:17:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0c/90941408bb6c1e84563d99177c9e62c536dce0388b5a8bf37b90b4f6f095/pydantic_core-2.47.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:0ae0096729c64aa6155cef74e75d1945017b01cfb82f313a18d843fafc497476", size = 2180871, upload-time = "2026-05-22T13:19:56.696Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index 81d84b0a7..28bb8a09b 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -607,7 +607,7 @@ def _parse_projects(module_ctx, hub_specs): config_settings = config_settings, monitor_memory = monitor_memory, resource_set = resource_set, - rust_toolchain = str(project.rust_toolchain) if project.rust_toolchain else "", + rust_toolchain = project.rust_toolchain, ) has_sbuild = True @@ -1027,7 +1027,7 @@ _override_package_tag = tag_class( ), "toolchains": attr.label_list( default = [], - doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", + doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_SYSROOT, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", ), "env": attr.string_dict( default = {}, diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index 688e68373..89d092117 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -26,13 +26,15 @@ _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") # TemplateVariableInfo make-variable -> build helper env key, for the # toolchains a native build commonly layers in: rules_rust's -# current_rust_toolchain (CARGO/RUSTC), an exec-configured rust sysroot -# layer (RUST_HOST_SYSROOT), a Java runtime (JAVA/JAVABASE) and an Ant layer -# (ANT_HOME/ANT_BIN_DIR). The env keys are the helper's contract -# (build_helper.py absolutizes exactly this set). +# current_rust_toolchain (CARGO/RUSTC and its generated RUST_SYSROOT, where +# rustc and rust-std meet whatever repositories they were fetched into), an +# exec-configured rust sysroot layer (RUST_HOST_SYSROOT), a Java runtime +# (JAVA/JAVABASE) and an Ant layer (ANT_HOME/ANT_BIN_DIR). The env keys are +# the helper's contract (build_helper.py absolutizes exactly this set). _DERIVED_ENV = { "CARGO": "CARGO", "RUSTC": "RUSTC", + "RUST_SYSROOT": "RULES_PY_RUST_SYSROOT", "RUST_HOST_SYSROOT": "RULES_PY_RUST_HOST_SYSROOT", "JAVA": "JAVA", "JAVABASE": "JAVA_HOME", diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index ea258c7fc..2f08052b2 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -7,6 +7,7 @@ load("//py:defs.bzl", "py_binary", "py_test") load("//uv/private/pep517_whl:frontend.bzl", "pep517_frontend") load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("//uv/private/pep517_whl:pep517_whl.bzl", "pep517_whl") +load("//uv/private/pep517_whl:rust_layer.bzl", "rust_host_sysroot") load( ":exec_platform_steering_test.bzl", "exec_platform_prefers_native_match_test", @@ -26,6 +27,7 @@ load( "config_settings_args_test", "cross_decision_test", "execroot_collision_toolchain", + "fake_rust_toolchain", "hostile_python_env_target", "interpreter_platform_triple_test", "pep517_native_whl_cross_mode_test", @@ -34,6 +36,7 @@ load( "pep517_native_whl_toolchain_env_test", "pep517_whl_console_scripts_test", "python_host_platform_test", + "rust_host_sysroot_test", "target_python_artifacts_test", ) @@ -379,6 +382,48 @@ pep517_native_whl_derived_env_test( target_under_test = ":__derived_env_override_fixture", ) +fake_rust_toolchain(name = "__fake_rust_toolchain") + +rust_host_sysroot( + name = "__rust_host_sysroot", + actual = ":__fake_rust_toolchain", +) + +rust_host_sysroot_test( + name = "rust_host_sysroot_test", + target_under_test = ":__rust_host_sysroot", +) + +# The shape sdist_build generates for a Rust sdist: the toolchain plus its +# exec-configured sysroot layer. Their make-variables must reach the helper +# under its env names, and the make-variable names themselves must not. +pep517_native_whl( + name = "__derived_rust_env_fixture", + src = ":__stub_sdist", + tags = ["manual"], + tool = ":__stub_tool", + toolchains = [ + ":__fake_rust_toolchain", + ":__rust_host_sysroot", + ], + version = "0.0.1", +) + +pep517_native_whl_derived_env_test( + name = "derived_rust_env_test", + absent_keys = [ + "RUST_SYSROOT", + "RUST_HOST_SYSROOT", + ], + derived_keys = [ + "CARGO", + "RUSTC", + "RULES_PY_RUST_SYSROOT", + "RULES_PY_RUST_HOST_SYSROOT", + ], + target_under_test = ":__derived_rust_env_fixture", +) + execroot_collision_toolchain(name = "__execroot_collision_toolchain") pep517_native_whl( diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 3abeb48ff..c811583f4 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -217,6 +217,15 @@ def test_driver_swapped_flags_preserved(self) -> None: self.assertEqual(env["LDSHARED"], "/wrap/cc -shared -pthread") +class NeedsCargoCrossEnvTest(unittest.TestCase): + def test_cargo_wired_by_the_rule_is_the_signal(self) -> None: + self.assertTrue(build_helper._needs_cargo_cross_env({"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc"})) + + def test_no_rust_toolchain_no_cargo_env(self) -> None: + self.assertFalse(build_helper._needs_cargo_cross_env({})) + self.assertFalse(build_helper._needs_cargo_cross_env({"CARGO": ""}), "an empty CARGO is not a toolchain") + + class MakeCompilerWrapperTest(unittest.TestCase): def test_wrapper_is_executable_and_bakes_the_driver(self) -> None: with tempfile.TemporaryDirectory() as tmp: @@ -893,6 +902,54 @@ def test_rustc_wrapper_uses_merged_sysroot(self) -> None: self.assertTrue(path.islink(path.join(merged, "aarch64-unknown-linux-gnu"))) + def test_target_sysroot_from_toolchain_wins_over_rustc_location(self) -> None: + # rules_rs-style layout: rustc in one repository, rust-std in another, + # both assembled into the toolchain's generated sysroot. + tmp = tempfile.mkdtemp() + target_rustc = path.join(tmp, "rustc_repo", "bin", "rustc") + makedirs(path.dirname(target_rustc)) + open(target_rustc, "w").close() + generated = path.join(tmp, "generated_sysroot") + makedirs(path.join(generated, "lib", "rustlib", "aarch64-unknown-linux-gnu")) + host_sysroot = path.join(tmp, "host_sysroot") + makedirs(path.join(host_sysroot, "lib", "rustlib", "x86_64-unknown-linux-gnu")) + + env = self._env() + env["RUSTC"] = target_rustc + env["RULES_PY_RUST_SYSROOT"] = generated + env["RULES_PY_RUST_HOST_SYSROOT"] = host_sysroot + build_helper._configure_cargo_cross_env(env, tmp, "linux", "aarch64", "glibc") + + merged = path.join(tmp, ".rust_sysroot", "lib", "rustlib") + self.assertTrue(path.islink(path.join(merged, "aarch64-unknown-linux-gnu"))) + self.assertTrue(path.islink(path.join(merged, "x86_64-unknown-linux-gnu"))) + + +class CargoNativeEnvTest(unittest.TestCase): + def test_rustc_gets_the_toolchain_sysroot(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_SYSROOT": "/tc/sysroot", "RULES_PY_RUST_HOST_SYSROOT": "/exec/sysroot"} + build_helper._configure_cargo_native_env(env, tmp) + with open(env["RUSTC"]) as f: + content = f.read() + self.assertIn('"--sysroot", \'/tc/sysroot\'', content) + self.assertIn("/tc/bin/rustc", content) + self.assertTrue(os.access(env["RUSTC"], os.X_OK)) + + def test_host_sysroot_is_the_fallback(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_HOST_SYSROOT": "/exec/sysroot"} + build_helper._configure_cargo_native_env(env, tmp) + with open(env["RUSTC"]) as f: + self.assertIn("/exec/sysroot", f.read()) + + def test_no_rust_toolchain_leaves_rustc_alone(self) -> None: + tmp = tempfile.mkdtemp() + env = {"RUSTC": "/usr/bin/rustc"} + build_helper._configure_cargo_native_env(env, tmp) + self.assertEqual("/usr/bin/rustc", env["RUSTC"]) + + class BuildBackendTest(unittest.TestCase): def test_declared_backend(self) -> None: data = {"build-system": {"build-backend": "mesonpy"}} @@ -903,28 +960,6 @@ def test_missing_cases(self) -> None: self.assertIsNone(build_helper._build_backend(data)) -class UsesSetuptoolsRustTest(unittest.TestCase): - def test_setuptools_rust_requirement_detected(self) -> None: - data = {"build-system": {"build-backend": "setuptools.build_meta", "requires": ["setuptools", "setuptools-rust>=1.8"]}} - self.assertTrue(build_helper._uses_setuptools_rust(data)) - - def test_no_backend_value_also_matches(self) -> None: - data = {"build-system": {"requires": ["setuptools-rust"]}} - self.assertTrue(build_helper._uses_setuptools_rust(data)) - - def test_plain_setuptools_does_not_match(self) -> None: - data = {"build-system": {"build-backend": "setuptools.build_meta", "requires": ["setuptools", "wheel"]}} - self.assertFalse(build_helper._uses_setuptools_rust(data)) - - def test_maturin_does_not_match(self) -> None: - data = {"build-system": {"build-backend": "maturin", "requires": ["maturin"]}} - self.assertFalse(build_helper._uses_setuptools_rust(data)) - - def test_requirement_name_strips_specifiers(self) -> None: - self.assertEqual("setuptools-rust", build_helper._requirement_name("setuptools-rust>=1.8")) - self.assertEqual("setuptools-rust", build_helper._requirement_name("setuptools-rust[extras] ~= 1.0 ; python_version > '3.9'")) - self.assertEqual("", build_helper._requirement_name(">=bogus")) - class StaticRuntimeArchivesTest(unittest.TestCase): def _wrapper(self, tmp: str, archives: list[str]) -> str: diff --git a/uv/private/pep517_whl/tests/pep517_whl_test.bzl b/uv/private/pep517_whl/tests/pep517_whl_test.bzl index 2d5f5a273..794ad056f 100644 --- a/uv/private/pep517_whl/tests/pep517_whl_test.bzl +++ b/uv/private/pep517_whl/tests/pep517_whl_test.bzl @@ -367,3 +367,36 @@ config_settings_args_test = analysistest.make( ), }, ) + +def _fake_rust_toolchain_impl(ctx): + # The sysroot is this target's own output root: an "-exec" segment in it + # proves the dependent re-resolved us in the exec configuration. The + # make-variables mirror what rules_rust's current_rust_toolchain exports. + return [ + platform_common.ToolchainInfo(sysroot = ctx.bin_dir.path, all_files = depset()), + platform_common.TemplateVariableInfo({ + "CARGO": "/fake/bin/cargo", + "RUSTC": "/fake/bin/rustc", + "RUST_SYSROOT": ctx.bin_dir.path + "/fake_sysroot", + }), + ] + +fake_rust_toolchain = rule( + implementation = _fake_rust_toolchain_impl, + doc = "Stands in for rules_rust's current_rust_toolchain: ToolchainInfo with a sysroot.", +) + +def _rust_host_sysroot_test_impl(ctx): + env = analysistest.begin(ctx) + target = analysistest.target_under_test(env) + variables = target[platform_common.TemplateVariableInfo].variables + sysroot = variables.get("RUST_HOST_SYSROOT", "") + asserts.true(env, sysroot != "", "RUST_HOST_SYSROOT must be exported; got: {}".format(variables)) + asserts.true( + env, + "-exec" in sysroot, + "the sysroot must come from the toolchain re-resolved in the exec configuration; got: " + sysroot, + ) + return analysistest.end(env) + +rust_host_sysroot_test = analysistest.make(_rust_host_sysroot_test_impl) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 604104254..bd6922ec1 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -215,7 +215,7 @@ def _override_tool(env: dict[str, str], key: str, wrapper: str) -> None: def _absolutize_tool_paths(env: dict[str, str]) -> None: """Resolve toolchain paths before the backend changes cwd.""" - for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): + for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): value = env.get(key) if value: env[key] = _absolutize_path(value) @@ -1033,7 +1033,7 @@ def _generate_cmake_toolchain_file( """ -def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> str: +def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str, target_sysroot: str | None = None) -> str: """Symlink-merge the target toolchain's sysroot with the host's rust-std. A cross rust_toolchain's sysroot has no exec-platform rust-std, but @@ -1042,8 +1042,12 @@ def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> st by side in one install; recreate that by merging the two Bazel-fetched single-target sysroots. The host's rustlib entries win: exec-platform code must resolve against exec-platform std. + + The target sysroot is the toolchain's generated one when known: rulesets + such as rules_rs fetch rustc and rust-std into separate repositories, so + the directory above rustc holds no std at all. """ - target_sysroot = path.dirname(path.dirname(target_rustc)) + target_sysroot = target_sysroot or path.dirname(path.dirname(target_rustc)) merged = path.join(tmpdir, ".rust_sysroot") if path.exists(merged): return merged @@ -1070,6 +1074,21 @@ def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> st return merged +def _needs_cargo_cross_env(build_env: dict[str, str]) -> bool: + """Whether this cross build compiles Rust. + + The decision is made once, at repository-generation time: sdist_build + wires the project's Rust toolchain into the build only for maturin + backends and setuptools-rust requirements (declared or inferred), and + pep517_native_whl turns its make-variables into CARGO/RUSTC. Their + presence is therefore the signal; the helper does not re-derive it from + pyproject.toml, which would miss inferred setuptools-rust builds. A Rust + toolchain listed on a package that never invokes cargo costs an unused + environment, nothing more. + """ + return bool(build_env.get("CARGO")) + + def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os: str, target_cpu: str, target_libc: str) -> None: """Cross env vars for maturin (Cargo-driven PyO3 builds). @@ -1092,7 +1111,7 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os host_sysroot = build_env.get("RULES_PY_RUST_HOST_SYSROOT") if host_sysroot: - merged_sysroot = _merge_rust_sysroot(tmpdir, build_env["RUSTC"], host_sysroot) + merged_sysroot = _merge_rust_sysroot(tmpdir, build_env["RUSTC"], host_sysroot, build_env.get("RULES_PY_RUST_SYSROOT")) build_env["RUSTC"] = _write_generated_file( path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=merged_sysroot), @@ -1110,6 +1129,25 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os build_env["MATURIN_PEP517_ARGS"] = (interpreter_arg + " " + existing).strip() +def _configure_cargo_native_env(build_env: dict[str, str], tmpdir: str) -> None: + """Point rustc at the toolchain's sysroot for a native build. + + Bare rustc infers its sysroot from its own location, which only works + when rust-std was unpacked next to it. rules_rust's toolchain always + publishes the sysroot it assembled (RUST_SYSROOT), so pass that + explicitly; the exec-configured layer's sysroot is the same toolchain in + native mode and serves as the fallback. + """ + sysroot = build_env.get("RULES_PY_RUST_SYSROOT") or build_env.get("RULES_PY_RUST_HOST_SYSROOT") + if not (build_env.get("CARGO") and sysroot): + return + build_env["RUSTC"] = _write_generated_file( + path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), + _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=sysroot), + executable=True, + ) + + def _build_backend(pyproject_data: dict[str, object] | None) -> str | None: """The [build-system].build-backend value, or None when undeclared.""" build_system = (pyproject_data or {}).get("build-system", {}) @@ -1119,30 +1157,6 @@ def _build_backend(pyproject_data: dict[str, object] | None) -> str | None: return backend if isinstance(backend, str) else None -_REQUIREMENT_NAME_RE = re.compile(r"^\s*([A-Za-z0-9][A-Za-z0-9._-]*)") - - -def _requirement_name(requirement: str) -> str: - """PEP 508 requirement string -> bare package name, extras/specifiers/markers stripped.""" - match = _REQUIREMENT_NAME_RE.match(requirement) - return match.group(1) if match else "" - - -def _uses_setuptools_rust(pyproject_data: dict[str, object] | None) -> bool: - """setuptools-rust has no build-backend of its own (it's - setuptools.build_meta plus a build requirement) — detect it there.""" - build_system = (pyproject_data or {}).get("build-system", {}) - if not isinstance(build_system, dict): - return False - backend = build_system.get("build-backend") - if (backend if isinstance(backend, str) else None) not in _SETUPTOOLS_BACKENDS: - return False - requires = build_system.get("requires", []) - if not isinstance(requires, list): - return False - return any(isinstance(req, str) and _requirement_name(req) == "setuptools-rust" for req in requires) - - def _meson_build_dir_args(backend: str | None, config_settings: list[str], worktree: str) -> list[str]: """Pin meson-python's build dir inside the worktree. @@ -1408,8 +1422,10 @@ def main() -> None: elif backend == "scikit_build_core.build": toolchain = _generate_cmake_toolchain_file(tmp_root, build_env, opts.target_os, opts.target_cpu) cmd += ["-C", "cmake.toolchain-file=" + toolchain] - elif (backend == "maturin" or _uses_setuptools_rust(pyproject_data)) and build_env.get("CARGO"): + if _needs_cargo_cross_env(build_env): _configure_cargo_cross_env(build_env, tmp_root, opts.target_os, opts.target_cpu, opts.target_libc) + else: + _configure_cargo_native_env(build_env, tmp_root) else: print("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!", file=sys.stderr) raise SystemExit(1) diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index bab6d0d27..7c4928590 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -171,12 +171,19 @@ def _normalize_requirement(requirement): return name.lower().replace("_", "-").replace(".", "-") def _is_rust_build(inspection): - """maturin backend, or setuptools with setuptools-rust among its build requirements.""" + """maturin backend, or setuptools with setuptools-rust among its build requirements. + + Declared requirements come with their PEP 508 spelling; inferred ones + (the configure tool adds setuptools-rust for sdists that ship .rs files + without declaring it) come normalized. Both are injected into the build + venv, so both need the Rust toolchain. + """ if not inspection: return False if inspection.get("build_backend") == "maturin": return True - return "setuptools-rust" in [_normalize_requirement(r) for r in inspection.get("build_requires", [])] + requirements = list(inspection.get("build_requires", [])) + list(inspection.get("inferred_build_requires", [])) + return "setuptools-rust" in [_normalize_requirement(r) for r in requirements] _RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" @@ -191,7 +198,7 @@ def _rust_wiring(rust_toolchain, inspection, toolchains): their make-variables. Args: - rust_toolchain: `uv.project(rust_toolchain = ...)` as a label string, or "". + rust_toolchain: `uv.project(rust_toolchain = ...)` rendered as a label string, or "". inspection: The configure tool's JSON, or None. toolchains: Extra toolchain labels from `uv.override_package`. @@ -350,7 +357,11 @@ def _sdist_build_impl(repository_ctx): toolchains = list(repository_ctx.attr.extra_toolchains) extra_env = repository_ctx.attr.extra_env - rust = _rust_wiring(repository_ctx.attr.rust_toolchain, inspection, toolchains) + # str(Label) is the canonical form: the only spelling that resolves inside + # a repository the rules_py extension generates, whose repo mapping knows + # nothing about the user's rules_rust dependency. + rust_toolchain = repository_ctx.attr.rust_toolchain + rust = _rust_wiring(str(rust_toolchain) if rust_toolchain else "", inspection, toolchains) rust_layer_load = rust.load_stmt rust_layer_target = rust.target toolchains = rust.toolchains @@ -473,9 +484,8 @@ sdist_build = repository_rule( ), "pre_build_patches": attr.label_list(default = []), "pre_build_patch_strip": attr.int(default = 1), - "rust_toolchain": attr.string( - default = "", - doc = "Project-level Rust toolchain label; applied when the sdist's build backend is Rust-based.", + "rust_toolchain": attr.label( + doc = "Project-level Rust toolchain; wired into the build when the sdist's build backend is Rust-based.", ), "extra_toolchains": attr.string_list( default = [], diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 6155cd981..0ebeefa14 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -7,7 +7,13 @@ building its `:whl` exercises the fallback the extension must preserve. """ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load(":repository_test.bzl", "config_settings_attr_test", "env_attr_test") +load( + ":repository_test.bzl", + "config_settings_attr_test", + "env_attr_test", + "is_rust_build_test", + "rust_wiring_test", +) build_test( name = "sdist_fallback_with_anyarch_wheel_build_test", @@ -17,3 +23,7 @@ build_test( config_settings_attr_test(name = "config_settings_attr_test") env_attr_test(name = "env_attr_test") + +is_rust_build_test(name = "is_rust_build_test") + +rust_wiring_test(name = "rust_wiring_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index 1c76b454f..517d95886 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -44,3 +44,64 @@ def _env_attr_test_impl(ctx): return unittest.end(env) env_attr_test = unittest.make(_env_attr_test_impl) + +_TOOLCHAIN = "@rules_rust//rust/toolchain:current_rust_toolchain" + +def _is_rust_build_test_impl(ctx): + env = unittest.begin(ctx) + is_rust = sdist_build_test_util.is_rust_build + + asserts.false(env, is_rust(None), "no inspection: nothing to detect") + asserts.false(env, is_rust({}), "empty inspection: nothing to detect") + asserts.true(env, is_rust({"build_backend": "maturin"}), "maturin is a Rust backend") + asserts.true( + env, + is_rust({"build_backend": "setuptools.build_meta", "build_requires": ["setuptools", "Setuptools_Rust>=1.7"]}), + "setuptools-rust in build requirements, whatever its spelling or specifier", + ) + asserts.false( + env, + is_rust({"build_backend": "setuptools.build_meta", "build_requires": ["setuptools", "wheel"]}), + "plain setuptools is not Rust", + ) + asserts.true( + env, + is_rust({"build_backend": "setuptools.build_meta", "build_requires": ["setuptools"], "inferred_build_requires": ["setuptools-rust"]}), + "setuptools-rust inferred from .rs files counts too: it is injected into the build venv", + ) + asserts.false(env, is_rust({"build_backend": "mesonpy"}), "meson-python is not Rust") + asserts.equals(env, "setuptools-rust", sdist_build_test_util.normalize_requirement("Setuptools_Rust>=1.7")) + return unittest.end(env) + +is_rust_build_test = unittest.make(_is_rust_build_test_impl) + +def _rust_wiring_test_impl(ctx): + env = unittest.begin(ctx) + wiring = sdist_build_test_util.rust_wiring + rust_inspection = {"build_backend": "maturin"} + + off = wiring("", rust_inspection, ["//x:jdk"]) + asserts.equals(env, "", off.load_stmt, "no project rust_toolchain: nothing is wired") + asserts.equals(env, "", off.target) + asserts.equals(env, ["//x:jdk"], off.toolchains, "override toolchains pass through untouched") + + not_rust = wiring(_TOOLCHAIN, {"build_backend": "mesonpy"}, []) + asserts.equals(env, "", not_rust.load_stmt, "a non-Rust backend ignores the project rust_toolchain") + asserts.equals(env, [], not_rust.toolchains) + + on = wiring(_TOOLCHAIN, rust_inspection, ["//x:jdk", _TOOLCHAIN]) + asserts.true(env, "rust_layer.bzl" in on.load_stmt and "rust_host_sysroot" in on.load_stmt, "load() for the layer rule") + asserts.true( + env, + 'rust_host_sysroot(\n name = "rust_host_sysroot",\n actual = "{}",\n)'.format(_TOOLCHAIN) in on.target, + "an exec-configured sysroot layer over the project toolchain; got: " + on.target, + ) + asserts.equals( + env, + [_TOOLCHAIN, ":rust_host_sysroot", "//x:jdk"], + on.toolchains, + "toolchain and layer first, override extras after, the toolchain not repeated", + ) + return unittest.end(env) + +rust_wiring_test = unittest.make(_rust_wiring_test_impl) From 7536a41d3937a84e362e9b779b504a9cf73c039f Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 18:18:03 -0600 Subject: [PATCH 078/103] feat(uv): vendor the crates a Rust sdist's Cargo.lock pins, build offline Cargo fetched its dependencies inside the build action, with whatever network the sandbox allowed: not hermetic, not reproducible beyond the lock the sdist happened to ship, and dead under remote execution. The C-family backends never had this problem: their build deps come from the uv lock and their toolchains are action inputs. sdist_configure now reads the sdist's Cargo.lock (anywhere in the tree, shallowest first: setuptools-rust keeps its crate under src/) and reports the crates it pins. For a Rust build, sdist_build downloads each crates.io crate through Bazel's downloader with the lock's checksum into a cargo vendor directory, and the generated pep517_native_whl passes it to the helper, which writes the source replacement into the sandbox CARGO_HOME and sets CARGO_NET_OFFLINE. Locks pinning git or path sources are rejected outright. Sdists without a Cargo.lock (tiktoken) build online with a warning, or take one from uv.override_package(cargo_lock = ...): vendored the same way and placed next to the crate's Cargo.toml before the build. e2e/crossbuild now runs every sdist build with sandbox network blocked; all five Rust cases (maturin on rules_rust and rules_rs, setuptools-rust, with and without a shipped lock) pass offline. --- docs/uv.md | 10 +- e2e/crossbuild/.bazelrc | 6 + e2e/crossbuild/pycross-tiktoken/BUILD.bazel | 2 + e2e/crossbuild/pycross-tiktoken/Cargo.lock | 255 ++++++++++++++++++ .../pycross-tiktoken/setup.MODULE.bazel | 9 + uv/private/extension/defs.bzl | 13 +- uv/private/pep517_whl/pep517_native_whl.bzl | 31 ++- uv/private/pep517_whl/tests/BUILD.bazel | 24 ++ uv/private/pep517_whl/tests/Cargo.lock | 5 + .../pep517_whl/tests/build_helper_test.py | 60 +++++ .../pep517_whl/tests/pep517_whl_test.bzl | 26 ++ .../vendor/fake-0.1.0/.cargo-checksum.json | 1 + .../tests/vendor/fake-0.1.0/Cargo.toml | 3 + uv/private/pep517_whl/tools/build_helper.py | 42 +++ uv/private/sdist_build/attrs.bzl | 4 + uv/private/sdist_build/repository.bzl | 86 +++++- uv/private/sdist_build/tests/BUILD.bazel | 3 + .../sdist_build/tests/repository_test.bzl | 23 ++ uv/private/sdist_configure/detect_native.py | 56 ++++ .../sdist_configure/detect_native_test.py | 97 +++++++ 20 files changed, 751 insertions(+), 5 deletions(-) create mode 100644 e2e/crossbuild/pycross-tiktoken/Cargo.lock create mode 100644 uv/private/pep517_whl/tests/Cargo.lock create mode 100644 uv/private/pep517_whl/tests/vendor/fake-0.1.0/.cargo-checksum.json create mode 100644 uv/private/pep517_whl/tests/vendor/fake-0.1.0/Cargo.toml diff --git a/docs/uv.md b/docs/uv.md index ed55700fe..8b192abac 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -498,7 +498,15 @@ uv.project( Every sdist in that project whose build backend is maturin, or whose build requirements include setuptools-rust, then gets the toolchain and an exec-configured `rust_host_sysroot` layer wired into its build. No -`uv.override_package` entry is needed for Rust packages. Any target exposing +`uv.override_package` entry is needed for Rust packages. The crates the +sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while +the repository is generated and vendored into it; cargo then builds offline, +so the build needs no network and works under remote execution. A lock that +pins crates outside crates.io (git or path sources) is rejected. An sdist +without a `Cargo.lock` builds with network access and a warning; give it one +with `uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once +with `cargo generate-lockfile` on the extracted sdist, and it is vendored and +placed next to the sdist's `Cargo.toml` before the build. Any target exposing rules_rust's toolchain providers works, so the same label serves [rules_rs](https://github.com/hermeticbuild/rules_rs) toolchains, which are declared with rules_rust's `rust_toolchain` rule. diff --git a/e2e/crossbuild/.bazelrc b/e2e/crossbuild/.bazelrc index 6cb312c68..5787752e5 100644 --- a/e2e/crossbuild/.bazelrc +++ b/e2e/crossbuild/.bazelrc @@ -10,6 +10,12 @@ common --incompatible_strict_action_env # configuration-stripped cache keys; those that don't still work normally. build --experimental_output_paths=strip +# Every sdist build must be hermetic: build deps come from the uv lock, the +# C/C++ and Rust toolchains are action inputs, and cargo runs offline against +# the crates sdist_build vendored from the sdist's Cargo.lock. A backend that +# reaches for the network fails here instead of passing by accident. +build --sandbox_default_allow_network=false + # Build without the bytes common:ci --remote_download_outputs=minimal common:ci --nobuild_runfile_links diff --git a/e2e/crossbuild/pycross-tiktoken/BUILD.bazel b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel index fbc4eb05b..8b4c80f57 100644 --- a/e2e/crossbuild/pycross-tiktoken/BUILD.bazel +++ b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel @@ -7,6 +7,8 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") load("//tools:wheel_export.bzl", "pycross_wheel_export") +exports_files(["Cargo.lock"]) + _PY = "3.12" _DEP_GROUP = "pycross_tiktoken" diff --git a/e2e/crossbuild/pycross-tiktoken/Cargo.lock b/e2e/crossbuild/pycross-tiktoken/Cargo.lock new file mode 100644 index 000000000..774d53efa --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/Cargo.lock @@ -0,0 +1,255 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bstr" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "regex-automata", + "serde_core", +] + +[[package]] +name = "fancy-regex" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12" +dependencies = [ + "libc", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", +] + +[[package]] +name = "pyo3-build-config" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e" +dependencies = [ + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" + +[[package]] +name = "tiktoken" +version = "0.13.0" +dependencies = [ + "bstr", + "fancy-regex", + "pyo3", + "regex", + "rustc-hash", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" diff --git a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel index d872d9d7e..b359dfd38 100644 --- a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel @@ -19,6 +19,15 @@ uv.project( pyproject = "//pycross-tiktoken:pyproject.toml", rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) + +# tiktoken's sdist ships no Cargo.lock, so nothing pins its crates; this one +# (`cargo generate-lockfile` on the extracted sdist) lets sdist_build vendor +# them and the build run offline like every other case here. +uv.override_package( + name = "tiktoken", + cargo_lock = "//pycross-tiktoken:Cargo.lock", + lock = "//pycross-tiktoken:uv.lock", +) use_repo( uv, "pypi_pycross_tiktoken", diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index 28bb8a09b..94ddaa261 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -275,13 +275,14 @@ def _parse_projects(module_ctx, hub_specs): override.toolchains or override.env or override.config_settings or + override.cargo_lock or override.monitor_memory or override.resource_set != "default" ) if has_target and has_modifications: fail("uv.override_package() for '{}': `target` is mutually exclusive with modification attributes. Use `target` for full replacement OR build, patch, and data attributes for modifications, not both.".format(override.name)) if not has_target and not has_modifications: - fail("uv.override_package() for '{}': must specify either `target` for full replacement or at least one modification attribute (console_scripts, pre_build_patches, post_install_patches, exclude_glob, extra_deps, extra_data, toolchains, env, monitor_memory, resource_set).".format(override.name)) + fail("uv.override_package() for '{}': must specify either `target` for full replacement or at least one modification attribute (console_scripts, pre_build_patches, post_install_patches, exclude_glob, extra_deps, extra_data, toolchains, env, config_settings, cargo_lock, monitor_memory, resource_set).".format(override.name)) unscoped_matches = {i: 0 for i, override in enumerate(mod.tags.override_package) if override.lock == None} @@ -534,6 +535,7 @@ def _parse_projects(module_ctx, hub_specs): monitor_memory = pkg_override.monitor_memory, pre_build_patches = pkg_override.pre_build_patches, pre_build_patch_strip = pkg_override.pre_build_patch_strip, + cargo_lock = pkg_override.cargo_lock, supported = [], toolchains = pkg_override.toolchains, ) @@ -584,12 +586,14 @@ def _parse_projects(module_ctx, hub_specs): extra_toolchains = [] extra_env = {} config_settings = {} + cargo_lock = None monitor_memory = False resource_set = "default" if pkg_override: extra_toolchains = [str(t) for t in pkg_override.toolchains] extra_env = pkg_override.env config_settings = pkg_override.config_settings + cargo_lock = pkg_override.cargo_lock monitor_memory = pkg_override.monitor_memory resource_set = pkg_override.resource_set @@ -605,6 +609,7 @@ def _parse_projects(module_ctx, hub_specs): extra_toolchains = extra_toolchains, extra_env = extra_env, config_settings = config_settings, + cargo_lock = cargo_lock, monitor_memory = monitor_memory, resource_set = resource_set, rust_toolchain = project.rust_toolchain, @@ -886,6 +891,8 @@ def _uv_impl(module_ctx): sbuild_kwargs["extra_env"] = sbuild_cfg.extra_env if sbuild_cfg.config_settings: sbuild_kwargs["config_settings"] = sbuild_cfg.config_settings + if sbuild_cfg.cargo_lock: + sbuild_kwargs["cargo_lock"] = sbuild_cfg.cargo_lock if sbuild_cfg.rust_toolchain: sbuild_kwargs["rust_toolchain"] = sbuild_cfg.rust_toolchain if sbuild_cfg.monitor_memory: @@ -1033,6 +1040,10 @@ _override_package_tag = tag_class( default = {}, doc = "Extra environment variables merged into the build action's `env` dict. Values may reference $(VAR) make-variables sourced from extra `toolchains` listed above. Prefix an execroot-relative path with `$(EXECROOT)/` so it remains valid after the backend changes into the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the configured C++ action tools.", ), + "cargo_lock": attr.label( + allow_single_file = True, + doc = "Cargo.lock for a Rust sdist that ships none. Its crates.io entries are vendored while the repository is generated and the file is placed next to the sdist's Cargo.toml before the build, so cargo builds offline. Requires the project's `rust_toolchain`.", + ), "config_settings": attr.string_list_dict( default = {}, doc = "PEP 517 `config_settings` for this package's build backend. Each key maps to a list of values: a single value reaches the backend as a string, several as a list. Keys and their meaning are defined by the backend, e.g. `{\"setup-args\": [\"-Dblas=none\"]}` for meson-python or `{\"cmake.define.FOO\": [\"1\"]}` for scikit-build-core. Applies to pure and native source builds.", diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index 89d092117..46a5f35dd 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -251,6 +251,15 @@ cross_identity_test_util = struct( target_python_artifacts = _target_python_artifacts, ) +def _vendor_dir(files): + """The `vendor/` root shared by the vendored crate files, from any one of them.""" + for f in files.to_list(): + marker = "/vendor/" + idx = f.path.find(marker) + if idx != -1: + return f.path[:idx + len(marker) - 1] + return None + def _pep517_native_whl(ctx): archive = ctx.file.src @@ -310,6 +319,16 @@ def _pep517_native_whl(ctx): env[_INFER_CXX_COMPANION] = "1" cross_args = [] + cargo_args = [] + if ctx.attr.vendored_crates: + vendored = ctx.attr.vendored_crates[DefaultInfo].files + extra_inputs.append(vendored) + vendor_dir = _vendor_dir(vendored) + if vendor_dir: + cargo_args = ["--cargo-vendor-dir", vendor_dir] + if ctx.file.cargo_lock: + extra_inputs.append(depset([ctx.file.cargo_lock])) + cargo_args = cargo_args + ["--cargo-lock", ctx.file.cargo_lock.path] if cross: cc_toolchain = cc_toolchain_raw if hasattr(cc_toolchain, "cc_provider_in_toolchain") and hasattr(cc_toolchain, "cc"): @@ -373,7 +392,7 @@ def _pep517_native_whl(ctx): progress_message = "Native source compiling {} to a whl".format(archive.basename), executable = tool, toolchain = None, - arguments = ctx.attr.args + [patch_args] + memory_args(ctx) + config_setting_args(ctx) + cross_args + [ + arguments = ctx.attr.args + [patch_args] + memory_args(ctx) + config_setting_args(ctx) + cross_args + cargo_args + [ "--execroot-marker", _EXECROOT_MARKER, archive.path, @@ -423,6 +442,16 @@ constraints of the target platform. "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + "configured C++ action tools.", ), + "cargo_lock": attr.label( + allow_single_file = True, + doc = "Cargo.lock placed next to the sdist's Cargo.toml before the build, replacing the sdist's own if any.", + ), + "vendored_crates": attr.label( + allow_files = True, + doc = "A cargo vendor directory (one subdirectory per crate, each with its " + + "`.cargo-checksum.json`), as sdist_build materializes it from the sdist's " + + "Cargo.lock. The build runs cargo offline against it.", + ), "_platform_libc": attr.label( default = "//uv/private/constraints/platform:platform_libc", doc = "Read in cross mode to pick the rust target triple (gnu vs musl).", diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index 2f08052b2..9893c0261 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -34,6 +34,7 @@ load( "pep517_native_whl_derived_env_test", "pep517_native_whl_execroot_collision_test", "pep517_native_whl_toolchain_env_test", + "pep517_native_whl_vendored_crates_test", "pep517_whl_console_scripts_test", "python_host_platform_test", "rust_host_sysroot_test", @@ -424,6 +425,29 @@ pep517_native_whl_derived_env_test( target_under_test = ":__derived_rust_env_fixture", ) +# sdist_build's vendor directory shape: one subdirectory per crate with its +# .cargo-checksum.json. The rule must hand the helper the vendor root and +# ship every file as an action input. +filegroup( + name = "__vendored_crates", + srcs = glob(["vendor/**"]), +) + +pep517_native_whl( + name = "__vendored_crates_fixture", + src = ":__stub_sdist", + cargo_lock = "Cargo.lock", + tags = ["manual"], + tool = ":__stub_tool", + vendored_crates = ":__vendored_crates", + version = "0.0.1", +) + +pep517_native_whl_vendored_crates_test( + name = "vendored_crates_test", + target_under_test = ":__vendored_crates_fixture", +) + execroot_collision_toolchain(name = "__execroot_collision_toolchain") pep517_native_whl( diff --git a/uv/private/pep517_whl/tests/Cargo.lock b/uv/private/pep517_whl/tests/Cargo.lock new file mode 100644 index 000000000..6c2d4a188 --- /dev/null +++ b/uv/private/pep517_whl/tests/Cargo.lock @@ -0,0 +1,5 @@ +version = 4 + +[[package]] +name = "fixture" +version = "0.0.1" diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index c811583f4..8155ffea7 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -925,6 +925,66 @@ def test_target_sysroot_from_toolchain_wins_over_rustc_location(self) -> None: self.assertTrue(path.islink(path.join(merged, "x86_64-unknown-linux-gnu"))) +class InjectCargoLockTest(unittest.TestCase): + def _tree(self, manifest_rel: str) -> tuple[str, str]: + tmp = tempfile.mkdtemp() + manifest = path.join(tmp, "worktree", manifest_rel) + makedirs(path.dirname(manifest), exist_ok=True) + open(manifest, "w").close() + lock = path.join(tmp, "user.Cargo.lock") + with open(lock, "w") as f: + f.write("version = 4\n") + return path.join(tmp, "worktree"), lock + + def test_lock_lands_next_to_the_root_manifest(self) -> None: + worktree, lock = self._tree("Cargo.toml") + dest = build_helper._inject_cargo_lock(worktree, lock) + self.assertEqual(path.join(worktree, "Cargo.lock"), dest) + with open(dest) as f: + self.assertEqual("version = 4\n", f.read()) + + def test_nested_manifest_is_found_at_any_depth(self) -> None: + # bcrypt keeps its crate under src/_bcrypt/. + worktree, lock = self._tree(path.join("src", "_bcrypt", "Cargo.toml")) + self.assertEqual(path.join(worktree, "src", "_bcrypt", "Cargo.lock"), build_helper._inject_cargo_lock(worktree, lock)) + + def test_shallowest_manifest_wins(self) -> None: + worktree, lock = self._tree("Cargo.toml") + deeper = path.join(worktree, "vendor", "dep", "Cargo.toml") + makedirs(path.dirname(deeper)) + open(deeper, "w").close() + self.assertEqual(path.join(worktree, "Cargo.lock"), build_helper._inject_cargo_lock(worktree, lock)) + + def test_no_manifest_no_copy(self) -> None: + worktree = tempfile.mkdtemp() + self.assertIsNone(build_helper._inject_cargo_lock(worktree, "/nonexistent/Cargo.lock")) + self.assertIsNone(build_helper._inject_cargo_lock(worktree, "")) + + +class CargoOfflineTest(unittest.TestCase): + def test_vendor_dir_replaces_crates_io_and_forbids_network(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "CARGO_HOME": path.join(tmp, ".cargo_home")} + build_helper._configure_cargo_offline(env, "/exec/external/repo/vendor") + with open(path.join(tmp, ".cargo_home", "config.toml")) as f: + config = f.read() + self.assertIn('[source.crates-io]\nreplace-with = "vendored-sources"', config) + self.assertIn('[source.vendored-sources]\ndirectory = "/exec/external/repo/vendor"', config) + self.assertEqual("true", env["CARGO_NET_OFFLINE"]) + + def test_no_cargo_home_means_no_cargo(self) -> None: + env = {"RUSTC": "/usr/bin/rustc"} + build_helper._configure_cargo_offline(env, "/vendor") + self.assertNotIn("CARGO_NET_OFFLINE", env) + + def test_no_vendor_dir_leaves_cargo_online(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "CARGO_HOME": tmp} + build_helper._configure_cargo_offline(env, "") + self.assertNotIn("CARGO_NET_OFFLINE", env) + self.assertFalse(path.exists(path.join(tmp, "config.toml"))) + + class CargoNativeEnvTest(unittest.TestCase): def test_rustc_gets_the_toolchain_sysroot(self) -> None: tmp = tempfile.mkdtemp() diff --git a/uv/private/pep517_whl/tests/pep517_whl_test.bzl b/uv/private/pep517_whl/tests/pep517_whl_test.bzl index 794ad056f..36007ffaf 100644 --- a/uv/private/pep517_whl/tests/pep517_whl_test.bzl +++ b/uv/private/pep517_whl/tests/pep517_whl_test.bzl @@ -400,3 +400,29 @@ def _rust_host_sysroot_test_impl(ctx): return analysistest.end(env) rust_host_sysroot_test = analysistest.make(_rust_host_sysroot_test_impl) + +def _vendored_crates_test_impl(ctx): + env = analysistest.begin(ctx) + target = analysistest.target_under_test(env) + actions = [a for a in target.actions if a.mnemonic == "PySdistNativeBuild"] + asserts.equals(env, 1, len(actions), "expected exactly one PySdistNativeBuild action") + if actions: + argv = list(actions[0].argv) + asserts.true(env, "--cargo-vendor-dir" in argv, "the vendor dir must reach the helper; got: {}".format(argv)) + if "--cargo-vendor-dir" in argv: + vendor_dir = argv[argv.index("--cargo-vendor-dir") + 1] + asserts.true(env, vendor_dir.endswith("/tests/vendor"), "the vendor root, not a crate file; got: " + vendor_dir) + inputs = [f.path for f in actions[0].inputs.to_list()] + asserts.true( + env, + any([p.endswith("/vendor/fake-0.1.0/.cargo-checksum.json") for p in inputs]), + "vendored crate files must be action inputs", + ) + asserts.true(env, "--cargo-lock" in argv, "the supplied Cargo.lock must reach the helper; got: {}".format(argv)) + if "--cargo-lock" in argv: + lock = argv[argv.index("--cargo-lock") + 1] + asserts.true(env, lock.endswith("/tests/Cargo.lock"), "got: " + lock) + asserts.true(env, lock in inputs, "the Cargo.lock must be an action input") + return analysistest.end(env) + +pep517_native_whl_vendored_crates_test = analysistest.make(_vendored_crates_test_impl) diff --git a/uv/private/pep517_whl/tests/vendor/fake-0.1.0/.cargo-checksum.json b/uv/private/pep517_whl/tests/vendor/fake-0.1.0/.cargo-checksum.json new file mode 100644 index 000000000..7d32cc001 --- /dev/null +++ b/uv/private/pep517_whl/tests/vendor/fake-0.1.0/.cargo-checksum.json @@ -0,0 +1 @@ +{"package": "0000", "files": {}} diff --git a/uv/private/pep517_whl/tests/vendor/fake-0.1.0/Cargo.toml b/uv/private/pep517_whl/tests/vendor/fake-0.1.0/Cargo.toml new file mode 100644 index 000000000..ef0c7d700 --- /dev/null +++ b/uv/private/pep517_whl/tests/vendor/fake-0.1.0/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "fake" +version = "0.1.0" diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index bd6922ec1..3f04007a9 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -11,6 +11,7 @@ from argparse import ArgumentParser import glob import importlib +import json import os import platform as _platform import re @@ -1129,6 +1130,42 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os build_env["MATURIN_PEP517_ARGS"] = (interpreter_arg + " " + existing).strip() +def _inject_cargo_lock(worktree: str, lock_path: str) -> str | None: + """Copy a user-supplied Cargo.lock next to the source tree's top-level Cargo.toml. + + Returns the destination, or None when the tree has no Cargo.toml (the lock + is then meaningless and cargo would ignore it anyway). + """ + if not lock_path: + return None + # Shallowest manifest wins: setuptools-rust crates live in subdirectories + # (bcrypt: src/_bcrypt/Cargo.toml), maturin ones at the top. + manifests = sorted(glob.glob(path.join(worktree, "**", "Cargo.toml"), recursive=True), key=lambda m: (m.count(os.sep), m)) + if not manifests: + return None + dest = path.join(path.dirname(manifests[0]), "Cargo.lock") + shutil.copyfile(lock_path, dest) + return dest + + +def _configure_cargo_offline(build_env: dict[str, str], vendor_dir: str) -> None: + """Point cargo at the vendored crates and forbid the network. + + CARGO_HOME is the sandbox-local one _compiler_env created for the wired + toolchain; without a toolchain there is no cargo to configure. + """ + cargo_home = build_env.get("CARGO_HOME") + if not (vendor_dir and cargo_home): + return + makedirs(cargo_home, exist_ok=True) + with open(path.join(cargo_home, "config.toml"), "a") as f: + f.write( + '[source.crates-io]\nreplace-with = "vendored-sources"\n\n' + '[source.vendored-sources]\ndirectory = {}\n'.format(json.dumps(_absolutize_path(vendor_dir))) + ) + build_env["CARGO_NET_OFFLINE"] = "true" + + def _configure_cargo_native_env(build_env: dict[str, str], tmpdir: str) -> None: """Point rustc at the toolchain's sysroot for a native build. @@ -1290,6 +1327,8 @@ def _wheel_platform_error( PARSER.add_argument("srcarchive") PARSER.add_argument("output", help="Path the single built wheel is written to") PARSER.add_argument("--monitor-memory", action="store_true") +PARSER.add_argument("--cargo-vendor-dir", default="", help="Cargo vendor directory; cargo runs offline against it") +PARSER.add_argument("--cargo-lock", default="", help="Cargo.lock to place next to the source tree's Cargo.toml") PARSER.add_argument( "--config-setting", action="append", @@ -1360,6 +1399,9 @@ def main() -> None: target_cpu=opts.target_cpu, ) + _configure_cargo_offline(build_env, opts.cargo_vendor_dir) + _inject_cargo_lock(t, opts.cargo_lock) + if _legacy_metadata_conflicts_with_pyproject(t): print( "Warning: falling back to setup.py because pyproject.toml omits dynamic dependency metadata " diff --git a/uv/private/sdist_build/attrs.bzl b/uv/private/sdist_build/attrs.bzl index e3de20d9c..04889a83a 100644 --- a/uv/private/sdist_build/attrs.bzl +++ b/uv/private/sdist_build/attrs.bzl @@ -8,6 +8,7 @@ def validate_build_attrs( monitor_memory, pre_build_patches, pre_build_patch_strip, + cargo_lock, supported, toolchains, error): @@ -21,6 +22,7 @@ def validate_build_attrs( monitor_memory: Whether to monitor the wheel-build action's memory. pre_build_patches: Patches applied before building the wheel. pre_build_patch_strip: Strip count for pre-build patches. + cargo_lock: A user-supplied Cargo.lock, or None. supported: Names of attributes consumed by the selected build path. toolchains: Toolchains used by the wheel-build action. error: Failure message with one `{}` slot for unsupported names. @@ -40,6 +42,8 @@ def validate_build_attrs( active.append("pre_build_patches") if pre_build_patch_strip != 1: active.append("pre_build_patch_strip") + if cargo_lock: + active.append("cargo_lock") if toolchains: active.append("toolchains") unsupported = [name for name in active if name not in supported] diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 7c4928590..b4340aab3 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -24,6 +24,9 @@ def _write_context_file(repository_ctx, available_deps): "deps": [str(d) for d in repository_ctx.attr.deps], "available_deps": available_deps, } + if repository_ctx.attr.cargo_lock: + # A user-supplied lock replaces whatever the sdist ships (usually nothing). + context["cargo_lock"] = str(repository_ctx.path(repository_ctx.attr.cargo_lock)) context_path = repository_ctx.path("_configure_context.json") repository_ctx.file("_configure_context.json", content = json.encode(context)) @@ -187,6 +190,62 @@ def _is_rust_build(inspection): _RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" +_CRATES_IO_SOURCE = "registry+https://github.com/rust-lang/crates.io-index" + +def _crate_url(name, version): + return "https://static.crates.io/crates/{name}/{name}-{version}.crate".format(name = name, version = version) + +def _unsupported_crate_sources(crates): + """Crates that cannot be vendored hermetically: anything not on crates.io.""" + return ["{}@{} ({})".format(c["name"], c["version"], c["source"]) for c in crates if c.get("source") != _CRATES_IO_SOURCE or not c.get("checksum")] + +def _vendor_crates(repository_ctx, crates): + """Materialize a Cargo.lock's crates.io dependencies as a cargo vendor directory. + + Cargo otherwise downloads them inside the build action, which needs + network in the sandbox and cannot work under remote execution. Bazel's + downloader fetches each crate with the checksum the lock records, so the + build is as pinned as the lock is; the per-crate `.cargo-checksum.json` + is what cargo's `vendored-sources` replacement requires. + """ + unsupported = _unsupported_crate_sources(crates) + if unsupported: + fail("sdist_build for '{}': cannot vendor crates that are not on crates.io with a checksum: {}. Provide a Cargo.lock that pins them to crates.io.".format( + repository_ctx.name, + ", ".join(unsupported), + )) + repository_ctx.report_progress("Vendoring {} crates for {}".format(len(crates), repository_ctx.name)) + downloads = [] + for crate in crates: + # .crate files are gzipped tarballs; extract() picks the format from the name. + archive = "_crates/{}-{}.tar.gz".format(crate["name"], crate["version"]) + token = repository_ctx.download( + url = _crate_url(crate["name"], crate["version"]), + output = archive, + sha256 = crate["checksum"], + block = False, + ) + downloads.append((token, crate, archive)) + for token, crate, archive in downloads: + token.wait() + crate_dir = "vendor/{}-{}".format(crate["name"], crate["version"]) + repository_ctx.extract(archive, output = crate_dir, stripPrefix = "{}-{}".format(crate["name"], crate["version"])) + repository_ctx.file(crate_dir + "/.cargo-checksum.json", json.encode({"package": crate["checksum"], "files": {}})) + repository_ctx.delete("_crates") + +_VENDORED_CRATES_TARGET = """ +filegroup( + name = "vendored_crates", + srcs = glob(["vendor/**"]), +) +""" + +def _cargo_lock_attr(label): + """Renders the generated rule call's `cargo_lock` attribute.""" + return "\n cargo_lock = {},".format(repr(label)) + +_VENDORED_CRATES_ATTR = "\n vendored_crates = \":vendored_crates\"," + def _rust_wiring(rust_toolchain, inspection, toolchains): """The generated BUILD's Rust wiring for a project-level `rust_toolchain`. @@ -288,6 +347,7 @@ def _sdist_build_impl(repository_ctx): monitor_memory = repository_ctx.attr.monitor_memory, pre_build_patches = repository_ctx.attr.pre_build_patches, pre_build_patch_strip = repository_ctx.attr.pre_build_patch_strip, + cargo_lock = repository_ctx.attr.cargo_lock, supported = [ "config_settings", "monitor_memory", @@ -353,6 +413,8 @@ def _sdist_build_impl(repository_ctx): toolchain_attrs = "" rust_layer_load = "" rust_layer_target = "" + vendored_crates_target = "" + vendored_crates_attr = "" if is_native: toolchains = list(repository_ctx.attr.extra_toolchains) extra_env = repository_ctx.attr.extra_env @@ -365,6 +427,17 @@ def _sdist_build_impl(repository_ctx): rust_layer_load = rust.load_stmt rust_layer_target = rust.target toolchains = rust.toolchains + if rust.load_stmt: + crates = inspection.get("cargo_crates") if inspection else None + if crates: + _vendor_crates(repository_ctx, crates) + vendored_crates_target = _VENDORED_CRATES_TARGET + vendored_crates_attr = _VENDORED_CRATES_ATTR + if repository_ctx.attr.cargo_lock: + vendored_crates_attr += _cargo_lock_attr(str(repository_ctx.attr.cargo_lock)) + elif crates == None: + # buildifier: disable=print + print("WARNING: {} builds Rust but its sdist ships no Cargo.lock; cargo will fetch crates during the build. Declare the lock to make the build hermetic.".format(repository_ctx.name)) if toolchains: toolchain_attrs = """ toolchains = [ @@ -415,12 +488,12 @@ py_binary( srcs = ["@aspect_rules_py//uv/private/pep517_whl/tools:build_helper.py"], deps = {deps}, ) -{frontend_target}{rust_layer_target} +{frontend_target}{rust_layer_target}{vendored_crates_target} {rule}( name = "whl", src = "{src}", tool = "{tool}", - version = "{version}",{console_scripts_attr}{config_settings_attr}{monitor_memory_attr}{resource_set_attr}{patch_attrs}{toolchain_attrs} + version = "{version}",{console_scripts_attr}{config_settings_attr}{monitor_memory_attr}{resource_set_attr}{patch_attrs}{toolchain_attrs}{vendored_crates_attr} visibility = ["//visibility:public"], ) @@ -438,6 +511,8 @@ exports_files( frontend_load = frontend_load, rust_layer_load = rust_layer_load, rust_layer_target = rust_layer_target, + vendored_crates_target = vendored_crates_target, + vendored_crates_attr = vendored_crates_attr, frontend_target = frontend_target, tool = tool, version = repository_ctx.attr.version, @@ -484,6 +559,10 @@ sdist_build = repository_rule( ), "pre_build_patches": attr.label_list(default = []), "pre_build_patch_strip": attr.int(default = 1), + "cargo_lock": attr.label( + allow_single_file = True, + doc = "Cargo.lock to vendor from and inject into the build in place of the sdist's. Set via `uv.override_package(cargo_lock = ...)`.", + ), "rust_toolchain": attr.label( doc = "Project-level Rust toolchain; wired into the build when the sdist's build backend is Rust-based.", ), @@ -503,6 +582,9 @@ sdist_build = repository_rule( ) sdist_build_test_util = struct( + cargo_lock_attr = _cargo_lock_attr, + crate_url = _crate_url, + unsupported_crate_sources = _unsupported_crate_sources, config_settings_attr = _config_settings_attr, env_attr = _env_attr, is_rust_build = _is_rust_build, diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 0ebeefa14..005836c28 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -10,6 +10,7 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") load( ":repository_test.bzl", "config_settings_attr_test", + "crate_vendoring_test", "env_attr_test", "is_rust_build_test", "rust_wiring_test", @@ -27,3 +28,5 @@ env_attr_test(name = "env_attr_test") is_rust_build_test(name = "is_rust_build_test") rust_wiring_test(name = "rust_wiring_test") + +crate_vendoring_test(name = "crate_vendoring_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index 517d95886..7dc120191 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -105,3 +105,26 @@ def _rust_wiring_test_impl(ctx): return unittest.end(env) rust_wiring_test = unittest.make(_rust_wiring_test_impl) + +def _crate_vendoring_test_impl(ctx): + env = unittest.begin(ctx) + asserts.equals( + env, + "https://static.crates.io/crates/ahash/ahash-0.8.11.crate", + sdist_build_test_util.crate_url("ahash", "0.8.11"), + ) + crates_io = "registry+https://github.com/rust-lang/crates.io-index" + ok = {"name": "ahash", "version": "0.8.11", "source": crates_io, "checksum": "e89d"} + git = {"name": "pyo3-fork", "version": "0.22.0", "source": "git+https://github.com/x/pyo3#abc", "checksum": ""} + unchecked = {"name": "odd", "version": "1.0.0", "source": crates_io, "checksum": ""} + asserts.equals(env, [], sdist_build_test_util.unsupported_crate_sources([ok]), "crates.io with a checksum vendors fine") + asserts.equals(env, '\n cargo_lock = "@@//pkg:Cargo.lock",', sdist_build_test_util.cargo_lock_attr("@@//pkg:Cargo.lock")) + asserts.equals( + env, + ["pyo3-fork@0.22.0 (git+https://github.com/x/pyo3#abc)", "odd@1.0.0 (" + crates_io + ")"], + sdist_build_test_util.unsupported_crate_sources([ok, git, unchecked]), + "git sources and checksum-less entries cannot be vendored hermetically", + ) + return unittest.end(env) + +crate_vendoring_test = unittest.make(_crate_vendoring_test_impl) diff --git a/uv/private/sdist_configure/detect_native.py b/uv/private/sdist_configure/detect_native.py index 833863756..549d639b2 100644 --- a/uv/private/sdist_configure/detect_native.py +++ b/uv/private/sdist_configure/detect_native.py @@ -67,6 +67,7 @@ class ConfigureContext(TypedDict, total=False): src: str + cargo_lock: str version: str deps: list[str] available_deps: dict[str, str] @@ -74,6 +75,7 @@ class ConfigureContext(TypedDict, total=False): class _OptionalDetectionResult(TypedDict, total=False): backend_path: list[str] + cargo_crates: list[dict[str, str]] class DetectionResult(_OptionalDetectionResult): @@ -402,6 +404,46 @@ def _extract_names(key: str) -> list[str]: # --- Detection --- +def _parse_cargo_lock(content: str) -> list[dict[str, str]]: + """The dependency crates a Cargo.lock pins: name, version, source, checksum. + + Packages without a `source` are the workspace's own crates (the root + package, path dependencies) and are already in the sdist; everything else + is what cargo would otherwise fetch at build time. + """ + if tomllib is None: + return [] + try: + data = tomllib.loads(content) + except tomllib.TOMLDecodeError: + return [] + crates = [] + for pkg in data.get("package", []): + source = pkg.get("source") + if not source: + continue + crates.append({ + "name": str(pkg.get("name", "")), + "version": str(pkg.get("version", "")), + "source": str(source), + "checksum": str(pkg.get("checksum", "")), + }) + return crates + + +def _find_cargo_lock(members: Sequence[str]) -> str | None: + """The sdist's Cargo.lock, wherever its crate lives. + + setuptools-rust projects keep the crate in a subdirectory (bcrypt: + src/_bcrypt/Cargo.lock); maturin ones at the top. With several locks the + shallowest is the workspace's. + """ + locks = [m for m in members if PurePosixPath(m).name == "Cargo.lock"] + if not locks: + return None + return min(locks, key=lambda m: (len(PurePosixPath(m).parts), m)) + + def _find_config_file(members: Sequence[str], filename: str) -> str | None: """Find a config file, accounting for the typical top-level sdist directory.""" if filename in members: @@ -494,6 +536,18 @@ def detect(archive_path: str, context: ConfigureContext) -> DetectionResult: if content: declared.extend(_parse_setup_cfg_build_requires(content)) + cargo_crates = None + context_lock = context.get("cargo_lock") + if context_lock: + with open(context_lock, encoding="utf-8") as f: + cargo_crates = _parse_cargo_lock(f.read()) + else: + cargo_lock_path = _find_cargo_lock(members) + if cargo_lock_path: + content = read_fn(cargo_lock_path) + if content: + cargo_crates = _parse_cargo_lock(content) + # Match the root distribution name rather than path depth: setuptools # src-layout projects place their own egg-info below src/ or another # package directory, while differently named metadata may be vendored. @@ -595,6 +649,8 @@ def detect(archive_path: str, context: ConfigureContext) -> DetectionResult: } if backend_path is not None: result["backend_path"] = backend_path + if cargo_crates is not None: + result["cargo_crates"] = cargo_crates return result diff --git a/uv/private/sdist_configure/detect_native_test.py b/uv/private/sdist_configure/detect_native_test.py index 1238ff5ba..ad555c95d 100644 --- a/uv/private/sdist_configure/detect_native_test.py +++ b/uv/private/sdist_configure/detect_native_test.py @@ -892,3 +892,100 @@ def test_setup_cfg_and_setup_py_merged() -> None: if failures: print(f"Failures: {', '.join(failures)}") sys.exit(1) + + +# --- Cargo.lock --- + +_CARGO_LOCK = """\ +version = 4 + +[[package]] +name = "pkg" +version = "1.0.0" +dependencies = ["ahash", "local-helper"] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" + +[[package]] +name = "local-helper" +version = "0.1.0" + +[[package]] +name = "pyo3-fork" +version = "0.22.0" +source = "git+https://github.com/example/pyo3?rev=abc123#abc123" +""" + + +def test_cargo_lock_crates() -> None: + archive = _make_tar_gz({ + "pkg-1.0/": None, + "pkg-1.0/Cargo.lock": _CARGO_LOCK, + "pkg-1.0/src/lib.rs": "", + }) + result = detect(archive, {}) + # Workspace crates (no source) are in the sdist already; everything else is a fetch. + assert result["cargo_crates"] == [ + { + "name": "ahash", + "version": "0.8.11", + "source": "registry+https://github.com/rust-lang/crates.io-index", + "checksum": "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011", + }, + { + "name": "pyo3-fork", + "version": "0.22.0", + "source": "git+https://github.com/example/pyo3?rev=abc123#abc123", + "checksum": "", + }, + ] + + +def test_no_cargo_lock_reports_nothing() -> None: + archive = _make_tar_gz({"pkg-1.0/": None, "pkg-1.0/src/lib.rs": ""}) + result = detect(archive, {}) + assert "cargo_crates" not in result + + +def test_context_cargo_lock_replaces_the_sdists() -> None: + archive = _make_tar_gz({ + "pkg-1.0/": None, + "pkg-1.0/Cargo.lock": _CARGO_LOCK, + "pkg-1.0/src/lib.rs": "", + }) + provided = os.path.join(tempfile.mkdtemp(), "Cargo.lock") + with open(provided, "w") as f: + f.write( + '[[package]]\nname = "pkg"\nversion = "1.0.0"\n\n' + '[[package]]\nname = "bstr"\nversion = "1.10.0"\n' + 'source = "registry+https://github.com/rust-lang/crates.io-index"\n' + 'checksum = "abcd"\n' + ) + result = detect(archive, {"cargo_lock": provided}) + assert [c["name"] for c in result["cargo_crates"]] == ["bstr"] + + +def test_nested_cargo_lock_is_found() -> None: + # setuptools-rust layout: the crate lives in a subdirectory. + archive = _make_tar_gz({ + "pkg-1.0/": None, + "pkg-1.0/src/_pkg/Cargo.lock": _CARGO_LOCK, + "pkg-1.0/src/_pkg/src/lib.rs": "", + }) + result = detect(archive, {}) + assert [c["name"] for c in result["cargo_crates"]] == ["ahash", "pyo3-fork"] + + +def test_shallowest_cargo_lock_wins() -> None: + archive = _make_tar_gz({ + "pkg-1.0/": None, + "pkg-1.0/Cargo.lock": _CARGO_LOCK, + "pkg-1.0/vendor/dep/Cargo.lock": '[[package]]\nname = "other"\nversion = "1.0.0"\nsource = "registry+x"\nchecksum = "1"\n', + "pkg-1.0/src/lib.rs": "", + }) + result = detect(archive, {}) + assert [c["name"] for c in result["cargo_crates"]] == ["ahash", "pyo3-fork"] From 1258defbb90ba6098c1c3d02bb5a2e4339086212 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 9 Sep 2026 06:36:49 -0600 Subject: [PATCH 079/103] feat(uv): ship rules_py's own Rust toolchain for pep517 sdists Rust sdists (maturin, setuptools-rust) no longer need a `rust_toolchain` attribute nor a rules_rust/rules_rs dependency: the `rust_tools` module extension downloads rustc + cargo + rust-std for the host and rust-std for every cross target from static.rust-lang.org, pinned by sha256, and registers one `rust_pep517_toolchain` per host x target pair. - uv/private/rust: versions (pins), repository rules, toolchain rule, extension; toolchain_type wired into a new `pep517_rust_whl` rule (factory over pep517_native_whl) that exports CARGO/RUSTC/sysroot/ target std roots to the build helper. - sdist_build emits `pep517_rust_whl` for Rust builds; setuptools-rust is only inferred under a setuptools backend (numpy ships meson's .rs test cases and must stay a meson build). - build_helper merges host sysroot + target rust-std the way rustup lays them out, for both native and cross cargo builds. - rust_layer.bzl, the `rust_toolchain` tag attr and the rules_rs e2e case are removed; e2e/crossbuild builds every Rust case offline. --- MODULE.bazel | 9 + docs/uv.md | 65 ++-- e2e/crossbuild/MODULE.bazel | 34 -- e2e/crossbuild/MODULE.bazel.lock | 301 +----------------- .../pycross-bcrypt/setup.MODULE.bazel | 6 +- .../pycross-rpds_py/setup.MODULE.bazel | 7 +- e2e/crossbuild/pycross-rust-rs/BUILD.bazel | 62 ---- e2e/crossbuild/pycross-rust-rs/pyproject.toml | 12 - .../pycross-rust-rs/setup.MODULE.bazel | 28 -- .../pycross-rust-rs/test_pydantic_core.py | 19 -- e2e/crossbuild/pycross-rust-rs/uv.lock | 194 ----------- .../pycross-rust/setup.MODULE.bazel | 8 +- .../pycross-tiktoken/setup.MODULE.bazel | 6 +- uv/extensions.bzl | 2 + uv/private/extension/defs.bzl | 14 +- uv/private/pep517_whl/BUILD.bazel | 6 +- uv/private/pep517_whl/pep517_native_whl.bzl | 194 +++++------ uv/private/pep517_whl/rust_layer.bzl | 33 -- uv/private/pep517_whl/tests/BUILD.bazel | 52 +-- .../pep517_whl/tests/build_helper_test.py | 120 +++---- .../pep517_whl/tests/pep517_whl_test.bzl | 44 ++- uv/private/pep517_whl/tools/build_helper.py | 66 ++-- uv/private/rust/BUILD.bazel | 35 ++ uv/private/rust/extensions.bzl | 73 +++++ uv/private/rust/repositories.bzl | 139 ++++++++ uv/private/rust/toolchain.bzl | 50 +++ uv/private/rust/versions.bzl | 59 ++++ uv/private/sdist_build/repository.bzl | 75 ++--- uv/private/sdist_build/tests/BUILD.bazel | 4 +- .../sdist_build/tests/repository_test.bzl | 46 +-- 30 files changed, 684 insertions(+), 1079 deletions(-) delete mode 100644 e2e/crossbuild/pycross-rust-rs/BUILD.bazel delete mode 100644 e2e/crossbuild/pycross-rust-rs/pyproject.toml delete mode 100644 e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel delete mode 100644 e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py delete mode 100644 e2e/crossbuild/pycross-rust-rs/uv.lock delete mode 100644 uv/private/pep517_whl/rust_layer.bzl create mode 100644 uv/private/rust/BUILD.bazel create mode 100644 uv/private/rust/extensions.bzl create mode 100644 uv/private/rust/repositories.bzl create mode 100644 uv/private/rust/toolchain.bzl create mode 100644 uv/private/rust/versions.bzl diff --git a/MODULE.bazel b/MODULE.bazel index 0ad229880..ef8e64bfd 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -84,6 +84,15 @@ use_repo( register_toolchains("@python_interpreters//:all") +# Rust for PEP 517 builds of Rust sdists (maturin, setuptools-rust): fetched by +# rules_py like the interpreters and uv, so a Rust package in a lock builds with +# nothing registered by the consumer. Only pep517_rust_whl resolves it. +rust_tools = use_extension("//uv:extensions.bzl", "rust_tools") +rust_tools.toolchain() +use_repo(rust_tools, "rules_py_rust_toolchains") + +register_toolchains("@rules_py_rust_toolchains//:all") + bazel_dep(name = "aspect_tools_telemetry", version = "0.5.2") tel = use_extension("@aspect_tools_telemetry//:extension.bzl", "telemetry") diff --git a/docs/uv.md b/docs/uv.md index 8b192abac..88bf47c7b 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -313,13 +313,10 @@ Under cross mode the build action: 4. Validates the produced wheel's platform tag against the target OS/CPU and fails the action if the backend leaked the exec platform into the tag. -Cargo-based backends need a Rust toolchain that runs on the exec platform. -Declare it once per project with -`uv.project(rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain")`; -sdist repos whose build backend is maturin, or whose build requirements -include setuptools-rust, then receive `CARGO`, `RUSTC` and the exec-platform -sysroot automatically. No per-package `uv.override_package` `env` or -`toolchains` entries are needed for Rust. +Cargo-based backends (maturin, setuptools-rust) build with rules_py's own Rust +toolchain, fetched like the interpreters and uv; nothing is declared per +project or per package, and the toolchain is never fetched by a workspace +without a Rust sdist. Other build-time toolchains are still layered per package through `uv.override_package(toolchains = [...])`. Toolchains exporting the JDK @@ -461,7 +458,7 @@ useful when a pre-build patch removes stale entry-point metadata. ### Build-time toolchains A native sdist build may need tools beyond the C++ toolchain: a JDK for JNI -extensions, cargo and rustc for Rust extensions, Ant. List them on the +extensions, Ant. List them on the package's override and their well-known make-variables reach the build environment on their own: @@ -473,43 +470,35 @@ uv.override_package( ) ``` -`$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(CARGO)`, -`$(RUSTC)`, `$(RUST_SYSROOT)` and `$(RUST_HOST_SYSROOT)` as the variables the -Rust build path reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other make-variable a +`$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(ANT_HOME)` and +`$(ANT_BIN_DIR)` likewise. Any other make-variable a toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always wins over the derived value. -Rust needs one more step. Every sdist runs its build logic on the exec -platform, but in a cross build cargo also *compiles* code for the exec platform -and runs it there: `build.rs` scripts and proc-macro crates. Those need the -exec platform's Rust standard library in the sysroot, and a toolchain resolved -for the target platform ships only the target's. Declare the toolchain once per -project and rules_py adds an exec-configured sysroot layer next to it: +Rust sdists (maturin, setuptools-rust) need nothing declared: rules_py fetches +its own Rust toolchain for them, the way it fetches Python interpreters and +uv, pinned to a release it ships hashes for. Only the build of those sdists +uses it; your own Rust rules and toolchains are untouched, and a workspace +with no Rust sdist never fetches it. To build with another Rust release, pin +it once in `MODULE.bazel`: ```starlark -uv.project( - hub_name = "pypi", - lock = "//:uv.lock", - pyproject = "//:pyproject.toml", - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", -) +rust_tools = use_extension("@aspect_rules_py//uv:extensions.bzl", "rust_tools") +rust_tools.toolchain(version = "1.90.0") ``` -Every sdist in that project whose build backend is maturin, or whose build -requirements include setuptools-rust, then gets the toolchain and an -exec-configured `rust_host_sysroot` layer wired into its build. No -`uv.override_package` entry is needed for Rust packages. The crates the -sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while -the repository is generated and vendored into it; cargo then builds offline, -so the build needs no network and works under remote execution. A lock that -pins crates outside crates.io (git or path sources) is rejected. An sdist -without a `Cargo.lock` builds with network access and a warning; give it one -with `uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once -with `cargo generate-lockfile` on the extracted sdist, and it is vendored and -placed next to the sdist's `Cargo.toml` before the build. Any target exposing -rules_rust's toolchain providers works, so the same label serves -[rules_rs](https://github.com/hermeticbuild/rules_rs) toolchains, which are -declared with rules_rust's `rust_toolchain` rule. +In a cross build cargo also *compiles* code for the exec platform and runs it +there (`build.rs` scripts, proc-macro crates), so the toolchain carries the +exec platform's std next to the target's and the helper overlays them the way +rustup keeps several targets in one install. The crates the sdist's +`Cargo.lock` pins on crates.io are fetched with their checksums while the +repository is generated and vendored into it; cargo then builds offline, so +the build needs no network and works under remote execution. A lock that pins +crates outside crates.io (git or path sources) is rejected. An sdist without a +`Cargo.lock` builds with network access and a warning; give it one with +`uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once with +`cargo generate-lockfile` on the extracted sdist, and it is vendored and +placed next to the sdist's `Cargo.toml` before the build. ### Backend config settings diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 4bb9cf12c..6978cea9c 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -7,8 +7,6 @@ bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "gcc_toolchain", version = "0.11.0") bazel_dep(name = "llvm", version = "0.8.3") bazel_dep(name = "rules_shell", version = "0.4.1") -bazel_dep(name = "rules_rust", version = "0.68.0") -bazel_dep(name = "rules_rs", version = "0.0.110") local_path_override( module_name = "aspect_rules_py", @@ -59,37 +57,6 @@ register_toolchains( # host cross-building the linux cases locally (exec=darwin → target=linux). register_toolchains("@llvm//toolchain:all") -# Shared by the rust suites (pycross-bcrypt, pycross-rpds_py, pycross-rust, -# pycross-tiktoken) through uv.project(rust_toolchain = ...). -rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") -rust.toolchain( - edition = "2021", - extra_target_triples = [ - "aarch64-unknown-linux-gnu", - "x86_64-unknown-linux-gnu", - ], - versions = ["1.90.0"], -) -use_repo(rust, "rust_toolchains") - -register_toolchains("@rust_toolchains//:all") - -# rules_rs toolchains for //pycross-rust-rs. They are rules_rust `rust_toolchain` -# instances declared in the patched rules_rust repository rules_rs fetches, so -# they register under that repository's toolchain type and never compete with -# the BCR rules_rust toolchains above. -rs_toolchains = use_extension("@rules_rs//rs/toolchains:module_extension.bzl", "toolchains") -rs_toolchains.toolchain( - edition = "2021", - version = "1.92.0", -) -use_repo(rs_toolchains, "default_rust_toolchains") - -rules_rust_rs = use_extension("@rules_rs//rs:rules_rust.bzl", "rules_rust") -use_repo(rules_rust_rs, rules_rust_rs = "rules_rust") - -register_toolchains("@default_rust_toolchains//...") - uv_bin = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv_bin") uv_bin.toolchain(version = "0.11.21") use_repo(uv_bin, "uv") @@ -102,7 +69,6 @@ include("//pycross-msgpack:setup.MODULE.bazel") include("//pycross-patches:setup.MODULE.bazel") include("//pycross-pure-python:setup.MODULE.bazel") include("//pycross-rust:setup.MODULE.bazel") -include("//pycross-rust-rs:setup.MODULE.bazel") include("//pycross-setuptools:setup.MODULE.bazel") include("//pycross-psutil:setup.MODULE.bazel") include("//pycross-geohash:setup.MODULE.bazel") diff --git a/e2e/crossbuild/MODULE.bazel.lock b/e2e/crossbuild/MODULE.bazel.lock index c318e0cde..6543b2bba 100644 --- a/e2e/crossbuild/MODULE.bazel.lock +++ b/e2e/crossbuild/MODULE.bazel.lock @@ -10,9 +10,6 @@ "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", - "https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442", - "https://bcr.bazel.build/modules/apple_support/1.24.1/MODULE.bazel": "f46e8ddad60aef170ee92b2f3d00ef66c147ceafea68b6877cb45bd91737f5f8", - "https://bcr.bazel.build/modules/apple_support/1.24.1/source.json": "cf725267cbacc5f028ef13bb77e7f2c2e0066923a4dab1025e4a0511b1ed258a", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.5.2/MODULE.bazel": "c715a5fb6b13a0086c061618f00d033a4ab6d76cbd1083e38d7ca953b5e547f4", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.5.2/source.json": "4dd300d44767ad4860098b006dda614e67ab0409ae6ec6e133faad303fe9ede8", "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", @@ -23,18 +20,14 @@ "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", "https://bcr.bazel.build/modules/bazel_features/1.24.0/MODULE.bazel": "4796b4c25b47053e9bbffa792b3792d07e228ff66cd0405faef56a978708acd4", - "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", - "https://bcr.bazel.build/modules/bazel_features/1.32.0/MODULE.bazel": "095d67022a58cb20f7e20e1aefecfa65257a222c18a938e2914fd257b5f1ccdc", "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", "https://bcr.bazel.build/modules/bazel_features/1.42.0/MODULE.bazel": "e8ca15cb2639c5f12183db6dcb678735555d0cdd739b32a0418b6532b5e565f8", "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", - "https://bcr.bazel.build/modules/bazel_features/1.45.0/MODULE.bazel": "7daec6d87ab0703417486d4cb948af0b06f55d4d7c08cbb5978c80e79b538edf", - "https://bcr.bazel.build/modules/bazel_features/1.50.0/MODULE.bazel": "2083ef9c7a469f520890483ccf8e0189d6e71e2117e7752e15e6554433d5ae3e", - "https://bcr.bazel.build/modules/bazel_features/1.50.0/source.json": "e0ee3debde2789ff56e4452e612d126925ba9ab64d4bde79c67f099d2902df9b", + "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", @@ -46,7 +39,6 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.0/MODULE.bazel": "2ab127ef8d56a739a99bb2ce00ec4c7d1ecc7977d4370c0ca6efd0d8f03d6d99", "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", @@ -60,7 +52,6 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", - "https://bcr.bazel.build/modules/bzip2/1.0.8.bcr.3/MODULE.bazel": "29ecf4babfd3c762be00d7573c288c083672ab60e79c833ff7f49ee662e54471", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", @@ -73,16 +64,13 @@ "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/MODULE.bazel": "67ff71bbfb482e58510451c4c8b8cd303c757f7ff79a2aff7cf381277be96f9f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/source.json": "475aa00426677e643e327b4b031d8816a3bc0a134c94d0d0d510cfd67b2cfd2c", - "https://bcr.bazel.build/modules/hermetic_launcher/0.0.8/MODULE.bazel": "3be7b0faca6f1e69e89197999e0b01ce058c42f3e764ef028466f7e0ff77c761", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/llvm/0.8.18/MODULE.bazel": "56d507d49c02498731fa5a95fa48a778368f2d23c0f6184a578d057e58830458", - "https://bcr.bazel.build/modules/llvm/0.8.18/source.json": "ca45abf06bdd842e88acdda4a077038bbecddd3e90050951c2aff5f89b1b522e", "https://bcr.bazel.build/modules/llvm/0.8.3/MODULE.bazel": "dbc1bc13171f8f9980a75524883abef1c491613e8d8d805cd4ffa3767ba9708e", + "https://bcr.bazel.build/modules/llvm/0.8.3/source.json": "4b11874c26a9de53c03a25a517ebc36dee6b458c920fe9ed65e3ca279ff19775", "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", - "https://bcr.bazel.build/modules/package_metadata/0.0.7/MODULE.bazel": "7adb03933fc8401f495800cf4eafcff0edc6da0ff55c7db223ef69d19f689486", - "https://bcr.bazel.build/modules/package_metadata/0.0.7/source.json": "50639625e937b56115012674c797cca7a05a96b4878c87d803c13dc2b31de8a0", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", @@ -90,7 +78,6 @@ "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", @@ -100,8 +87,7 @@ "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", - "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", - "https://bcr.bazel.build/modules/protobuf/29.1/source.json": "04cca85dce26b895ed037d98336d860367fe09919208f2ad383f0df1aff63199", + "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", @@ -125,10 +111,8 @@ "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", - "https://bcr.bazel.build/modules/rules_cc/0.2.22/MODULE.bazel": "94df4328edef9e44d38de5e73b037cd348e75e7ae55f4e21bf07878c41a31ebb", - "https://bcr.bazel.build/modules/rules_cc/0.2.22/source.json": "b2d6d6f9c332ce269ad75b89c6f3168d809a66173c9040210fb9bcc733ab42fa", + "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", - "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", @@ -168,8 +152,7 @@ "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", - "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", @@ -177,20 +160,13 @@ "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", - "https://bcr.bazel.build/modules/rules_python/1.6.3/MODULE.bazel": "a7b80c42cb3de5ee2a5fa1abc119684593704fcd2fec83165ebe615dec76574f", "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", - "https://bcr.bazel.build/modules/rules_python/1.8.0/MODULE.bazel": "c151c025dbcc93d8f62ab68ecc313c9176a868a0e6386981bf2a12aec77cbe7b", "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", - "https://bcr.bazel.build/modules/rules_rs/0.0.110/MODULE.bazel": "c0c3c938547998dbced9aafea3c67c28d6919a33ea63707b03f1da0359840355", - "https://bcr.bazel.build/modules/rules_rs/0.0.110/source.json": "679b8aad1f16158580dbfd4aac59eea2644740ff34078bc46030a5ec3bfa62f8", - "https://bcr.bazel.build/modules/rules_rust/0.68.0/MODULE.bazel": "dcb4fe4396b49d3b2d72bccf634d27499dd2a58dcdfccfe8e17ba15c4bd150ae", - "https://bcr.bazel.build/modules/rules_rust/0.68.0/source.json": "e5d5f37874c4af13dbdfbf1220889607d9b3cc51f2831e10c2035b6638442f07", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.8.0/MODULE.bazel": "f6a89f1d6a669a26f28fe814503857055d76306b79cfc11d12399af08d0b80ae", - "https://bcr.bazel.build/modules/rules_shell/0.8.0/source.json": "eb53cc815bc503c6683c5fe12d943f98883f81fc22f51403ec8a95610cba4195", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", @@ -204,15 +180,10 @@ "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/MODULE.bazel": "b573395fe63aef4299ba095173e2f62ccfee5ad9bbf7acaa95dba73af9fc2b38", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/source.json": "3f3fbaeafecaf629877ad152a2c9def21f8d330d91aa94c5dc75bbb98c10b8b8", - "https://bcr.bazel.build/modules/xz/5.4.5.bcr.8/MODULE.bazel": "e48a69bd54053c2ec5fffc2a29fb70122afd3e83ab6c07068f63bc6553fa57cc", - "https://bcr.bazel.build/modules/zlib-ng/2.3.3.bcr.2/MODULE.bazel": "86130924115bf8dfc4aba286fb49a2ec8d32430a21771db9ccf5381acf0d10cc", - "https://bcr.bazel.build/modules/zlib-ng/2.3.3.bcr.2/source.json": "7aa4112eb2fbb99757e97cf0b7a4e2bdb3464b2b3cfb351bc807ffcb34bd349f", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198", - "https://bcr.bazel.build/modules/zstd/1.5.7.bcr.1/MODULE.bazel": "c5977176dd8555be7a9d598512ae0cae11831259c06f00a5e5e0037d5db4e3f5", - "https://bcr.bazel.build/modules/zstd/1.5.7.bcr.1/source.json": "aa95e0b5aac9d80195b9047d223beaf26b1948be55d49f0e803e180e9ccc6e75" + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" }, "selectedYankedVersions": {}, "moduleExtensions": { @@ -603,158 +574,6 @@ ] ] } - }, - "@@rules_rust+//crate_universe/private:internal_extensions.bzl%cu_nr": { - "general": { - "bzlTransitiveDigest": "YzmISGDIFf1NJ3Mirh13ENAB5ReImczJ9PzKoZhDpMs=", - "usagesDigest": "x2UGTaQ0WUugfG6TAhmfjv42yrbUJc9cune5ruXn4o8=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "cargo_bazel_bootstrap": { - "repoRuleId": "@@rules_rust+//cargo/private:cargo_bootstrap.bzl%cargo_bootstrap_repository", - "attributes": { - "srcs": [ - "@@rules_rust+//crate_universe:src/api.rs", - "@@rules_rust+//crate_universe:src/api/lockfile.rs", - "@@rules_rust+//crate_universe:src/cli.rs", - "@@rules_rust+//crate_universe:src/cli/generate.rs", - "@@rules_rust+//crate_universe:src/cli/query.rs", - "@@rules_rust+//crate_universe:src/cli/render.rs", - "@@rules_rust+//crate_universe:src/cli/splice.rs", - "@@rules_rust+//crate_universe:src/cli/vendor.rs", - "@@rules_rust+//crate_universe:src/config.rs", - "@@rules_rust+//crate_universe:src/context.rs", - "@@rules_rust+//crate_universe:src/context/crate_context.rs", - "@@rules_rust+//crate_universe:src/context/platforms.rs", - "@@rules_rust+//crate_universe:src/lib.rs", - "@@rules_rust+//crate_universe:src/lockfile.rs", - "@@rules_rust+//crate_universe:src/main.rs", - "@@rules_rust+//crate_universe:src/metadata.rs", - "@@rules_rust+//crate_universe:src/metadata/cargo_bin.rs", - "@@rules_rust+//crate_universe:src/metadata/cargo_tree_resolver.rs", - "@@rules_rust+//crate_universe:src/metadata/cargo_tree_rustc_wrapper.bat", - "@@rules_rust+//crate_universe:src/metadata/cargo_tree_rustc_wrapper.sh", - "@@rules_rust+//crate_universe:src/metadata/dependency.rs", - "@@rules_rust+//crate_universe:src/metadata/metadata_annotation.rs", - "@@rules_rust+//crate_universe:src/rendering.rs", - "@@rules_rust+//crate_universe:src/rendering/template_engine.rs", - "@@rules_rust+//crate_universe:src/rendering/templates/module_bzl.j2", - "@@rules_rust+//crate_universe:src/rendering/templates/partials/header.j2", - "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/aliases_map.j2", - "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/deps_map.j2", - "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/repo_git.j2", - "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/repo_http.j2", - "@@rules_rust+//crate_universe:src/rendering/templates/vendor_module.j2", - "@@rules_rust+//crate_universe:src/rendering/verbatim/alias_rules.bzl", - "@@rules_rust+//crate_universe:src/select.rs", - "@@rules_rust+//crate_universe:src/splicing.rs", - "@@rules_rust+//crate_universe:src/splicing/cargo_config.rs", - "@@rules_rust+//crate_universe:src/splicing/crate_index_lookup.rs", - "@@rules_rust+//crate_universe:src/splicing/splicer.rs", - "@@rules_rust+//crate_universe:src/test.rs", - "@@rules_rust+//crate_universe:src/utils.rs", - "@@rules_rust+//crate_universe:src/utils/starlark.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/glob.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/label.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/select.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/select_dict.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/select_list.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/select_scalar.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/select_set.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/serialize.rs", - "@@rules_rust+//crate_universe:src/utils/starlark/target_compatible_with.rs", - "@@rules_rust+//crate_universe:src/utils/symlink.rs", - "@@rules_rust+//crate_universe:src/utils/target_triple.rs" - ], - "binary": "cargo-bazel", - "cargo_lockfile": "@@rules_rust+//crate_universe:Cargo.lock", - "cargo_toml": "@@rules_rust+//crate_universe:Cargo.toml", - "version": "1.86.0", - "timeout": 900, - "rust_toolchain_cargo_template": "@rust_host_tools//:bin/{tool}", - "rust_toolchain_rustc_template": "@rust_host_tools//:bin/{tool}", - "compressed_windows_toolchain_names": false - } - } - }, - "moduleExtensionMetadata": { - "explicitRootModuleDirectDeps": [ - "cargo_bazel_bootstrap" - ], - "explicitRootModuleDirectDevDeps": [], - "useAllRepos": "NO", - "reproducible": false - }, - "recordedRepoMappingEntries": [ - [ - "bazel_features+", - "bazel_features_globals", - "bazel_features++version_extension+bazel_features_globals" - ], - [ - "bazel_features+", - "bazel_features_version", - "bazel_features++version_extension+bazel_features_version" - ], - [ - "rules_cc+", - "bazel_tools", - "bazel_tools" - ], - [ - "rules_cc+", - "cc_compatibility_proxy", - "rules_cc++compatibility_proxy+cc_compatibility_proxy" - ], - [ - "rules_cc+", - "rules_cc", - "rules_cc+" - ], - [ - "rules_cc++compatibility_proxy+cc_compatibility_proxy", - "rules_cc", - "rules_cc+" - ], - [ - "rules_rust+", - "bazel_features", - "bazel_features+" - ], - [ - "rules_rust+", - "bazel_skylib", - "bazel_skylib+" - ], - [ - "rules_rust+", - "bazel_tools", - "bazel_tools" - ], - [ - "rules_rust+", - "cui", - "rules_rust++cu+cui" - ], - [ - "rules_rust+", - "rrc", - "rules_rust++i2+rrc" - ], - [ - "rules_rust+", - "rules_cc", - "rules_cc+" - ], - [ - "rules_rust+", - "rules_rust", - "rules_rust+" - ] - ] - } } }, "facts": { @@ -1818,110 +1637,6 @@ }, "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "notice_version": "3" - }, - "@@rules_rs+//rs/toolchains:module_extension.bzl%toolchains": { - "cargo-1.92.0-aarch64-apple-darwin.tar.zst": "934faac197f1ca044b55dee59e1ca7b31c56dcdf622d3c34575ac9e99951caf2", - "cargo-1.92.0-aarch64-pc-windows-msvc.tar.zst": "6d6dc45e6c98c9afe5d5194dee36bc6ed04e2229fec32307603b1f017d0d2f36", - "cargo-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "e9d346d32d3ceb05a4fb8680da608084cd55d80a491418e53e66bd46dd582929", - "cargo-1.92.0-x86_64-apple-darwin.tar.zst": "6ad5fb1cf52ec9417334d77f408848704bbb7987d4e0f71dcbb69cde75353470", - "cargo-1.92.0-x86_64-pc-windows-msvc.tar.zst": "ad5aa56f37216bced19b15b27de116a5cdc448a15c3a30d2d8a31f14a86cc9bb", - "cargo-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "5ea83bd512d784ff495631476aee1a5422f0a22261aae311446a4b288ecded5f", - "clippy-1.92.0-aarch64-apple-darwin.tar.zst": "00f1c80d36f97fc42009315faa1881fc7ae6a060f541b7a4361bcbb03ce6cd70", - "clippy-1.92.0-aarch64-pc-windows-msvc.tar.zst": "62402d8dad087cff56f768d29994f35fa319d0f4642f608b293995f0d1324870", - "clippy-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "a7c5eff6b5d763498454dd463a0b0c100880ab8b4156f82936c05e72d1dfc6ba", - "clippy-1.92.0-x86_64-apple-darwin.tar.zst": "28076203bfa4b9cda9a2c7723d33c3debab32b65bf17a5edc253c5715042fa31", - "clippy-1.92.0-x86_64-pc-windows-msvc.tar.zst": "28bf949165fb1252b1e8d78ad1718933cc247cac7f0d6f22f55bae930a66f4f3", - "clippy-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "7f1e94c6c0ddc529ed8d3a620c0dbb6035dc4a2491f558bea1e5f850413d56a5", - "rust-analyzer-1.92.0-aarch64-apple-darwin.tar.zst": "271047fbcdfc135864919bdf8590d5416b583e87d5d688d9e1dc993032508780", - "rust-analyzer-1.92.0-aarch64-pc-windows-msvc.tar.zst": "01c0ebf593b6bf69bc3aae245d82d6a22d6319aa1452cb467b12f766d7031290", - "rust-analyzer-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "4f6bca3ad473b9db72e1cee5cb4f378b8cc48157e46a9e60b24636d62edc6c61", - "rust-analyzer-1.92.0-x86_64-apple-darwin.tar.zst": "6b162050d40da201e9beffe94afd748d7b1d2c88c6d7d23a5fcf95330c995c83", - "rust-analyzer-1.92.0-x86_64-pc-windows-msvc.tar.zst": "36d0e77c09e7297fab4df3fae286c39ee4348946b34776aa67b5b23c27d72a80", - "rust-analyzer-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "950c2f0fc51ef8f7c99d33951e4dacab4c0767e106466d9e883a8f31a9c27b62", - "rust-src-1.92.0.tar.zst": "39a65365e239f5f33db3ecac464633ee0c6a298abc2c60e4a25c127c2bf5f263", - "rust-std-1.92.0-aarch64-apple-darwin.tar.zst": "a6152db76c66b25e4846b91bdb153b57c645b9323f7c99121b8d938d05ec8756", - "rust-std-1.92.0-aarch64-apple-ios-macabi.tar.zst": "d9812a9b2ba5e8838c86abd37e1a0b78314c717029a64fc9f71c6863a0cfc16d", - "rust-std-1.92.0-aarch64-apple-ios-sim.tar.zst": "4bb0ed5ddaac0e82223b4a3173a9d29aa8f999e4f108534f7d6b6a174da49816", - "rust-std-1.92.0-aarch64-apple-ios.tar.zst": "cc7bc7c7118432c674fd372f76de67f9631873f21fc7390cbc0d48ccb8c0706a", - "rust-std-1.92.0-aarch64-linux-android.tar.zst": "342650902c8b3d497c0d152c9aa1013e5e1bc281666f00ebea13ac6c2848dd2c", - "rust-std-1.92.0-aarch64-pc-windows-gnullvm.tar.zst": "6ea57d6cfc68697ce7a6376d7c0b66191723a28ee95dd81ca9746a0c6b4f3f1c", - "rust-std-1.92.0-aarch64-pc-windows-msvc.tar.zst": "bbb6ef03ecc830260a933176610619078916e1494e5f7a3f2dba89956f9d52b3", - "rust-std-1.92.0-aarch64-unknown-fuchsia.tar.zst": "58ac7b9e74b1ced3b9640cd8b0d849824428640f03a66a3f390f9779850c4075", - "rust-std-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "db5f099c63013b558ee334f7a13c503ae256d3d3c5fb3bbabe6b513d0217e19a", - "rust-std-1.92.0-aarch64-unknown-linux-musl.tar.zst": "923384991a566d5477305d49c152d2f83911b9f06e30a53a90e62b9c0931642e", - "rust-std-1.92.0-aarch64-unknown-none-softfloat.tar.zst": "7587517944d2e19f5e0231f05989fac0ae5877778eaa6420928edc3047bda542", - "rust-std-1.92.0-aarch64-unknown-none.tar.zst": "6b8fa1a40adc80e58aa14d148ad8b652d1362c42e3f9ded24b05d4ca2c7c76dd", - "rust-std-1.92.0-aarch64-unknown-uefi.tar.zst": "5cb3f57bb7606d9cb08e55d95797491698e4c221f09c087faf28f42d169edb47", - "rust-std-1.92.0-arm-linux-androideabi.tar.zst": "e74a37f3da7cb3b29c46636b45e2af6cc6e477768cfaf22d1182fdce3998cd06", - "rust-std-1.92.0-arm-unknown-linux-gnueabi.tar.zst": "1fea2017b00227e8e1750f3f78d571e2731e949ea3a9c024f4d706c50532c4ee", - "rust-std-1.92.0-arm-unknown-linux-gnueabihf.tar.zst": "755937d472c0f77262704b80fb4d762cfe22f6fe559fe1dd7a6ffd8c9945ad52", - "rust-std-1.92.0-arm-unknown-linux-musleabi.tar.zst": "78dad339d932fe8d6b4d28f55caf0a66ac981dae65b1080b34827ad90c65820d", - "rust-std-1.92.0-arm-unknown-linux-musleabihf.tar.zst": "a1647d1ae3672d7f4a77f7c2aaef53f7c1ba1e4c04e79fef5c31fedb1624fb52", - "rust-std-1.92.0-armv7-linux-androideabi.tar.zst": "f347361f8aaa09796c81b33dd530c6df59c545e2225a9f430354602c5d3d225d", - "rust-std-1.92.0-armv7-unknown-linux-gnueabi.tar.zst": "cdc9d12195fc578c3a6890066ffe3e2f45b61bee6069b79a0723ffc01580d43e", - "rust-std-1.92.0-armv7-unknown-linux-gnueabihf.tar.zst": "3747329709be56bb493f39e148721cf47ad52e2d6f4d641e173f877069b86641", - "rust-std-1.92.0-armv7-unknown-linux-musleabi.tar.zst": "4947f6748d6b340bc44196f8db60564d75d0b244f59231d8d1b81a659131348d", - "rust-std-1.92.0-armv7-unknown-linux-musleabihf.tar.zst": "5a0836abf6946350bb3a21bba569a6732829946593037c2d8ec452eead3a98bd", - "rust-std-1.92.0-i686-linux-android.tar.zst": "272394a361ebca0a1e18ae8e2bbf51ee03abacb9492a89a5e07f44e15e11dc75", - "rust-std-1.92.0-i686-pc-windows-gnu.tar.zst": "1a7574ffe7495bc5b386af0da87b241d8f80bed44622992e65203bfad98f87d7", - "rust-std-1.92.0-i686-pc-windows-gnullvm.tar.zst": "2e332076308db6558c39986a4de0542d193d42cac4c8171ef3bcb331b010b9c7", - "rust-std-1.92.0-i686-pc-windows-msvc.tar.zst": "bb1b6313d47da6927f8be564a95cb494854c9d6e39d91947f5feb31ed92b7bbf", - "rust-std-1.92.0-i686-unknown-freebsd.tar.zst": "64799a94bd6695f2edfdbfef895605b443b702041a05a8149641c395d342867f", - "rust-std-1.92.0-i686-unknown-linux-gnu.tar.zst": "6a53e3ecf2d94d79842a4d6ee20a175860fbe2061b8702d816e7d0fb3efb2dc4", - "rust-std-1.92.0-i686-unknown-linux-musl.tar.zst": "30f96a8b910cab267c06460e3403031de1a14373da1876a031fab44b68c221dd", - "rust-std-1.92.0-i686-unknown-uefi.tar.zst": "cf28b4182d8f12ede776dc310964cebef06d1a9efcb311c98722eb10e0052f1b", - "rust-std-1.92.0-loongarch64-unknown-linux-gnu.tar.zst": "04e0a4dcf92533a240f9190bf6b8d487168df2ad4fba56fef26d9835b4abbad1", - "rust-std-1.92.0-loongarch64-unknown-linux-musl.tar.zst": "5737ceaf6492c52ad4e3bdcd6b6c99c9f88adf3d24489802d3bd5cace8c077ab", - "rust-std-1.92.0-loongarch64-unknown-none.tar.zst": "2aa371171d9a48f01d6ef4b8dc091ea6e26fbd3720da217f86e482d825b35dd8", - "rust-std-1.92.0-powerpc-unknown-linux-gnu.tar.zst": "5c813b76bab6ddc79776dc7993b628f09c0e36e98f2a2fa4225e8443e0bfe956", - "rust-std-1.92.0-powerpc64-unknown-linux-gnu.tar.zst": "ecd97d75b8ec82b2a11a414b9afa44ddab8242e402d149d176e18d3755468b9d", - "rust-std-1.92.0-powerpc64le-unknown-linux-gnu.tar.zst": "970b68e135b8fa4b7f86cd8f39173bd5c03a1223735c32bbcd5122a6b5dee13f", - "rust-std-1.92.0-powerpc64le-unknown-linux-musl.tar.zst": "1bc1904a48014c423c68a66b06a75cb7d67010a3e8fdb89b1b4621dc031a7fd0", - "rust-std-1.92.0-riscv32imac-unknown-none-elf.tar.zst": "1107e131abff8bd4426de83af64df9b45f7f713523b430792f0b72c7dbc86775", - "rust-std-1.92.0-riscv32imc-unknown-none-elf.tar.zst": "9838a8ae5f35ccf44f18bc712bd329dac6384b5d69a21bfd32832e85293db453", - "rust-std-1.92.0-riscv64gc-unknown-linux-gnu.tar.zst": "9fec2f1d31e08b5f12886385f548d02854a4df70aa74779bf17d6c582741f668", - "rust-std-1.92.0-riscv64gc-unknown-linux-musl.tar.zst": "977ddd7ad1061521eea05f7cc2742d33a7b1fe1adbf971e9bfc153973bba734d", - "rust-std-1.92.0-riscv64gc-unknown-none-elf.tar.zst": "f9c3c317d5d5ac892aad53c351cf6d31fa809a4aa366bdf1bbc9377f651535ee", - "rust-std-1.92.0-s390x-unknown-linux-gnu.tar.zst": "3fc7e9129dfc2981ec5390a2d0d1200b5ac3d1bf373b890a57624a6611dab8b8", - "rust-std-1.92.0-sparc64-unknown-linux-gnu.tar.zst": "524699c80798fb92fe06778ec20433c38a2295939577ec31f1af9aed0a229b34", - "rust-std-1.92.0-thumbv6m-none-eabi.tar.zst": "e7cc3cfc7d0e6e10a1eb90ba36773db35a25c6fa98587c5d1ae02e9aaa77978f", - "rust-std-1.92.0-thumbv7em-none-eabi.tar.zst": "99b0c00163763dc6d0f93a48840fdbf2c43ddba24a41944c0c1eda593ed867a0", - "rust-std-1.92.0-thumbv7em-none-eabihf.tar.zst": "4d0439d1d0fecd5d2590436c318b7b9d9cd84b25e494ded534ab251d52b48401", - "rust-std-1.92.0-thumbv7m-none-eabi.tar.zst": "9967cf844d7c1871a2e27a43362315bfa29ca5d1a745f3e165103bddd8c721eb", - "rust-std-1.92.0-thumbv8m.main-none-eabi.tar.zst": "c9b9b67622a3bb15a9d2bc81c9473523514848faf1784826392dc3765904c315", - "rust-std-1.92.0-thumbv8m.main-none-eabihf.tar.zst": "53cb8593ae84a982ecd7bb6b203957ebfddbd1cabeccdff93ef456103af99690", - "rust-std-1.92.0-wasm32-unknown-emscripten.tar.zst": "d7d81544d8295e68836bad16d0512285ca9113b4abe2567d61cc58ea9f9d4c72", - "rust-std-1.92.0-wasm32-unknown-unknown.tar.zst": "9e0aca6975365c914c35ad003e0058361cdf3337736d7f908c7be67258eb7589", - "rust-std-1.92.0-wasm32-wasip1-threads.tar.zst": "41e2c8b944f140285b762f73ef3e3f028b068f3f4d353b9cd48aee37aef2df98", - "rust-std-1.92.0-wasm32-wasip1.tar.zst": "ef0e481aad764cb455e3ee459547d2bb7b580969859d91c23ae2618e58791abc", - "rust-std-1.92.0-wasm32-wasip2.tar.zst": "7d3d9da3f58dd07035b3c86d4285f145e06c4247b885bad014f7976187d8cbe3", - "rust-std-1.92.0-x86_64-apple-darwin.tar.zst": "3c7c504c0cc8fdfa56125f27292c057359b1529f79a8f7807b097f9b3175f75b", - "rust-std-1.92.0-x86_64-apple-ios-macabi.tar.zst": "f3258393b78f0163cfbf0bf4f71046d72da8f794ce2e6dd062325211cfd0d2c6", - "rust-std-1.92.0-x86_64-apple-ios.tar.zst": "fd889ca97041a6a7150dd0d2ae6bff9454f55f30520e8a043b5e45b5d91e57ee", - "rust-std-1.92.0-x86_64-linux-android.tar.zst": "b223b3271b9bd9695bc9cdcf26a5b8636ce2ffeca8cd80ad00c2e57ef4af5f06", - "rust-std-1.92.0-x86_64-pc-windows-gnu.tar.zst": "a5046c33ea9b87627f8266200c5ea51ed2c6c567d4c9d1350bd1bd57db685177", - "rust-std-1.92.0-x86_64-pc-windows-gnullvm.tar.zst": "4931412aa9b5ad6340d7403cf5597876979d24fda36b422944c33f8187610a85", - "rust-std-1.92.0-x86_64-pc-windows-msvc.tar.zst": "48b550c038691aafa0de408e045d17da9dd39bc911456b7e3cd0af2762a4d403", - "rust-std-1.92.0-x86_64-unknown-freebsd.tar.zst": "21c4065536337fdabfa18fa52accdfb9c37509324ff93a45bddb53eb1254c3e8", - "rust-std-1.92.0-x86_64-unknown-fuchsia.tar.zst": "eaa3eac2a2758c77e706a3eadee52b7b27eed15bd2788e9ef922215187aecbd0", - "rust-std-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "7d28286fe72ad895a1187f7b075d7d1cf5b1d824d6f65241f121265bfe161d82", - "rust-std-1.92.0-x86_64-unknown-linux-musl.tar.zst": "4a26b05ba7c19de836bce0176858fb58bfbd475f7eec82be16009ddbbb63aed7", - "rust-std-1.92.0-x86_64-unknown-netbsd.tar.zst": "db9f91d5eb6b26b03afeffc1e9ace53c2d13f8e0e10f87be0f8f7c86ba978383", - "rust-std-1.92.0-x86_64-unknown-none.tar.zst": "ee1385827731ae293cce83a252ec43718a85df3ac9982723bb35c118fbbe8048", - "rust-std-1.92.0-x86_64-unknown-uefi.tar.zst": "a651c526a7bf8867b760763f98c8c73f93b962fc6fb220872cff64d5b42b9c7c", - "rustc-1.92.0-aarch64-apple-darwin.tar.zst": "91d29edcb82361f943bd0fe00a9027a36b99561f99fe4fb35d8b4fcf43217430", - "rustc-1.92.0-aarch64-pc-windows-msvc.tar.zst": "853d238dec9c596a9c7f677490a0b0c7e44e46384739a3fc2693bf5c60073bac", - "rustc-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "10d2d323aa0a9b0d75aa2540a14002caf5d1b3413a4c65ab936a36879eb4f621", - "rustc-1.92.0-src.tar.zst": "c895404fd5326c857a29805638513a07c6909745e1b8afbb2fbbed906c39c7ce", - "rustc-1.92.0-x86_64-apple-darwin.tar.zst": "cf537975a07c94b4913619c5209fb2d6622a77922fc51a63e09fcd75dedfd192", - "rustc-1.92.0-x86_64-pc-windows-msvc.tar.zst": "d9ba009edecca135d816ba15995696cb0e4f98c669c3759ce107526121fe9ae4", - "rustc-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "d234e767edd7f8dc0c5c8976b1f044e55594d5a11654fcf4b9a5e19dc97f349b", - "rustfmt-1.92.0-aarch64-apple-darwin.tar.zst": "ec6c9ce8053de1e69f87ff254593e3b0eca10138455bd57e388020a00af1226d", - "rustfmt-1.92.0-aarch64-pc-windows-msvc.tar.zst": "2a31a49e093427098bc242792f5b9413f60b63b27f715996291170ecfa6e7bcc", - "rustfmt-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "ef3fb38df66f3678d242f9cde30dc29b9a241900ea5e78b5c711d9afffbc06f2", - "rustfmt-1.92.0-x86_64-apple-darwin.tar.zst": "ec907b57cef4c62f5ca30f70a16b1b5182143507385c855a997064546fa88158", - "rustfmt-1.92.0-x86_64-pc-windows-msvc.tar.zst": "a3f415ce0fd1f87605a210daa82fa748ccb7d8097c258f646ed6afe180eed2c5", - "rustfmt-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "20fc854bb0b7117d08631026986616a282c900ec2cdcc065842dd8ef381bb57e" } } } diff --git a/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel b/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel index 80223f472..1c2ad5ba9 100644 --- a/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel @@ -1,8 +1,7 @@ """bcrypt: setuptools-rust sdist build. -`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build detects -setuptools-rust in the build requirements and emits the toolchain plus the -exec-platform sysroot into the generated pep517_native_whl. +Nothing declares Rust: sdist_build detects setuptools-rust in the build +requirements and builds with rules_py's own Rust toolchain. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -17,7 +16,6 @@ uv.project( hub_name = "pypi_pycross_bcrypt", lock = "//pycross-bcrypt:uv.lock", pyproject = "//pycross-bcrypt:pyproject.toml", - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel b/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel index b99a8cef7..adcfbedff 100644 --- a/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel @@ -1,10 +1,8 @@ """rpds-py: maturin/PyO3 sdist build (hub dir underscores what PyPI hyphenates, hence override name != hub name). -`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build detects -the maturin backend and emits the toolchain plus the exec-platform sysroot -(the std that build scripts and proc-macros need) into the generated -pep517_native_whl. +Nothing declares Rust: sdist_build detects the maturin backend and builds +with rules_py's own Rust toolchain, exec std and target std overlaid. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -17,7 +15,6 @@ uv.project( hub_name = "pypi_pycross_rpds_py", lock = "//pycross-rpds_py:uv.lock", pyproject = "//pycross-rpds_py:pyproject.toml", - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel deleted file mode 100644 index 5d6adbff5..000000000 --- a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel +++ /dev/null @@ -1,62 +0,0 @@ -# maturin (Cargo/PyO3) cross case on rules_rs toolchains: pydantic-core built -# from its sdist for the host at runtime, and cross-compiled for both linux -# CPUs. Same assertions as //pycross-rust; only the Rust toolchain provider -# differs (see setup.MODULE.bazel). - -load("@aspect_rules_py//py:defs.bzl", "py_test") -load("//tools:collect_wheels.bzl", "collect_wheels") - -_PY = "3.12" - -_DEP_GROUP = "pycross_rust_rs" - -py_test( - name = "test_pydantic_core", - srcs = ["test_pydantic_core.py"], - dep_group = _DEP_GROUP, - main = "test_pydantic_core.py", - python_version = _PY, - deps = ["@pypi_pycross_rust_rs//pydantic_core"], -) - -# The wheel targets under `collect_wheels` are reached through a platform -# transition rather than a py_venv, so nothing sets the dep_group flag for -# them — the platform carries it alongside the libc/version flags the wheel -# resolver needs. -_PLATFORM_FLAGS = [ - "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", - "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", - "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, - "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, -] - -platform( - name = "amd64_linux", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:x86_64", - ], - flags = _PLATFORM_FLAGS, -) - -platform( - name = "arm64_linux", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:aarch64", - ], - flags = _PLATFORM_FLAGS, -) - -collect_wheels( - name = "rust_rs_wheels", - expected_tags = [ - "linux_x86_64", - "linux_aarch64", - ], - platforms = [ - ":amd64_linux", - ":arm64_linux", - ], - wheels = ["@sdist_build__pycross_rust_rs__pydantic_core__2_47_0//:whl"], -) diff --git a/e2e/crossbuild/pycross-rust-rs/pyproject.toml b/e2e/crossbuild/pycross-rust-rs/pyproject.toml deleted file mode 100644 index 4b544807b..000000000 --- a/e2e/crossbuild/pycross-rust-rs/pyproject.toml +++ /dev/null @@ -1,12 +0,0 @@ -[project] -name = "pycross_rust_rs" -version = "0.0.0" -requires-python = ">=3.11" -dependencies = [ - "build", - "maturin", - "pydantic-core==2.47.0", -] - -[tool.uv] -no-binary-package = ["pydantic-core"] diff --git a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel deleted file mode 100644 index 068fd6d9f..000000000 --- a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel +++ /dev/null @@ -1,28 +0,0 @@ -"""maturin cross case on rules_rs toolchains. - -Same package and assertions as //pycross-rust, built with the toolchains -rules_rs provisions instead of rules_rust's own. rules_rs declares them with -rules_rust's `rust_toolchain` rule inside the patched `rules_rust` repository -it fetches, so `uv.project(rust_toolchain = ...)` points at that repository's -`current_rust_toolchain`: the wiring is a provider contract, not a dependency -on one ruleset's toolchain layout. The two rulesets coexist here because each -carries its own `rules_rust` repository and therefore its own toolchain type. -""" - -uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") -uv.declare_hub(hub_name = "pypi_pycross_rust_rs") -uv.project( - default_build_dependencies = [ - "build", - "maturin", - ], - hub_name = "pypi_pycross_rust_rs", - lock = "//pycross-rust-rs:uv.lock", - pyproject = "//pycross-rust-rs:pyproject.toml", - rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", -) -use_repo( - uv, - "pypi_pycross_rust_rs", - "sdist_build__pycross_rust_rs__pydantic_core__2_47_0", -) diff --git a/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py deleted file mode 100644 index 6bf4f92b8..000000000 --- a/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python3 -"""Exercises the cross-compiled _pydantic_core extension. - -SchemaValidator is implemented in Rust (PyO3); constructing one and -validating through it proves the .so loads and runs on the target. -""" -from pydantic_core import SchemaValidator, core_schema - - -def main() -> None: - validator = SchemaValidator(core_schema.int_schema()) - result = validator.validate_python("123") - # pydantic-core's lax int mode coerces the numeric string to a real int. - assert result == 123 and isinstance(result, int), "expected int 123, got {!r}".format(result) - print("OK") - - -if __name__ == "__main__": - main() diff --git a/e2e/crossbuild/pycross-rust-rs/uv.lock b/e2e/crossbuild/pycross-rust-rs/uv.lock deleted file mode 100644 index ab8b074ff..000000000 --- a/e2e/crossbuild/pycross-rust-rs/uv.lock +++ /dev/null @@ -1,194 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.11" - -[[package]] -name = "build" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "os_name == 'nt'" }, - { name = "packaging" }, - { name = "pyproject-hooks" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "maturin" -version = "1.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/c8/22e5e21b2679c9bce6415ca578034ca2cc9316be0642ae21e051a2d5198c/maturin-1.15.0.tar.gz", hash = "sha256:94b26cc8e8aba61a5f2099715fe640e18c5f678e9a500408b38761263954228a", size = 385504, upload-time = "2026-08-24T12:11:22.665Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/69/5c01b461044eb1f45ddcce006706eb88110c793cdb11c7ae0b5e08492e94/maturin-1.15.0-py3-none-linux_armv6l.whl", hash = "sha256:6bf6dc62e22d4dcfd5a51244ff0d58975fa4979c48209fe84159617648956d82", size = 10206220, upload-time = "2026-08-24T12:10:53.327Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1f/2b431554e11687cdb1077e0cdadcc118c53f611086b3af00c8545a67c6a5/maturin-1.15.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd35772633f489841132bc8e71d6fc7f842df30b9c05cd5cdf1ee1ddcb744cc7", size = 19416513, upload-time = "2026-08-24T12:10:56.126Z" }, - { url = "https://files.pythonhosted.org/packages/51/36/e23a21cb34a648b711036b9b2fe1d4f3f4ee24f8db54215d73f1a9a3a3ec/maturin-1.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c40b4eae7bf5ef1f4b1af8d623fe4105016f93578fb15b764e741d08ec3b92dd", size = 10014962, upload-time = "2026-08-24T12:10:58.486Z" }, - { url = "https://files.pythonhosted.org/packages/8c/80/33b15cb2d8f30f12c807955e8f2fd775027692904e30ec0784744ce8cd83/maturin-1.15.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:7eb066372f541f8eb4909c79c5d9bd0b9e8125980bdf1ec9e8aba23c6c8d6c55", size = 10196223, upload-time = "2026-08-24T12:11:00.696Z" }, - { url = "https://files.pythonhosted.org/packages/fe/91/b495e19e2f5c503b540452b2039115e7b2363867e8c5ad4179eb752fa92c/maturin-1.15.0-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:653020a63525bb224e5ab0adf02e17a2e08bc86dbea7fc1399c9a56d7529b99e", size = 10541186, upload-time = "2026-08-24T12:11:02.857Z" }, - { url = "https://files.pythonhosted.org/packages/5d/2b/2abff58037188d852b124871b1f0d720e1c2bfb3d4f1b03d87c52cd66488/maturin-1.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0ebf9767892725083138e671c34482c660317a2f3d6a29fc0e0f34e9d8c99136", size = 10083468, upload-time = "2026-08-24T12:11:05.012Z" }, - { url = "https://files.pythonhosted.org/packages/3f/07/b7e9f8be99a6627849e81ac7b6694876bce8f50a92995fe17e3cf2610f0a/maturin-1.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7ab7eebffd7b8debca2265985de4eaeb332141276d24b9560b5ad484d4b3add1", size = 10047786, upload-time = "2026-08-24T12:11:07.042Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ab/167e3cb7accee11b507dbe53e0e87aeccb376d44ae66284c96ee4df3a9fd/maturin-1.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:126e12e618b4db42f68c779a56d41f82a390145ba36ac3f621d057eb34f5ad9d", size = 13315332, upload-time = "2026-08-24T12:11:09.433Z" }, - { url = "https://files.pythonhosted.org/packages/14/4d/801379f646cbc6b00998e5289b0630a886be3a4ee4c75b6bc9b87478a7f1/maturin-1.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f9d33e6c3f9615c8caceecbbbd440f8eb25a3ddeb687077682cd5eca2e9ae15", size = 10807183, upload-time = "2026-08-24T12:11:11.73Z" }, - { url = "https://files.pythonhosted.org/packages/89/27/2e612e1cbd1580e9e94d4722c227b5180dca27b32b955a34b79918aa1292/maturin-1.15.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:bf29beddd0c6708f112db51d5275fc28b28b9e9c9c5faae387eaef662918b176", size = 10413274, upload-time = "2026-08-24T12:11:14.04Z" }, - { url = "https://files.pythonhosted.org/packages/70/d8/202a7b4d75a51f20f84ec9ce3b7345b12b822207072164e2b1c6ef665125/maturin-1.15.0-py3-none-win32.whl", hash = "sha256:da649988be98e87e009e51b1bf0d301b6a301bc0cecbdd60d40d8ba60748d1ca", size = 8928744, upload-time = "2026-08-24T12:11:16.269Z" }, - { url = "https://files.pythonhosted.org/packages/40/dc/4e90da594986ba78dd3bc8a5921ecdcdb11085b22b02a412caab3b225601/maturin-1.15.0-py3-none-win_amd64.whl", hash = "sha256:552c2be4afd43fe8d5c9f3ec8d4c4756d973b8dcbe94c14084390301f50243e1", size = 10335085, upload-time = "2026-08-24T12:11:18.326Z" }, - { url = "https://files.pythonhosted.org/packages/8b/10/15d4314edf130955edf2dc237aa393a8a7c10f2b9b57b89fa2f61f915659/maturin-1.15.0-py3-none-win_arm64.whl", hash = "sha256:c7dc0c66c78d3debdd9c5aa807e861fbcbf07f3505d34b125df74c03986b0f48", size = 9713795, upload-time = "2026-08-24T12:11:20.83Z" }, -] - -[[package]] -name = "packaging" -version = "26.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, -] - -[[package]] -name = "pycross-rust-rs" -version = "0.0.0" -source = { virtual = "." } -dependencies = [ - { name = "build" }, - { name = "maturin" }, - { name = "pydantic-core" }, -] - -[package.metadata] -requires-dist = [ - { name = "build" }, - { name = "maturin" }, - { name = "pydantic-core", specifier = "==2.47.0" }, -] - -[[package]] -name = "pydantic-core" -version = "2.47.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a7/74/319859f70c733f341df03823c8ca27ce9003faaac3ffa3110f3af1c8641a/pydantic_core-2.47.0.tar.gz", hash = "sha256:422c1797a7864b2a9a996435aba92fe571fb80190f67a31edbc1ac040c7b51fe", size = 476601, upload-time = "2026-05-22T13:19:00.229Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/e0/0da7149bbd84c438beb208e17174d03a798f2c8ce5a978cbc19fb3052be6/pydantic_core-2.47.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fe87ccbc39a103709d0a5afa75240c15a94611af129261e9484bef0bc97960b2", size = 2114007, upload-time = "2026-05-22T13:20:19.05Z" }, - { url = "https://files.pythonhosted.org/packages/51/30/362c68ac4dc1a830066bf250850725d95be0567bb6a85434616ac68f5939/pydantic_core-2.47.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45882c24324f123037982c65eb8d60da778447e6bc87c82241f81d6c6d2c307e", size = 1948028, upload-time = "2026-05-22T13:19:25.939Z" }, - { url = "https://files.pythonhosted.org/packages/60/d6/1dd26612212fab9145a2b0d876459764ad04248331cb6f61ab4909fddc43/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983e39b39547772543f3518557d0a86dbb3b7bb58bf8e82faba1e0cfa3e816d9", size = 1972491, upload-time = "2026-05-22T13:20:35.379Z" }, - { url = "https://files.pythonhosted.org/packages/ed/c4/00b31fd04acf601efff148add88cfe5f3c21f43f872e79f76e4580cfaf18/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3eb92447d3a079b945b61b8cbd6c3ec2954de3655c4efa0ebd35b069e472c2a9", size = 2045790, upload-time = "2026-05-22T13:18:25.672Z" }, - { url = "https://files.pythonhosted.org/packages/8b/33/7d1a8116bde9d259b3289090a2d93b87562001731cdf81d78bef5d1060d8/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af9600c680bec4b8d23c32ddaf7a5d91ed39a2cf758c082e34e860140cdcd87", size = 2223039, upload-time = "2026-05-22T13:20:37.64Z" }, - { url = "https://files.pythonhosted.org/packages/cd/f6/4c94adcfe1bdaad3f8865a2115bed02e02cba809ffab25c0f85c0cc9b78a/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d6098342d4510a9034a500a53b1d737daf9cfc18a47cd21047d02d7d1587557", size = 2282031, upload-time = "2026-05-22T13:17:41.455Z" }, - { url = "https://files.pythonhosted.org/packages/b6/4f/7fe179b37f887297a5bfd7b38a4a26cd485748b6b424c43c73a36c02f57b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a891c20be5110deb1904f639f3615ec5022b3495995850d1abe7b8fa1550b5", size = 2088600, upload-time = "2026-05-22T13:17:36.643Z" }, - { url = "https://files.pythonhosted.org/packages/fa/15/daef331c1571ee986e1410511218c4d58e6ead75e0db735051925caa572b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:13990d357a50078e382b15fa3ce3f08043223b4be3eaeb340b184f54c1a2397a", size = 2112087, upload-time = "2026-05-22T13:19:30.024Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c7/7cfbb736f9ac501a92171e93bf640d065a13e12dcbcfb7effd21cce2f1ca/pydantic_core-2.47.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0f7343305387bb5884f24d384b7978ad099a277b27529e592c041a502a37c32", size = 2171199, upload-time = "2026-05-22T13:19:12.183Z" }, - { url = "https://files.pythonhosted.org/packages/5f/03/48e63b1f7d2088d747dde98b5dd7b89a46fff9173b6c10dc6189289c4aa5/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2c5e11bb1be2de2707c9367f364e73091ef30d34be54b3a4564d7421ac1a16bd", size = 2176850, upload-time = "2026-05-22T13:17:39.318Z" }, - { url = "https://files.pythonhosted.org/packages/15/8b/e653f7723f1dff5c054dada5f5d7f2c294067c087a52188847a0414cff2e/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e1b52aa981e034896712460c899ee30707c8c6a385e79bb7648aac76c748a3da", size = 2315368, upload-time = "2026-05-22T13:18:36.365Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ff/5aa6fcde3bd427648fee1a363671d8b4852c716603acd77091fb4cf1fc3d/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57d46021c20d4efc28f69b4ca4670dffbb7bdafa51d1967b747849726ec643b", size = 2351750, upload-time = "2026-05-22T13:19:28.187Z" }, - { url = "https://files.pythonhosted.org/packages/85/1d/6ee14bea4426d6bc421033d8d6ec69a6938d5773f7bd1d535b221fa48a7b/pydantic_core-2.47.0-cp311-cp311-win32.whl", hash = "sha256:d93c02ae8bd33f73624319d85cba47e754155c5bf104c0c5ca96fcd1f3094939", size = 1971464, upload-time = "2026-05-22T13:20:30.718Z" }, - { url = "https://files.pythonhosted.org/packages/cf/6b/e466253efba866851af6e1094c488b4c5fb6adbfd8993d13e12b2a575541/pydantic_core-2.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:859ca679f00e5feb11b58b616eb7bc0efbb13654be21f5c898e510e27671c900", size = 2070625, upload-time = "2026-05-22T13:18:17.224Z" }, - { url = "https://files.pythonhosted.org/packages/c1/27/10628ab2df9f2421b6f3b88add9e026f1cb79198be417ee7d684ef0de5d7/pydantic_core-2.47.0-cp311-cp311-win_arm64.whl", hash = "sha256:482667e5b7a3e97b0836f33a716199c4ec6ba9c896ca4db6eae799ec527c1e64", size = 2052484, upload-time = "2026-05-22T13:17:32.654Z" }, - { url = "https://files.pythonhosted.org/packages/19/23/2daeff7346433ad9a3567852dd7a716329f9a7952dcf1ee74b166271bdc7/pydantic_core-2.47.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:70a7aeba54854f5d97da65cb1a61f000f53df3704cab41cd81d65ab127ddd031", size = 2108216, upload-time = "2026-05-22T13:19:31.898Z" }, - { url = "https://files.pythonhosted.org/packages/6c/70/2989cb5112b892b7dc13af570ff57d0f383f770fc88bbb644262df1b3017/pydantic_core-2.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c0e97329e38228f57fe1f2d91ba0ef39cc75cc1a84fe6ef58942d2fc6cb406bf", size = 1951502, upload-time = "2026-05-22T13:19:54.702Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a6/2417d8b1856cf7579a21e2679f02417b910e4f29120303e2c45137525072/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:faf83e50714837af72f13e9369c50377552a4a74049d4477bed51c7e5822d94b", size = 1975590, upload-time = "2026-05-22T13:17:26.586Z" }, - { url = "https://files.pythonhosted.org/packages/fc/71/0cd0813355b385bef8fa9a719982e0b44847afedc043b988c9f7c5d02ca9/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f50abe60347bf8afe2b2f58db86cf3ac6e418eec7ffa01d9dc90ba29fc64f243", size = 2055885, upload-time = "2026-05-22T13:20:42.378Z" }, - { url = "https://files.pythonhosted.org/packages/a3/33/5687c6dcf8ecca106c95b2a49f04a633320ab49961da6e57682db37b4482/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f13b18e7dec056336f29ee77dea3cc5db0271d6215cac7249cc5c61b0a49d293", size = 2235292, upload-time = "2026-05-22T13:19:17.723Z" }, - { url = "https://files.pythonhosted.org/packages/36/98/08e81f1a0f0aa82cfa1a4d07b66eb116740fd6c82ba4baa8f96d4b377132/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3aaabbdbbbb8dff33fa053ffb2c980f39dec745fc03592f50e1e010449129841", size = 2308945, upload-time = "2026-05-22T13:18:38.113Z" }, - { url = "https://files.pythonhosted.org/packages/04/f1/6e35bdbdb79f96e630265297452d709b2ebd5facfbd83d3eb702eee24939/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d2907ee6d15cf26787bfbeb4c42e18e52f358086eab91baea961a0d909248d6", size = 2093861, upload-time = "2026-05-22T13:20:26.271Z" }, - { url = "https://files.pythonhosted.org/packages/1f/c4/6a48e5da6a567bcf6d3ab113d2d476e1b93e3be941b4c486918f1c9d6714/pydantic_core-2.47.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:c413761260967f4dbb51135e1b49f30a1c29e15bf371fbb39754ed6475739545", size = 2124948, upload-time = "2026-05-22T13:18:15.728Z" }, - { url = "https://files.pythonhosted.org/packages/94/a1/e356c98dfc6bd5e6e166f2c832865a62941370b17a7199d35bc5999fecc8/pydantic_core-2.47.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bb527ac6e5a9721023b24615e1a55c01f47c60007f08b7d2afb89ff9c7a0e22", size = 2182065, upload-time = "2026-05-22T13:19:07.986Z" }, - { url = "https://files.pythonhosted.org/packages/63/aa/6e99aac0a891b05cc522cc464aebeec2bb877fa4744be641a013ebc1785a/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b3abf7fd5e6abe483a63413f9cd26b7c93c20780e19c8556434c7279f6b2f10c", size = 2185830, upload-time = "2026-05-22T13:18:34.551Z" }, - { url = "https://files.pythonhosted.org/packages/99/68/c6c5c1ad40b4d58f11d6e754e9c3990a2a3cfff20a9cf5c1f0a855a791b2/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:9cefe43d17a5a273d71697c084d3787defa7f578cd5fab4cef4c66d13c9e44b2", size = 2327330, upload-time = "2026-05-22T13:19:48.203Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f8/064747538297e385a1f197f35551d1bf6093e88c5ce9b4e15c035f0a1cfe/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:38a8b5371b7938e4f6c31060dbd51d3b3229aef7c43eaac2eb8b153e43c3f189", size = 2366505, upload-time = "2026-05-22T13:20:11.895Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d5/2d8715ef982c0b1875e42f4248b48439133a2781f0be77f0e4dbc84d147d/pydantic_core-2.47.0-cp312-cp312-win32.whl", hash = "sha256:b87e95e644df2a36bd631dd0d6e097aa73d19a55adf7b1724ebdeece3d9c76b7", size = 1957410, upload-time = "2026-05-22T13:17:38.025Z" }, - { url = "https://files.pythonhosted.org/packages/0e/ea/9d908a80798db41c7c38926259ed74d015869f0afe4be6ed56f71793a084/pydantic_core-2.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0078c5695322050ccedbc86eafaf3e2548439782c51d99e575de0e31b9fe4f4", size = 2072354, upload-time = "2026-05-22T13:17:42.779Z" }, - { url = "https://files.pythonhosted.org/packages/fe/78/5549cba47c662ec7f05d79527474786e5ff7f08ef3e65a409a8a2ab6013e/pydantic_core-2.47.0-cp312-cp312-win_arm64.whl", hash = "sha256:7eedc31996e9eba3bdfbbc380805ac6d765c889b7e93b17cd00ecb0200fd6dca", size = 2035452, upload-time = "2026-05-22T13:18:18.75Z" }, - { url = "https://files.pythonhosted.org/packages/7a/91/810cabda42f7fdd13b349702694e1140f6071fd42d1e542d606d5ad0c2d4/pydantic_core-2.47.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:263560ece98bffbbc0a8047ce60b8a278c859db6a2a4e30d9454b02891045eca", size = 2108548, upload-time = "2026-05-22T13:18:09.878Z" }, - { url = "https://files.pythonhosted.org/packages/fa/87/f444a6d63bcbdff3c45291df842941ed56c568f45dd3742f25afb567b5a2/pydantic_core-2.47.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a7fdaff39a66bf66e9037da482575513d2f20bfb02ea9d9222b5cb3b902fc695", size = 1951421, upload-time = "2026-05-22T13:20:32.973Z" }, - { url = "https://files.pythonhosted.org/packages/f5/09/c90dff5407c11e59023161c84df19dd5ed93966a23b2f08cd21d45812ab9/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e6c8ee5ce8c270bfae09763ae4bbbccfe81090c97d670a621fb86cb1ef6042", size = 1976554, upload-time = "2026-05-22T13:19:04.085Z" }, - { url = "https://files.pythonhosted.org/packages/95/cf/55fbe9f1b396f91005cd1cb7acf2bcf380a1f1b57e261ac78bcdc0ff42f3/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e38cdae682cfec4b3816722dccf6376ca59049726d57dca83c2fe7cc13665589", size = 2055005, upload-time = "2026-05-22T13:18:12.809Z" }, - { url = "https://files.pythonhosted.org/packages/1b/c6/4f7cbaa62582e95c080cdd45fb5d4350ff05dac87ea32930c75dcb427bf1/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc3193ff0b7e2e168f84c6185e70475738c191f3154e0af8f897cd0f8f9a489", size = 2235489, upload-time = "2026-05-22T13:19:13.994Z" }, - { url = "https://files.pythonhosted.org/packages/31/75/16913c82ffd194c537222b3d0e8a05c11681e551add67308ec4af6023724/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57ff41672a615f38af528ee904602be51c653248354e5db8e9252668abe91e68", size = 2308360, upload-time = "2026-05-22T13:18:39.894Z" }, - { url = "https://files.pythonhosted.org/packages/05/9f/b24bb1b764fc360adace5df806a81fd62ef1662df2973891e487c3fd5a2c/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473b9a2b2a1f0dd55cbb32d2b902f93babe7f141a0bb48fb4d3d4d2b3e93e9a0", size = 2092549, upload-time = "2026-05-22T13:17:45.38Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d3/0268ea5972b91178250c0a573bb54c17f697665cd2aa35623087a3589fc6/pydantic_core-2.47.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:195f9c4ac43a7b2a044a7b86631c3352abdb820bed2823ea29f98f779255f459", size = 2123849, upload-time = "2026-05-22T13:18:03.817Z" }, - { url = "https://files.pythonhosted.org/packages/8f/92/26b2147738a89f78925775bb4b34ae53f981ce880ee77ee2c2ccbc49466a/pydantic_core-2.47.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c1cd10d39ef1ff8bcd68b6865bee9c434631ac0608d402fe86e678851c2e2a5", size = 2181733, upload-time = "2026-05-22T13:17:35.308Z" }, - { url = "https://files.pythonhosted.org/packages/d6/fa/8a858dde4784c7245b7216ab9a71518cb1a898a83ffb5c0509181789de19/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7cbe66352fe2b39511d49150e5b52159429cd21f5633a3e801dd2c43829dcdca", size = 2184065, upload-time = "2026-05-22T13:18:11.369Z" }, - { url = "https://files.pythonhosted.org/packages/69/20/ea165877f965622e021f04d63330f9ceb55ede0aefa862863e06a9a610cb/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e35192a1d53e55d510d8bb1023c988c7cdae6d94539074971741b2a7656e49a1", size = 2326881, upload-time = "2026-05-22T13:18:41.477Z" }, - { url = "https://files.pythonhosted.org/packages/7b/d6/ad22a6f0941be5a5478e6c378d0ec3c7641be96d7a86a3ea1f9e9830a269/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81de54576de2e20baec76cc5afae2820f9049e6fdc4f357bac3391da02d0ba97", size = 2365574, upload-time = "2026-05-22T13:20:02.947Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4e/eb5e3429dd29311e75ab89313cde09b709b0637fd88838d2cb4a98760b02/pydantic_core-2.47.0-cp313-cp313-win32.whl", hash = "sha256:05da6647bdfd3888936ac10aa39b239d659f3c93dff281af0fc5943eb55629dd", size = 1955451, upload-time = "2026-05-22T13:17:31.178Z" }, - { url = "https://files.pythonhosted.org/packages/15/12/ec107c12aa8729c766285d4aa6caa5f5addf8b2ef6cfd35c455a3ca5c66e/pydantic_core-2.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:021220e0a03b66112737ee1fc49759340ce8fafb8d9ade1b7fb366b06033fa45", size = 2071285, upload-time = "2026-05-22T13:19:50.585Z" }, - { url = "https://files.pythonhosted.org/packages/f4/02/b003a55acfeb35823925d1cd502b80e3fe6c5d477865c36815fbefdf49ac/pydantic_core-2.47.0-cp313-cp313-win_arm64.whl", hash = "sha256:55156ee2f6f561ea4e25ab55f84bd70b9c9ed2546a834cb2b038fe10225aaa37", size = 2034804, upload-time = "2026-05-22T13:18:32.64Z" }, - { url = "https://files.pythonhosted.org/packages/ef/46/a4675c783822e229bf04e290ae28cf5a057b00a46039498743b066e0fefd/pydantic_core-2.47.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6e37a6974fbd8fa7cae12285a76970d50b3689ffd6ed7c7fdd176ba81dd22d0e", size = 2104537, upload-time = "2026-05-22T13:18:05.312Z" }, - { url = "https://files.pythonhosted.org/packages/67/bb/f6d6d1dd8362d616b227b55af8bc2d1b7d4ea842facb7c50a82298ba3b9d/pydantic_core-2.47.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2433b8524785cc117e602233bc574879bc8d87f09523edeec51665d5c46cf42d", size = 1951581, upload-time = "2026-05-22T13:18:14.244Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ae/7d01ed8658ccf8beae8a3fcf2cd023c3ba0ab0b19d3f456845a709cece94/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f9f2be064c8bf1189f46f7062fd42765d94f59cfb7db7ef8db19563192110a", size = 1978461, upload-time = "2026-05-22T13:19:15.829Z" }, - { url = "https://files.pythonhosted.org/packages/80/e5/dd38ccbd1e68f1c3fd7f8b413a8b32db11bd16d5999c3dc3aed4e54290df/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1f0a9659a2eb161573418e3138f616101ba21bbd2ff04916dca7b6712155e015", size = 2049444, upload-time = "2026-05-22T13:19:06.258Z" }, - { url = "https://files.pythonhosted.org/packages/7d/63/0cb998f3f4ea4255ab6d891e2537d4566cd31630df0d406ce45b00306729/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2995074b99242aa28991e0120a3c881babc139e08750a05b7ea7d140644e091d", size = 2231772, upload-time = "2026-05-22T13:20:05.22Z" }, - { url = "https://files.pythonhosted.org/packages/3f/20/2cacf5c4a1bdda1356351df38f343c6cf13af6194e6e0ee0f7967395793f/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5b224dc04c3ff9b08c24419464eb7f6ad7a1049e12284a00bf80df82bd15fdb", size = 2305322, upload-time = "2026-05-22T13:20:14.552Z" }, - { url = "https://files.pythonhosted.org/packages/e3/8f/b7e09086bd48b1ef3f74227ed98907496924a622c7f9315cf661946233c6/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:264361b7236d4374fef6342908f87d084a0d58a2f8d0811e99f714309cb0ba7e", size = 2097748, upload-time = "2026-05-22T13:20:21.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/27/2927049e93f6fbbaa838b2bb656dbd63c6d6fcaab9909d632fd93573ebd9/pydantic_core-2.47.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:53368beaf693f6302a6e33bdefe950857534a04d282811421bd20176d0fb5636", size = 2122971, upload-time = "2026-05-22T13:19:37.977Z" }, - { url = "https://files.pythonhosted.org/packages/f2/3b/80b58a0c7f4339f024ad5c5b6316bef895536abf75c45dc85f0c83ae1a92/pydantic_core-2.47.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5d2177b44ba7d9d86850f865f362feeaac6a2ed8517a9b505b97ff0b7fdbd7dd", size = 2181287, upload-time = "2026-05-22T13:18:20.601Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0a/dfcb9575603aaf113d2cae1fb622570046a210276eba2267764b3f83f4f2/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fb57a6b538ec7a01b937986bc093aec530fb056135b6bc9cfdd0bf8460c25bc2", size = 2177842, upload-time = "2026-05-22T13:17:55.981Z" }, - { url = "https://files.pythonhosted.org/packages/57/c2/31a198c8180b417d18410e7640c505b39c51ac291aca34f71ac37093f4c4/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:18c9c7c3a18e9bdbf1215d913f6bd00e17595dc92949817935cb87a3cf5f1697", size = 2321802, upload-time = "2026-05-22T13:17:54.495Z" }, - { url = "https://files.pythonhosted.org/packages/11/2d/052d872b61f88d2f71b3d881c08abfbe33cb9d64bd988712bb4fb973001c/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2f72a382886ca85bb1247303b9134cf9978c9d454de62e710a1ebcd9d2131927", size = 2363870, upload-time = "2026-05-22T13:18:45.053Z" }, - { url = "https://files.pythonhosted.org/packages/be/60/c8c985d4081dafaa88fe6ac6a41ebe2b82d289c391b2bcbd3508f585e7a9/pydantic_core-2.47.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:cdf4dc2cdd0eacad1bd81c4d25422b4c25b206acae095d2d64e5d5cb7facc6b3", size = 1369335, upload-time = "2026-05-22T13:17:51.719Z" }, - { url = "https://files.pythonhosted.org/packages/42/70/30dfcc18dc5552f7235ae2ffd7b699a1ba0d38ebfcdb97f371c792d61601/pydantic_core-2.47.0-cp314-cp314-win32.whl", hash = "sha256:1e859dd5e06e9807080e14995db131649a77c61131cc464a7fe492a69ce82488", size = 1952107, upload-time = "2026-05-22T13:20:24.07Z" }, - { url = "https://files.pythonhosted.org/packages/fa/49/f5c517ba99b9e1036ead16cedd0fc189dbcbf900fb0b85b746b6a0b9b389/pydantic_core-2.47.0-cp314-cp314-win_amd64.whl", hash = "sha256:234ecade0e358caa1ea516c218b3f61e61e30532cad1a8bb12f2487325838548", size = 2071388, upload-time = "2026-05-22T13:18:46.74Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6c/6b95e00ed7a3c7f78cb8544bc34cb29412c05512af507fc4466912576d50/pydantic_core-2.47.0-cp314-cp314-win_arm64.whl", hash = "sha256:58158d0111e86893bc35aacabe509f951ed303cddf8cdba43533190bde317914", size = 2026046, upload-time = "2026-05-22T13:18:22.112Z" }, - { url = "https://files.pythonhosted.org/packages/22/2c/fa67f96f381ba3c83e8cd75a6eb3c538e123d8d02e19d80383bff01ffda0/pydantic_core-2.47.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:24017fd3befd4d7cc4a8c71f4a1e9a44d29fdc91723c5446b0e795ab808adee7", size = 2102407, upload-time = "2026-05-22T13:17:46.882Z" }, - { url = "https://files.pythonhosted.org/packages/9b/e8/99abe6c33db3dda235a2095eae5fdd03266857abd9be1c50ed97a59587c3/pydantic_core-2.47.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dfa0820888cc4549fcce7e6bd8affa7d75198d885ccd0bb0760def4bb8461862", size = 1931963, upload-time = "2026-05-22T13:18:23.776Z" }, - { url = "https://files.pythonhosted.org/packages/5c/dd/96d1884f65737f793e64b6b8745ee793e3cb4735e086ead0a40e5349294e/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d507f331756f7066cde7c9f35ed78fa78223a54369dbc8a34d6da7a5074fa1", size = 1973492, upload-time = "2026-05-22T13:17:22.128Z" }, - { url = "https://files.pythonhosted.org/packages/07/8c/0504f091c75b229cd07d61b45464d7c5291c3ecf2e7d847f215fe81cf5e5/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c4a885fb50c05903bc703a00830616e680304fdcdd90fc9535a52e72debe712", size = 2035548, upload-time = "2026-05-22T13:17:24.958Z" }, - { url = "https://files.pythonhosted.org/packages/0f/bf/e9f69c55ef6c945d29e4afb306f62a15354bfd09f1ee25d9aecd4c6cbb82/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b107cbd764bf68f12a57c7aa5846d868bc7463490a1ac2d0f19bffef624c5a9", size = 2238356, upload-time = "2026-05-22T13:19:10.309Z" }, - { url = "https://files.pythonhosted.org/packages/b3/1d/dfbd214487033093f5946c1fd5915ae5dc6b278efe764397b5e2ef8092a8/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b5f46412c8226d0c8f1f423c324c75afe342e4b854836933579fb484f68598c", size = 2284799, upload-time = "2026-05-22T13:17:27.959Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ec/f80488fa26a6b27bd0d1267f35b0fce3bfeec23ca97021085a94ccd3adc3/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90cbf7e35d597503cbdb5cd85409cbb75f377290bc7e8e37cc5dfe4f5cc66cf8", size = 2107895, upload-time = "2026-05-22T13:18:27.282Z" }, - { url = "https://files.pythonhosted.org/packages/9b/1d/67ac210745f63a982b145d8f281dc76bd347d98052792f087224a178da54/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:04ee7ba7172cb4484af51b2890f19069d35773698abc8c6ebb651f52fbf41134", size = 2102797, upload-time = "2026-05-22T13:19:40.139Z" }, - { url = "https://files.pythonhosted.org/packages/6c/75/f3b9bd4d88fcaad9a5abf2ec6969f37a70e34f40a5f8d2d78077f168e83d/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a7acb3e120ddba94372b8146e62ea3a0bce203180e34641c817c87f995c91e0", size = 2160123, upload-time = "2026-05-22T13:19:22.354Z" }, - { url = "https://files.pythonhosted.org/packages/13/1b/e94ac13bd17c341e86c4b67deb47b63718208fe413034fdb01e7a4bf1dd8/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:1a2f7ceb58013d167d8c96f10ec9b3a137018c819ba356f68ff1cb74302fd22e", size = 2164386, upload-time = "2026-05-22T13:18:48.372Z" }, - { url = "https://files.pythonhosted.org/packages/36/e5/862ff195402f5b08db9ad4d9ebe7cbed993f51528aab7edcb62531442556/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:482b097637fec5037eb13fe9f9d5fe47e568a5b451d686bc2b854076cc0b50ca", size = 2303767, upload-time = "2026-05-22T13:18:50.211Z" }, - { url = "https://files.pythonhosted.org/packages/c2/05/c8ebbb97cf44686fc9cc64a6bb86ac72a8871426a9f61417e395d77c4894/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a8c7f5fad73eb404f4b84c75f3d9d3865b748ded248b7366341db6e516fc502b", size = 2361148, upload-time = "2026-05-22T13:18:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/c5/8b/4695ec6ce81eda7cc822383de993c5b2c289cfc84d3f032a30c55eb238fc/pydantic_core-2.47.0-cp314-cp314t-win32.whl", hash = "sha256:f343c39928097175acf2f7d0cba5c00b0f62265d88a173a4ce264266ac849bd9", size = 1939588, upload-time = "2026-05-22T13:19:42.151Z" }, - { url = "https://files.pythonhosted.org/packages/96/4d/bc2e188ab648b3ab284e80a0340c5d5b9723c22572c6e36ba39eb300e718/pydantic_core-2.47.0-cp314-cp314t-win_amd64.whl", hash = "sha256:52d40e074da44e42b2425aedebd513e405a31807036ef597175117a9b01743a6", size = 2049697, upload-time = "2026-05-22T13:18:08.244Z" }, - { url = "https://files.pythonhosted.org/packages/6f/46/ca1e6813e029993e57340c6a37740450c51919e3809472f79060f4d64cf0/pydantic_core-2.47.0-cp314-cp314t-win_arm64.whl", hash = "sha256:25cac08c9735e61e5c0b9f7a85c438661fc0e9da226afdfa984c3da6c5942a5a", size = 2025906, upload-time = "2026-05-22T13:17:50.322Z" }, - { url = "https://files.pythonhosted.org/packages/1e/a3/7391a9a511aba60ba119dcbc221a36109dd05ff498dcd6e6ff7222a21b76/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:dbe50ffd50c7e1b8e3bedafafd10fabe8a7cf51916f995fd57316eb1293f2439", size = 2112946, upload-time = "2026-05-22T13:18:54.846Z" }, - { url = "https://files.pythonhosted.org/packages/71/74/1d0fe337fa5a89069731206be4da2b41793b8f8fe28f34ed4d941028a62f/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:67c3f4b57a1cda846a9b6258e0ef70f99b0757d0b6a55f7e3e5b100620937d2c", size = 1940704, upload-time = "2026-05-22T13:18:00.366Z" }, - { url = "https://files.pythonhosted.org/packages/ac/75/d40231aed211f97ffc3264d7a7c98d1f52f7b9c8d165cee75c8c1c13e5c3/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1e025c83b3987784191ec5aa78cfb94686f1ba73d98ae4d520c09cdecda8d", size = 1985024, upload-time = "2026-05-22T13:17:29.331Z" }, - { url = "https://files.pythonhosted.org/packages/a6/bc/e27d3fb897c5b059a508b88eb7c4cc1f0fe600be3231728bb003e1e2b464/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547cac87585ab8a6e9495fd3be22ae8ccaabb3c909f6ae589a180677c105cc8", size = 2136202, upload-time = "2026-05-22T13:17:34.031Z" }, - { url = "https://files.pythonhosted.org/packages/4e/21/81cc7e3acbf7d4eed41e9585e81b5840aaf6ddbe65974a20946038d6516b/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:d648515c65f8871ceca6a0446be32fb1a0aae414db3907ec0df6cc2380dd0c04", size = 2098016, upload-time = "2026-05-22T13:18:56.902Z" }, - { url = "https://files.pythonhosted.org/packages/4f/6e/c98e869e9f754f18088ad9b55887972d08606e7bf81dba088779e927eb65/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3292813ac8ed17671a5b1ac8256b6e98b96c29c1c6d061c35899e2f6e0444cac", size = 1931175, upload-time = "2026-05-22T13:20:07.566Z" }, - { url = "https://files.pythonhosted.org/packages/5d/65/ce0d773f4b51dc332764ba1bd585c81f62d5c92231a66d152aff16be8dfa/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf3cfcea028f41a9b42a47f4a53d72ca4274d04e3ee525bd58ca89ea8c5e1910", size = 1995356, upload-time = "2026-05-22T13:19:44.143Z" }, - { url = "https://files.pythonhosted.org/packages/19/2c/6e63683a77d342c93bad67bb0762ca8fe1d8418acc8617d70ccdcc5ec5ff/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52afdd8640d59890539060e91c8a494cf96b463e63b2ba499cc5c23abcb5e96b", size = 2144893, upload-time = "2026-05-22T13:17:59.008Z" }, - { url = "https://files.pythonhosted.org/packages/f1/bf/06a01e2f6668aa10646e5c9b050a609d975a93d58454e26e16fd9f82cd38/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ff201e8b93cd6a3849ec3fecb1d642d0391ca4a387f1162adaadddfd1986598c", size = 2114751, upload-time = "2026-05-22T13:18:02.245Z" }, - { url = "https://files.pythonhosted.org/packages/41/50/caf4cc67fdd664baf89bfe264d72079e901a02d903c813ced9de173cdd69/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eba39fca6e1fc7c58a5e6b5c320c6eec86014f7075dfa0fb1a79076e00304b3a", size = 1947894, upload-time = "2026-05-22T13:19:36.12Z" }, - { url = "https://files.pythonhosted.org/packages/9f/c0/96ba102865c9ccb945a758272741d00175837bf32bb71750f6e2bf4543fb/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b494566e8e7e1a3992a550900902d6c0051538e53f5957e24003e7775638a24", size = 2131698, upload-time = "2026-05-22T13:18:58.55Z" }, - { url = "https://files.pythonhosted.org/packages/b9/f8/ee7c5d4eafaecdeaf92ce84f48d748c139888e90fa25b2ae988c5aea874c/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c96f745745fe778a92e74f40675c57b80dd46fc98186c9020e5ba4514a0470bd", size = 2157797, upload-time = "2026-05-22T13:17:53.079Z" }, - { url = "https://files.pythonhosted.org/packages/08/69/b3eba1d0e015cee3906f7056cfd9ed383f6cef486fde5398a002df2594e4/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dbfb8f8ac48a8fd5a9f83cdbba0a23796f3ff5f9421c735808ed134d3318046f", size = 2177829, upload-time = "2026-05-22T13:20:09.611Z" }, - { url = "https://files.pythonhosted.org/packages/8a/36/a0ceff9b7c3a0980128c9ef763db1e9fe9c2b1fcecf6ed055e88af39f123/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:4ded2d8dc3beb086623ab3256b81a0b51fc026c94eb363f480aec09b204a1cbd", size = 2307425, upload-time = "2026-05-22T13:19:46.177Z" }, - { url = "https://files.pythonhosted.org/packages/d6/0a/930e210e95ade33ecacabc4ba822aa1662a0aaf843d2cf57abce27fb95b1/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:25f8aa59fd3f85651387c37b289cd8f0bbc8f632e7dad13c6b837759e78be88d", size = 2351547, upload-time = "2026-05-22T13:17:48.597Z" }, - { url = "https://files.pythonhosted.org/packages/2d/0c/90941408bb6c1e84563d99177c9e62c536dce0388b5a8bf37b90b4f6f095/pydantic_core-2.47.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:0ae0096729c64aa6155cef74e75d1945017b01cfb82f313a18d843fafc497476", size = 2180871, upload-time = "2026-05-22T13:19:56.696Z" }, -] - -[[package]] -name = "pyproject-hooks" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, -] diff --git a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel index 9e47530a5..ff506def6 100644 --- a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel @@ -8,10 +8,9 @@ and a rustc wrapper whose sysroot merges the target toolchain's std with the exec platform's std (build scripts/proc-macros are always exec artifacts). -`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build -detects the maturin backend and emits the toolchain plus an exec-configured -rust_host_sysroot into the generated pep517_native_whl, whose -CARGO/RUSTC/RUST_HOST_SYSROOT make variables reach the helper's env. +Nothing declares Rust: sdist_build detects the maturin backend and emits +pep517_rust_whl, which resolves rules_py's own Rust toolchain for this +exec/target pair; the helper maps its cargo, rustc and sysroots into the env. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -24,7 +23,6 @@ uv.project( hub_name = "pypi_pycross_rust", lock = "//pycross-rust:uv.lock", pyproject = "//pycross-rust:pyproject.toml", - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel index b359dfd38..5e44df2a9 100644 --- a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel @@ -1,8 +1,7 @@ """tiktoken: setuptools-rust sdist build. -`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build detects -setuptools-rust in the build requirements and emits the toolchain plus the -exec-platform sysroot into the generated pep517_native_whl. +Nothing declares Rust: sdist_build detects setuptools-rust in the build +requirements and builds with rules_py's own Rust toolchain. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -17,7 +16,6 @@ uv.project( hub_name = "pypi_pycross_tiktoken", lock = "//pycross-tiktoken:uv.lock", pyproject = "//pycross-tiktoken:pyproject.toml", - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) # tiktoken's sdist ships no Cargo.lock, so nothing pins its crates; this one diff --git a/uv/extensions.bzl b/uv/extensions.bzl index f9f6fb7d0..93b9867b4 100644 --- a/uv/extensions.bzl +++ b/uv/extensions.bzl @@ -5,6 +5,8 @@ Graduated from `@aspect_rules_py//uv/unstable:extension.bzl` in rules_py v2.0.0. load("//uv/private/extension:defs.bzl", _uv = "uv") load("//uv/private/extension:uv_bin.bzl", _uv_bin = "uv_bin") +load("//uv/private/rust:extensions.bzl", _rust_tools = "rust_tools") uv = _uv uv_bin = _uv_bin +rust_tools = _rust_tools diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index 94ddaa261..15dccb8ee 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -612,7 +612,6 @@ def _parse_projects(module_ctx, hub_specs): cargo_lock = cargo_lock, monitor_memory = monitor_memory, resource_set = resource_set, - rust_toolchain = project.rust_toolchain, ) has_sbuild = True @@ -893,8 +892,6 @@ def _uv_impl(module_ctx): sbuild_kwargs["config_settings"] = sbuild_cfg.config_settings if sbuild_cfg.cargo_lock: sbuild_kwargs["cargo_lock"] = sbuild_cfg.cargo_lock - if sbuild_cfg.rust_toolchain: - sbuild_kwargs["rust_toolchain"] = sbuild_cfg.rust_toolchain if sbuild_cfg.monitor_memory: sbuild_kwargs["monitor_memory"] = True if sbuild_cfg.resource_set != "default": @@ -969,13 +966,6 @@ _project_tag = tag_class( mandatory = True, doc = "The `uv.lock` pinning this project's dependency graph.", ), - "rust_toolchain": attr.label( - mandatory = False, - doc = "A rules_rust `current_rust_toolchain`-style target. When set, every sdist in " + - "this project whose build backend is maturin or setuptools-rust gets it (plus " + - "rules_py's exec-configured sysroot layer) wired into its build automatically, " + - "with no per-package `uv.override_package(toolchains = ...)`.", - ), "default_build_dependencies": attr.string_list( mandatory = False, default = [ @@ -1034,7 +1024,7 @@ _override_package_tag = tag_class( ), "toolchains": attr.label_list( default = [], - doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_SYSROOT, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", + doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", ), "env": attr.string_dict( default = {}, @@ -1042,7 +1032,7 @@ _override_package_tag = tag_class( ), "cargo_lock": attr.label( allow_single_file = True, - doc = "Cargo.lock for a Rust sdist that ships none. Its crates.io entries are vendored while the repository is generated and the file is placed next to the sdist's Cargo.toml before the build, so cargo builds offline. Requires the project's `rust_toolchain`.", + doc = "Cargo.lock for a Rust sdist that ships none. Its crates.io entries are vendored while the repository is generated and the file is placed next to the sdist's Cargo.toml before the build, so cargo builds offline.", ), "config_settings": attr.string_list_dict( default = {}, diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index c3f0eb88e..6719507de 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -22,6 +22,7 @@ bzl_library( ":common", "//py/private/interpreter:versions", "//py/private/toolchain:types", + "//uv/private/rust:toolchain", "@bazel_lib//lib:resource_sets", "@rules_cc//cc:action_names_bzl", "@rules_cc//cc/common", @@ -51,8 +52,3 @@ bzl_library( "@bazel_lib//lib:resource_sets", ], ) - -bzl_library( - name = "rust_layer", - srcs = ["rust_layer.bzl"], -) diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index 46a5f35dd..86aaecaa1 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -10,6 +10,7 @@ load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES") load("@rules_cc//cc/common:cc_common.bzl", "cc_common") load("//py/private/interpreter:versions.bzl", "PLATFORMS") load("//py/private/toolchain:types.bzl", "EXEC_TOOLS_TOOLCHAIN", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") +load("//uv/private/rust:toolchain.bzl", "RUST_TOOLCHAIN_TYPE") load(":cc_layer.bzl", "CC_LAYER_ATTRS", "extract_cc_layer") load( ":common.bzl", @@ -25,17 +26,10 @@ load( _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") # TemplateVariableInfo make-variable -> build helper env key, for the -# toolchains a native build commonly layers in: rules_rust's -# current_rust_toolchain (CARGO/RUSTC and its generated RUST_SYSROOT, where -# rustc and rust-std meet whatever repositories they were fetched into), an -# exec-configured rust sysroot layer (RUST_HOST_SYSROOT), a Java runtime +# toolchains a native build commonly layers in: a Java runtime # (JAVA/JAVABASE) and an Ant layer (ANT_HOME/ANT_BIN_DIR). The env keys are # the helper's contract (build_helper.py absolutizes exactly this set). _DERIVED_ENV = { - "CARGO": "CARGO", - "RUSTC": "RUSTC", - "RUST_SYSROOT": "RULES_PY_RUST_SYSROOT", - "RUST_HOST_SYSROOT": "RULES_PY_RUST_HOST_SYSROOT", "JAVA": "JAVA", "JAVABASE": "JAVA_HOME", "ANT_HOME": "ANT_HOME", @@ -320,6 +314,15 @@ def _pep517_native_whl(ctx): cross_args = [] cargo_args = [] + if ctx.attr._rust: + # rules_py's own Rust toolchain, resolved for this exec/target pair: + # the exec platform's complete sysroot plus the target's std trees. + rust = eg_toolchains[RUST_TOOLCHAIN_TYPE] + env["CARGO"] = rust.cargo.path + env["RUSTC"] = rust.rustc.path + env["RULES_PY_RUST_SYSROOT"] = rust.sysroot + env["RULES_PY_RUST_TARGET_STD"] = ":".join(rust.target_std_roots) + extra_inputs.append(rust.all_files) if ctx.attr.vendored_crates: vendored = ctx.attr.vendored_crates[DefaultInfo].files extra_inputs.append(vendored) @@ -411,86 +414,95 @@ def _pep517_native_whl(ctx): return wheel_providers(wheel_file, ctx.attr.console_scripts) -pep517_native_whl = rule( - implementation = _pep517_native_whl, - doc = """PEP 517 sdist to platform-specific whl build rule. - -Consumes a sdist artifact and performs a build of that artifact with the -specified Python dependencies under the configured Python toolchain to produce a -platform-specific bdist we can subsequently install or deploy. - -Extra toolchains the build action depends on are passed via the standard `toolchains` -attribute and each target's `DefaultInfo.files`, `ToolchainInfo.all_files`, and -`TemplateVariableInfo.variables` are forwarded to the action. The `env` -attribute maps environment variable names to strings that may reference -`$(VAR)` make-variables sourced from those toolchains. This mirrors the -pattern used by `rules_rust`'s `cargo_build_script`. - -The build is guaranteed to occur on an execution platform matching the -constraints of the target platform. - -""", - attrs = PEP517_WHL_ATTRS | { - "args": attr.string_list(), - "env": attr.string_dict( - doc = "Environment variables to set on the build action. Values may " + - "contain `$(VAR)` references to the configured C++ action tools " + - "or make-variables exposed by any target in the rule's " + - "`toolchains` attribute (via `TemplateVariableInfo`). Prefix an " + - "execroot-relative path with " + - "`$(EXECROOT)/` so it remains valid after the backend changes into " + - "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + - "configured C++ action tools.", - ), - "cargo_lock": attr.label( - allow_single_file = True, - doc = "Cargo.lock placed next to the sdist's Cargo.toml before the build, replacing the sdist's own if any.", - ), - "vendored_crates": attr.label( - allow_files = True, - doc = "A cargo vendor directory (one subdirectory per crate, each with its " + - "`.cargo-checksum.json`), as sdist_build materializes it from the sdist's " + - "Cargo.lock. The build runs cargo offline against it.", - ), - "_platform_libc": attr.label( - default = "//uv/private/constraints/platform:platform_libc", - doc = "Read in cross mode to pick the rust target triple (gnu vs musl).", - ), - } | CC_LAYER_ATTRS, - fragments = ["cpp"], - toolchains = [ - # Target-configured interpreter, read only for its platform triple in - # the cross detection; optional so unresolvable targets surface the - # rule's own error instead of a toolchain-resolution one. - config_common.toolchain_type(PY_TOOLCHAIN, mandatory = False), - ], - exec_groups = { - # Cross-compilation of sdists is intentionally unsupported: PEP 517 - # build backends (setuptools, meson-python, etc.) have no standard - # mechanism for cross-compilation, Python headers for the target - # platform are not readily available, and output wheel tags would - # need to encode the target platform with no upstream tooling - # support. Packages that need cross-compiled native extensions should - # publish pre-built wheels for their target platforms instead. - # - # Detection inputs: NATIVE_BUILD_TOOLCHAIN has matching - # exec_compatible_with and target_compatible_with, so it resolves - # exactly when the exec and target platforms match — optional, its - # absence is a cross signal, not a resolution error. The exec- and - # target-configured interpreters' platform triples refine that signal - # (see _cross_decision); a cross decision switches the action into - # cross mode (cc_layer extraction + target-identity env) instead of - # failing. - TARGET_EXEC_GROUP: exec_group( - toolchains = [ - PY_TOOLCHAIN, - config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN, mandatory = False), - config_common.toolchain_type(NATIVE_BUILD_TOOLCHAIN, mandatory = False), - # Optional for the same reason: on a cross target no C++ - # toolchain may resolve, and the rule's own error must win - # over a resolution failure. - config_common.toolchain_type(_CC_TOOLCHAIN_TYPE, mandatory = False), - ], - ), - }, -) +def _native_rule(rust): + return rule( + implementation = _pep517_native_whl, + doc = """PEP 517 sdist to platform-specific whl build rule. + + Consumes a sdist artifact and performs a build of that artifact with the + specified Python dependencies under the configured Python toolchain to produce a + platform-specific bdist we can subsequently install or deploy. + + Extra toolchains the build action depends on are passed via the standard `toolchains` + attribute and each target's `DefaultInfo.files`, `ToolchainInfo.all_files`, and + `TemplateVariableInfo.variables` are forwarded to the action. The `env` + attribute maps environment variable names to strings that may reference + `$(VAR)` make-variables sourced from those toolchains. This mirrors the + pattern used by `rules_rust`'s `cargo_build_script`. + + The build is guaranteed to occur on an execution platform matching the + constraints of the target platform. + + """, + attrs = PEP517_WHL_ATTRS | { + "args": attr.string_list(), + "env": attr.string_dict( + doc = "Environment variables to set on the build action. Values may " + + "contain `$(VAR)` references to the configured C++ action tools " + + "or make-variables exposed by any target in the rule's " + + "`toolchains` attribute (via `TemplateVariableInfo`). Prefix an " + + "execroot-relative path with " + + "`$(EXECROOT)/` so it remains valid after the backend changes into " + + "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + + "configured C++ action tools.", + ), + "cargo_lock": attr.label( + allow_single_file = True, + doc = "Cargo.lock placed next to the sdist's Cargo.toml before the build, replacing the sdist's own if any.", + ), + "vendored_crates": attr.label( + allow_files = True, + doc = "A cargo vendor directory (one subdirectory per crate, each with its " + + "`.cargo-checksum.json`), as sdist_build materializes it from the sdist's " + + "Cargo.lock. The build runs cargo offline against it.", + ), + "_rust": attr.bool(default = rust), + "_platform_libc": attr.label( + default = "//uv/private/constraints/platform:platform_libc", + doc = "Read in cross mode to pick the rust target triple (gnu vs musl).", + ), + } | CC_LAYER_ATTRS, + fragments = ["cpp"], + toolchains = [ + # Target-configured interpreter, read only for its platform triple in + # the cross detection; optional so unresolvable targets surface the + # rule's own error instead of a toolchain-resolution one. + config_common.toolchain_type(PY_TOOLCHAIN, mandatory = False), + ], + exec_groups = { + # Cross-compilation of sdists is intentionally unsupported: PEP 517 + # build backends (setuptools, meson-python, etc.) have no standard + # mechanism for cross-compilation, Python headers for the target + # platform are not readily available, and output wheel tags would + # need to encode the target platform with no upstream tooling + # support. Packages that need cross-compiled native extensions should + # publish pre-built wheels for their target platforms instead. + # + # Detection inputs: NATIVE_BUILD_TOOLCHAIN has matching + # exec_compatible_with and target_compatible_with, so it resolves + # exactly when the exec and target platforms match — optional, its + # absence is a cross signal, not a resolution error. The exec- and + # target-configured interpreters' platform triples refine that signal + # (see _cross_decision); a cross decision switches the action into + # cross mode (cc_layer extraction + target-identity env) instead of + # failing. + TARGET_EXEC_GROUP: exec_group( + toolchains = [ + PY_TOOLCHAIN, + config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN, mandatory = False), + config_common.toolchain_type(NATIVE_BUILD_TOOLCHAIN, mandatory = False), + # Optional for the same reason: on a cross target no C++ + # toolchain may resolve, and the rule's own error must win + # over a resolution failure. + config_common.toolchain_type(_CC_TOOLCHAIN_TYPE, mandatory = False), + ] + ([RUST_TOOLCHAIN_TYPE] if rust else []), + ), + }, + ) + +pep517_native_whl = _native_rule(rust = False) + +# Same rule, plus rules_py's Rust toolchain in the build's exec group. Only +# sdists whose backend is Rust (maturin, setuptools-rust) instantiate it, so +# nobody else ever resolves or fetches a Rust toolchain. +pep517_rust_whl = _native_rule(rust = True) diff --git a/uv/private/pep517_whl/rust_layer.bzl b/uv/private/pep517_whl/rust_layer.bzl deleted file mode 100644 index 86fbb26a9..000000000 --- a/uv/private/pep517_whl/rust_layer.bzl +++ /dev/null @@ -1,33 +0,0 @@ -"""Exposes the exec-platform rust_toolchain's sysroot. - -`@rules_rust//rust/toolchain:current_rust_toolchain` resolves against the -build's ambient --platforms, so under a cross transition it returns the -*target*-targeting toolchain — whose sysroot has no exec-platform rust-std, -which build scripts/proc-macros (always compiled for the exec platform) -need. Re-resolving the toolchain in the exec configuration hands back the -exec-targeting toolchain without hardcoding any repository label. -""" - -def _rust_host_sysroot_impl(ctx): - actual = ctx.attr.actual - if type(actual) == "list": - actual = actual[0] - toolchain = actual[platform_common.ToolchainInfo] - return [ - DefaultInfo(files = toolchain.all_files), - platform_common.TemplateVariableInfo({ - "RUST_HOST_SYSROOT": toolchain.sysroot, - }), - ] - -rust_host_sysroot = rule( - implementation = _rust_host_sysroot_impl, - attrs = { - "actual": attr.label( - cfg = "exec", - doc = "current_rust_toolchain, re-resolved in the exec configuration.", - mandatory = True, - ), - }, - doc = "Exposes the exec-platform rust_toolchain's sysroot as $(RUST_HOST_SYSROOT).", -) diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index 9893c0261..c9dd327fa 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -5,9 +5,8 @@ load("@tar.bzl//tar:mtree.bzl", "mtree_mutate", "mtree_spec") load("@tar.bzl//tar:tar.bzl", "tar_rule") load("//py:defs.bzl", "py_binary", "py_test") load("//uv/private/pep517_whl:frontend.bzl", "pep517_frontend") -load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") +load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl", "pep517_rust_whl") load("//uv/private/pep517_whl:pep517_whl.bzl", "pep517_whl") -load("//uv/private/pep517_whl:rust_layer.bzl", "rust_host_sysroot") load( ":exec_platform_steering_test.bzl", "exec_platform_prefers_native_match_test", @@ -27,7 +26,6 @@ load( "config_settings_args_test", "cross_decision_test", "execroot_collision_toolchain", - "fake_rust_toolchain", "hostile_python_env_target", "interpreter_platform_triple_test", "pep517_native_whl_cross_mode_test", @@ -35,9 +33,9 @@ load( "pep517_native_whl_execroot_collision_test", "pep517_native_whl_toolchain_env_test", "pep517_native_whl_vendored_crates_test", + "pep517_rust_whl_toolchain_env_test", "pep517_whl_console_scripts_test", "python_host_platform_test", - "rust_host_sysroot_test", "target_python_artifacts_test", ) @@ -383,46 +381,28 @@ pep517_native_whl_derived_env_test( target_under_test = ":__derived_env_override_fixture", ) -fake_rust_toolchain(name = "__fake_rust_toolchain") - -rust_host_sysroot( - name = "__rust_host_sysroot", - actual = ":__fake_rust_toolchain", -) - -rust_host_sysroot_test( - name = "rust_host_sysroot_test", - target_under_test = ":__rust_host_sysroot", +# rules_py's own Rust toolchain reaches the build: resolved for the exec +# platform and a linux/x86_64 target, its cargo, rustc, sysroot and target +# std land in the env and the inputs. Nothing is registered by the workspace. +platform( + name = "cross_target_platform_x86_64", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], ) -# The shape sdist_build generates for a Rust sdist: the toolchain plus its -# exec-configured sysroot layer. Their make-variables must reach the helper -# under its env names, and the make-variable names themselves must not. -pep517_native_whl( - name = "__derived_rust_env_fixture", +pep517_rust_whl( + name = "__rust_toolchain_fixture", src = ":__stub_sdist", tags = ["manual"], tool = ":__stub_tool", - toolchains = [ - ":__fake_rust_toolchain", - ":__rust_host_sysroot", - ], version = "0.0.1", ) -pep517_native_whl_derived_env_test( - name = "derived_rust_env_test", - absent_keys = [ - "RUST_SYSROOT", - "RUST_HOST_SYSROOT", - ], - derived_keys = [ - "CARGO", - "RUSTC", - "RULES_PY_RUST_SYSROOT", - "RULES_PY_RUST_HOST_SYSROOT", - ], - target_under_test = ":__derived_rust_env_fixture", +pep517_rust_whl_toolchain_env_test( + name = "rust_toolchain_env_test", + target_under_test = ":__rust_toolchain_fixture", ) # sdist_build's vendor directory shape: one subdirectory per crate with its diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 8155ffea7..6889ee65f 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -193,10 +193,18 @@ def test_index_only_rewrites_from_itself(self) -> None: class AbsolutizeToolPathsTest(unittest.TestCase): def test_rust_keys_absolutized(self) -> None: - env = {"CARGO": "bazel-out/bin/rust/bin/cargo", "RUSTC": "bazel-out/bin/rust/bin/rustc", "RULES_PY_RUST_HOST_SYSROOT": "bazel-out/bin/rust"} + env = { + "CARGO": "bazel-out/bin/rust/bin/cargo", + "RUSTC": "bazel-out/bin/rust/bin/rustc", + "RULES_PY_RUST_SYSROOT": "bazel-out/bin/rust", + "RULES_PY_RUST_TARGET_STD": "external/std_gnu:external/std_musl", + } build_helper._absolutize_tool_paths(env) - for key in ("CARGO", "RUSTC", "RULES_PY_RUST_HOST_SYSROOT"): + for key in ("CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT"): self.assertTrue(path.isabs(env[key]), key) + roots = env["RULES_PY_RUST_TARGET_STD"].split(os.pathsep) + self.assertEqual(2, len(roots)) + self.assertTrue(all(path.isabs(r) for r in roots), roots) def test_ant_keys_absolutized(self) -> None: env = {"ANT_HOME": "bazel-out/bin/ant", "RULES_PY_ANT_BIN_DIR": "bazel-out/bin/ant/bin"} @@ -874,55 +882,6 @@ def test_maturin_args_preserve_package_values(self) -> None: env["MATURIN_PEP517_ARGS"], ) - def test_rustc_wrapper_uses_merged_sysroot(self) -> None: - tmp = tempfile.mkdtemp() - # Fake target toolchain (bin/rustc) and host sysroot with an exec-std entry. - target_rustc = path.join(tmp, "target_tc", "bin", "rustc") - makedirs(path.dirname(target_rustc)) - open(target_rustc, "w").close() - makedirs(path.join(tmp, "target_tc", "lib", "rustlib", "aarch64-unknown-linux-gnu")) - host_sysroot = path.join(tmp, "host_sysroot") - makedirs(path.join(host_sysroot, "lib", "rustlib", "aarch64-apple-darwin")) - - env = self._env() - env["RUSTC"] = target_rustc - env["RULES_PY_RUST_HOST_SYSROOT"] = host_sysroot - build_helper._configure_cargo_cross_env(env, tmp, "linux", "aarch64", "glibc") - - wrapper = env["RUSTC"] - self.assertNotEqual(target_rustc, wrapper) - with open(wrapper) as f: - content = f.read() - self.assertIn("--sysroot", content) - self.assertTrue(os.access(wrapper, os.X_OK)) - # The merged sysroot exposes the host's rustlib entries (exec std for - # build scripts) alongside the target's. - merged = path.join(tmp, ".rust_sysroot", "lib", "rustlib") - self.assertTrue(path.islink(path.join(merged, "aarch64-apple-darwin"))) - self.assertTrue(path.islink(path.join(merged, "aarch64-unknown-linux-gnu"))) - - - def test_target_sysroot_from_toolchain_wins_over_rustc_location(self) -> None: - # rules_rs-style layout: rustc in one repository, rust-std in another, - # both assembled into the toolchain's generated sysroot. - tmp = tempfile.mkdtemp() - target_rustc = path.join(tmp, "rustc_repo", "bin", "rustc") - makedirs(path.dirname(target_rustc)) - open(target_rustc, "w").close() - generated = path.join(tmp, "generated_sysroot") - makedirs(path.join(generated, "lib", "rustlib", "aarch64-unknown-linux-gnu")) - host_sysroot = path.join(tmp, "host_sysroot") - makedirs(path.join(host_sysroot, "lib", "rustlib", "x86_64-unknown-linux-gnu")) - - env = self._env() - env["RUSTC"] = target_rustc - env["RULES_PY_RUST_SYSROOT"] = generated - env["RULES_PY_RUST_HOST_SYSROOT"] = host_sysroot - build_helper._configure_cargo_cross_env(env, tmp, "linux", "aarch64", "glibc") - - merged = path.join(tmp, ".rust_sysroot", "lib", "rustlib") - self.assertTrue(path.islink(path.join(merged, "aarch64-unknown-linux-gnu"))) - self.assertTrue(path.islink(path.join(merged, "x86_64-unknown-linux-gnu"))) class InjectCargoLockTest(unittest.TestCase): @@ -985,10 +944,61 @@ def test_no_vendor_dir_leaves_cargo_online(self) -> None: self.assertFalse(path.exists(path.join(tmp, "config.toml"))) +class MergeRustSysrootTest(unittest.TestCase): + def _sysroot(self, tmp: str, name: str, *triples: str) -> str: + root = path.join(tmp, name) + makedirs(path.join(root, "bin")) + open(path.join(root, "bin", "rustc"), "w").close() + makedirs(path.join(root, "lib")) + open(path.join(root, "lib", "librustc_driver.so"), "w").close() + for triple in triples: + makedirs(path.join(root, "lib", "rustlib", triple, "lib")) + return root + + def _std(self, tmp: str, name: str, triple: str) -> str: + root = path.join(tmp, name) + makedirs(path.join(root, "lib", "rustlib", triple, "lib")) + return root + + def test_exec_sysroot_plus_target_stds(self) -> None: + tmp = tempfile.mkdtemp() + host = self._sysroot(tmp, "host", "aarch64-apple-darwin") + gnu = self._std(tmp, "std_gnu", "x86_64-unknown-linux-gnu") + musl = self._std(tmp, "std_musl", "x86_64-unknown-linux-musl") + merged = build_helper._merge_rust_sysroot(tmp, host, [gnu, musl]) + rustlib = path.join(merged, "lib", "rustlib") + self.assertTrue(path.islink(path.join(merged, "bin")), "exec drivers come whole") + self.assertTrue(path.islink(path.join(merged, "lib", "librustc_driver.so"))) + for triple in ("aarch64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl"): + self.assertTrue(path.islink(path.join(rustlib, triple)), triple) + + def test_exec_entries_win_and_merge_is_idempotent(self) -> None: + tmp = tempfile.mkdtemp() + host = self._sysroot(tmp, "host", "x86_64-unknown-linux-gnu") + same = self._std(tmp, "std_same", "x86_64-unknown-linux-gnu") + merged = build_helper._merge_rust_sysroot(tmp, host, [same]) + link = path.join(merged, "lib", "rustlib", "x86_64-unknown-linux-gnu") + self.assertEqual(path.join(host, "lib", "rustlib", "x86_64-unknown-linux-gnu"), os.readlink(link)) + self.assertEqual(merged, build_helper._merge_rust_sysroot(tmp, host, [same])) + + def test_cross_env_wraps_rustc_with_the_merged_sysroot(self) -> None: + tmp = tempfile.mkdtemp() + host = self._sysroot(tmp, "host", "aarch64-apple-darwin") + gnu = self._std(tmp, "std_gnu", "aarch64-unknown-linux-gnu") + env = {"CC": "/wrap/cc", "CXX": "/wrap/c++", "CARGO": path.join(host, "bin", "cargo"), "RUSTC": path.join(host, "bin", "rustc"), + "RULES_PY_RUST_SYSROOT": host, "RULES_PY_RUST_TARGET_STD": gnu} + build_helper._configure_cargo_cross_env(env, tmp, "linux", "aarch64", "glibc") + with open(env["RUSTC"]) as f: + content = f.read() + self.assertIn("--sysroot", content) + self.assertIn(path.join(tmp, ".rust_sysroot"), content) + self.assertTrue(path.islink(path.join(tmp, ".rust_sysroot", "lib", "rustlib", "aarch64-unknown-linux-gnu"))) + + class CargoNativeEnvTest(unittest.TestCase): def test_rustc_gets_the_toolchain_sysroot(self) -> None: tmp = tempfile.mkdtemp() - env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_SYSROOT": "/tc/sysroot", "RULES_PY_RUST_HOST_SYSROOT": "/exec/sysroot"} + env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_SYSROOT": "/tc/sysroot"} build_helper._configure_cargo_native_env(env, tmp) with open(env["RUSTC"]) as f: content = f.read() @@ -996,12 +1006,6 @@ def test_rustc_gets_the_toolchain_sysroot(self) -> None: self.assertIn("/tc/bin/rustc", content) self.assertTrue(os.access(env["RUSTC"], os.X_OK)) - def test_host_sysroot_is_the_fallback(self) -> None: - tmp = tempfile.mkdtemp() - env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_HOST_SYSROOT": "/exec/sysroot"} - build_helper._configure_cargo_native_env(env, tmp) - with open(env["RUSTC"]) as f: - self.assertIn("/exec/sysroot", f.read()) def test_no_rust_toolchain_leaves_rustc_alone(self) -> None: tmp = tempfile.mkdtemp() diff --git a/uv/private/pep517_whl/tests/pep517_whl_test.bzl b/uv/private/pep517_whl/tests/pep517_whl_test.bzl index 36007ffaf..5220297e3 100644 --- a/uv/private/pep517_whl/tests/pep517_whl_test.bzl +++ b/uv/private/pep517_whl/tests/pep517_whl_test.bzl @@ -368,38 +368,32 @@ config_settings_args_test = analysistest.make( }, ) -def _fake_rust_toolchain_impl(ctx): - # The sysroot is this target's own output root: an "-exec" segment in it - # proves the dependent re-resolved us in the exec configuration. The - # make-variables mirror what rules_rust's current_rust_toolchain exports. - return [ - platform_common.ToolchainInfo(sysroot = ctx.bin_dir.path, all_files = depset()), - platform_common.TemplateVariableInfo({ - "CARGO": "/fake/bin/cargo", - "RUSTC": "/fake/bin/rustc", - "RUST_SYSROOT": ctx.bin_dir.path + "/fake_sysroot", - }), - ] - -fake_rust_toolchain = rule( - implementation = _fake_rust_toolchain_impl, - doc = "Stands in for rules_rust's current_rust_toolchain: ToolchainInfo with a sysroot.", -) - -def _rust_host_sysroot_test_impl(ctx): +def _rust_toolchain_env_test_impl(ctx): env = analysistest.begin(ctx) target = analysistest.target_under_test(env) - variables = target[platform_common.TemplateVariableInfo].variables - sysroot = variables.get("RUST_HOST_SYSROOT", "") - asserts.true(env, sysroot != "", "RUST_HOST_SYSROOT must be exported; got: {}".format(variables)) + actions = [a for a in target.actions if a.mnemonic == "PySdistNativeBuild"] + asserts.equals(env, 1, len(actions), "expected exactly one PySdistNativeBuild action") + if not actions: + return analysistest.end(env) + action_env = actions[0].env + for key in ("CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT", "RULES_PY_RUST_TARGET_STD"): + asserts.true(env, action_env.get(key), "{} must come from rules_py's Rust toolchain; env keys: {}".format(key, sorted(action_env.keys()))) + rustc = action_env.get("RUSTC", "") + asserts.true(env, rustc.endswith("/bin/rustc"), "got: " + rustc) + asserts.true(env, rustc.startswith(action_env.get("RULES_PY_RUST_SYSROOT", "?")), "rustc lives inside its sysroot") + inputs = [f.path for f in actions[0].inputs.to_list()] + asserts.true(env, rustc in inputs, "the toolchain files must be action inputs") asserts.true( env, - "-exec" in sysroot, - "the sysroot must come from the toolchain re-resolved in the exec configuration; got: " + sysroot, + any(["/lib/rustlib/x86_64-unknown-linux-gnu/lib/" in p for p in inputs]), + "the target platform's std must be an action input", ) return analysistest.end(env) -rust_host_sysroot_test = analysistest.make(_rust_host_sysroot_test_impl) +pep517_rust_whl_toolchain_env_test = analysistest.make( + _rust_toolchain_env_test_impl, + config_settings = {"//command_line_option:platforms": "@@//uv/private/pep517_whl/tests:cross_target_platform_x86_64"}, +) def _vendored_crates_test_impl(ctx): env = analysistest.begin(ctx) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 3f04007a9..5b2516748 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -216,10 +216,12 @@ def _override_tool(env: dict[str, str], key: str, wrapper: str) -> None: def _absolutize_tool_paths(env: dict[str, str]) -> None: """Resolve toolchain paths before the backend changes cwd.""" - for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): + for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): value = env.get(key) if value: env[key] = _absolutize_path(value) + if env.get("RULES_PY_RUST_TARGET_STD"): + env["RULES_PY_RUST_TARGET_STD"] = pathsep.join(_absolutize_path(p) for p in env["RULES_PY_RUST_TARGET_STD"].split(pathsep) if p) for key in ("AR", "LD", "STRIP"): value = env.get(key) @@ -1034,44 +1036,37 @@ def _generate_cmake_toolchain_file( """ -def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str, target_sysroot: str | None = None) -> str: - """Symlink-merge the target toolchain's sysroot with the host's rust-std. +def _merge_rust_sysroot(tmpdir: str, host_sysroot: str, target_std_roots: list[str]) -> str: + """Overlay the target platforms' rust-std onto the exec platform's sysroot. - A cross rust_toolchain's sysroot has no exec-platform rust-std, but - cargo needs one to compile build scripts/proc-macros (always host - artifacts regardless of --target). rustup holds every target's std side - by side in one install; recreate that by merging the two Bazel-fetched - single-target sysroots. The host's rustlib entries win: exec-platform - code must resolve against exec-platform std. - - The target sysroot is the toolchain's generated one when known: rulesets - such as rules_rs fetch rustc and rust-std into separate repositories, so - the directory above rustc holds no std at all. + rules_py's toolchain ships the exec sysroot (rustc, cargo, exec std) and + the target std trees separately; cargo needs both in one sysroot: exec + std for build scripts and proc-macros, target std for the extension. + rustup keeps every target's std side by side in one install; recreate + that with symlinks. Exec entries win on collision. """ - target_sysroot = target_sysroot or path.dirname(path.dirname(target_rustc)) merged = path.join(tmpdir, ".rust_sysroot") if path.exists(merged): return merged makedirs(merged) - for entry in os.listdir(target_sysroot): + for entry in os.listdir(host_sysroot): if entry != "lib": - os.symlink(path.join(target_sysroot, entry), path.join(merged, entry)) + os.symlink(path.join(host_sysroot, entry), path.join(merged, entry)) merged_lib = path.join(merged, "lib") makedirs(merged_lib) - for entry in os.listdir(path.join(target_sysroot, "lib")): + for entry in os.listdir(path.join(host_sysroot, "lib")): if entry != "rustlib": - os.symlink(path.join(target_sysroot, "lib", entry), path.join(merged_lib, entry)) + os.symlink(path.join(host_sysroot, "lib", entry), path.join(merged_lib, entry)) merged_rustlib = path.join(merged_lib, "rustlib") makedirs(merged_rustlib) - host_rustlib = path.join(host_sysroot, "lib", "rustlib") - target_rustlib = path.join(target_sysroot, "lib", "rustlib") - overridden = set() - for entry in os.listdir(host_rustlib): - os.symlink(path.join(host_rustlib, entry), path.join(merged_rustlib, entry)) - overridden.add(entry) - for entry in os.listdir(target_rustlib): - if entry not in overridden: - os.symlink(path.join(target_rustlib, entry), path.join(merged_rustlib, entry)) + for root in [host_sysroot] + list(target_std_roots): + rustlib = path.join(root, "lib", "rustlib") + if not path.isdir(rustlib): + continue + for entry in os.listdir(rustlib): + dest = path.join(merged_rustlib, entry) + if not path.lexists(dest): + os.symlink(path.join(rustlib, entry), dest) return merged @@ -1110,9 +1105,10 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os # version. Unused (harmless) for non-PyO3 crates. build_env["PYO3_CROSS_PYTHON_VERSION"] = "{}.{}".format(sys.version_info.major, sys.version_info.minor) - host_sysroot = build_env.get("RULES_PY_RUST_HOST_SYSROOT") - if host_sysroot: - merged_sysroot = _merge_rust_sysroot(tmpdir, build_env["RUSTC"], host_sysroot, build_env.get("RULES_PY_RUST_SYSROOT")) + sysroot = build_env.get("RULES_PY_RUST_SYSROOT") + if sysroot: + target_std = [p for p in build_env.get("RULES_PY_RUST_TARGET_STD", "").split(pathsep) if p] + merged_sysroot = _merge_rust_sysroot(tmpdir, sysroot, target_std) build_env["RUSTC"] = _write_generated_file( path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=merged_sysroot), @@ -1169,13 +1165,11 @@ def _configure_cargo_offline(build_env: dict[str, str], vendor_dir: str) -> None def _configure_cargo_native_env(build_env: dict[str, str], tmpdir: str) -> None: """Point rustc at the toolchain's sysroot for a native build. - Bare rustc infers its sysroot from its own location, which only works - when rust-std was unpacked next to it. rules_rust's toolchain always - publishes the sysroot it assembled (RUST_SYSROOT), so pass that - explicitly; the exec-configured layer's sysroot is the same toolchain in - native mode and serves as the fallback. + rules_py's toolchain publishes the exec platform's complete sysroot + (RULES_PY_RUST_SYSROOT); pass it explicitly rather than trusting rustc to + infer it from its own location. """ - sysroot = build_env.get("RULES_PY_RUST_SYSROOT") or build_env.get("RULES_PY_RUST_HOST_SYSROOT") + sysroot = build_env.get("RULES_PY_RUST_SYSROOT") if not (build_env.get("CARGO") and sysroot): return build_env["RUSTC"] = _write_generated_file( diff --git a/uv/private/rust/BUILD.bazel b/uv/private/rust/BUILD.bazel new file mode 100644 index 000000000..95da14e47 --- /dev/null +++ b/uv/private/rust/BUILD.bazel @@ -0,0 +1,35 @@ +load("@bazel_lib//:bzl_library.bzl", "bzl_library") + +package(default_visibility = ["//uv/private:__subpackages__"]) + +# Resolved only by pep517_rust_whl, the rule sdist_build emits for Rust +# sdists, so consumers without one never fetch a Rust toolchain. +toolchain_type( + name = "toolchain_type", + visibility = ["//visibility:public"], +) + +bzl_library( + name = "repositories", + srcs = ["repositories.bzl"], + deps = [":versions"], +) + +bzl_library( + name = "extensions", + srcs = ["extensions.bzl"], + deps = [ + ":repositories", + ":versions", + ], +) + +bzl_library( + name = "toolchain", + srcs = ["toolchain.bzl"], +) + +bzl_library( + name = "versions", + srcs = ["versions.bzl"], +) diff --git a/uv/private/rust/extensions.bzl b/uv/private/rust/extensions.bzl new file mode 100644 index 000000000..0dae5c67d --- /dev/null +++ b/uv/private/rust/extensions.bzl @@ -0,0 +1,73 @@ +"""Module extension provisioning rules_py's own Rust toolchain for sdist builds. + +Rust sdists (maturin, setuptools-rust) need cargo, rustc and a std for the +exec and target platforms. rules_py fetches the official Rust dist archives +itself, the way it fetches Python interpreters and uv, so no ruleset has to +be added or registered for a Rust package in the lock to build. +""" + +load("//uv/private/rust:repositories.bzl", "rust_host_repository", "rust_hub_repository", "rust_std_repository") +load("//uv/private/rust:versions.bzl", "LATEST_RUST_VERSION", "RUST_HOST_TRIPLES", "RUST_TARGETS", "RUST_VERSIONS") + +_HUB = "rules_py_rust_toolchains" +_PREFIX = "rules_py_rust_" + +def _rust_tools_impl(module_ctx): + version = LATEST_RUST_VERSION + sha256s = {} + for mod in module_ctx.modules: + for tc in mod.tags.toolchain: + if mod.is_root: + version = tc.version or version + sha256s = dict(tc.sha256s) + hashes = dict(RUST_VERSIONS.get(version, {})) + hashes.update(sha256s) + + def sha(component, triple): + key = "{}-{}".format(component, triple) + if key not in hashes: + fail("rust_tools.toolchain(version = \"{}\"): no sha256 pinned for {}; pass it in `sha256s`.".format(version, key)) + return hashes[key] + + for host in RUST_HOST_TRIPLES: + rust_host_repository( + name = _PREFIX + "host_" + host.replace("-", "_"), + version = version, + triple = host, + rustc_sha256 = sha("rustc", host), + cargo_sha256 = sha("cargo", host), + std_sha256 = sha("rust-std", host), + ) + std_triples = {t: None for triples in RUST_TARGETS.values() for t in triples} + for triple in std_triples: + rust_std_repository( + name = _PREFIX + "std_" + triple.replace("-", "_"), + version = version, + triple = triple, + sha256 = sha("rust-std", triple), + ) + rust_hub_repository( + name = _HUB, + repo_prefix = _PREFIX, + host_triples = RUST_HOST_TRIPLES, + targets_json = json.encode({"{}/{}".format(os, cpu): triples for (os, cpu), triples in RUST_TARGETS.items()}), + ) + return module_ctx.extension_metadata(reproducible = True) + +_toolchain_tag = tag_class( + attrs = { + "version": attr.string( + doc = "Rust release to use for sdist builds (e.g. '1.90.0'). Defaults to the latest version pinned in aspect_rules_py. Only the root module's choice applies.", + ), + "sha256s": attr.string_dict( + doc = "`-` -> sha256 of the dist archive, for versions aspect_rules_py does not pin.", + ), + }, + doc = "Selects the Rust release rules_py fetches for building Rust sdists.", +) + +rust_tools = module_extension( + implementation = _rust_tools_impl, + tag_classes = {"toolchain": _toolchain_tag}, + doc = "Fetches the Rust toolchain rules_py uses to build Rust sdists and publishes `@rules_py_rust_toolchains`.", +) diff --git a/uv/private/rust/repositories.bzl b/uv/private/rust/repositories.bzl new file mode 100644 index 000000000..ebef9bcb1 --- /dev/null +++ b/uv/private/rust/repositories.bzl @@ -0,0 +1,139 @@ +"""Repository rules materializing a Rust toolchain for PEP 517 builds. + +A host repository is a complete rustup-style sysroot for one exec platform: +rustc, cargo and that platform's rust-std, extracted into one tree. Std +repositories hold one target platform's rust-std; the helper overlays them +onto the host sysroot for cross builds, the way rustup keeps several targets +side by side. +""" + +load(":versions.bzl", "rust_archive_prefix", "rust_archive_url") + +def _download(rctx, component, triple, sha256): + rctx.download_and_extract( + url = rust_archive_url(component, rctx.attr.version, triple), + sha256 = sha256, + canonical_id = "{}-{}-{}".format(component, rctx.attr.version, triple), + stripPrefix = rust_archive_prefix(component, rctx.attr.version, triple), + ) + +def _repo_metadata(rctx): + # Support bazel [rust-std triples]."), + }, +) diff --git a/uv/private/rust/toolchain.bzl b/uv/private/rust/toolchain.bzl new file mode 100644 index 000000000..491ac377e --- /dev/null +++ b/uv/private/rust/toolchain.bzl @@ -0,0 +1,50 @@ +"""The Rust toolchain rules_py hands to PEP 517 builds of Rust sdists.""" + +RUST_TOOLCHAIN_TYPE = "@aspect_rules_py//uv/private/rust:toolchain_type" + +def _root_of(files, marker): + """Repository root shared by `files`, from any path containing `marker`.""" + for f in files.to_list(): + idx = f.path.find(marker) + if idx != -1: + return f.path[:idx] + return None + +def _rust_pep517_toolchain_impl(ctx): + rustc = ctx.file.rustc + sysroot = rustc.path[:-len("/bin/rustc")] + target_std_roots = [] + transitive = [ctx.attr.sysroot_files[DefaultInfo].files] + for std in ctx.attr.target_std: + files = std[DefaultInfo].files + transitive.append(files) + root = _root_of(files, "/lib/rustlib/") + if root: + target_std_roots.append(root) + return [platform_common.ToolchainInfo( + rustc = rustc, + cargo = ctx.file.cargo, + sysroot = sysroot, + target_std_roots = target_std_roots, + exec_triple = ctx.attr.exec_triple, + target_triples = ctx.attr.target_triples, + all_files = depset(transitive = transitive), + )] + +rust_pep517_toolchain = rule( + implementation = _rust_pep517_toolchain_impl, + doc = """A Rust toolchain for one (exec platform, target platform) pair. + +`sysroot_files` is the exec platform's complete sysroot (rustc, cargo, its own +std); `target_std` holds the target platform's rust-std trees, one per libc on +Linux. The build helper passes the sysroot to rustc explicitly and, under +cross, overlays the target std onto it.""", + attrs = { + "rustc": attr.label(allow_single_file = True, mandatory = True), + "cargo": attr.label(allow_single_file = True, mandatory = True), + "sysroot_files": attr.label(mandatory = True), + "target_std": attr.label_list(), + "exec_triple": attr.string(mandatory = True), + "target_triples": attr.string_list(mandatory = True), + }, +) diff --git a/uv/private/rust/versions.bzl b/uv/private/rust/versions.bzl new file mode 100644 index 000000000..0b70f1af8 --- /dev/null +++ b/uv/private/rust/versions.bzl @@ -0,0 +1,59 @@ +"""Pinned Rust releases for PEP 517 sdist builds. + +Hashes come from the `.sha256` files published next to each archive at +https://static.rust-lang.org/dist/. Keys are `-`. +""" + +# Exec platforms a build can run on. +RUST_HOST_TRIPLES = [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-unknown-linux-gnu", +] + +# Wheel target platforms, as (os, cpu) -> the rust-std triples a build for +# that platform may need. Linux carries both libcs: the toolchain cannot see +# the platform_libc flag, so the helper picks the triple at build time. +RUST_TARGETS = { + ("linux", "x86_64"): ["x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl"], + ("linux", "aarch64"): ["aarch64-unknown-linux-gnu", "aarch64-unknown-linux-musl"], + ("macos", "x86_64"): ["x86_64-apple-darwin"], + ("macos", "aarch64"): ["aarch64-apple-darwin"], +} + +RUST_VERSIONS = { + "1.90.0": { + "rustc-x86_64-unknown-linux-gnu": "48c2a42de9e92fcae8c24568f5fe40d5734696a6f80e83cc6d46eef1a78f13c9", + "rustc-aarch64-unknown-linux-gnu": "4e1a9987a11d7d91f0d5afbf5333feb62f44172e4a31f33ce7246549003217f2", + "rustc-x86_64-apple-darwin": "594687a61b671445ea9fff0e6b6c6eef81cba30b005d22710217b4da8d2d2ecc", + "rustc-aarch64-apple-darwin": "89551c0ba1cc6d0312aebc4a6cafe4497223217ea8e87c81f6afbe127dfaeeb6", + "cargo-x86_64-unknown-linux-gnu": "9853db03d68578a30972e2755c89c66aec035fec641cf8f3a7117c81eec2578d", + "cargo-aarch64-unknown-linux-gnu": "bd8d1da6fe88ea7e29338f24277c22156267447adbfc47d690467ad32d02c2a7", + "cargo-x86_64-apple-darwin": "b2fa21c8fed854775e379bb4617145abd047d1be729e8383148139ba1d05c88f", + "cargo-aarch64-apple-darwin": "17a4410a27bf7dad4765f3809265c225f25f8b009da3d4b76cd0927acdae04b5", + "rust-std-x86_64-unknown-linux-gnu": "663f4ab7945b392d5e5294dec1b050a66820a20e86f084ec37eeb0f2f7ff5569", + "rust-std-aarch64-unknown-linux-gnu": "4952abb7d9d3ed7cea4f7ea44dcb23dc67631fae4ac44a5f059b90a4b5e9223f", + "rust-std-x86_64-unknown-linux-musl": "38490d575786f4688e83b357baeb022d8dde0ace2cb8c1357e060c76644fc56a", + "rust-std-aarch64-unknown-linux-musl": "a603e135d4eb67ababdd193268a69937fa4490bafde592f2c931d17c7567b228", + "rust-std-x86_64-apple-darwin": "dd731e6f9f30cb9b2928b92b084d2f12a3abf06a481ecbd8c3553c3e6f742139", + "rust-std-aarch64-apple-darwin": "c36777aec17d617f85f94b7cb87bdd4270eeca30ef38c6f686809d163c881609", + }, +} + +LATEST_RUST_VERSION = RUST_VERSIONS.keys()[-1] + +def rust_archive_url(component, version, triple): + """Upstream URL of one Rust dist component archive.""" + return "https://static.rust-lang.org/dist/{}-{}-{}.tar.xz".format(component, version, triple) + +def rust_archive_prefix(component, version, triple): + """Path inside the archive holding the component's install tree (bin/, lib/).""" + inner = component if component != "rust-std" else "rust-std-" + triple + return "{}-{}-{}/{}".format(component, version, triple, inner) + +def triple_constraints(triple): + """Bazel platform constraints for a Rust target triple.""" + cpu, _, rest = triple.partition("-") + os = "macos" if "apple-darwin" in rest else "linux" + return ["@platforms//os:" + os, "@platforms//cpu:" + cpu] diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 92335a883..0503ddbe2 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -183,13 +183,18 @@ def _is_rust_build(inspection): """ if not inspection: return False - if inspection.get("build_backend") == "maturin": + backend = inspection.get("build_backend") + if backend == "maturin": return True + + # setuptools-rust only ever rides on a setuptools backend (or none, for a + # bare setup.py). Other backends may ship stray .rs files that make the + # configure tool infer setuptools-rust (numpy does), and are not Rust builds. + if backend not in (None, "setuptools.build_meta", "setuptools.build_meta:__legacy__"): + return False requirements = list(inspection.get("build_requires", [])) + list(inspection.get("inferred_build_requires", [])) return "setuptools-rust" in [_normalize_requirement(r) for r in requirements] -_RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" - _CRATES_IO_SOURCE = "registry+https://github.com/rust-lang/crates.io-index" def _crate_url(name, version): @@ -246,39 +251,13 @@ def _cargo_lock_attr(label): _VENDORED_CRATES_ATTR = "\n vendored_crates = \":vendored_crates\"," -def _rust_wiring(rust_toolchain, inspection, toolchains): - """The generated BUILD's Rust wiring for a project-level `rust_toolchain`. - - The configure tool already detected the build backend and its declared - requirements, so a Rust-based build (maturin, or setuptools with - setuptools-rust) gets the project's Rust toolchain plus an exec-configured - rust_host_sysroot layer without the user spelling either out per package. - pep517_native_whl derives CARGO/RUSTC/RULES_PY_RUST_HOST_SYSROOT from - their make-variables. +def _rust_rule(inspection): + """The rule sdist_build instantiates for a Rust sdist, or None. - Args: - rust_toolchain: `uv.project(rust_toolchain = ...)` rendered as a label string, or "". - inspection: The configure tool's JSON, or None. - toolchains: Extra toolchain labels from `uv.override_package`. - - Returns: - struct(load_stmt, target, toolchains): the `load()` line and the - `rust_host_sysroot(...)` target to splice into the BUILD (both "" when - not wired), and the final `toolchains` list. + pep517_rust_whl is pep517_native_whl plus rules_py's own Rust toolchain in + the build's exec group; nothing else resolves that toolchain. """ - if not (rust_toolchain and _is_rust_build(inspection)): - return struct(load_stmt = "", target = "", toolchains = list(toolchains)) - target = """ -rust_host_sysroot( - name = "rust_host_sysroot", - actual = {}, -) -""".format(repr(rust_toolchain)) - return struct( - load_stmt = _RUST_LAYER_LOAD, - target = target, - toolchains = [rust_toolchain, ":rust_host_sysroot"] + [t for t in toolchains if t != rust_toolchain], - ) + return "pep517_rust_whl" if _is_rust_build(inspection) else None def _sdist_build_impl(repository_ctx): """Prepares a repository for building a wheel from a source distribution (sdist). @@ -411,23 +390,15 @@ def _sdist_build_impl(repository_ctx): # AR, LD, and STRIP make variables can be synthetic. Only forward explicit # toolchains/env for JDK, Rust, and other package-specific overrides. toolchain_attrs = "" - rust_layer_load = "" - rust_layer_target = "" + rule = "pep517_native_whl" if is_native else "pep517_whl" vendored_crates_target = "" vendored_crates_attr = "" if is_native: toolchains = list(repository_ctx.attr.extra_toolchains) extra_env = repository_ctx.attr.extra_env - # str(Label) is the canonical form: the only spelling that resolves inside - # a repository the rules_py extension generates, whose repo mapping knows - # nothing about the user's rules_rust dependency. - rust_toolchain = repository_ctx.attr.rust_toolchain - rust = _rust_wiring(str(rust_toolchain) if rust_toolchain else "", inspection, toolchains) - rust_layer_load = rust.load_stmt - rust_layer_target = rust.target - toolchains = rust.toolchains - if rust.load_stmt: + if _rust_rule(inspection): + rule = "pep517_rust_whl" crates = inspection.get("cargo_crates") if inspection else None if crates: _vendor_crates(repository_ctx, crates) @@ -479,7 +450,7 @@ pep517_frontend( tool = ":frontend" repository_ctx.file("BUILD.bazel", content = """ -load("@aspect_rules_py//uv/private/pep517_whl:{rule}.bzl", "{rule}"){frontend_load}{rust_layer_load} +load("@aspect_rules_py//uv/private/pep517_whl:{rule_bzl}.bzl", "{rule}"){frontend_load} load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( @@ -489,7 +460,7 @@ py_binary( deps = {deps}, include_console_scripts = True, ) -{frontend_target}{rust_layer_target}{vendored_crates_target} +{frontend_target}{vendored_crates_target} {rule}( name = "whl", src = "{src}", @@ -508,10 +479,9 @@ exports_files( console_scripts_attr = console_scripts_attr, config_settings_attr = config_settings_attr, monitor_memory_attr = monitor_memory_attr, - rule = "pep517_native_whl" if is_native else "pep517_whl", + rule = rule, + rule_bzl = "pep517_native_whl" if is_native else "pep517_whl", frontend_load = frontend_load, - rust_layer_load = rust_layer_load, - rust_layer_target = rust_layer_target, vendored_crates_target = vendored_crates_target, vendored_crates_attr = vendored_crates_attr, frontend_target = frontend_target, @@ -564,9 +534,6 @@ sdist_build = repository_rule( allow_single_file = True, doc = "Cargo.lock to vendor from and inject into the build in place of the sdist's. Set via `uv.override_package(cargo_lock = ...)`.", ), - "rust_toolchain": attr.label( - doc = "Project-level Rust toolchain; wired into the build when the sdist's build backend is Rust-based.", - ), "extra_toolchains": attr.string_list( default = [], doc = "Toolchain labels forwarded to the generated pep517_native_whl(...) `toolchains` list. Set via `uv.override_package(toolchains = [...])`.", @@ -590,5 +557,5 @@ sdist_build_test_util = struct( env_attr = _env_attr, is_rust_build = _is_rust_build, normalize_requirement = _normalize_requirement, - rust_wiring = _rust_wiring, + rust_rule = _rust_rule, ) diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 005836c28..42e212aaf 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -13,7 +13,7 @@ load( "crate_vendoring_test", "env_attr_test", "is_rust_build_test", - "rust_wiring_test", + "rust_rule_test", ) build_test( @@ -27,6 +27,6 @@ env_attr_test(name = "env_attr_test") is_rust_build_test(name = "is_rust_build_test") -rust_wiring_test(name = "rust_wiring_test") +rust_rule_test(name = "rust_rule_test") crate_vendoring_test(name = "crate_vendoring_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index 7dc120191..a1e4c2b75 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -45,8 +45,6 @@ def _env_attr_test_impl(ctx): env_attr_test = unittest.make(_env_attr_test_impl) -_TOOLCHAIN = "@rules_rust//rust/toolchain:current_rust_toolchain" - def _is_rust_build_test_impl(ctx): env = unittest.begin(ctx) is_rust = sdist_build_test_util.is_rust_build @@ -70,41 +68,31 @@ def _is_rust_build_test_impl(ctx): "setuptools-rust inferred from .rs files counts too: it is injected into the build venv", ) asserts.false(env, is_rust({"build_backend": "mesonpy"}), "meson-python is not Rust") + asserts.false( + env, + is_rust({"build_backend": "mesonpy", "inferred_build_requires": ["setuptools-rust"]}), + "stray .rs files under a non-setuptools backend (numpy) do not make a Rust build", + ) + asserts.true( + env, + is_rust({"build_backend": None, "inferred_build_requires": ["setuptools-rust"]}), + "a bare setup.py with .rs sources is setuptools-rust", + ) asserts.equals(env, "setuptools-rust", sdist_build_test_util.normalize_requirement("Setuptools_Rust>=1.7")) return unittest.end(env) is_rust_build_test = unittest.make(_is_rust_build_test_impl) -def _rust_wiring_test_impl(ctx): +def _rust_rule_test_impl(ctx): env = unittest.begin(ctx) - wiring = sdist_build_test_util.rust_wiring - rust_inspection = {"build_backend": "maturin"} - - off = wiring("", rust_inspection, ["//x:jdk"]) - asserts.equals(env, "", off.load_stmt, "no project rust_toolchain: nothing is wired") - asserts.equals(env, "", off.target) - asserts.equals(env, ["//x:jdk"], off.toolchains, "override toolchains pass through untouched") - - not_rust = wiring(_TOOLCHAIN, {"build_backend": "mesonpy"}, []) - asserts.equals(env, "", not_rust.load_stmt, "a non-Rust backend ignores the project rust_toolchain") - asserts.equals(env, [], not_rust.toolchains) - - on = wiring(_TOOLCHAIN, rust_inspection, ["//x:jdk", _TOOLCHAIN]) - asserts.true(env, "rust_layer.bzl" in on.load_stmt and "rust_host_sysroot" in on.load_stmt, "load() for the layer rule") - asserts.true( - env, - 'rust_host_sysroot(\n name = "rust_host_sysroot",\n actual = "{}",\n)'.format(_TOOLCHAIN) in on.target, - "an exec-configured sysroot layer over the project toolchain; got: " + on.target, - ) - asserts.equals( - env, - [_TOOLCHAIN, ":rust_host_sysroot", "//x:jdk"], - on.toolchains, - "toolchain and layer first, override extras after, the toolchain not repeated", - ) + rule = sdist_build_test_util.rust_rule + asserts.equals(env, "pep517_rust_whl", rule({"build_backend": "maturin"}), "maturin sdists take the Rust flavor") + asserts.equals(env, "pep517_rust_whl", rule({"build_backend": "setuptools.build_meta", "build_requires": ["setuptools-rust>=1.7"]})) + asserts.equals(env, None, rule({"build_backend": "mesonpy"}), "everything else stays on pep517_native_whl") + asserts.equals(env, None, rule(None)) return unittest.end(env) -rust_wiring_test = unittest.make(_rust_wiring_test_impl) +rust_rule_test = unittest.make(_rust_rule_test_impl) def _crate_vendoring_test_impl(ctx): env = unittest.begin(ctx) From 18c9af0093a5faf15ca94a73ccdbf66ce4b33903 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 9 Sep 2026 07:00:39 -0600 Subject: [PATCH 080/103] ci: drop the macOS smoke job The root and e2e/cases suites already run on Linux for every PR, and the crossbuild cases are exercised by the darwin cross-build pipeline. The job tripled macOS minutes without covering anything new. --- .github/workflows/ci-workflows.yaml | 39 ----------------------------- 1 file changed, 39 deletions(-) diff --git a/.github/workflows/ci-workflows.yaml b/.github/workflows/ci-workflows.yaml index debc32945..1a852ea68 100644 --- a/.github/workflows/ci-workflows.yaml +++ b/.github/workflows/ci-workflows.yaml @@ -114,45 +114,6 @@ jobs: if [ -f test.sh ]; then bash test.sh fi - # macOS minutes are billed at 10X, so it only covers the root and e2e consumer - # workspaces, on main plus branches whose name contains 'macos'. - # https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes - smoke: - name: smoke (${{ matrix.workspace.path }}, macos) - if: >- - ${{ github.ref_name == 'main' - || contains(github.head_ref || github.ref_name, 'macos') }} - runs-on: macos-latest - strategy: - fail-fast: false - matrix: - workspace: - - { path: ".", slug: "root" } - - { path: "e2e/cases", slug: "e2e" } - - { path: "e2e/crossbuild", slug: "e2e-crossbuild" } - defaults: - run: - working-directory: ${{ matrix.workspace.path }} - steps: - - uses: actions/checkout@v6 - - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 - with: - bazelisk-cache: true - disk-cache: macos-${{ matrix.workspace.slug }} - repository-cache: true - # Images still build; only the tests that need a Linux container daemon are - # dropped, since the GitHub-hosted macOS runners have none. - # Run `test //...`, then the workspace's test.sh if it has one - - name: Test - shell: bash - run: | - bazel test --config=ci --keep_going \ - --test_tag_filters=-skip-on-bazel8,-requires-docker \ - --build_tag_filters=-skip-on-bazel8 \ - //... - if [ -f test.sh ]; then - bash test.sh - fi # Cross-build validation: build wheels for the opposite architecture on # each Linux runner, then install and run the case's standalone test on a # native runner of the target architecture. No OCI containers — just pip From 8b416c1c3a7fbe66d0bf3fdb842a431e3a78518f Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Wed, 9 Sep 2026 14:13:36 -0600 Subject: [PATCH 081/103] chore(e2e): point the shared setproctitle label at the 1.3.7 the spike pins --- e2e/crossbuild/pycross-setuptools/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/crossbuild/pycross-setuptools/BUILD.bazel b/e2e/crossbuild/pycross-setuptools/BUILD.bazel index 5c1864fab..6197facc6 100644 --- a/e2e/crossbuild/pycross-setuptools/BUILD.bazel +++ b/e2e/crossbuild/pycross-setuptools/BUILD.bazel @@ -11,7 +11,7 @@ exports_files(["require_extension.patch"]) _PY = "3.12" -_SETPROCTITLE_WHL = "@sdist_build__pycross_setuptools__setproctitle__1_3_2//:whl" +_SETPROCTITLE_WHL = "@sdist_build__pycross_setuptools__setproctitle__1_3_7//:whl" _DEP_GROUP = "pycross_setuptools" From eb55b705ca8f8f13a8f8a7f52cec88c932088702 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 05:54:54 -0600 Subject: [PATCH 082/103] Revert "feat(uv): ship rules_py's own Rust toolchain for pep517 sdists" This reverts commit 1258defbb90ba6098c1c3d02bb5a2e4339086212. --- MODULE.bazel | 9 - docs/uv.md | 65 ++-- e2e/crossbuild/MODULE.bazel | 34 ++ e2e/crossbuild/MODULE.bazel.lock | 301 +++++++++++++++++- .../pycross-bcrypt/setup.MODULE.bazel | 6 +- .../pycross-rpds_py/setup.MODULE.bazel | 7 +- e2e/crossbuild/pycross-rust-rs/BUILD.bazel | 62 ++++ e2e/crossbuild/pycross-rust-rs/pyproject.toml | 12 + .../pycross-rust-rs/setup.MODULE.bazel | 28 ++ .../pycross-rust-rs/test_pydantic_core.py | 19 ++ e2e/crossbuild/pycross-rust-rs/uv.lock | 194 +++++++++++ .../pycross-rust/setup.MODULE.bazel | 8 +- .../pycross-tiktoken/setup.MODULE.bazel | 6 +- uv/extensions.bzl | 2 - uv/private/extension/defs.bzl | 14 +- uv/private/pep517_whl/BUILD.bazel | 6 +- uv/private/pep517_whl/pep517_native_whl.bzl | 194 ++++++----- uv/private/pep517_whl/rust_layer.bzl | 33 ++ uv/private/pep517_whl/tests/BUILD.bazel | 52 ++- .../pep517_whl/tests/build_helper_test.py | 120 ++++--- .../pep517_whl/tests/pep517_whl_test.bzl | 44 +-- uv/private/pep517_whl/tools/build_helper.py | 66 ++-- uv/private/rust/BUILD.bazel | 35 -- uv/private/rust/extensions.bzl | 73 ----- uv/private/rust/repositories.bzl | 139 -------- uv/private/rust/toolchain.bzl | 50 --- uv/private/rust/versions.bzl | 59 ---- uv/private/sdist_build/repository.bzl | 75 +++-- uv/private/sdist_build/tests/BUILD.bazel | 4 +- .../sdist_build/tests/repository_test.bzl | 46 ++- 30 files changed, 1079 insertions(+), 684 deletions(-) create mode 100644 e2e/crossbuild/pycross-rust-rs/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-rust-rs/pyproject.toml create mode 100644 e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py create mode 100644 e2e/crossbuild/pycross-rust-rs/uv.lock create mode 100644 uv/private/pep517_whl/rust_layer.bzl delete mode 100644 uv/private/rust/BUILD.bazel delete mode 100644 uv/private/rust/extensions.bzl delete mode 100644 uv/private/rust/repositories.bzl delete mode 100644 uv/private/rust/toolchain.bzl delete mode 100644 uv/private/rust/versions.bzl diff --git a/MODULE.bazel b/MODULE.bazel index ef8e64bfd..0ad229880 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -84,15 +84,6 @@ use_repo( register_toolchains("@python_interpreters//:all") -# Rust for PEP 517 builds of Rust sdists (maturin, setuptools-rust): fetched by -# rules_py like the interpreters and uv, so a Rust package in a lock builds with -# nothing registered by the consumer. Only pep517_rust_whl resolves it. -rust_tools = use_extension("//uv:extensions.bzl", "rust_tools") -rust_tools.toolchain() -use_repo(rust_tools, "rules_py_rust_toolchains") - -register_toolchains("@rules_py_rust_toolchains//:all") - bazel_dep(name = "aspect_tools_telemetry", version = "0.5.2") tel = use_extension("@aspect_tools_telemetry//:extension.bzl", "telemetry") diff --git a/docs/uv.md b/docs/uv.md index 88bf47c7b..8b192abac 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -313,10 +313,13 @@ Under cross mode the build action: 4. Validates the produced wheel's platform tag against the target OS/CPU and fails the action if the backend leaked the exec platform into the tag. -Cargo-based backends (maturin, setuptools-rust) build with rules_py's own Rust -toolchain, fetched like the interpreters and uv; nothing is declared per -project or per package, and the toolchain is never fetched by a workspace -without a Rust sdist. +Cargo-based backends need a Rust toolchain that runs on the exec platform. +Declare it once per project with +`uv.project(rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain")`; +sdist repos whose build backend is maturin, or whose build requirements +include setuptools-rust, then receive `CARGO`, `RUSTC` and the exec-platform +sysroot automatically. No per-package `uv.override_package` `env` or +`toolchains` entries are needed for Rust. Other build-time toolchains are still layered per package through `uv.override_package(toolchains = [...])`. Toolchains exporting the JDK @@ -458,7 +461,7 @@ useful when a pre-build patch removes stale entry-point metadata. ### Build-time toolchains A native sdist build may need tools beyond the C++ toolchain: a JDK for JNI -extensions, Ant. List them on the +extensions, cargo and rustc for Rust extensions, Ant. List them on the package's override and their well-known make-variables reach the build environment on their own: @@ -470,35 +473,43 @@ uv.override_package( ) ``` -`$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(ANT_HOME)` and -`$(ANT_BIN_DIR)` likewise. Any other make-variable a +`$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(CARGO)`, +`$(RUSTC)`, `$(RUST_SYSROOT)` and `$(RUST_HOST_SYSROOT)` as the variables the +Rust build path reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other make-variable a toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always wins over the derived value. -Rust sdists (maturin, setuptools-rust) need nothing declared: rules_py fetches -its own Rust toolchain for them, the way it fetches Python interpreters and -uv, pinned to a release it ships hashes for. Only the build of those sdists -uses it; your own Rust rules and toolchains are untouched, and a workspace -with no Rust sdist never fetches it. To build with another Rust release, pin -it once in `MODULE.bazel`: +Rust needs one more step. Every sdist runs its build logic on the exec +platform, but in a cross build cargo also *compiles* code for the exec platform +and runs it there: `build.rs` scripts and proc-macro crates. Those need the +exec platform's Rust standard library in the sysroot, and a toolchain resolved +for the target platform ships only the target's. Declare the toolchain once per +project and rules_py adds an exec-configured sysroot layer next to it: ```starlark -rust_tools = use_extension("@aspect_rules_py//uv:extensions.bzl", "rust_tools") -rust_tools.toolchain(version = "1.90.0") +uv.project( + hub_name = "pypi", + lock = "//:uv.lock", + pyproject = "//:pyproject.toml", + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", +) ``` -In a cross build cargo also *compiles* code for the exec platform and runs it -there (`build.rs` scripts, proc-macro crates), so the toolchain carries the -exec platform's std next to the target's and the helper overlays them the way -rustup keeps several targets in one install. The crates the sdist's -`Cargo.lock` pins on crates.io are fetched with their checksums while the -repository is generated and vendored into it; cargo then builds offline, so -the build needs no network and works under remote execution. A lock that pins -crates outside crates.io (git or path sources) is rejected. An sdist without a -`Cargo.lock` builds with network access and a warning; give it one with -`uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once with -`cargo generate-lockfile` on the extracted sdist, and it is vendored and -placed next to the sdist's `Cargo.toml` before the build. +Every sdist in that project whose build backend is maturin, or whose build +requirements include setuptools-rust, then gets the toolchain and an +exec-configured `rust_host_sysroot` layer wired into its build. No +`uv.override_package` entry is needed for Rust packages. The crates the +sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while +the repository is generated and vendored into it; cargo then builds offline, +so the build needs no network and works under remote execution. A lock that +pins crates outside crates.io (git or path sources) is rejected. An sdist +without a `Cargo.lock` builds with network access and a warning; give it one +with `uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once +with `cargo generate-lockfile` on the extracted sdist, and it is vendored and +placed next to the sdist's `Cargo.toml` before the build. Any target exposing +rules_rust's toolchain providers works, so the same label serves +[rules_rs](https://github.com/hermeticbuild/rules_rs) toolchains, which are +declared with rules_rust's `rust_toolchain` rule. ### Backend config settings diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 6978cea9c..4bb9cf12c 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -7,6 +7,8 @@ bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "gcc_toolchain", version = "0.11.0") bazel_dep(name = "llvm", version = "0.8.3") bazel_dep(name = "rules_shell", version = "0.4.1") +bazel_dep(name = "rules_rust", version = "0.68.0") +bazel_dep(name = "rules_rs", version = "0.0.110") local_path_override( module_name = "aspect_rules_py", @@ -57,6 +59,37 @@ register_toolchains( # host cross-building the linux cases locally (exec=darwin → target=linux). register_toolchains("@llvm//toolchain:all") +# Shared by the rust suites (pycross-bcrypt, pycross-rpds_py, pycross-rust, +# pycross-tiktoken) through uv.project(rust_toolchain = ...). +rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") +rust.toolchain( + edition = "2021", + extra_target_triples = [ + "aarch64-unknown-linux-gnu", + "x86_64-unknown-linux-gnu", + ], + versions = ["1.90.0"], +) +use_repo(rust, "rust_toolchains") + +register_toolchains("@rust_toolchains//:all") + +# rules_rs toolchains for //pycross-rust-rs. They are rules_rust `rust_toolchain` +# instances declared in the patched rules_rust repository rules_rs fetches, so +# they register under that repository's toolchain type and never compete with +# the BCR rules_rust toolchains above. +rs_toolchains = use_extension("@rules_rs//rs/toolchains:module_extension.bzl", "toolchains") +rs_toolchains.toolchain( + edition = "2021", + version = "1.92.0", +) +use_repo(rs_toolchains, "default_rust_toolchains") + +rules_rust_rs = use_extension("@rules_rs//rs:rules_rust.bzl", "rules_rust") +use_repo(rules_rust_rs, rules_rust_rs = "rules_rust") + +register_toolchains("@default_rust_toolchains//...") + uv_bin = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv_bin") uv_bin.toolchain(version = "0.11.21") use_repo(uv_bin, "uv") @@ -69,6 +102,7 @@ include("//pycross-msgpack:setup.MODULE.bazel") include("//pycross-patches:setup.MODULE.bazel") include("//pycross-pure-python:setup.MODULE.bazel") include("//pycross-rust:setup.MODULE.bazel") +include("//pycross-rust-rs:setup.MODULE.bazel") include("//pycross-setuptools:setup.MODULE.bazel") include("//pycross-psutil:setup.MODULE.bazel") include("//pycross-geohash:setup.MODULE.bazel") diff --git a/e2e/crossbuild/MODULE.bazel.lock b/e2e/crossbuild/MODULE.bazel.lock index 6543b2bba..c318e0cde 100644 --- a/e2e/crossbuild/MODULE.bazel.lock +++ b/e2e/crossbuild/MODULE.bazel.lock @@ -10,6 +10,9 @@ "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", + "https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442", + "https://bcr.bazel.build/modules/apple_support/1.24.1/MODULE.bazel": "f46e8ddad60aef170ee92b2f3d00ef66c147ceafea68b6877cb45bd91737f5f8", + "https://bcr.bazel.build/modules/apple_support/1.24.1/source.json": "cf725267cbacc5f028ef13bb77e7f2c2e0066923a4dab1025e4a0511b1ed258a", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.5.2/MODULE.bazel": "c715a5fb6b13a0086c061618f00d033a4ab6d76cbd1083e38d7ca953b5e547f4", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.5.2/source.json": "4dd300d44767ad4860098b006dda614e67ab0409ae6ec6e133faad303fe9ede8", "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", @@ -20,14 +23,18 @@ "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", "https://bcr.bazel.build/modules/bazel_features/1.24.0/MODULE.bazel": "4796b4c25b47053e9bbffa792b3792d07e228ff66cd0405faef56a978708acd4", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87", + "https://bcr.bazel.build/modules/bazel_features/1.32.0/MODULE.bazel": "095d67022a58cb20f7e20e1aefecfa65257a222c18a938e2914fd257b5f1ccdc", "https://bcr.bazel.build/modules/bazel_features/1.34.0/MODULE.bazel": "e8475ad7c8965542e0c7aac8af68eb48c4af904be3d614b6aa6274c092c2ea1e", "https://bcr.bazel.build/modules/bazel_features/1.38.0/MODULE.bazel": "f9b8a9c890ebd216b4049fd12a31d3c2602e3403c7af636b04fbbd7453edc9c9", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", "https://bcr.bazel.build/modules/bazel_features/1.42.0/MODULE.bazel": "e8ca15cb2639c5f12183db6dcb678735555d0cdd739b32a0418b6532b5e565f8", "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", + "https://bcr.bazel.build/modules/bazel_features/1.45.0/MODULE.bazel": "7daec6d87ab0703417486d4cb948af0b06f55d4d7c08cbb5978c80e79b538edf", + "https://bcr.bazel.build/modules/bazel_features/1.50.0/MODULE.bazel": "2083ef9c7a469f520890483ccf8e0189d6e71e2117e7752e15e6554433d5ae3e", + "https://bcr.bazel.build/modules/bazel_features/1.50.0/source.json": "e0ee3debde2789ff56e4452e612d126925ba9ab64d4bde79c67f099d2902df9b", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", @@ -39,6 +46,7 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.0/MODULE.bazel": "2ab127ef8d56a739a99bb2ce00ec4c7d1ecc7977d4370c0ca6efd0d8f03d6d99", "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", @@ -52,6 +60,7 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/bzip2/1.0.8.bcr.3/MODULE.bazel": "29ecf4babfd3c762be00d7573c288c083672ab60e79c833ff7f49ee662e54471", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", @@ -64,13 +73,16 @@ "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/MODULE.bazel": "67ff71bbfb482e58510451c4c8b8cd303c757f7ff79a2aff7cf381277be96f9f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/source.json": "475aa00426677e643e327b4b031d8816a3bc0a134c94d0d0d510cfd67b2cfd2c", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.8/MODULE.bazel": "3be7b0faca6f1e69e89197999e0b01ce058c42f3e764ef028466f7e0ff77c761", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/llvm/0.8.18/MODULE.bazel": "56d507d49c02498731fa5a95fa48a778368f2d23c0f6184a578d057e58830458", + "https://bcr.bazel.build/modules/llvm/0.8.18/source.json": "ca45abf06bdd842e88acdda4a077038bbecddd3e90050951c2aff5f89b1b522e", "https://bcr.bazel.build/modules/llvm/0.8.3/MODULE.bazel": "dbc1bc13171f8f9980a75524883abef1c491613e8d8d805cd4ffa3767ba9708e", - "https://bcr.bazel.build/modules/llvm/0.8.3/source.json": "4b11874c26a9de53c03a25a517ebc36dee6b458c920fe9ed65e3ca279ff19775", "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", + "https://bcr.bazel.build/modules/package_metadata/0.0.7/MODULE.bazel": "7adb03933fc8401f495800cf4eafcff0edc6da0ff55c7db223ef69d19f689486", + "https://bcr.bazel.build/modules/package_metadata/0.0.7/source.json": "50639625e937b56115012674c797cca7a05a96b4878c87d803c13dc2b31de8a0", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", @@ -78,6 +90,7 @@ "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", @@ -87,7 +100,8 @@ "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", - "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/29.1/source.json": "04cca85dce26b895ed037d98336d860367fe09919208f2ad383f0df1aff63199", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", @@ -111,8 +125,10 @@ "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.22/MODULE.bazel": "94df4328edef9e44d38de5e73b037cd348e75e7ae55f4e21bf07878c41a31ebb", + "https://bcr.bazel.build/modules/rules_cc/0.2.22/source.json": "b2d6d6f9c332ce269ad75b89c6f3168d809a66173c9040210fb9bcc733ab42fa", "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", @@ -152,7 +168,8 @@ "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", - "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", @@ -160,13 +177,20 @@ "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", + "https://bcr.bazel.build/modules/rules_python/1.6.3/MODULE.bazel": "a7b80c42cb3de5ee2a5fa1abc119684593704fcd2fec83165ebe615dec76574f", "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.8.0/MODULE.bazel": "c151c025dbcc93d8f62ab68ecc313c9176a868a0e6386981bf2a12aec77cbe7b", "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_rs/0.0.110/MODULE.bazel": "c0c3c938547998dbced9aafea3c67c28d6919a33ea63707b03f1da0359840355", + "https://bcr.bazel.build/modules/rules_rs/0.0.110/source.json": "679b8aad1f16158580dbfd4aac59eea2644740ff34078bc46030a5ec3bfa62f8", + "https://bcr.bazel.build/modules/rules_rust/0.68.0/MODULE.bazel": "dcb4fe4396b49d3b2d72bccf634d27499dd2a58dcdfccfe8e17ba15c4bd150ae", + "https://bcr.bazel.build/modules/rules_rust/0.68.0/source.json": "e5d5f37874c4af13dbdfbf1220889607d9b3cc51f2831e10c2035b6638442f07", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_shell/0.8.0/MODULE.bazel": "f6a89f1d6a669a26f28fe814503857055d76306b79cfc11d12399af08d0b80ae", + "https://bcr.bazel.build/modules/rules_shell/0.8.0/source.json": "eb53cc815bc503c6683c5fe12d943f98883f81fc22f51403ec8a95610cba4195", "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", @@ -180,10 +204,15 @@ "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/MODULE.bazel": "b573395fe63aef4299ba095173e2f62ccfee5ad9bbf7acaa95dba73af9fc2b38", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/source.json": "3f3fbaeafecaf629877ad152a2c9def21f8d330d91aa94c5dc75bbb98c10b8b8", + "https://bcr.bazel.build/modules/xz/5.4.5.bcr.8/MODULE.bazel": "e48a69bd54053c2ec5fffc2a29fb70122afd3e83ab6c07068f63bc6553fa57cc", + "https://bcr.bazel.build/modules/zlib-ng/2.3.3.bcr.2/MODULE.bazel": "86130924115bf8dfc4aba286fb49a2ec8d32430a21771db9ccf5381acf0d10cc", + "https://bcr.bazel.build/modules/zlib-ng/2.3.3.bcr.2/source.json": "7aa4112eb2fbb99757e97cf0b7a4e2bdb3464b2b3cfb351bc807ffcb34bd349f", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198", + "https://bcr.bazel.build/modules/zstd/1.5.7.bcr.1/MODULE.bazel": "c5977176dd8555be7a9d598512ae0cae11831259c06f00a5e5e0037d5db4e3f5", + "https://bcr.bazel.build/modules/zstd/1.5.7.bcr.1/source.json": "aa95e0b5aac9d80195b9047d223beaf26b1948be55d49f0e803e180e9ccc6e75" }, "selectedYankedVersions": {}, "moduleExtensions": { @@ -574,6 +603,158 @@ ] ] } + }, + "@@rules_rust+//crate_universe/private:internal_extensions.bzl%cu_nr": { + "general": { + "bzlTransitiveDigest": "YzmISGDIFf1NJ3Mirh13ENAB5ReImczJ9PzKoZhDpMs=", + "usagesDigest": "x2UGTaQ0WUugfG6TAhmfjv42yrbUJc9cune5ruXn4o8=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "cargo_bazel_bootstrap": { + "repoRuleId": "@@rules_rust+//cargo/private:cargo_bootstrap.bzl%cargo_bootstrap_repository", + "attributes": { + "srcs": [ + "@@rules_rust+//crate_universe:src/api.rs", + "@@rules_rust+//crate_universe:src/api/lockfile.rs", + "@@rules_rust+//crate_universe:src/cli.rs", + "@@rules_rust+//crate_universe:src/cli/generate.rs", + "@@rules_rust+//crate_universe:src/cli/query.rs", + "@@rules_rust+//crate_universe:src/cli/render.rs", + "@@rules_rust+//crate_universe:src/cli/splice.rs", + "@@rules_rust+//crate_universe:src/cli/vendor.rs", + "@@rules_rust+//crate_universe:src/config.rs", + "@@rules_rust+//crate_universe:src/context.rs", + "@@rules_rust+//crate_universe:src/context/crate_context.rs", + "@@rules_rust+//crate_universe:src/context/platforms.rs", + "@@rules_rust+//crate_universe:src/lib.rs", + "@@rules_rust+//crate_universe:src/lockfile.rs", + "@@rules_rust+//crate_universe:src/main.rs", + "@@rules_rust+//crate_universe:src/metadata.rs", + "@@rules_rust+//crate_universe:src/metadata/cargo_bin.rs", + "@@rules_rust+//crate_universe:src/metadata/cargo_tree_resolver.rs", + "@@rules_rust+//crate_universe:src/metadata/cargo_tree_rustc_wrapper.bat", + "@@rules_rust+//crate_universe:src/metadata/cargo_tree_rustc_wrapper.sh", + "@@rules_rust+//crate_universe:src/metadata/dependency.rs", + "@@rules_rust+//crate_universe:src/metadata/metadata_annotation.rs", + "@@rules_rust+//crate_universe:src/rendering.rs", + "@@rules_rust+//crate_universe:src/rendering/template_engine.rs", + "@@rules_rust+//crate_universe:src/rendering/templates/module_bzl.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/header.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/aliases_map.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/deps_map.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/repo_git.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/repo_http.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/vendor_module.j2", + "@@rules_rust+//crate_universe:src/rendering/verbatim/alias_rules.bzl", + "@@rules_rust+//crate_universe:src/select.rs", + "@@rules_rust+//crate_universe:src/splicing.rs", + "@@rules_rust+//crate_universe:src/splicing/cargo_config.rs", + "@@rules_rust+//crate_universe:src/splicing/crate_index_lookup.rs", + "@@rules_rust+//crate_universe:src/splicing/splicer.rs", + "@@rules_rust+//crate_universe:src/test.rs", + "@@rules_rust+//crate_universe:src/utils.rs", + "@@rules_rust+//crate_universe:src/utils/starlark.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/glob.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/label.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select_dict.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select_list.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select_scalar.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select_set.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/serialize.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/target_compatible_with.rs", + "@@rules_rust+//crate_universe:src/utils/symlink.rs", + "@@rules_rust+//crate_universe:src/utils/target_triple.rs" + ], + "binary": "cargo-bazel", + "cargo_lockfile": "@@rules_rust+//crate_universe:Cargo.lock", + "cargo_toml": "@@rules_rust+//crate_universe:Cargo.toml", + "version": "1.86.0", + "timeout": 900, + "rust_toolchain_cargo_template": "@rust_host_tools//:bin/{tool}", + "rust_toolchain_rustc_template": "@rust_host_tools//:bin/{tool}", + "compressed_windows_toolchain_names": false + } + } + }, + "moduleExtensionMetadata": { + "explicitRootModuleDirectDeps": [ + "cargo_bazel_bootstrap" + ], + "explicitRootModuleDirectDevDeps": [], + "useAllRepos": "NO", + "reproducible": false + }, + "recordedRepoMappingEntries": [ + [ + "bazel_features+", + "bazel_features_globals", + "bazel_features++version_extension+bazel_features_globals" + ], + [ + "bazel_features+", + "bazel_features_version", + "bazel_features++version_extension+bazel_features_version" + ], + [ + "rules_cc+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_cc+", + "cc_compatibility_proxy", + "rules_cc++compatibility_proxy+cc_compatibility_proxy" + ], + [ + "rules_cc+", + "rules_cc", + "rules_cc+" + ], + [ + "rules_cc++compatibility_proxy+cc_compatibility_proxy", + "rules_cc", + "rules_cc+" + ], + [ + "rules_rust+", + "bazel_features", + "bazel_features+" + ], + [ + "rules_rust+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "rules_rust+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_rust+", + "cui", + "rules_rust++cu+cui" + ], + [ + "rules_rust+", + "rrc", + "rules_rust++i2+rrc" + ], + [ + "rules_rust+", + "rules_cc", + "rules_cc+" + ], + [ + "rules_rust+", + "rules_rust", + "rules_rust+" + ] + ] + } } }, "facts": { @@ -1637,6 +1818,110 @@ }, "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "notice_version": "3" + }, + "@@rules_rs+//rs/toolchains:module_extension.bzl%toolchains": { + "cargo-1.92.0-aarch64-apple-darwin.tar.zst": "934faac197f1ca044b55dee59e1ca7b31c56dcdf622d3c34575ac9e99951caf2", + "cargo-1.92.0-aarch64-pc-windows-msvc.tar.zst": "6d6dc45e6c98c9afe5d5194dee36bc6ed04e2229fec32307603b1f017d0d2f36", + "cargo-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "e9d346d32d3ceb05a4fb8680da608084cd55d80a491418e53e66bd46dd582929", + "cargo-1.92.0-x86_64-apple-darwin.tar.zst": "6ad5fb1cf52ec9417334d77f408848704bbb7987d4e0f71dcbb69cde75353470", + "cargo-1.92.0-x86_64-pc-windows-msvc.tar.zst": "ad5aa56f37216bced19b15b27de116a5cdc448a15c3a30d2d8a31f14a86cc9bb", + "cargo-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "5ea83bd512d784ff495631476aee1a5422f0a22261aae311446a4b288ecded5f", + "clippy-1.92.0-aarch64-apple-darwin.tar.zst": "00f1c80d36f97fc42009315faa1881fc7ae6a060f541b7a4361bcbb03ce6cd70", + "clippy-1.92.0-aarch64-pc-windows-msvc.tar.zst": "62402d8dad087cff56f768d29994f35fa319d0f4642f608b293995f0d1324870", + "clippy-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "a7c5eff6b5d763498454dd463a0b0c100880ab8b4156f82936c05e72d1dfc6ba", + "clippy-1.92.0-x86_64-apple-darwin.tar.zst": "28076203bfa4b9cda9a2c7723d33c3debab32b65bf17a5edc253c5715042fa31", + "clippy-1.92.0-x86_64-pc-windows-msvc.tar.zst": "28bf949165fb1252b1e8d78ad1718933cc247cac7f0d6f22f55bae930a66f4f3", + "clippy-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "7f1e94c6c0ddc529ed8d3a620c0dbb6035dc4a2491f558bea1e5f850413d56a5", + "rust-analyzer-1.92.0-aarch64-apple-darwin.tar.zst": "271047fbcdfc135864919bdf8590d5416b583e87d5d688d9e1dc993032508780", + "rust-analyzer-1.92.0-aarch64-pc-windows-msvc.tar.zst": "01c0ebf593b6bf69bc3aae245d82d6a22d6319aa1452cb467b12f766d7031290", + "rust-analyzer-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "4f6bca3ad473b9db72e1cee5cb4f378b8cc48157e46a9e60b24636d62edc6c61", + "rust-analyzer-1.92.0-x86_64-apple-darwin.tar.zst": "6b162050d40da201e9beffe94afd748d7b1d2c88c6d7d23a5fcf95330c995c83", + "rust-analyzer-1.92.0-x86_64-pc-windows-msvc.tar.zst": "36d0e77c09e7297fab4df3fae286c39ee4348946b34776aa67b5b23c27d72a80", + "rust-analyzer-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "950c2f0fc51ef8f7c99d33951e4dacab4c0767e106466d9e883a8f31a9c27b62", + "rust-src-1.92.0.tar.zst": "39a65365e239f5f33db3ecac464633ee0c6a298abc2c60e4a25c127c2bf5f263", + "rust-std-1.92.0-aarch64-apple-darwin.tar.zst": "a6152db76c66b25e4846b91bdb153b57c645b9323f7c99121b8d938d05ec8756", + "rust-std-1.92.0-aarch64-apple-ios-macabi.tar.zst": "d9812a9b2ba5e8838c86abd37e1a0b78314c717029a64fc9f71c6863a0cfc16d", + "rust-std-1.92.0-aarch64-apple-ios-sim.tar.zst": "4bb0ed5ddaac0e82223b4a3173a9d29aa8f999e4f108534f7d6b6a174da49816", + "rust-std-1.92.0-aarch64-apple-ios.tar.zst": "cc7bc7c7118432c674fd372f76de67f9631873f21fc7390cbc0d48ccb8c0706a", + "rust-std-1.92.0-aarch64-linux-android.tar.zst": "342650902c8b3d497c0d152c9aa1013e5e1bc281666f00ebea13ac6c2848dd2c", + "rust-std-1.92.0-aarch64-pc-windows-gnullvm.tar.zst": "6ea57d6cfc68697ce7a6376d7c0b66191723a28ee95dd81ca9746a0c6b4f3f1c", + "rust-std-1.92.0-aarch64-pc-windows-msvc.tar.zst": "bbb6ef03ecc830260a933176610619078916e1494e5f7a3f2dba89956f9d52b3", + "rust-std-1.92.0-aarch64-unknown-fuchsia.tar.zst": "58ac7b9e74b1ced3b9640cd8b0d849824428640f03a66a3f390f9779850c4075", + "rust-std-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "db5f099c63013b558ee334f7a13c503ae256d3d3c5fb3bbabe6b513d0217e19a", + "rust-std-1.92.0-aarch64-unknown-linux-musl.tar.zst": "923384991a566d5477305d49c152d2f83911b9f06e30a53a90e62b9c0931642e", + "rust-std-1.92.0-aarch64-unknown-none-softfloat.tar.zst": "7587517944d2e19f5e0231f05989fac0ae5877778eaa6420928edc3047bda542", + "rust-std-1.92.0-aarch64-unknown-none.tar.zst": "6b8fa1a40adc80e58aa14d148ad8b652d1362c42e3f9ded24b05d4ca2c7c76dd", + "rust-std-1.92.0-aarch64-unknown-uefi.tar.zst": "5cb3f57bb7606d9cb08e55d95797491698e4c221f09c087faf28f42d169edb47", + "rust-std-1.92.0-arm-linux-androideabi.tar.zst": "e74a37f3da7cb3b29c46636b45e2af6cc6e477768cfaf22d1182fdce3998cd06", + "rust-std-1.92.0-arm-unknown-linux-gnueabi.tar.zst": "1fea2017b00227e8e1750f3f78d571e2731e949ea3a9c024f4d706c50532c4ee", + "rust-std-1.92.0-arm-unknown-linux-gnueabihf.tar.zst": "755937d472c0f77262704b80fb4d762cfe22f6fe559fe1dd7a6ffd8c9945ad52", + "rust-std-1.92.0-arm-unknown-linux-musleabi.tar.zst": "78dad339d932fe8d6b4d28f55caf0a66ac981dae65b1080b34827ad90c65820d", + "rust-std-1.92.0-arm-unknown-linux-musleabihf.tar.zst": "a1647d1ae3672d7f4a77f7c2aaef53f7c1ba1e4c04e79fef5c31fedb1624fb52", + "rust-std-1.92.0-armv7-linux-androideabi.tar.zst": "f347361f8aaa09796c81b33dd530c6df59c545e2225a9f430354602c5d3d225d", + "rust-std-1.92.0-armv7-unknown-linux-gnueabi.tar.zst": "cdc9d12195fc578c3a6890066ffe3e2f45b61bee6069b79a0723ffc01580d43e", + "rust-std-1.92.0-armv7-unknown-linux-gnueabihf.tar.zst": "3747329709be56bb493f39e148721cf47ad52e2d6f4d641e173f877069b86641", + "rust-std-1.92.0-armv7-unknown-linux-musleabi.tar.zst": "4947f6748d6b340bc44196f8db60564d75d0b244f59231d8d1b81a659131348d", + "rust-std-1.92.0-armv7-unknown-linux-musleabihf.tar.zst": "5a0836abf6946350bb3a21bba569a6732829946593037c2d8ec452eead3a98bd", + "rust-std-1.92.0-i686-linux-android.tar.zst": "272394a361ebca0a1e18ae8e2bbf51ee03abacb9492a89a5e07f44e15e11dc75", + "rust-std-1.92.0-i686-pc-windows-gnu.tar.zst": "1a7574ffe7495bc5b386af0da87b241d8f80bed44622992e65203bfad98f87d7", + "rust-std-1.92.0-i686-pc-windows-gnullvm.tar.zst": "2e332076308db6558c39986a4de0542d193d42cac4c8171ef3bcb331b010b9c7", + "rust-std-1.92.0-i686-pc-windows-msvc.tar.zst": "bb1b6313d47da6927f8be564a95cb494854c9d6e39d91947f5feb31ed92b7bbf", + "rust-std-1.92.0-i686-unknown-freebsd.tar.zst": "64799a94bd6695f2edfdbfef895605b443b702041a05a8149641c395d342867f", + "rust-std-1.92.0-i686-unknown-linux-gnu.tar.zst": "6a53e3ecf2d94d79842a4d6ee20a175860fbe2061b8702d816e7d0fb3efb2dc4", + "rust-std-1.92.0-i686-unknown-linux-musl.tar.zst": "30f96a8b910cab267c06460e3403031de1a14373da1876a031fab44b68c221dd", + "rust-std-1.92.0-i686-unknown-uefi.tar.zst": "cf28b4182d8f12ede776dc310964cebef06d1a9efcb311c98722eb10e0052f1b", + "rust-std-1.92.0-loongarch64-unknown-linux-gnu.tar.zst": "04e0a4dcf92533a240f9190bf6b8d487168df2ad4fba56fef26d9835b4abbad1", + "rust-std-1.92.0-loongarch64-unknown-linux-musl.tar.zst": "5737ceaf6492c52ad4e3bdcd6b6c99c9f88adf3d24489802d3bd5cace8c077ab", + "rust-std-1.92.0-loongarch64-unknown-none.tar.zst": "2aa371171d9a48f01d6ef4b8dc091ea6e26fbd3720da217f86e482d825b35dd8", + "rust-std-1.92.0-powerpc-unknown-linux-gnu.tar.zst": "5c813b76bab6ddc79776dc7993b628f09c0e36e98f2a2fa4225e8443e0bfe956", + "rust-std-1.92.0-powerpc64-unknown-linux-gnu.tar.zst": "ecd97d75b8ec82b2a11a414b9afa44ddab8242e402d149d176e18d3755468b9d", + "rust-std-1.92.0-powerpc64le-unknown-linux-gnu.tar.zst": "970b68e135b8fa4b7f86cd8f39173bd5c03a1223735c32bbcd5122a6b5dee13f", + "rust-std-1.92.0-powerpc64le-unknown-linux-musl.tar.zst": "1bc1904a48014c423c68a66b06a75cb7d67010a3e8fdb89b1b4621dc031a7fd0", + "rust-std-1.92.0-riscv32imac-unknown-none-elf.tar.zst": "1107e131abff8bd4426de83af64df9b45f7f713523b430792f0b72c7dbc86775", + "rust-std-1.92.0-riscv32imc-unknown-none-elf.tar.zst": "9838a8ae5f35ccf44f18bc712bd329dac6384b5d69a21bfd32832e85293db453", + "rust-std-1.92.0-riscv64gc-unknown-linux-gnu.tar.zst": "9fec2f1d31e08b5f12886385f548d02854a4df70aa74779bf17d6c582741f668", + "rust-std-1.92.0-riscv64gc-unknown-linux-musl.tar.zst": "977ddd7ad1061521eea05f7cc2742d33a7b1fe1adbf971e9bfc153973bba734d", + "rust-std-1.92.0-riscv64gc-unknown-none-elf.tar.zst": "f9c3c317d5d5ac892aad53c351cf6d31fa809a4aa366bdf1bbc9377f651535ee", + "rust-std-1.92.0-s390x-unknown-linux-gnu.tar.zst": "3fc7e9129dfc2981ec5390a2d0d1200b5ac3d1bf373b890a57624a6611dab8b8", + "rust-std-1.92.0-sparc64-unknown-linux-gnu.tar.zst": "524699c80798fb92fe06778ec20433c38a2295939577ec31f1af9aed0a229b34", + "rust-std-1.92.0-thumbv6m-none-eabi.tar.zst": "e7cc3cfc7d0e6e10a1eb90ba36773db35a25c6fa98587c5d1ae02e9aaa77978f", + "rust-std-1.92.0-thumbv7em-none-eabi.tar.zst": "99b0c00163763dc6d0f93a48840fdbf2c43ddba24a41944c0c1eda593ed867a0", + "rust-std-1.92.0-thumbv7em-none-eabihf.tar.zst": "4d0439d1d0fecd5d2590436c318b7b9d9cd84b25e494ded534ab251d52b48401", + "rust-std-1.92.0-thumbv7m-none-eabi.tar.zst": "9967cf844d7c1871a2e27a43362315bfa29ca5d1a745f3e165103bddd8c721eb", + "rust-std-1.92.0-thumbv8m.main-none-eabi.tar.zst": "c9b9b67622a3bb15a9d2bc81c9473523514848faf1784826392dc3765904c315", + "rust-std-1.92.0-thumbv8m.main-none-eabihf.tar.zst": "53cb8593ae84a982ecd7bb6b203957ebfddbd1cabeccdff93ef456103af99690", + "rust-std-1.92.0-wasm32-unknown-emscripten.tar.zst": "d7d81544d8295e68836bad16d0512285ca9113b4abe2567d61cc58ea9f9d4c72", + "rust-std-1.92.0-wasm32-unknown-unknown.tar.zst": "9e0aca6975365c914c35ad003e0058361cdf3337736d7f908c7be67258eb7589", + "rust-std-1.92.0-wasm32-wasip1-threads.tar.zst": "41e2c8b944f140285b762f73ef3e3f028b068f3f4d353b9cd48aee37aef2df98", + "rust-std-1.92.0-wasm32-wasip1.tar.zst": "ef0e481aad764cb455e3ee459547d2bb7b580969859d91c23ae2618e58791abc", + "rust-std-1.92.0-wasm32-wasip2.tar.zst": "7d3d9da3f58dd07035b3c86d4285f145e06c4247b885bad014f7976187d8cbe3", + "rust-std-1.92.0-x86_64-apple-darwin.tar.zst": "3c7c504c0cc8fdfa56125f27292c057359b1529f79a8f7807b097f9b3175f75b", + "rust-std-1.92.0-x86_64-apple-ios-macabi.tar.zst": "f3258393b78f0163cfbf0bf4f71046d72da8f794ce2e6dd062325211cfd0d2c6", + "rust-std-1.92.0-x86_64-apple-ios.tar.zst": "fd889ca97041a6a7150dd0d2ae6bff9454f55f30520e8a043b5e45b5d91e57ee", + "rust-std-1.92.0-x86_64-linux-android.tar.zst": "b223b3271b9bd9695bc9cdcf26a5b8636ce2ffeca8cd80ad00c2e57ef4af5f06", + "rust-std-1.92.0-x86_64-pc-windows-gnu.tar.zst": "a5046c33ea9b87627f8266200c5ea51ed2c6c567d4c9d1350bd1bd57db685177", + "rust-std-1.92.0-x86_64-pc-windows-gnullvm.tar.zst": "4931412aa9b5ad6340d7403cf5597876979d24fda36b422944c33f8187610a85", + "rust-std-1.92.0-x86_64-pc-windows-msvc.tar.zst": "48b550c038691aafa0de408e045d17da9dd39bc911456b7e3cd0af2762a4d403", + "rust-std-1.92.0-x86_64-unknown-freebsd.tar.zst": "21c4065536337fdabfa18fa52accdfb9c37509324ff93a45bddb53eb1254c3e8", + "rust-std-1.92.0-x86_64-unknown-fuchsia.tar.zst": "eaa3eac2a2758c77e706a3eadee52b7b27eed15bd2788e9ef922215187aecbd0", + "rust-std-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "7d28286fe72ad895a1187f7b075d7d1cf5b1d824d6f65241f121265bfe161d82", + "rust-std-1.92.0-x86_64-unknown-linux-musl.tar.zst": "4a26b05ba7c19de836bce0176858fb58bfbd475f7eec82be16009ddbbb63aed7", + "rust-std-1.92.0-x86_64-unknown-netbsd.tar.zst": "db9f91d5eb6b26b03afeffc1e9ace53c2d13f8e0e10f87be0f8f7c86ba978383", + "rust-std-1.92.0-x86_64-unknown-none.tar.zst": "ee1385827731ae293cce83a252ec43718a85df3ac9982723bb35c118fbbe8048", + "rust-std-1.92.0-x86_64-unknown-uefi.tar.zst": "a651c526a7bf8867b760763f98c8c73f93b962fc6fb220872cff64d5b42b9c7c", + "rustc-1.92.0-aarch64-apple-darwin.tar.zst": "91d29edcb82361f943bd0fe00a9027a36b99561f99fe4fb35d8b4fcf43217430", + "rustc-1.92.0-aarch64-pc-windows-msvc.tar.zst": "853d238dec9c596a9c7f677490a0b0c7e44e46384739a3fc2693bf5c60073bac", + "rustc-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "10d2d323aa0a9b0d75aa2540a14002caf5d1b3413a4c65ab936a36879eb4f621", + "rustc-1.92.0-src.tar.zst": "c895404fd5326c857a29805638513a07c6909745e1b8afbb2fbbed906c39c7ce", + "rustc-1.92.0-x86_64-apple-darwin.tar.zst": "cf537975a07c94b4913619c5209fb2d6622a77922fc51a63e09fcd75dedfd192", + "rustc-1.92.0-x86_64-pc-windows-msvc.tar.zst": "d9ba009edecca135d816ba15995696cb0e4f98c669c3759ce107526121fe9ae4", + "rustc-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "d234e767edd7f8dc0c5c8976b1f044e55594d5a11654fcf4b9a5e19dc97f349b", + "rustfmt-1.92.0-aarch64-apple-darwin.tar.zst": "ec6c9ce8053de1e69f87ff254593e3b0eca10138455bd57e388020a00af1226d", + "rustfmt-1.92.0-aarch64-pc-windows-msvc.tar.zst": "2a31a49e093427098bc242792f5b9413f60b63b27f715996291170ecfa6e7bcc", + "rustfmt-1.92.0-aarch64-unknown-linux-gnu.tar.zst": "ef3fb38df66f3678d242f9cde30dc29b9a241900ea5e78b5c711d9afffbc06f2", + "rustfmt-1.92.0-x86_64-apple-darwin.tar.zst": "ec907b57cef4c62f5ca30f70a16b1b5182143507385c855a997064546fa88158", + "rustfmt-1.92.0-x86_64-pc-windows-msvc.tar.zst": "a3f415ce0fd1f87605a210daa82fa748ccb7d8097c258f646ed6afe180eed2c5", + "rustfmt-1.92.0-x86_64-unknown-linux-gnu.tar.zst": "20fc854bb0b7117d08631026986616a282c900ec2cdcc065842dd8ef381bb57e" } } } diff --git a/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel b/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel index 1c2ad5ba9..80223f472 100644 --- a/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-bcrypt/setup.MODULE.bazel @@ -1,7 +1,8 @@ """bcrypt: setuptools-rust sdist build. -Nothing declares Rust: sdist_build detects setuptools-rust in the build -requirements and builds with rules_py's own Rust toolchain. +`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build detects +setuptools-rust in the build requirements and emits the toolchain plus the +exec-platform sysroot into the generated pep517_native_whl. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -16,6 +17,7 @@ uv.project( hub_name = "pypi_pycross_bcrypt", lock = "//pycross-bcrypt:uv.lock", pyproject = "//pycross-bcrypt:pyproject.toml", + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel b/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel index adcfbedff..b99a8cef7 100644 --- a/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rpds_py/setup.MODULE.bazel @@ -1,8 +1,10 @@ """rpds-py: maturin/PyO3 sdist build (hub dir underscores what PyPI hyphenates, hence override name != hub name). -Nothing declares Rust: sdist_build detects the maturin backend and builds -with rules_py's own Rust toolchain, exec std and target std overlaid. +`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build detects +the maturin backend and emits the toolchain plus the exec-platform sysroot +(the std that build scripts and proc-macros need) into the generated +pep517_native_whl. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -15,6 +17,7 @@ uv.project( hub_name = "pypi_pycross_rpds_py", lock = "//pycross-rpds_py:uv.lock", pyproject = "//pycross-rpds_py:pyproject.toml", + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel new file mode 100644 index 000000000..5d6adbff5 --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel @@ -0,0 +1,62 @@ +# maturin (Cargo/PyO3) cross case on rules_rs toolchains: pydantic-core built +# from its sdist for the host at runtime, and cross-compiled for both linux +# CPUs. Same assertions as //pycross-rust; only the Rust toolchain provider +# differs (see setup.MODULE.bazel). + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") + +_PY = "3.12" + +_DEP_GROUP = "pycross_rust_rs" + +py_test( + name = "test_pydantic_core", + srcs = ["test_pydantic_core.py"], + dep_group = _DEP_GROUP, + main = "test_pydantic_core.py", + python_version = _PY, + deps = ["@pypi_pycross_rust_rs//pydantic_core"], +) + +# The wheel targets under `collect_wheels` are reached through a platform +# transition rather than a py_venv, so nothing sets the dep_group flag for +# them — the platform carries it alongside the libc/version flags the wheel +# resolver needs. +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "rust_rs_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = ["@sdist_build__pycross_rust_rs__pydantic_core__2_47_0//:whl"], +) diff --git a/e2e/crossbuild/pycross-rust-rs/pyproject.toml b/e2e/crossbuild/pycross-rust-rs/pyproject.toml new file mode 100644 index 000000000..4b544807b --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "pycross_rust_rs" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "maturin", + "pydantic-core==2.47.0", +] + +[tool.uv] +no-binary-package = ["pydantic-core"] diff --git a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel new file mode 100644 index 000000000..068fd6d9f --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel @@ -0,0 +1,28 @@ +"""maturin cross case on rules_rs toolchains. + +Same package and assertions as //pycross-rust, built with the toolchains +rules_rs provisions instead of rules_rust's own. rules_rs declares them with +rules_rust's `rust_toolchain` rule inside the patched `rules_rust` repository +it fetches, so `uv.project(rust_toolchain = ...)` points at that repository's +`current_rust_toolchain`: the wiring is a provider contract, not a dependency +on one ruleset's toolchain layout. The two rulesets coexist here because each +carries its own `rules_rust` repository and therefore its own toolchain type. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_rust_rs") +uv.project( + default_build_dependencies = [ + "build", + "maturin", + ], + hub_name = "pypi_pycross_rust_rs", + lock = "//pycross-rust-rs:uv.lock", + pyproject = "//pycross-rust-rs:pyproject.toml", + rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", +) +use_repo( + uv, + "pypi_pycross_rust_rs", + "sdist_build__pycross_rust_rs__pydantic_core__2_47_0", +) diff --git a/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py new file mode 100644 index 000000000..6bf4f92b8 --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +"""Exercises the cross-compiled _pydantic_core extension. + +SchemaValidator is implemented in Rust (PyO3); constructing one and +validating through it proves the .so loads and runs on the target. +""" +from pydantic_core import SchemaValidator, core_schema + + +def main() -> None: + validator = SchemaValidator(core_schema.int_schema()) + result = validator.validate_python("123") + # pydantic-core's lax int mode coerces the numeric string to a real int. + assert result == 123 and isinstance(result, int), "expected int 123, got {!r}".format(result) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pycross-rust-rs/uv.lock b/e2e/crossbuild/pycross-rust-rs/uv.lock new file mode 100644 index 000000000..ab8b074ff --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/uv.lock @@ -0,0 +1,194 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "maturin" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/c8/22e5e21b2679c9bce6415ca578034ca2cc9316be0642ae21e051a2d5198c/maturin-1.15.0.tar.gz", hash = "sha256:94b26cc8e8aba61a5f2099715fe640e18c5f678e9a500408b38761263954228a", size = 385504, upload-time = "2026-08-24T12:11:22.665Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/69/5c01b461044eb1f45ddcce006706eb88110c793cdb11c7ae0b5e08492e94/maturin-1.15.0-py3-none-linux_armv6l.whl", hash = "sha256:6bf6dc62e22d4dcfd5a51244ff0d58975fa4979c48209fe84159617648956d82", size = 10206220, upload-time = "2026-08-24T12:10:53.327Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1f/2b431554e11687cdb1077e0cdadcc118c53f611086b3af00c8545a67c6a5/maturin-1.15.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd35772633f489841132bc8e71d6fc7f842df30b9c05cd5cdf1ee1ddcb744cc7", size = 19416513, upload-time = "2026-08-24T12:10:56.126Z" }, + { url = "https://files.pythonhosted.org/packages/51/36/e23a21cb34a648b711036b9b2fe1d4f3f4ee24f8db54215d73f1a9a3a3ec/maturin-1.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c40b4eae7bf5ef1f4b1af8d623fe4105016f93578fb15b764e741d08ec3b92dd", size = 10014962, upload-time = "2026-08-24T12:10:58.486Z" }, + { url = "https://files.pythonhosted.org/packages/8c/80/33b15cb2d8f30f12c807955e8f2fd775027692904e30ec0784744ce8cd83/maturin-1.15.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:7eb066372f541f8eb4909c79c5d9bd0b9e8125980bdf1ec9e8aba23c6c8d6c55", size = 10196223, upload-time = "2026-08-24T12:11:00.696Z" }, + { url = "https://files.pythonhosted.org/packages/fe/91/b495e19e2f5c503b540452b2039115e7b2363867e8c5ad4179eb752fa92c/maturin-1.15.0-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:653020a63525bb224e5ab0adf02e17a2e08bc86dbea7fc1399c9a56d7529b99e", size = 10541186, upload-time = "2026-08-24T12:11:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/5d/2b/2abff58037188d852b124871b1f0d720e1c2bfb3d4f1b03d87c52cd66488/maturin-1.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0ebf9767892725083138e671c34482c660317a2f3d6a29fc0e0f34e9d8c99136", size = 10083468, upload-time = "2026-08-24T12:11:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/b7e9f8be99a6627849e81ac7b6694876bce8f50a92995fe17e3cf2610f0a/maturin-1.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7ab7eebffd7b8debca2265985de4eaeb332141276d24b9560b5ad484d4b3add1", size = 10047786, upload-time = "2026-08-24T12:11:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ab/167e3cb7accee11b507dbe53e0e87aeccb376d44ae66284c96ee4df3a9fd/maturin-1.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:126e12e618b4db42f68c779a56d41f82a390145ba36ac3f621d057eb34f5ad9d", size = 13315332, upload-time = "2026-08-24T12:11:09.433Z" }, + { url = "https://files.pythonhosted.org/packages/14/4d/801379f646cbc6b00998e5289b0630a886be3a4ee4c75b6bc9b87478a7f1/maturin-1.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f9d33e6c3f9615c8caceecbbbd440f8eb25a3ddeb687077682cd5eca2e9ae15", size = 10807183, upload-time = "2026-08-24T12:11:11.73Z" }, + { url = "https://files.pythonhosted.org/packages/89/27/2e612e1cbd1580e9e94d4722c227b5180dca27b32b955a34b79918aa1292/maturin-1.15.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:bf29beddd0c6708f112db51d5275fc28b28b9e9c9c5faae387eaef662918b176", size = 10413274, upload-time = "2026-08-24T12:11:14.04Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/202a7b4d75a51f20f84ec9ce3b7345b12b822207072164e2b1c6ef665125/maturin-1.15.0-py3-none-win32.whl", hash = "sha256:da649988be98e87e009e51b1bf0d301b6a301bc0cecbdd60d40d8ba60748d1ca", size = 8928744, upload-time = "2026-08-24T12:11:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/40/dc/4e90da594986ba78dd3bc8a5921ecdcdb11085b22b02a412caab3b225601/maturin-1.15.0-py3-none-win_amd64.whl", hash = "sha256:552c2be4afd43fe8d5c9f3ec8d4c4756d973b8dcbe94c14084390301f50243e1", size = 10335085, upload-time = "2026-08-24T12:11:18.326Z" }, + { url = "https://files.pythonhosted.org/packages/8b/10/15d4314edf130955edf2dc237aa393a8a7c10f2b9b57b89fa2f61f915659/maturin-1.15.0-py3-none-win_arm64.whl", hash = "sha256:c7dc0c66c78d3debdd9c5aa807e861fbcbf07f3505d34b125df74c03986b0f48", size = 9713795, upload-time = "2026-08-24T12:11:20.83Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-rust-rs" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "maturin" }, + { name = "pydantic-core" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "maturin" }, + { name = "pydantic-core", specifier = "==2.47.0" }, +] + +[[package]] +name = "pydantic-core" +version = "2.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/74/319859f70c733f341df03823c8ca27ce9003faaac3ffa3110f3af1c8641a/pydantic_core-2.47.0.tar.gz", hash = "sha256:422c1797a7864b2a9a996435aba92fe571fb80190f67a31edbc1ac040c7b51fe", size = 476601, upload-time = "2026-05-22T13:19:00.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/e0/0da7149bbd84c438beb208e17174d03a798f2c8ce5a978cbc19fb3052be6/pydantic_core-2.47.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fe87ccbc39a103709d0a5afa75240c15a94611af129261e9484bef0bc97960b2", size = 2114007, upload-time = "2026-05-22T13:20:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/51/30/362c68ac4dc1a830066bf250850725d95be0567bb6a85434616ac68f5939/pydantic_core-2.47.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45882c24324f123037982c65eb8d60da778447e6bc87c82241f81d6c6d2c307e", size = 1948028, upload-time = "2026-05-22T13:19:25.939Z" }, + { url = "https://files.pythonhosted.org/packages/60/d6/1dd26612212fab9145a2b0d876459764ad04248331cb6f61ab4909fddc43/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983e39b39547772543f3518557d0a86dbb3b7bb58bf8e82faba1e0cfa3e816d9", size = 1972491, upload-time = "2026-05-22T13:20:35.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c4/00b31fd04acf601efff148add88cfe5f3c21f43f872e79f76e4580cfaf18/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3eb92447d3a079b945b61b8cbd6c3ec2954de3655c4efa0ebd35b069e472c2a9", size = 2045790, upload-time = "2026-05-22T13:18:25.672Z" }, + { url = "https://files.pythonhosted.org/packages/8b/33/7d1a8116bde9d259b3289090a2d93b87562001731cdf81d78bef5d1060d8/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af9600c680bec4b8d23c32ddaf7a5d91ed39a2cf758c082e34e860140cdcd87", size = 2223039, upload-time = "2026-05-22T13:20:37.64Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f6/4c94adcfe1bdaad3f8865a2115bed02e02cba809ffab25c0f85c0cc9b78a/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d6098342d4510a9034a500a53b1d737daf9cfc18a47cd21047d02d7d1587557", size = 2282031, upload-time = "2026-05-22T13:17:41.455Z" }, + { url = "https://files.pythonhosted.org/packages/b6/4f/7fe179b37f887297a5bfd7b38a4a26cd485748b6b424c43c73a36c02f57b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a891c20be5110deb1904f639f3615ec5022b3495995850d1abe7b8fa1550b5", size = 2088600, upload-time = "2026-05-22T13:17:36.643Z" }, + { url = "https://files.pythonhosted.org/packages/fa/15/daef331c1571ee986e1410511218c4d58e6ead75e0db735051925caa572b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:13990d357a50078e382b15fa3ce3f08043223b4be3eaeb340b184f54c1a2397a", size = 2112087, upload-time = "2026-05-22T13:19:30.024Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c7/7cfbb736f9ac501a92171e93bf640d065a13e12dcbcfb7effd21cce2f1ca/pydantic_core-2.47.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0f7343305387bb5884f24d384b7978ad099a277b27529e592c041a502a37c32", size = 2171199, upload-time = "2026-05-22T13:19:12.183Z" }, + { url = "https://files.pythonhosted.org/packages/5f/03/48e63b1f7d2088d747dde98b5dd7b89a46fff9173b6c10dc6189289c4aa5/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2c5e11bb1be2de2707c9367f364e73091ef30d34be54b3a4564d7421ac1a16bd", size = 2176850, upload-time = "2026-05-22T13:17:39.318Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/e653f7723f1dff5c054dada5f5d7f2c294067c087a52188847a0414cff2e/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e1b52aa981e034896712460c899ee30707c8c6a385e79bb7648aac76c748a3da", size = 2315368, upload-time = "2026-05-22T13:18:36.365Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ff/5aa6fcde3bd427648fee1a363671d8b4852c716603acd77091fb4cf1fc3d/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57d46021c20d4efc28f69b4ca4670dffbb7bdafa51d1967b747849726ec643b", size = 2351750, upload-time = "2026-05-22T13:19:28.187Z" }, + { url = "https://files.pythonhosted.org/packages/85/1d/6ee14bea4426d6bc421033d8d6ec69a6938d5773f7bd1d535b221fa48a7b/pydantic_core-2.47.0-cp311-cp311-win32.whl", hash = "sha256:d93c02ae8bd33f73624319d85cba47e754155c5bf104c0c5ca96fcd1f3094939", size = 1971464, upload-time = "2026-05-22T13:20:30.718Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6b/e466253efba866851af6e1094c488b4c5fb6adbfd8993d13e12b2a575541/pydantic_core-2.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:859ca679f00e5feb11b58b616eb7bc0efbb13654be21f5c898e510e27671c900", size = 2070625, upload-time = "2026-05-22T13:18:17.224Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/10628ab2df9f2421b6f3b88add9e026f1cb79198be417ee7d684ef0de5d7/pydantic_core-2.47.0-cp311-cp311-win_arm64.whl", hash = "sha256:482667e5b7a3e97b0836f33a716199c4ec6ba9c896ca4db6eae799ec527c1e64", size = 2052484, upload-time = "2026-05-22T13:17:32.654Z" }, + { url = "https://files.pythonhosted.org/packages/19/23/2daeff7346433ad9a3567852dd7a716329f9a7952dcf1ee74b166271bdc7/pydantic_core-2.47.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:70a7aeba54854f5d97da65cb1a61f000f53df3704cab41cd81d65ab127ddd031", size = 2108216, upload-time = "2026-05-22T13:19:31.898Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/2989cb5112b892b7dc13af570ff57d0f383f770fc88bbb644262df1b3017/pydantic_core-2.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c0e97329e38228f57fe1f2d91ba0ef39cc75cc1a84fe6ef58942d2fc6cb406bf", size = 1951502, upload-time = "2026-05-22T13:19:54.702Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a6/2417d8b1856cf7579a21e2679f02417b910e4f29120303e2c45137525072/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:faf83e50714837af72f13e9369c50377552a4a74049d4477bed51c7e5822d94b", size = 1975590, upload-time = "2026-05-22T13:17:26.586Z" }, + { url = "https://files.pythonhosted.org/packages/fc/71/0cd0813355b385bef8fa9a719982e0b44847afedc043b988c9f7c5d02ca9/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f50abe60347bf8afe2b2f58db86cf3ac6e418eec7ffa01d9dc90ba29fc64f243", size = 2055885, upload-time = "2026-05-22T13:20:42.378Z" }, + { url = "https://files.pythonhosted.org/packages/a3/33/5687c6dcf8ecca106c95b2a49f04a633320ab49961da6e57682db37b4482/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f13b18e7dec056336f29ee77dea3cc5db0271d6215cac7249cc5c61b0a49d293", size = 2235292, upload-time = "2026-05-22T13:19:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/36/98/08e81f1a0f0aa82cfa1a4d07b66eb116740fd6c82ba4baa8f96d4b377132/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3aaabbdbbbb8dff33fa053ffb2c980f39dec745fc03592f50e1e010449129841", size = 2308945, upload-time = "2026-05-22T13:18:38.113Z" }, + { url = "https://files.pythonhosted.org/packages/04/f1/6e35bdbdb79f96e630265297452d709b2ebd5facfbd83d3eb702eee24939/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d2907ee6d15cf26787bfbeb4c42e18e52f358086eab91baea961a0d909248d6", size = 2093861, upload-time = "2026-05-22T13:20:26.271Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c4/6a48e5da6a567bcf6d3ab113d2d476e1b93e3be941b4c486918f1c9d6714/pydantic_core-2.47.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:c413761260967f4dbb51135e1b49f30a1c29e15bf371fbb39754ed6475739545", size = 2124948, upload-time = "2026-05-22T13:18:15.728Z" }, + { url = "https://files.pythonhosted.org/packages/94/a1/e356c98dfc6bd5e6e166f2c832865a62941370b17a7199d35bc5999fecc8/pydantic_core-2.47.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bb527ac6e5a9721023b24615e1a55c01f47c60007f08b7d2afb89ff9c7a0e22", size = 2182065, upload-time = "2026-05-22T13:19:07.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/aa/6e99aac0a891b05cc522cc464aebeec2bb877fa4744be641a013ebc1785a/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b3abf7fd5e6abe483a63413f9cd26b7c93c20780e19c8556434c7279f6b2f10c", size = 2185830, upload-time = "2026-05-22T13:18:34.551Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/c6c5c1ad40b4d58f11d6e754e9c3990a2a3cfff20a9cf5c1f0a855a791b2/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:9cefe43d17a5a273d71697c084d3787defa7f578cd5fab4cef4c66d13c9e44b2", size = 2327330, upload-time = "2026-05-22T13:19:48.203Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f8/064747538297e385a1f197f35551d1bf6093e88c5ce9b4e15c035f0a1cfe/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:38a8b5371b7938e4f6c31060dbd51d3b3229aef7c43eaac2eb8b153e43c3f189", size = 2366505, upload-time = "2026-05-22T13:20:11.895Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d5/2d8715ef982c0b1875e42f4248b48439133a2781f0be77f0e4dbc84d147d/pydantic_core-2.47.0-cp312-cp312-win32.whl", hash = "sha256:b87e95e644df2a36bd631dd0d6e097aa73d19a55adf7b1724ebdeece3d9c76b7", size = 1957410, upload-time = "2026-05-22T13:17:38.025Z" }, + { url = "https://files.pythonhosted.org/packages/0e/ea/9d908a80798db41c7c38926259ed74d015869f0afe4be6ed56f71793a084/pydantic_core-2.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0078c5695322050ccedbc86eafaf3e2548439782c51d99e575de0e31b9fe4f4", size = 2072354, upload-time = "2026-05-22T13:17:42.779Z" }, + { url = "https://files.pythonhosted.org/packages/fe/78/5549cba47c662ec7f05d79527474786e5ff7f08ef3e65a409a8a2ab6013e/pydantic_core-2.47.0-cp312-cp312-win_arm64.whl", hash = "sha256:7eedc31996e9eba3bdfbbc380805ac6d765c889b7e93b17cd00ecb0200fd6dca", size = 2035452, upload-time = "2026-05-22T13:18:18.75Z" }, + { url = "https://files.pythonhosted.org/packages/7a/91/810cabda42f7fdd13b349702694e1140f6071fd42d1e542d606d5ad0c2d4/pydantic_core-2.47.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:263560ece98bffbbc0a8047ce60b8a278c859db6a2a4e30d9454b02891045eca", size = 2108548, upload-time = "2026-05-22T13:18:09.878Z" }, + { url = "https://files.pythonhosted.org/packages/fa/87/f444a6d63bcbdff3c45291df842941ed56c568f45dd3742f25afb567b5a2/pydantic_core-2.47.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a7fdaff39a66bf66e9037da482575513d2f20bfb02ea9d9222b5cb3b902fc695", size = 1951421, upload-time = "2026-05-22T13:20:32.973Z" }, + { url = "https://files.pythonhosted.org/packages/f5/09/c90dff5407c11e59023161c84df19dd5ed93966a23b2f08cd21d45812ab9/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e6c8ee5ce8c270bfae09763ae4bbbccfe81090c97d670a621fb86cb1ef6042", size = 1976554, upload-time = "2026-05-22T13:19:04.085Z" }, + { url = "https://files.pythonhosted.org/packages/95/cf/55fbe9f1b396f91005cd1cb7acf2bcf380a1f1b57e261ac78bcdc0ff42f3/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e38cdae682cfec4b3816722dccf6376ca59049726d57dca83c2fe7cc13665589", size = 2055005, upload-time = "2026-05-22T13:18:12.809Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c6/4f7cbaa62582e95c080cdd45fb5d4350ff05dac87ea32930c75dcb427bf1/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc3193ff0b7e2e168f84c6185e70475738c191f3154e0af8f897cd0f8f9a489", size = 2235489, upload-time = "2026-05-22T13:19:13.994Z" }, + { url = "https://files.pythonhosted.org/packages/31/75/16913c82ffd194c537222b3d0e8a05c11681e551add67308ec4af6023724/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57ff41672a615f38af528ee904602be51c653248354e5db8e9252668abe91e68", size = 2308360, upload-time = "2026-05-22T13:18:39.894Z" }, + { url = "https://files.pythonhosted.org/packages/05/9f/b24bb1b764fc360adace5df806a81fd62ef1662df2973891e487c3fd5a2c/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473b9a2b2a1f0dd55cbb32d2b902f93babe7f141a0bb48fb4d3d4d2b3e93e9a0", size = 2092549, upload-time = "2026-05-22T13:17:45.38Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d3/0268ea5972b91178250c0a573bb54c17f697665cd2aa35623087a3589fc6/pydantic_core-2.47.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:195f9c4ac43a7b2a044a7b86631c3352abdb820bed2823ea29f98f779255f459", size = 2123849, upload-time = "2026-05-22T13:18:03.817Z" }, + { url = "https://files.pythonhosted.org/packages/8f/92/26b2147738a89f78925775bb4b34ae53f981ce880ee77ee2c2ccbc49466a/pydantic_core-2.47.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c1cd10d39ef1ff8bcd68b6865bee9c434631ac0608d402fe86e678851c2e2a5", size = 2181733, upload-time = "2026-05-22T13:17:35.308Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fa/8a858dde4784c7245b7216ab9a71518cb1a898a83ffb5c0509181789de19/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7cbe66352fe2b39511d49150e5b52159429cd21f5633a3e801dd2c43829dcdca", size = 2184065, upload-time = "2026-05-22T13:18:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/69/20/ea165877f965622e021f04d63330f9ceb55ede0aefa862863e06a9a610cb/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e35192a1d53e55d510d8bb1023c988c7cdae6d94539074971741b2a7656e49a1", size = 2326881, upload-time = "2026-05-22T13:18:41.477Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d6/ad22a6f0941be5a5478e6c378d0ec3c7641be96d7a86a3ea1f9e9830a269/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81de54576de2e20baec76cc5afae2820f9049e6fdc4f357bac3391da02d0ba97", size = 2365574, upload-time = "2026-05-22T13:20:02.947Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4e/eb5e3429dd29311e75ab89313cde09b709b0637fd88838d2cb4a98760b02/pydantic_core-2.47.0-cp313-cp313-win32.whl", hash = "sha256:05da6647bdfd3888936ac10aa39b239d659f3c93dff281af0fc5943eb55629dd", size = 1955451, upload-time = "2026-05-22T13:17:31.178Z" }, + { url = "https://files.pythonhosted.org/packages/15/12/ec107c12aa8729c766285d4aa6caa5f5addf8b2ef6cfd35c455a3ca5c66e/pydantic_core-2.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:021220e0a03b66112737ee1fc49759340ce8fafb8d9ade1b7fb366b06033fa45", size = 2071285, upload-time = "2026-05-22T13:19:50.585Z" }, + { url = "https://files.pythonhosted.org/packages/f4/02/b003a55acfeb35823925d1cd502b80e3fe6c5d477865c36815fbefdf49ac/pydantic_core-2.47.0-cp313-cp313-win_arm64.whl", hash = "sha256:55156ee2f6f561ea4e25ab55f84bd70b9c9ed2546a834cb2b038fe10225aaa37", size = 2034804, upload-time = "2026-05-22T13:18:32.64Z" }, + { url = "https://files.pythonhosted.org/packages/ef/46/a4675c783822e229bf04e290ae28cf5a057b00a46039498743b066e0fefd/pydantic_core-2.47.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6e37a6974fbd8fa7cae12285a76970d50b3689ffd6ed7c7fdd176ba81dd22d0e", size = 2104537, upload-time = "2026-05-22T13:18:05.312Z" }, + { url = "https://files.pythonhosted.org/packages/67/bb/f6d6d1dd8362d616b227b55af8bc2d1b7d4ea842facb7c50a82298ba3b9d/pydantic_core-2.47.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2433b8524785cc117e602233bc574879bc8d87f09523edeec51665d5c46cf42d", size = 1951581, upload-time = "2026-05-22T13:18:14.244Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ae/7d01ed8658ccf8beae8a3fcf2cd023c3ba0ab0b19d3f456845a709cece94/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f9f2be064c8bf1189f46f7062fd42765d94f59cfb7db7ef8db19563192110a", size = 1978461, upload-time = "2026-05-22T13:19:15.829Z" }, + { url = "https://files.pythonhosted.org/packages/80/e5/dd38ccbd1e68f1c3fd7f8b413a8b32db11bd16d5999c3dc3aed4e54290df/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1f0a9659a2eb161573418e3138f616101ba21bbd2ff04916dca7b6712155e015", size = 2049444, upload-time = "2026-05-22T13:19:06.258Z" }, + { url = "https://files.pythonhosted.org/packages/7d/63/0cb998f3f4ea4255ab6d891e2537d4566cd31630df0d406ce45b00306729/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2995074b99242aa28991e0120a3c881babc139e08750a05b7ea7d140644e091d", size = 2231772, upload-time = "2026-05-22T13:20:05.22Z" }, + { url = "https://files.pythonhosted.org/packages/3f/20/2cacf5c4a1bdda1356351df38f343c6cf13af6194e6e0ee0f7967395793f/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5b224dc04c3ff9b08c24419464eb7f6ad7a1049e12284a00bf80df82bd15fdb", size = 2305322, upload-time = "2026-05-22T13:20:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/e3/8f/b7e09086bd48b1ef3f74227ed98907496924a622c7f9315cf661946233c6/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:264361b7236d4374fef6342908f87d084a0d58a2f8d0811e99f714309cb0ba7e", size = 2097748, upload-time = "2026-05-22T13:20:21.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/27/2927049e93f6fbbaa838b2bb656dbd63c6d6fcaab9909d632fd93573ebd9/pydantic_core-2.47.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:53368beaf693f6302a6e33bdefe950857534a04d282811421bd20176d0fb5636", size = 2122971, upload-time = "2026-05-22T13:19:37.977Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3b/80b58a0c7f4339f024ad5c5b6316bef895536abf75c45dc85f0c83ae1a92/pydantic_core-2.47.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5d2177b44ba7d9d86850f865f362feeaac6a2ed8517a9b505b97ff0b7fdbd7dd", size = 2181287, upload-time = "2026-05-22T13:18:20.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0a/dfcb9575603aaf113d2cae1fb622570046a210276eba2267764b3f83f4f2/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fb57a6b538ec7a01b937986bc093aec530fb056135b6bc9cfdd0bf8460c25bc2", size = 2177842, upload-time = "2026-05-22T13:17:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/57/c2/31a198c8180b417d18410e7640c505b39c51ac291aca34f71ac37093f4c4/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:18c9c7c3a18e9bdbf1215d913f6bd00e17595dc92949817935cb87a3cf5f1697", size = 2321802, upload-time = "2026-05-22T13:17:54.495Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/052d872b61f88d2f71b3d881c08abfbe33cb9d64bd988712bb4fb973001c/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2f72a382886ca85bb1247303b9134cf9978c9d454de62e710a1ebcd9d2131927", size = 2363870, upload-time = "2026-05-22T13:18:45.053Z" }, + { url = "https://files.pythonhosted.org/packages/be/60/c8c985d4081dafaa88fe6ac6a41ebe2b82d289c391b2bcbd3508f585e7a9/pydantic_core-2.47.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:cdf4dc2cdd0eacad1bd81c4d25422b4c25b206acae095d2d64e5d5cb7facc6b3", size = 1369335, upload-time = "2026-05-22T13:17:51.719Z" }, + { url = "https://files.pythonhosted.org/packages/42/70/30dfcc18dc5552f7235ae2ffd7b699a1ba0d38ebfcdb97f371c792d61601/pydantic_core-2.47.0-cp314-cp314-win32.whl", hash = "sha256:1e859dd5e06e9807080e14995db131649a77c61131cc464a7fe492a69ce82488", size = 1952107, upload-time = "2026-05-22T13:20:24.07Z" }, + { url = "https://files.pythonhosted.org/packages/fa/49/f5c517ba99b9e1036ead16cedd0fc189dbcbf900fb0b85b746b6a0b9b389/pydantic_core-2.47.0-cp314-cp314-win_amd64.whl", hash = "sha256:234ecade0e358caa1ea516c218b3f61e61e30532cad1a8bb12f2487325838548", size = 2071388, upload-time = "2026-05-22T13:18:46.74Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6c/6b95e00ed7a3c7f78cb8544bc34cb29412c05512af507fc4466912576d50/pydantic_core-2.47.0-cp314-cp314-win_arm64.whl", hash = "sha256:58158d0111e86893bc35aacabe509f951ed303cddf8cdba43533190bde317914", size = 2026046, upload-time = "2026-05-22T13:18:22.112Z" }, + { url = "https://files.pythonhosted.org/packages/22/2c/fa67f96f381ba3c83e8cd75a6eb3c538e123d8d02e19d80383bff01ffda0/pydantic_core-2.47.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:24017fd3befd4d7cc4a8c71f4a1e9a44d29fdc91723c5446b0e795ab808adee7", size = 2102407, upload-time = "2026-05-22T13:17:46.882Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e8/99abe6c33db3dda235a2095eae5fdd03266857abd9be1c50ed97a59587c3/pydantic_core-2.47.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dfa0820888cc4549fcce7e6bd8affa7d75198d885ccd0bb0760def4bb8461862", size = 1931963, upload-time = "2026-05-22T13:18:23.776Z" }, + { url = "https://files.pythonhosted.org/packages/5c/dd/96d1884f65737f793e64b6b8745ee793e3cb4735e086ead0a40e5349294e/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d507f331756f7066cde7c9f35ed78fa78223a54369dbc8a34d6da7a5074fa1", size = 1973492, upload-time = "2026-05-22T13:17:22.128Z" }, + { url = "https://files.pythonhosted.org/packages/07/8c/0504f091c75b229cd07d61b45464d7c5291c3ecf2e7d847f215fe81cf5e5/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c4a885fb50c05903bc703a00830616e680304fdcdd90fc9535a52e72debe712", size = 2035548, upload-time = "2026-05-22T13:17:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bf/e9f69c55ef6c945d29e4afb306f62a15354bfd09f1ee25d9aecd4c6cbb82/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b107cbd764bf68f12a57c7aa5846d868bc7463490a1ac2d0f19bffef624c5a9", size = 2238356, upload-time = "2026-05-22T13:19:10.309Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/dfbd214487033093f5946c1fd5915ae5dc6b278efe764397b5e2ef8092a8/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b5f46412c8226d0c8f1f423c324c75afe342e4b854836933579fb484f68598c", size = 2284799, upload-time = "2026-05-22T13:17:27.959Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ec/f80488fa26a6b27bd0d1267f35b0fce3bfeec23ca97021085a94ccd3adc3/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90cbf7e35d597503cbdb5cd85409cbb75f377290bc7e8e37cc5dfe4f5cc66cf8", size = 2107895, upload-time = "2026-05-22T13:18:27.282Z" }, + { url = "https://files.pythonhosted.org/packages/9b/1d/67ac210745f63a982b145d8f281dc76bd347d98052792f087224a178da54/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:04ee7ba7172cb4484af51b2890f19069d35773698abc8c6ebb651f52fbf41134", size = 2102797, upload-time = "2026-05-22T13:19:40.139Z" }, + { url = "https://files.pythonhosted.org/packages/6c/75/f3b9bd4d88fcaad9a5abf2ec6969f37a70e34f40a5f8d2d78077f168e83d/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a7acb3e120ddba94372b8146e62ea3a0bce203180e34641c817c87f995c91e0", size = 2160123, upload-time = "2026-05-22T13:19:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/e94ac13bd17c341e86c4b67deb47b63718208fe413034fdb01e7a4bf1dd8/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:1a2f7ceb58013d167d8c96f10ec9b3a137018c819ba356f68ff1cb74302fd22e", size = 2164386, upload-time = "2026-05-22T13:18:48.372Z" }, + { url = "https://files.pythonhosted.org/packages/36/e5/862ff195402f5b08db9ad4d9ebe7cbed993f51528aab7edcb62531442556/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:482b097637fec5037eb13fe9f9d5fe47e568a5b451d686bc2b854076cc0b50ca", size = 2303767, upload-time = "2026-05-22T13:18:50.211Z" }, + { url = "https://files.pythonhosted.org/packages/c2/05/c8ebbb97cf44686fc9cc64a6bb86ac72a8871426a9f61417e395d77c4894/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a8c7f5fad73eb404f4b84c75f3d9d3865b748ded248b7366341db6e516fc502b", size = 2361148, upload-time = "2026-05-22T13:18:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8b/4695ec6ce81eda7cc822383de993c5b2c289cfc84d3f032a30c55eb238fc/pydantic_core-2.47.0-cp314-cp314t-win32.whl", hash = "sha256:f343c39928097175acf2f7d0cba5c00b0f62265d88a173a4ce264266ac849bd9", size = 1939588, upload-time = "2026-05-22T13:19:42.151Z" }, + { url = "https://files.pythonhosted.org/packages/96/4d/bc2e188ab648b3ab284e80a0340c5d5b9723c22572c6e36ba39eb300e718/pydantic_core-2.47.0-cp314-cp314t-win_amd64.whl", hash = "sha256:52d40e074da44e42b2425aedebd513e405a31807036ef597175117a9b01743a6", size = 2049697, upload-time = "2026-05-22T13:18:08.244Z" }, + { url = "https://files.pythonhosted.org/packages/6f/46/ca1e6813e029993e57340c6a37740450c51919e3809472f79060f4d64cf0/pydantic_core-2.47.0-cp314-cp314t-win_arm64.whl", hash = "sha256:25cac08c9735e61e5c0b9f7a85c438661fc0e9da226afdfa984c3da6c5942a5a", size = 2025906, upload-time = "2026-05-22T13:17:50.322Z" }, + { url = "https://files.pythonhosted.org/packages/1e/a3/7391a9a511aba60ba119dcbc221a36109dd05ff498dcd6e6ff7222a21b76/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:dbe50ffd50c7e1b8e3bedafafd10fabe8a7cf51916f995fd57316eb1293f2439", size = 2112946, upload-time = "2026-05-22T13:18:54.846Z" }, + { url = "https://files.pythonhosted.org/packages/71/74/1d0fe337fa5a89069731206be4da2b41793b8f8fe28f34ed4d941028a62f/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:67c3f4b57a1cda846a9b6258e0ef70f99b0757d0b6a55f7e3e5b100620937d2c", size = 1940704, upload-time = "2026-05-22T13:18:00.366Z" }, + { url = "https://files.pythonhosted.org/packages/ac/75/d40231aed211f97ffc3264d7a7c98d1f52f7b9c8d165cee75c8c1c13e5c3/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1e025c83b3987784191ec5aa78cfb94686f1ba73d98ae4d520c09cdecda8d", size = 1985024, upload-time = "2026-05-22T13:17:29.331Z" }, + { url = "https://files.pythonhosted.org/packages/a6/bc/e27d3fb897c5b059a508b88eb7c4cc1f0fe600be3231728bb003e1e2b464/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547cac87585ab8a6e9495fd3be22ae8ccaabb3c909f6ae589a180677c105cc8", size = 2136202, upload-time = "2026-05-22T13:17:34.031Z" }, + { url = "https://files.pythonhosted.org/packages/4e/21/81cc7e3acbf7d4eed41e9585e81b5840aaf6ddbe65974a20946038d6516b/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:d648515c65f8871ceca6a0446be32fb1a0aae414db3907ec0df6cc2380dd0c04", size = 2098016, upload-time = "2026-05-22T13:18:56.902Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6e/c98e869e9f754f18088ad9b55887972d08606e7bf81dba088779e927eb65/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3292813ac8ed17671a5b1ac8256b6e98b96c29c1c6d061c35899e2f6e0444cac", size = 1931175, upload-time = "2026-05-22T13:20:07.566Z" }, + { url = "https://files.pythonhosted.org/packages/5d/65/ce0d773f4b51dc332764ba1bd585c81f62d5c92231a66d152aff16be8dfa/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf3cfcea028f41a9b42a47f4a53d72ca4274d04e3ee525bd58ca89ea8c5e1910", size = 1995356, upload-time = "2026-05-22T13:19:44.143Z" }, + { url = "https://files.pythonhosted.org/packages/19/2c/6e63683a77d342c93bad67bb0762ca8fe1d8418acc8617d70ccdcc5ec5ff/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52afdd8640d59890539060e91c8a494cf96b463e63b2ba499cc5c23abcb5e96b", size = 2144893, upload-time = "2026-05-22T13:17:59.008Z" }, + { url = "https://files.pythonhosted.org/packages/f1/bf/06a01e2f6668aa10646e5c9b050a609d975a93d58454e26e16fd9f82cd38/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ff201e8b93cd6a3849ec3fecb1d642d0391ca4a387f1162adaadddfd1986598c", size = 2114751, upload-time = "2026-05-22T13:18:02.245Z" }, + { url = "https://files.pythonhosted.org/packages/41/50/caf4cc67fdd664baf89bfe264d72079e901a02d903c813ced9de173cdd69/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eba39fca6e1fc7c58a5e6b5c320c6eec86014f7075dfa0fb1a79076e00304b3a", size = 1947894, upload-time = "2026-05-22T13:19:36.12Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c0/96ba102865c9ccb945a758272741d00175837bf32bb71750f6e2bf4543fb/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b494566e8e7e1a3992a550900902d6c0051538e53f5957e24003e7775638a24", size = 2131698, upload-time = "2026-05-22T13:18:58.55Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f8/ee7c5d4eafaecdeaf92ce84f48d748c139888e90fa25b2ae988c5aea874c/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c96f745745fe778a92e74f40675c57b80dd46fc98186c9020e5ba4514a0470bd", size = 2157797, upload-time = "2026-05-22T13:17:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/08/69/b3eba1d0e015cee3906f7056cfd9ed383f6cef486fde5398a002df2594e4/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dbfb8f8ac48a8fd5a9f83cdbba0a23796f3ff5f9421c735808ed134d3318046f", size = 2177829, upload-time = "2026-05-22T13:20:09.611Z" }, + { url = "https://files.pythonhosted.org/packages/8a/36/a0ceff9b7c3a0980128c9ef763db1e9fe9c2b1fcecf6ed055e88af39f123/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:4ded2d8dc3beb086623ab3256b81a0b51fc026c94eb363f480aec09b204a1cbd", size = 2307425, upload-time = "2026-05-22T13:19:46.177Z" }, + { url = "https://files.pythonhosted.org/packages/d6/0a/930e210e95ade33ecacabc4ba822aa1662a0aaf843d2cf57abce27fb95b1/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:25f8aa59fd3f85651387c37b289cd8f0bbc8f632e7dad13c6b837759e78be88d", size = 2351547, upload-time = "2026-05-22T13:17:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0c/90941408bb6c1e84563d99177c9e62c536dce0388b5a8bf37b90b4f6f095/pydantic_core-2.47.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:0ae0096729c64aa6155cef74e75d1945017b01cfb82f313a18d843fafc497476", size = 2180871, upload-time = "2026-05-22T13:19:56.696Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel index ff506def6..9e47530a5 100644 --- a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel @@ -8,9 +8,10 @@ and a rustc wrapper whose sysroot merges the target toolchain's std with the exec platform's std (build scripts/proc-macros are always exec artifacts). -Nothing declares Rust: sdist_build detects the maturin backend and emits -pep517_rust_whl, which resolves rules_py's own Rust toolchain for this -exec/target pair; the helper maps its cargo, rustc and sysroots into the env. +`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build +detects the maturin backend and emits the toolchain plus an exec-configured +rust_host_sysroot into the generated pep517_native_whl, whose +CARGO/RUSTC/RUST_HOST_SYSROOT make variables reach the helper's env. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -23,6 +24,7 @@ uv.project( hub_name = "pypi_pycross_rust", lock = "//pycross-rust:uv.lock", pyproject = "//pycross-rust:pyproject.toml", + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel index 5e44df2a9..b359dfd38 100644 --- a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel @@ -1,7 +1,8 @@ """tiktoken: setuptools-rust sdist build. -Nothing declares Rust: sdist_build detects setuptools-rust in the build -requirements and builds with rules_py's own Rust toolchain. +`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build detects +setuptools-rust in the build requirements and emits the toolchain plus the +exec-platform sysroot into the generated pep517_native_whl. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -16,6 +17,7 @@ uv.project( hub_name = "pypi_pycross_tiktoken", lock = "//pycross-tiktoken:uv.lock", pyproject = "//pycross-tiktoken:pyproject.toml", + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) # tiktoken's sdist ships no Cargo.lock, so nothing pins its crates; this one diff --git a/uv/extensions.bzl b/uv/extensions.bzl index 93b9867b4..f9f6fb7d0 100644 --- a/uv/extensions.bzl +++ b/uv/extensions.bzl @@ -5,8 +5,6 @@ Graduated from `@aspect_rules_py//uv/unstable:extension.bzl` in rules_py v2.0.0. load("//uv/private/extension:defs.bzl", _uv = "uv") load("//uv/private/extension:uv_bin.bzl", _uv_bin = "uv_bin") -load("//uv/private/rust:extensions.bzl", _rust_tools = "rust_tools") uv = _uv uv_bin = _uv_bin -rust_tools = _rust_tools diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index 15dccb8ee..94ddaa261 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -612,6 +612,7 @@ def _parse_projects(module_ctx, hub_specs): cargo_lock = cargo_lock, monitor_memory = monitor_memory, resource_set = resource_set, + rust_toolchain = project.rust_toolchain, ) has_sbuild = True @@ -892,6 +893,8 @@ def _uv_impl(module_ctx): sbuild_kwargs["config_settings"] = sbuild_cfg.config_settings if sbuild_cfg.cargo_lock: sbuild_kwargs["cargo_lock"] = sbuild_cfg.cargo_lock + if sbuild_cfg.rust_toolchain: + sbuild_kwargs["rust_toolchain"] = sbuild_cfg.rust_toolchain if sbuild_cfg.monitor_memory: sbuild_kwargs["monitor_memory"] = True if sbuild_cfg.resource_set != "default": @@ -966,6 +969,13 @@ _project_tag = tag_class( mandatory = True, doc = "The `uv.lock` pinning this project's dependency graph.", ), + "rust_toolchain": attr.label( + mandatory = False, + doc = "A rules_rust `current_rust_toolchain`-style target. When set, every sdist in " + + "this project whose build backend is maturin or setuptools-rust gets it (plus " + + "rules_py's exec-configured sysroot layer) wired into its build automatically, " + + "with no per-package `uv.override_package(toolchains = ...)`.", + ), "default_build_dependencies": attr.string_list( mandatory = False, default = [ @@ -1024,7 +1034,7 @@ _override_package_tag = tag_class( ), "toolchains": attr.label_list( default = [], - doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", + doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_SYSROOT, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", ), "env": attr.string_dict( default = {}, @@ -1032,7 +1042,7 @@ _override_package_tag = tag_class( ), "cargo_lock": attr.label( allow_single_file = True, - doc = "Cargo.lock for a Rust sdist that ships none. Its crates.io entries are vendored while the repository is generated and the file is placed next to the sdist's Cargo.toml before the build, so cargo builds offline.", + doc = "Cargo.lock for a Rust sdist that ships none. Its crates.io entries are vendored while the repository is generated and the file is placed next to the sdist's Cargo.toml before the build, so cargo builds offline. Requires the project's `rust_toolchain`.", ), "config_settings": attr.string_list_dict( default = {}, diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 6719507de..c3f0eb88e 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -22,7 +22,6 @@ bzl_library( ":common", "//py/private/interpreter:versions", "//py/private/toolchain:types", - "//uv/private/rust:toolchain", "@bazel_lib//lib:resource_sets", "@rules_cc//cc:action_names_bzl", "@rules_cc//cc/common", @@ -52,3 +51,8 @@ bzl_library( "@bazel_lib//lib:resource_sets", ], ) + +bzl_library( + name = "rust_layer", + srcs = ["rust_layer.bzl"], +) diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index 86aaecaa1..46a5f35dd 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -10,7 +10,6 @@ load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES") load("@rules_cc//cc/common:cc_common.bzl", "cc_common") load("//py/private/interpreter:versions.bzl", "PLATFORMS") load("//py/private/toolchain:types.bzl", "EXEC_TOOLS_TOOLCHAIN", "NATIVE_BUILD_TOOLCHAIN", "PY_TOOLCHAIN") -load("//uv/private/rust:toolchain.bzl", "RUST_TOOLCHAIN_TYPE") load(":cc_layer.bzl", "CC_LAYER_ATTRS", "extract_cc_layer") load( ":common.bzl", @@ -26,10 +25,17 @@ load( _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") # TemplateVariableInfo make-variable -> build helper env key, for the -# toolchains a native build commonly layers in: a Java runtime +# toolchains a native build commonly layers in: rules_rust's +# current_rust_toolchain (CARGO/RUSTC and its generated RUST_SYSROOT, where +# rustc and rust-std meet whatever repositories they were fetched into), an +# exec-configured rust sysroot layer (RUST_HOST_SYSROOT), a Java runtime # (JAVA/JAVABASE) and an Ant layer (ANT_HOME/ANT_BIN_DIR). The env keys are # the helper's contract (build_helper.py absolutizes exactly this set). _DERIVED_ENV = { + "CARGO": "CARGO", + "RUSTC": "RUSTC", + "RUST_SYSROOT": "RULES_PY_RUST_SYSROOT", + "RUST_HOST_SYSROOT": "RULES_PY_RUST_HOST_SYSROOT", "JAVA": "JAVA", "JAVABASE": "JAVA_HOME", "ANT_HOME": "ANT_HOME", @@ -314,15 +320,6 @@ def _pep517_native_whl(ctx): cross_args = [] cargo_args = [] - if ctx.attr._rust: - # rules_py's own Rust toolchain, resolved for this exec/target pair: - # the exec platform's complete sysroot plus the target's std trees. - rust = eg_toolchains[RUST_TOOLCHAIN_TYPE] - env["CARGO"] = rust.cargo.path - env["RUSTC"] = rust.rustc.path - env["RULES_PY_RUST_SYSROOT"] = rust.sysroot - env["RULES_PY_RUST_TARGET_STD"] = ":".join(rust.target_std_roots) - extra_inputs.append(rust.all_files) if ctx.attr.vendored_crates: vendored = ctx.attr.vendored_crates[DefaultInfo].files extra_inputs.append(vendored) @@ -414,95 +411,86 @@ def _pep517_native_whl(ctx): return wheel_providers(wheel_file, ctx.attr.console_scripts) -def _native_rule(rust): - return rule( - implementation = _pep517_native_whl, - doc = """PEP 517 sdist to platform-specific whl build rule. - - Consumes a sdist artifact and performs a build of that artifact with the - specified Python dependencies under the configured Python toolchain to produce a - platform-specific bdist we can subsequently install or deploy. - - Extra toolchains the build action depends on are passed via the standard `toolchains` - attribute and each target's `DefaultInfo.files`, `ToolchainInfo.all_files`, and - `TemplateVariableInfo.variables` are forwarded to the action. The `env` - attribute maps environment variable names to strings that may reference - `$(VAR)` make-variables sourced from those toolchains. This mirrors the - pattern used by `rules_rust`'s `cargo_build_script`. - - The build is guaranteed to occur on an execution platform matching the - constraints of the target platform. - - """, - attrs = PEP517_WHL_ATTRS | { - "args": attr.string_list(), - "env": attr.string_dict( - doc = "Environment variables to set on the build action. Values may " + - "contain `$(VAR)` references to the configured C++ action tools " + - "or make-variables exposed by any target in the rule's " + - "`toolchains` attribute (via `TemplateVariableInfo`). Prefix an " + - "execroot-relative path with " + - "`$(EXECROOT)/` so it remains valid after the backend changes into " + - "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + - "configured C++ action tools.", - ), - "cargo_lock": attr.label( - allow_single_file = True, - doc = "Cargo.lock placed next to the sdist's Cargo.toml before the build, replacing the sdist's own if any.", - ), - "vendored_crates": attr.label( - allow_files = True, - doc = "A cargo vendor directory (one subdirectory per crate, each with its " + - "`.cargo-checksum.json`), as sdist_build materializes it from the sdist's " + - "Cargo.lock. The build runs cargo offline against it.", - ), - "_rust": attr.bool(default = rust), - "_platform_libc": attr.label( - default = "//uv/private/constraints/platform:platform_libc", - doc = "Read in cross mode to pick the rust target triple (gnu vs musl).", - ), - } | CC_LAYER_ATTRS, - fragments = ["cpp"], - toolchains = [ - # Target-configured interpreter, read only for its platform triple in - # the cross detection; optional so unresolvable targets surface the - # rule's own error instead of a toolchain-resolution one. - config_common.toolchain_type(PY_TOOLCHAIN, mandatory = False), - ], - exec_groups = { - # Cross-compilation of sdists is intentionally unsupported: PEP 517 - # build backends (setuptools, meson-python, etc.) have no standard - # mechanism for cross-compilation, Python headers for the target - # platform are not readily available, and output wheel tags would - # need to encode the target platform with no upstream tooling - # support. Packages that need cross-compiled native extensions should - # publish pre-built wheels for their target platforms instead. - # - # Detection inputs: NATIVE_BUILD_TOOLCHAIN has matching - # exec_compatible_with and target_compatible_with, so it resolves - # exactly when the exec and target platforms match — optional, its - # absence is a cross signal, not a resolution error. The exec- and - # target-configured interpreters' platform triples refine that signal - # (see _cross_decision); a cross decision switches the action into - # cross mode (cc_layer extraction + target-identity env) instead of - # failing. - TARGET_EXEC_GROUP: exec_group( - toolchains = [ - PY_TOOLCHAIN, - config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN, mandatory = False), - config_common.toolchain_type(NATIVE_BUILD_TOOLCHAIN, mandatory = False), - # Optional for the same reason: on a cross target no C++ - # toolchain may resolve, and the rule's own error must win - # over a resolution failure. - config_common.toolchain_type(_CC_TOOLCHAIN_TYPE, mandatory = False), - ] + ([RUST_TOOLCHAIN_TYPE] if rust else []), - ), - }, - ) - -pep517_native_whl = _native_rule(rust = False) - -# Same rule, plus rules_py's Rust toolchain in the build's exec group. Only -# sdists whose backend is Rust (maturin, setuptools-rust) instantiate it, so -# nobody else ever resolves or fetches a Rust toolchain. -pep517_rust_whl = _native_rule(rust = True) +pep517_native_whl = rule( + implementation = _pep517_native_whl, + doc = """PEP 517 sdist to platform-specific whl build rule. + +Consumes a sdist artifact and performs a build of that artifact with the +specified Python dependencies under the configured Python toolchain to produce a +platform-specific bdist we can subsequently install or deploy. + +Extra toolchains the build action depends on are passed via the standard `toolchains` +attribute and each target's `DefaultInfo.files`, `ToolchainInfo.all_files`, and +`TemplateVariableInfo.variables` are forwarded to the action. The `env` +attribute maps environment variable names to strings that may reference +`$(VAR)` make-variables sourced from those toolchains. This mirrors the +pattern used by `rules_rust`'s `cargo_build_script`. + +The build is guaranteed to occur on an execution platform matching the +constraints of the target platform. + +""", + attrs = PEP517_WHL_ATTRS | { + "args": attr.string_list(), + "env": attr.string_dict( + doc = "Environment variables to set on the build action. Values may " + + "contain `$(VAR)` references to the configured C++ action tools " + + "or make-variables exposed by any target in the rule's " + + "`toolchains` attribute (via `TemplateVariableInfo`). Prefix an " + + "execroot-relative path with " + + "`$(EXECROOT)/` so it remains valid after the backend changes into " + + "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + + "configured C++ action tools.", + ), + "cargo_lock": attr.label( + allow_single_file = True, + doc = "Cargo.lock placed next to the sdist's Cargo.toml before the build, replacing the sdist's own if any.", + ), + "vendored_crates": attr.label( + allow_files = True, + doc = "A cargo vendor directory (one subdirectory per crate, each with its " + + "`.cargo-checksum.json`), as sdist_build materializes it from the sdist's " + + "Cargo.lock. The build runs cargo offline against it.", + ), + "_platform_libc": attr.label( + default = "//uv/private/constraints/platform:platform_libc", + doc = "Read in cross mode to pick the rust target triple (gnu vs musl).", + ), + } | CC_LAYER_ATTRS, + fragments = ["cpp"], + toolchains = [ + # Target-configured interpreter, read only for its platform triple in + # the cross detection; optional so unresolvable targets surface the + # rule's own error instead of a toolchain-resolution one. + config_common.toolchain_type(PY_TOOLCHAIN, mandatory = False), + ], + exec_groups = { + # Cross-compilation of sdists is intentionally unsupported: PEP 517 + # build backends (setuptools, meson-python, etc.) have no standard + # mechanism for cross-compilation, Python headers for the target + # platform are not readily available, and output wheel tags would + # need to encode the target platform with no upstream tooling + # support. Packages that need cross-compiled native extensions should + # publish pre-built wheels for their target platforms instead. + # + # Detection inputs: NATIVE_BUILD_TOOLCHAIN has matching + # exec_compatible_with and target_compatible_with, so it resolves + # exactly when the exec and target platforms match — optional, its + # absence is a cross signal, not a resolution error. The exec- and + # target-configured interpreters' platform triples refine that signal + # (see _cross_decision); a cross decision switches the action into + # cross mode (cc_layer extraction + target-identity env) instead of + # failing. + TARGET_EXEC_GROUP: exec_group( + toolchains = [ + PY_TOOLCHAIN, + config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN, mandatory = False), + config_common.toolchain_type(NATIVE_BUILD_TOOLCHAIN, mandatory = False), + # Optional for the same reason: on a cross target no C++ + # toolchain may resolve, and the rule's own error must win + # over a resolution failure. + config_common.toolchain_type(_CC_TOOLCHAIN_TYPE, mandatory = False), + ], + ), + }, +) diff --git a/uv/private/pep517_whl/rust_layer.bzl b/uv/private/pep517_whl/rust_layer.bzl new file mode 100644 index 000000000..86fbb26a9 --- /dev/null +++ b/uv/private/pep517_whl/rust_layer.bzl @@ -0,0 +1,33 @@ +"""Exposes the exec-platform rust_toolchain's sysroot. + +`@rules_rust//rust/toolchain:current_rust_toolchain` resolves against the +build's ambient --platforms, so under a cross transition it returns the +*target*-targeting toolchain — whose sysroot has no exec-platform rust-std, +which build scripts/proc-macros (always compiled for the exec platform) +need. Re-resolving the toolchain in the exec configuration hands back the +exec-targeting toolchain without hardcoding any repository label. +""" + +def _rust_host_sysroot_impl(ctx): + actual = ctx.attr.actual + if type(actual) == "list": + actual = actual[0] + toolchain = actual[platform_common.ToolchainInfo] + return [ + DefaultInfo(files = toolchain.all_files), + platform_common.TemplateVariableInfo({ + "RUST_HOST_SYSROOT": toolchain.sysroot, + }), + ] + +rust_host_sysroot = rule( + implementation = _rust_host_sysroot_impl, + attrs = { + "actual": attr.label( + cfg = "exec", + doc = "current_rust_toolchain, re-resolved in the exec configuration.", + mandatory = True, + ), + }, + doc = "Exposes the exec-platform rust_toolchain's sysroot as $(RUST_HOST_SYSROOT).", +) diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index c9dd327fa..9893c0261 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -5,8 +5,9 @@ load("@tar.bzl//tar:mtree.bzl", "mtree_mutate", "mtree_spec") load("@tar.bzl//tar:tar.bzl", "tar_rule") load("//py:defs.bzl", "py_binary", "py_test") load("//uv/private/pep517_whl:frontend.bzl", "pep517_frontend") -load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl", "pep517_rust_whl") +load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("//uv/private/pep517_whl:pep517_whl.bzl", "pep517_whl") +load("//uv/private/pep517_whl:rust_layer.bzl", "rust_host_sysroot") load( ":exec_platform_steering_test.bzl", "exec_platform_prefers_native_match_test", @@ -26,6 +27,7 @@ load( "config_settings_args_test", "cross_decision_test", "execroot_collision_toolchain", + "fake_rust_toolchain", "hostile_python_env_target", "interpreter_platform_triple_test", "pep517_native_whl_cross_mode_test", @@ -33,9 +35,9 @@ load( "pep517_native_whl_execroot_collision_test", "pep517_native_whl_toolchain_env_test", "pep517_native_whl_vendored_crates_test", - "pep517_rust_whl_toolchain_env_test", "pep517_whl_console_scripts_test", "python_host_platform_test", + "rust_host_sysroot_test", "target_python_artifacts_test", ) @@ -381,28 +383,46 @@ pep517_native_whl_derived_env_test( target_under_test = ":__derived_env_override_fixture", ) -# rules_py's own Rust toolchain reaches the build: resolved for the exec -# platform and a linux/x86_64 target, its cargo, rustc, sysroot and target -# std land in the env and the inputs. Nothing is registered by the workspace. -platform( - name = "cross_target_platform_x86_64", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:x86_64", - ], +fake_rust_toolchain(name = "__fake_rust_toolchain") + +rust_host_sysroot( + name = "__rust_host_sysroot", + actual = ":__fake_rust_toolchain", +) + +rust_host_sysroot_test( + name = "rust_host_sysroot_test", + target_under_test = ":__rust_host_sysroot", ) -pep517_rust_whl( - name = "__rust_toolchain_fixture", +# The shape sdist_build generates for a Rust sdist: the toolchain plus its +# exec-configured sysroot layer. Their make-variables must reach the helper +# under its env names, and the make-variable names themselves must not. +pep517_native_whl( + name = "__derived_rust_env_fixture", src = ":__stub_sdist", tags = ["manual"], tool = ":__stub_tool", + toolchains = [ + ":__fake_rust_toolchain", + ":__rust_host_sysroot", + ], version = "0.0.1", ) -pep517_rust_whl_toolchain_env_test( - name = "rust_toolchain_env_test", - target_under_test = ":__rust_toolchain_fixture", +pep517_native_whl_derived_env_test( + name = "derived_rust_env_test", + absent_keys = [ + "RUST_SYSROOT", + "RUST_HOST_SYSROOT", + ], + derived_keys = [ + "CARGO", + "RUSTC", + "RULES_PY_RUST_SYSROOT", + "RULES_PY_RUST_HOST_SYSROOT", + ], + target_under_test = ":__derived_rust_env_fixture", ) # sdist_build's vendor directory shape: one subdirectory per crate with its diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 6889ee65f..8155ffea7 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -193,18 +193,10 @@ def test_index_only_rewrites_from_itself(self) -> None: class AbsolutizeToolPathsTest(unittest.TestCase): def test_rust_keys_absolutized(self) -> None: - env = { - "CARGO": "bazel-out/bin/rust/bin/cargo", - "RUSTC": "bazel-out/bin/rust/bin/rustc", - "RULES_PY_RUST_SYSROOT": "bazel-out/bin/rust", - "RULES_PY_RUST_TARGET_STD": "external/std_gnu:external/std_musl", - } + env = {"CARGO": "bazel-out/bin/rust/bin/cargo", "RUSTC": "bazel-out/bin/rust/bin/rustc", "RULES_PY_RUST_HOST_SYSROOT": "bazel-out/bin/rust"} build_helper._absolutize_tool_paths(env) - for key in ("CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT"): + for key in ("CARGO", "RUSTC", "RULES_PY_RUST_HOST_SYSROOT"): self.assertTrue(path.isabs(env[key]), key) - roots = env["RULES_PY_RUST_TARGET_STD"].split(os.pathsep) - self.assertEqual(2, len(roots)) - self.assertTrue(all(path.isabs(r) for r in roots), roots) def test_ant_keys_absolutized(self) -> None: env = {"ANT_HOME": "bazel-out/bin/ant", "RULES_PY_ANT_BIN_DIR": "bazel-out/bin/ant/bin"} @@ -882,6 +874,55 @@ def test_maturin_args_preserve_package_values(self) -> None: env["MATURIN_PEP517_ARGS"], ) + def test_rustc_wrapper_uses_merged_sysroot(self) -> None: + tmp = tempfile.mkdtemp() + # Fake target toolchain (bin/rustc) and host sysroot with an exec-std entry. + target_rustc = path.join(tmp, "target_tc", "bin", "rustc") + makedirs(path.dirname(target_rustc)) + open(target_rustc, "w").close() + makedirs(path.join(tmp, "target_tc", "lib", "rustlib", "aarch64-unknown-linux-gnu")) + host_sysroot = path.join(tmp, "host_sysroot") + makedirs(path.join(host_sysroot, "lib", "rustlib", "aarch64-apple-darwin")) + + env = self._env() + env["RUSTC"] = target_rustc + env["RULES_PY_RUST_HOST_SYSROOT"] = host_sysroot + build_helper._configure_cargo_cross_env(env, tmp, "linux", "aarch64", "glibc") + + wrapper = env["RUSTC"] + self.assertNotEqual(target_rustc, wrapper) + with open(wrapper) as f: + content = f.read() + self.assertIn("--sysroot", content) + self.assertTrue(os.access(wrapper, os.X_OK)) + # The merged sysroot exposes the host's rustlib entries (exec std for + # build scripts) alongside the target's. + merged = path.join(tmp, ".rust_sysroot", "lib", "rustlib") + self.assertTrue(path.islink(path.join(merged, "aarch64-apple-darwin"))) + self.assertTrue(path.islink(path.join(merged, "aarch64-unknown-linux-gnu"))) + + + def test_target_sysroot_from_toolchain_wins_over_rustc_location(self) -> None: + # rules_rs-style layout: rustc in one repository, rust-std in another, + # both assembled into the toolchain's generated sysroot. + tmp = tempfile.mkdtemp() + target_rustc = path.join(tmp, "rustc_repo", "bin", "rustc") + makedirs(path.dirname(target_rustc)) + open(target_rustc, "w").close() + generated = path.join(tmp, "generated_sysroot") + makedirs(path.join(generated, "lib", "rustlib", "aarch64-unknown-linux-gnu")) + host_sysroot = path.join(tmp, "host_sysroot") + makedirs(path.join(host_sysroot, "lib", "rustlib", "x86_64-unknown-linux-gnu")) + + env = self._env() + env["RUSTC"] = target_rustc + env["RULES_PY_RUST_SYSROOT"] = generated + env["RULES_PY_RUST_HOST_SYSROOT"] = host_sysroot + build_helper._configure_cargo_cross_env(env, tmp, "linux", "aarch64", "glibc") + + merged = path.join(tmp, ".rust_sysroot", "lib", "rustlib") + self.assertTrue(path.islink(path.join(merged, "aarch64-unknown-linux-gnu"))) + self.assertTrue(path.islink(path.join(merged, "x86_64-unknown-linux-gnu"))) class InjectCargoLockTest(unittest.TestCase): @@ -944,61 +985,10 @@ def test_no_vendor_dir_leaves_cargo_online(self) -> None: self.assertFalse(path.exists(path.join(tmp, "config.toml"))) -class MergeRustSysrootTest(unittest.TestCase): - def _sysroot(self, tmp: str, name: str, *triples: str) -> str: - root = path.join(tmp, name) - makedirs(path.join(root, "bin")) - open(path.join(root, "bin", "rustc"), "w").close() - makedirs(path.join(root, "lib")) - open(path.join(root, "lib", "librustc_driver.so"), "w").close() - for triple in triples: - makedirs(path.join(root, "lib", "rustlib", triple, "lib")) - return root - - def _std(self, tmp: str, name: str, triple: str) -> str: - root = path.join(tmp, name) - makedirs(path.join(root, "lib", "rustlib", triple, "lib")) - return root - - def test_exec_sysroot_plus_target_stds(self) -> None: - tmp = tempfile.mkdtemp() - host = self._sysroot(tmp, "host", "aarch64-apple-darwin") - gnu = self._std(tmp, "std_gnu", "x86_64-unknown-linux-gnu") - musl = self._std(tmp, "std_musl", "x86_64-unknown-linux-musl") - merged = build_helper._merge_rust_sysroot(tmp, host, [gnu, musl]) - rustlib = path.join(merged, "lib", "rustlib") - self.assertTrue(path.islink(path.join(merged, "bin")), "exec drivers come whole") - self.assertTrue(path.islink(path.join(merged, "lib", "librustc_driver.so"))) - for triple in ("aarch64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl"): - self.assertTrue(path.islink(path.join(rustlib, triple)), triple) - - def test_exec_entries_win_and_merge_is_idempotent(self) -> None: - tmp = tempfile.mkdtemp() - host = self._sysroot(tmp, "host", "x86_64-unknown-linux-gnu") - same = self._std(tmp, "std_same", "x86_64-unknown-linux-gnu") - merged = build_helper._merge_rust_sysroot(tmp, host, [same]) - link = path.join(merged, "lib", "rustlib", "x86_64-unknown-linux-gnu") - self.assertEqual(path.join(host, "lib", "rustlib", "x86_64-unknown-linux-gnu"), os.readlink(link)) - self.assertEqual(merged, build_helper._merge_rust_sysroot(tmp, host, [same])) - - def test_cross_env_wraps_rustc_with_the_merged_sysroot(self) -> None: - tmp = tempfile.mkdtemp() - host = self._sysroot(tmp, "host", "aarch64-apple-darwin") - gnu = self._std(tmp, "std_gnu", "aarch64-unknown-linux-gnu") - env = {"CC": "/wrap/cc", "CXX": "/wrap/c++", "CARGO": path.join(host, "bin", "cargo"), "RUSTC": path.join(host, "bin", "rustc"), - "RULES_PY_RUST_SYSROOT": host, "RULES_PY_RUST_TARGET_STD": gnu} - build_helper._configure_cargo_cross_env(env, tmp, "linux", "aarch64", "glibc") - with open(env["RUSTC"]) as f: - content = f.read() - self.assertIn("--sysroot", content) - self.assertIn(path.join(tmp, ".rust_sysroot"), content) - self.assertTrue(path.islink(path.join(tmp, ".rust_sysroot", "lib", "rustlib", "aarch64-unknown-linux-gnu"))) - - class CargoNativeEnvTest(unittest.TestCase): def test_rustc_gets_the_toolchain_sysroot(self) -> None: tmp = tempfile.mkdtemp() - env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_SYSROOT": "/tc/sysroot"} + env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_SYSROOT": "/tc/sysroot", "RULES_PY_RUST_HOST_SYSROOT": "/exec/sysroot"} build_helper._configure_cargo_native_env(env, tmp) with open(env["RUSTC"]) as f: content = f.read() @@ -1006,6 +996,12 @@ def test_rustc_gets_the_toolchain_sysroot(self) -> None: self.assertIn("/tc/bin/rustc", content) self.assertTrue(os.access(env["RUSTC"], os.X_OK)) + def test_host_sysroot_is_the_fallback(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_HOST_SYSROOT": "/exec/sysroot"} + build_helper._configure_cargo_native_env(env, tmp) + with open(env["RUSTC"]) as f: + self.assertIn("/exec/sysroot", f.read()) def test_no_rust_toolchain_leaves_rustc_alone(self) -> None: tmp = tempfile.mkdtemp() diff --git a/uv/private/pep517_whl/tests/pep517_whl_test.bzl b/uv/private/pep517_whl/tests/pep517_whl_test.bzl index 5220297e3..36007ffaf 100644 --- a/uv/private/pep517_whl/tests/pep517_whl_test.bzl +++ b/uv/private/pep517_whl/tests/pep517_whl_test.bzl @@ -368,32 +368,38 @@ config_settings_args_test = analysistest.make( }, ) -def _rust_toolchain_env_test_impl(ctx): +def _fake_rust_toolchain_impl(ctx): + # The sysroot is this target's own output root: an "-exec" segment in it + # proves the dependent re-resolved us in the exec configuration. The + # make-variables mirror what rules_rust's current_rust_toolchain exports. + return [ + platform_common.ToolchainInfo(sysroot = ctx.bin_dir.path, all_files = depset()), + platform_common.TemplateVariableInfo({ + "CARGO": "/fake/bin/cargo", + "RUSTC": "/fake/bin/rustc", + "RUST_SYSROOT": ctx.bin_dir.path + "/fake_sysroot", + }), + ] + +fake_rust_toolchain = rule( + implementation = _fake_rust_toolchain_impl, + doc = "Stands in for rules_rust's current_rust_toolchain: ToolchainInfo with a sysroot.", +) + +def _rust_host_sysroot_test_impl(ctx): env = analysistest.begin(ctx) target = analysistest.target_under_test(env) - actions = [a for a in target.actions if a.mnemonic == "PySdistNativeBuild"] - asserts.equals(env, 1, len(actions), "expected exactly one PySdistNativeBuild action") - if not actions: - return analysistest.end(env) - action_env = actions[0].env - for key in ("CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT", "RULES_PY_RUST_TARGET_STD"): - asserts.true(env, action_env.get(key), "{} must come from rules_py's Rust toolchain; env keys: {}".format(key, sorted(action_env.keys()))) - rustc = action_env.get("RUSTC", "") - asserts.true(env, rustc.endswith("/bin/rustc"), "got: " + rustc) - asserts.true(env, rustc.startswith(action_env.get("RULES_PY_RUST_SYSROOT", "?")), "rustc lives inside its sysroot") - inputs = [f.path for f in actions[0].inputs.to_list()] - asserts.true(env, rustc in inputs, "the toolchain files must be action inputs") + variables = target[platform_common.TemplateVariableInfo].variables + sysroot = variables.get("RUST_HOST_SYSROOT", "") + asserts.true(env, sysroot != "", "RUST_HOST_SYSROOT must be exported; got: {}".format(variables)) asserts.true( env, - any(["/lib/rustlib/x86_64-unknown-linux-gnu/lib/" in p for p in inputs]), - "the target platform's std must be an action input", + "-exec" in sysroot, + "the sysroot must come from the toolchain re-resolved in the exec configuration; got: " + sysroot, ) return analysistest.end(env) -pep517_rust_whl_toolchain_env_test = analysistest.make( - _rust_toolchain_env_test_impl, - config_settings = {"//command_line_option:platforms": "@@//uv/private/pep517_whl/tests:cross_target_platform_x86_64"}, -) +rust_host_sysroot_test = analysistest.make(_rust_host_sysroot_test_impl) def _vendored_crates_test_impl(ctx): env = analysistest.begin(ctx) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 5b2516748..3f04007a9 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -216,12 +216,10 @@ def _override_tool(env: dict[str, str], key: str, wrapper: str) -> None: def _absolutize_tool_paths(env: dict[str, str]) -> None: """Resolve toolchain paths before the backend changes cwd.""" - for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): + for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): value = env.get(key) if value: env[key] = _absolutize_path(value) - if env.get("RULES_PY_RUST_TARGET_STD"): - env["RULES_PY_RUST_TARGET_STD"] = pathsep.join(_absolutize_path(p) for p in env["RULES_PY_RUST_TARGET_STD"].split(pathsep) if p) for key in ("AR", "LD", "STRIP"): value = env.get(key) @@ -1036,37 +1034,44 @@ def _generate_cmake_toolchain_file( """ -def _merge_rust_sysroot(tmpdir: str, host_sysroot: str, target_std_roots: list[str]) -> str: - """Overlay the target platforms' rust-std onto the exec platform's sysroot. +def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str, target_sysroot: str | None = None) -> str: + """Symlink-merge the target toolchain's sysroot with the host's rust-std. - rules_py's toolchain ships the exec sysroot (rustc, cargo, exec std) and - the target std trees separately; cargo needs both in one sysroot: exec - std for build scripts and proc-macros, target std for the extension. - rustup keeps every target's std side by side in one install; recreate - that with symlinks. Exec entries win on collision. + A cross rust_toolchain's sysroot has no exec-platform rust-std, but + cargo needs one to compile build scripts/proc-macros (always host + artifacts regardless of --target). rustup holds every target's std side + by side in one install; recreate that by merging the two Bazel-fetched + single-target sysroots. The host's rustlib entries win: exec-platform + code must resolve against exec-platform std. + + The target sysroot is the toolchain's generated one when known: rulesets + such as rules_rs fetch rustc and rust-std into separate repositories, so + the directory above rustc holds no std at all. """ + target_sysroot = target_sysroot or path.dirname(path.dirname(target_rustc)) merged = path.join(tmpdir, ".rust_sysroot") if path.exists(merged): return merged makedirs(merged) - for entry in os.listdir(host_sysroot): + for entry in os.listdir(target_sysroot): if entry != "lib": - os.symlink(path.join(host_sysroot, entry), path.join(merged, entry)) + os.symlink(path.join(target_sysroot, entry), path.join(merged, entry)) merged_lib = path.join(merged, "lib") makedirs(merged_lib) - for entry in os.listdir(path.join(host_sysroot, "lib")): + for entry in os.listdir(path.join(target_sysroot, "lib")): if entry != "rustlib": - os.symlink(path.join(host_sysroot, "lib", entry), path.join(merged_lib, entry)) + os.symlink(path.join(target_sysroot, "lib", entry), path.join(merged_lib, entry)) merged_rustlib = path.join(merged_lib, "rustlib") makedirs(merged_rustlib) - for root in [host_sysroot] + list(target_std_roots): - rustlib = path.join(root, "lib", "rustlib") - if not path.isdir(rustlib): - continue - for entry in os.listdir(rustlib): - dest = path.join(merged_rustlib, entry) - if not path.lexists(dest): - os.symlink(path.join(rustlib, entry), dest) + host_rustlib = path.join(host_sysroot, "lib", "rustlib") + target_rustlib = path.join(target_sysroot, "lib", "rustlib") + overridden = set() + for entry in os.listdir(host_rustlib): + os.symlink(path.join(host_rustlib, entry), path.join(merged_rustlib, entry)) + overridden.add(entry) + for entry in os.listdir(target_rustlib): + if entry not in overridden: + os.symlink(path.join(target_rustlib, entry), path.join(merged_rustlib, entry)) return merged @@ -1105,10 +1110,9 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os # version. Unused (harmless) for non-PyO3 crates. build_env["PYO3_CROSS_PYTHON_VERSION"] = "{}.{}".format(sys.version_info.major, sys.version_info.minor) - sysroot = build_env.get("RULES_PY_RUST_SYSROOT") - if sysroot: - target_std = [p for p in build_env.get("RULES_PY_RUST_TARGET_STD", "").split(pathsep) if p] - merged_sysroot = _merge_rust_sysroot(tmpdir, sysroot, target_std) + host_sysroot = build_env.get("RULES_PY_RUST_HOST_SYSROOT") + if host_sysroot: + merged_sysroot = _merge_rust_sysroot(tmpdir, build_env["RUSTC"], host_sysroot, build_env.get("RULES_PY_RUST_SYSROOT")) build_env["RUSTC"] = _write_generated_file( path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=merged_sysroot), @@ -1165,11 +1169,13 @@ def _configure_cargo_offline(build_env: dict[str, str], vendor_dir: str) -> None def _configure_cargo_native_env(build_env: dict[str, str], tmpdir: str) -> None: """Point rustc at the toolchain's sysroot for a native build. - rules_py's toolchain publishes the exec platform's complete sysroot - (RULES_PY_RUST_SYSROOT); pass it explicitly rather than trusting rustc to - infer it from its own location. + Bare rustc infers its sysroot from its own location, which only works + when rust-std was unpacked next to it. rules_rust's toolchain always + publishes the sysroot it assembled (RUST_SYSROOT), so pass that + explicitly; the exec-configured layer's sysroot is the same toolchain in + native mode and serves as the fallback. """ - sysroot = build_env.get("RULES_PY_RUST_SYSROOT") + sysroot = build_env.get("RULES_PY_RUST_SYSROOT") or build_env.get("RULES_PY_RUST_HOST_SYSROOT") if not (build_env.get("CARGO") and sysroot): return build_env["RUSTC"] = _write_generated_file( diff --git a/uv/private/rust/BUILD.bazel b/uv/private/rust/BUILD.bazel deleted file mode 100644 index 95da14e47..000000000 --- a/uv/private/rust/BUILD.bazel +++ /dev/null @@ -1,35 +0,0 @@ -load("@bazel_lib//:bzl_library.bzl", "bzl_library") - -package(default_visibility = ["//uv/private:__subpackages__"]) - -# Resolved only by pep517_rust_whl, the rule sdist_build emits for Rust -# sdists, so consumers without one never fetch a Rust toolchain. -toolchain_type( - name = "toolchain_type", - visibility = ["//visibility:public"], -) - -bzl_library( - name = "repositories", - srcs = ["repositories.bzl"], - deps = [":versions"], -) - -bzl_library( - name = "extensions", - srcs = ["extensions.bzl"], - deps = [ - ":repositories", - ":versions", - ], -) - -bzl_library( - name = "toolchain", - srcs = ["toolchain.bzl"], -) - -bzl_library( - name = "versions", - srcs = ["versions.bzl"], -) diff --git a/uv/private/rust/extensions.bzl b/uv/private/rust/extensions.bzl deleted file mode 100644 index 0dae5c67d..000000000 --- a/uv/private/rust/extensions.bzl +++ /dev/null @@ -1,73 +0,0 @@ -"""Module extension provisioning rules_py's own Rust toolchain for sdist builds. - -Rust sdists (maturin, setuptools-rust) need cargo, rustc and a std for the -exec and target platforms. rules_py fetches the official Rust dist archives -itself, the way it fetches Python interpreters and uv, so no ruleset has to -be added or registered for a Rust package in the lock to build. -""" - -load("//uv/private/rust:repositories.bzl", "rust_host_repository", "rust_hub_repository", "rust_std_repository") -load("//uv/private/rust:versions.bzl", "LATEST_RUST_VERSION", "RUST_HOST_TRIPLES", "RUST_TARGETS", "RUST_VERSIONS") - -_HUB = "rules_py_rust_toolchains" -_PREFIX = "rules_py_rust_" - -def _rust_tools_impl(module_ctx): - version = LATEST_RUST_VERSION - sha256s = {} - for mod in module_ctx.modules: - for tc in mod.tags.toolchain: - if mod.is_root: - version = tc.version or version - sha256s = dict(tc.sha256s) - hashes = dict(RUST_VERSIONS.get(version, {})) - hashes.update(sha256s) - - def sha(component, triple): - key = "{}-{}".format(component, triple) - if key not in hashes: - fail("rust_tools.toolchain(version = \"{}\"): no sha256 pinned for {}; pass it in `sha256s`.".format(version, key)) - return hashes[key] - - for host in RUST_HOST_TRIPLES: - rust_host_repository( - name = _PREFIX + "host_" + host.replace("-", "_"), - version = version, - triple = host, - rustc_sha256 = sha("rustc", host), - cargo_sha256 = sha("cargo", host), - std_sha256 = sha("rust-std", host), - ) - std_triples = {t: None for triples in RUST_TARGETS.values() for t in triples} - for triple in std_triples: - rust_std_repository( - name = _PREFIX + "std_" + triple.replace("-", "_"), - version = version, - triple = triple, - sha256 = sha("rust-std", triple), - ) - rust_hub_repository( - name = _HUB, - repo_prefix = _PREFIX, - host_triples = RUST_HOST_TRIPLES, - targets_json = json.encode({"{}/{}".format(os, cpu): triples for (os, cpu), triples in RUST_TARGETS.items()}), - ) - return module_ctx.extension_metadata(reproducible = True) - -_toolchain_tag = tag_class( - attrs = { - "version": attr.string( - doc = "Rust release to use for sdist builds (e.g. '1.90.0'). Defaults to the latest version pinned in aspect_rules_py. Only the root module's choice applies.", - ), - "sha256s": attr.string_dict( - doc = "`-` -> sha256 of the dist archive, for versions aspect_rules_py does not pin.", - ), - }, - doc = "Selects the Rust release rules_py fetches for building Rust sdists.", -) - -rust_tools = module_extension( - implementation = _rust_tools_impl, - tag_classes = {"toolchain": _toolchain_tag}, - doc = "Fetches the Rust toolchain rules_py uses to build Rust sdists and publishes `@rules_py_rust_toolchains`.", -) diff --git a/uv/private/rust/repositories.bzl b/uv/private/rust/repositories.bzl deleted file mode 100644 index ebef9bcb1..000000000 --- a/uv/private/rust/repositories.bzl +++ /dev/null @@ -1,139 +0,0 @@ -"""Repository rules materializing a Rust toolchain for PEP 517 builds. - -A host repository is a complete rustup-style sysroot for one exec platform: -rustc, cargo and that platform's rust-std, extracted into one tree. Std -repositories hold one target platform's rust-std; the helper overlays them -onto the host sysroot for cross builds, the way rustup keeps several targets -side by side. -""" - -load(":versions.bzl", "rust_archive_prefix", "rust_archive_url") - -def _download(rctx, component, triple, sha256): - rctx.download_and_extract( - url = rust_archive_url(component, rctx.attr.version, triple), - sha256 = sha256, - canonical_id = "{}-{}-{}".format(component, rctx.attr.version, triple), - stripPrefix = rust_archive_prefix(component, rctx.attr.version, triple), - ) - -def _repo_metadata(rctx): - # Support bazel [rust-std triples]."), - }, -) diff --git a/uv/private/rust/toolchain.bzl b/uv/private/rust/toolchain.bzl deleted file mode 100644 index 491ac377e..000000000 --- a/uv/private/rust/toolchain.bzl +++ /dev/null @@ -1,50 +0,0 @@ -"""The Rust toolchain rules_py hands to PEP 517 builds of Rust sdists.""" - -RUST_TOOLCHAIN_TYPE = "@aspect_rules_py//uv/private/rust:toolchain_type" - -def _root_of(files, marker): - """Repository root shared by `files`, from any path containing `marker`.""" - for f in files.to_list(): - idx = f.path.find(marker) - if idx != -1: - return f.path[:idx] - return None - -def _rust_pep517_toolchain_impl(ctx): - rustc = ctx.file.rustc - sysroot = rustc.path[:-len("/bin/rustc")] - target_std_roots = [] - transitive = [ctx.attr.sysroot_files[DefaultInfo].files] - for std in ctx.attr.target_std: - files = std[DefaultInfo].files - transitive.append(files) - root = _root_of(files, "/lib/rustlib/") - if root: - target_std_roots.append(root) - return [platform_common.ToolchainInfo( - rustc = rustc, - cargo = ctx.file.cargo, - sysroot = sysroot, - target_std_roots = target_std_roots, - exec_triple = ctx.attr.exec_triple, - target_triples = ctx.attr.target_triples, - all_files = depset(transitive = transitive), - )] - -rust_pep517_toolchain = rule( - implementation = _rust_pep517_toolchain_impl, - doc = """A Rust toolchain for one (exec platform, target platform) pair. - -`sysroot_files` is the exec platform's complete sysroot (rustc, cargo, its own -std); `target_std` holds the target platform's rust-std trees, one per libc on -Linux. The build helper passes the sysroot to rustc explicitly and, under -cross, overlays the target std onto it.""", - attrs = { - "rustc": attr.label(allow_single_file = True, mandatory = True), - "cargo": attr.label(allow_single_file = True, mandatory = True), - "sysroot_files": attr.label(mandatory = True), - "target_std": attr.label_list(), - "exec_triple": attr.string(mandatory = True), - "target_triples": attr.string_list(mandatory = True), - }, -) diff --git a/uv/private/rust/versions.bzl b/uv/private/rust/versions.bzl deleted file mode 100644 index 0b70f1af8..000000000 --- a/uv/private/rust/versions.bzl +++ /dev/null @@ -1,59 +0,0 @@ -"""Pinned Rust releases for PEP 517 sdist builds. - -Hashes come from the `.sha256` files published next to each archive at -https://static.rust-lang.org/dist/. Keys are `-`. -""" - -# Exec platforms a build can run on. -RUST_HOST_TRIPLES = [ - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-unknown-linux-gnu", -] - -# Wheel target platforms, as (os, cpu) -> the rust-std triples a build for -# that platform may need. Linux carries both libcs: the toolchain cannot see -# the platform_libc flag, so the helper picks the triple at build time. -RUST_TARGETS = { - ("linux", "x86_64"): ["x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl"], - ("linux", "aarch64"): ["aarch64-unknown-linux-gnu", "aarch64-unknown-linux-musl"], - ("macos", "x86_64"): ["x86_64-apple-darwin"], - ("macos", "aarch64"): ["aarch64-apple-darwin"], -} - -RUST_VERSIONS = { - "1.90.0": { - "rustc-x86_64-unknown-linux-gnu": "48c2a42de9e92fcae8c24568f5fe40d5734696a6f80e83cc6d46eef1a78f13c9", - "rustc-aarch64-unknown-linux-gnu": "4e1a9987a11d7d91f0d5afbf5333feb62f44172e4a31f33ce7246549003217f2", - "rustc-x86_64-apple-darwin": "594687a61b671445ea9fff0e6b6c6eef81cba30b005d22710217b4da8d2d2ecc", - "rustc-aarch64-apple-darwin": "89551c0ba1cc6d0312aebc4a6cafe4497223217ea8e87c81f6afbe127dfaeeb6", - "cargo-x86_64-unknown-linux-gnu": "9853db03d68578a30972e2755c89c66aec035fec641cf8f3a7117c81eec2578d", - "cargo-aarch64-unknown-linux-gnu": "bd8d1da6fe88ea7e29338f24277c22156267447adbfc47d690467ad32d02c2a7", - "cargo-x86_64-apple-darwin": "b2fa21c8fed854775e379bb4617145abd047d1be729e8383148139ba1d05c88f", - "cargo-aarch64-apple-darwin": "17a4410a27bf7dad4765f3809265c225f25f8b009da3d4b76cd0927acdae04b5", - "rust-std-x86_64-unknown-linux-gnu": "663f4ab7945b392d5e5294dec1b050a66820a20e86f084ec37eeb0f2f7ff5569", - "rust-std-aarch64-unknown-linux-gnu": "4952abb7d9d3ed7cea4f7ea44dcb23dc67631fae4ac44a5f059b90a4b5e9223f", - "rust-std-x86_64-unknown-linux-musl": "38490d575786f4688e83b357baeb022d8dde0ace2cb8c1357e060c76644fc56a", - "rust-std-aarch64-unknown-linux-musl": "a603e135d4eb67ababdd193268a69937fa4490bafde592f2c931d17c7567b228", - "rust-std-x86_64-apple-darwin": "dd731e6f9f30cb9b2928b92b084d2f12a3abf06a481ecbd8c3553c3e6f742139", - "rust-std-aarch64-apple-darwin": "c36777aec17d617f85f94b7cb87bdd4270eeca30ef38c6f686809d163c881609", - }, -} - -LATEST_RUST_VERSION = RUST_VERSIONS.keys()[-1] - -def rust_archive_url(component, version, triple): - """Upstream URL of one Rust dist component archive.""" - return "https://static.rust-lang.org/dist/{}-{}-{}.tar.xz".format(component, version, triple) - -def rust_archive_prefix(component, version, triple): - """Path inside the archive holding the component's install tree (bin/, lib/).""" - inner = component if component != "rust-std" else "rust-std-" + triple - return "{}-{}-{}/{}".format(component, version, triple, inner) - -def triple_constraints(triple): - """Bazel platform constraints for a Rust target triple.""" - cpu, _, rest = triple.partition("-") - os = "macos" if "apple-darwin" in rest else "linux" - return ["@platforms//os:" + os, "@platforms//cpu:" + cpu] diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 0503ddbe2..92335a883 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -183,18 +183,13 @@ def _is_rust_build(inspection): """ if not inspection: return False - backend = inspection.get("build_backend") - if backend == "maturin": + if inspection.get("build_backend") == "maturin": return True - - # setuptools-rust only ever rides on a setuptools backend (or none, for a - # bare setup.py). Other backends may ship stray .rs files that make the - # configure tool infer setuptools-rust (numpy does), and are not Rust builds. - if backend not in (None, "setuptools.build_meta", "setuptools.build_meta:__legacy__"): - return False requirements = list(inspection.get("build_requires", [])) + list(inspection.get("inferred_build_requires", [])) return "setuptools-rust" in [_normalize_requirement(r) for r in requirements] +_RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" + _CRATES_IO_SOURCE = "registry+https://github.com/rust-lang/crates.io-index" def _crate_url(name, version): @@ -251,13 +246,39 @@ def _cargo_lock_attr(label): _VENDORED_CRATES_ATTR = "\n vendored_crates = \":vendored_crates\"," -def _rust_rule(inspection): - """The rule sdist_build instantiates for a Rust sdist, or None. +def _rust_wiring(rust_toolchain, inspection, toolchains): + """The generated BUILD's Rust wiring for a project-level `rust_toolchain`. + + The configure tool already detected the build backend and its declared + requirements, so a Rust-based build (maturin, or setuptools with + setuptools-rust) gets the project's Rust toolchain plus an exec-configured + rust_host_sysroot layer without the user spelling either out per package. + pep517_native_whl derives CARGO/RUSTC/RULES_PY_RUST_HOST_SYSROOT from + their make-variables. - pep517_rust_whl is pep517_native_whl plus rules_py's own Rust toolchain in - the build's exec group; nothing else resolves that toolchain. + Args: + rust_toolchain: `uv.project(rust_toolchain = ...)` rendered as a label string, or "". + inspection: The configure tool's JSON, or None. + toolchains: Extra toolchain labels from `uv.override_package`. + + Returns: + struct(load_stmt, target, toolchains): the `load()` line and the + `rust_host_sysroot(...)` target to splice into the BUILD (both "" when + not wired), and the final `toolchains` list. """ - return "pep517_rust_whl" if _is_rust_build(inspection) else None + if not (rust_toolchain and _is_rust_build(inspection)): + return struct(load_stmt = "", target = "", toolchains = list(toolchains)) + target = """ +rust_host_sysroot( + name = "rust_host_sysroot", + actual = {}, +) +""".format(repr(rust_toolchain)) + return struct( + load_stmt = _RUST_LAYER_LOAD, + target = target, + toolchains = [rust_toolchain, ":rust_host_sysroot"] + [t for t in toolchains if t != rust_toolchain], + ) def _sdist_build_impl(repository_ctx): """Prepares a repository for building a wheel from a source distribution (sdist). @@ -390,15 +411,23 @@ def _sdist_build_impl(repository_ctx): # AR, LD, and STRIP make variables can be synthetic. Only forward explicit # toolchains/env for JDK, Rust, and other package-specific overrides. toolchain_attrs = "" - rule = "pep517_native_whl" if is_native else "pep517_whl" + rust_layer_load = "" + rust_layer_target = "" vendored_crates_target = "" vendored_crates_attr = "" if is_native: toolchains = list(repository_ctx.attr.extra_toolchains) extra_env = repository_ctx.attr.extra_env - if _rust_rule(inspection): - rule = "pep517_rust_whl" + # str(Label) is the canonical form: the only spelling that resolves inside + # a repository the rules_py extension generates, whose repo mapping knows + # nothing about the user's rules_rust dependency. + rust_toolchain = repository_ctx.attr.rust_toolchain + rust = _rust_wiring(str(rust_toolchain) if rust_toolchain else "", inspection, toolchains) + rust_layer_load = rust.load_stmt + rust_layer_target = rust.target + toolchains = rust.toolchains + if rust.load_stmt: crates = inspection.get("cargo_crates") if inspection else None if crates: _vendor_crates(repository_ctx, crates) @@ -450,7 +479,7 @@ pep517_frontend( tool = ":frontend" repository_ctx.file("BUILD.bazel", content = """ -load("@aspect_rules_py//uv/private/pep517_whl:{rule_bzl}.bzl", "{rule}"){frontend_load} +load("@aspect_rules_py//uv/private/pep517_whl:{rule}.bzl", "{rule}"){frontend_load}{rust_layer_load} load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( @@ -460,7 +489,7 @@ py_binary( deps = {deps}, include_console_scripts = True, ) -{frontend_target}{vendored_crates_target} +{frontend_target}{rust_layer_target}{vendored_crates_target} {rule}( name = "whl", src = "{src}", @@ -479,9 +508,10 @@ exports_files( console_scripts_attr = console_scripts_attr, config_settings_attr = config_settings_attr, monitor_memory_attr = monitor_memory_attr, - rule = rule, - rule_bzl = "pep517_native_whl" if is_native else "pep517_whl", + rule = "pep517_native_whl" if is_native else "pep517_whl", frontend_load = frontend_load, + rust_layer_load = rust_layer_load, + rust_layer_target = rust_layer_target, vendored_crates_target = vendored_crates_target, vendored_crates_attr = vendored_crates_attr, frontend_target = frontend_target, @@ -534,6 +564,9 @@ sdist_build = repository_rule( allow_single_file = True, doc = "Cargo.lock to vendor from and inject into the build in place of the sdist's. Set via `uv.override_package(cargo_lock = ...)`.", ), + "rust_toolchain": attr.label( + doc = "Project-level Rust toolchain; wired into the build when the sdist's build backend is Rust-based.", + ), "extra_toolchains": attr.string_list( default = [], doc = "Toolchain labels forwarded to the generated pep517_native_whl(...) `toolchains` list. Set via `uv.override_package(toolchains = [...])`.", @@ -557,5 +590,5 @@ sdist_build_test_util = struct( env_attr = _env_attr, is_rust_build = _is_rust_build, normalize_requirement = _normalize_requirement, - rust_rule = _rust_rule, + rust_wiring = _rust_wiring, ) diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 42e212aaf..005836c28 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -13,7 +13,7 @@ load( "crate_vendoring_test", "env_attr_test", "is_rust_build_test", - "rust_rule_test", + "rust_wiring_test", ) build_test( @@ -27,6 +27,6 @@ env_attr_test(name = "env_attr_test") is_rust_build_test(name = "is_rust_build_test") -rust_rule_test(name = "rust_rule_test") +rust_wiring_test(name = "rust_wiring_test") crate_vendoring_test(name = "crate_vendoring_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index a1e4c2b75..7dc120191 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -45,6 +45,8 @@ def _env_attr_test_impl(ctx): env_attr_test = unittest.make(_env_attr_test_impl) +_TOOLCHAIN = "@rules_rust//rust/toolchain:current_rust_toolchain" + def _is_rust_build_test_impl(ctx): env = unittest.begin(ctx) is_rust = sdist_build_test_util.is_rust_build @@ -68,31 +70,41 @@ def _is_rust_build_test_impl(ctx): "setuptools-rust inferred from .rs files counts too: it is injected into the build venv", ) asserts.false(env, is_rust({"build_backend": "mesonpy"}), "meson-python is not Rust") - asserts.false( - env, - is_rust({"build_backend": "mesonpy", "inferred_build_requires": ["setuptools-rust"]}), - "stray .rs files under a non-setuptools backend (numpy) do not make a Rust build", - ) - asserts.true( - env, - is_rust({"build_backend": None, "inferred_build_requires": ["setuptools-rust"]}), - "a bare setup.py with .rs sources is setuptools-rust", - ) asserts.equals(env, "setuptools-rust", sdist_build_test_util.normalize_requirement("Setuptools_Rust>=1.7")) return unittest.end(env) is_rust_build_test = unittest.make(_is_rust_build_test_impl) -def _rust_rule_test_impl(ctx): +def _rust_wiring_test_impl(ctx): env = unittest.begin(ctx) - rule = sdist_build_test_util.rust_rule - asserts.equals(env, "pep517_rust_whl", rule({"build_backend": "maturin"}), "maturin sdists take the Rust flavor") - asserts.equals(env, "pep517_rust_whl", rule({"build_backend": "setuptools.build_meta", "build_requires": ["setuptools-rust>=1.7"]})) - asserts.equals(env, None, rule({"build_backend": "mesonpy"}), "everything else stays on pep517_native_whl") - asserts.equals(env, None, rule(None)) + wiring = sdist_build_test_util.rust_wiring + rust_inspection = {"build_backend": "maturin"} + + off = wiring("", rust_inspection, ["//x:jdk"]) + asserts.equals(env, "", off.load_stmt, "no project rust_toolchain: nothing is wired") + asserts.equals(env, "", off.target) + asserts.equals(env, ["//x:jdk"], off.toolchains, "override toolchains pass through untouched") + + not_rust = wiring(_TOOLCHAIN, {"build_backend": "mesonpy"}, []) + asserts.equals(env, "", not_rust.load_stmt, "a non-Rust backend ignores the project rust_toolchain") + asserts.equals(env, [], not_rust.toolchains) + + on = wiring(_TOOLCHAIN, rust_inspection, ["//x:jdk", _TOOLCHAIN]) + asserts.true(env, "rust_layer.bzl" in on.load_stmt and "rust_host_sysroot" in on.load_stmt, "load() for the layer rule") + asserts.true( + env, + 'rust_host_sysroot(\n name = "rust_host_sysroot",\n actual = "{}",\n)'.format(_TOOLCHAIN) in on.target, + "an exec-configured sysroot layer over the project toolchain; got: " + on.target, + ) + asserts.equals( + env, + [_TOOLCHAIN, ":rust_host_sysroot", "//x:jdk"], + on.toolchains, + "toolchain and layer first, override extras after, the toolchain not repeated", + ) return unittest.end(env) -rust_rule_test = unittest.make(_rust_rule_test_impl) +rust_wiring_test = unittest.make(_rust_wiring_test_impl) def _crate_vendoring_test_impl(ctx): env = unittest.begin(ctx) From 5bbfd62edf0ac563384a80a3124923bd24f7c066 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 05:49:58 -0600 Subject: [PATCH 083/103] fix(uv): only infer setuptools-rust under a setuptools backend numpy's sdist vendors meson's test suite, .rs files included, so the configure tool inferred setuptools-rust for it and sdist_build treated a meson build as Rust: it demanded a rust_toolchain the project never needed. setuptools-rust only ever rides on a setuptools backend (or a bare setup.py). --- e2e/README.md | 13 +++++++------ uv/private/sdist_build/repository.bzl | 10 +++++++++- uv/private/sdist_build/tests/repository_test.bzl | 10 ++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/e2e/README.md b/e2e/README.md index 1662a77cd..c9634c918 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -45,12 +45,13 @@ support rests on a single case: setuptools/distutils C extensions (`pycross-geohash`, `pycross-psutil`, `pycross-msgpack`, `pycross-setuptools`), meson-python (`pycross-meson`, `pycross-numpy`), scikit-build-core/CMake (`pycross-cmake`, `pycross-jdk` — the latter also needing a JDK and a -hermetically vendored Apache Ant), maturin/PyO3 (`pycross-rust`, -`pycross-rpds_py`) and setuptools-rust (`pycross-bcrypt`, `pycross-tiktoken`). -Every case builds for linux/amd64 and linux/arm64; in-suite verification is -structural (`Tag:` metadata, ELF arch of every bundled `.so`), and each case -exports a wheel bundle that CI installs and runs on NATIVE amd64 and arm64 -runners — no emulation in the verdict. The suites are isolated from +hermetically vendored Apache Ant), maturin/PyO3 (`pycross-rust` on a +rules_rust toolchain, `pycross-rust-rs` on a rules_rs one, `pycross-rpds_py`) +and setuptools-rust (`pycross-bcrypt`, `pycross-tiktoken`). Every case builds +for linux/amd64 and linux/arm64; in-suite verification is structural (`Tag:` +metadata, ELF arch of every bundled `.so`), and each case exports a wheel +bundle that CI installs and runs on NATIVE amd64 and arm64 runners — no +emulation in the verdict. The suites are isolated from `e2e/cases` because their hubs need package-specific configuration (`default_build_dependencies`, pre-build patches, a larger `resource_set`) that would otherwise leak onto unrelated packages sharing the hub. On a macOS diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 92335a883..abd04e52f 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -183,8 +183,16 @@ def _is_rust_build(inspection): """ if not inspection: return False - if inspection.get("build_backend") == "maturin": + backend = inspection.get("build_backend") + if backend == "maturin": return True + + # setuptools-rust only ever rides on a setuptools backend (or none, for a + # bare setup.py). Other backends may ship stray .rs files that make the + # configure tool infer setuptools-rust (numpy vendors meson's test suite), + # and are not Rust builds. + if backend not in (None, "setuptools.build_meta", "setuptools.build_meta:__legacy__"): + return False requirements = list(inspection.get("build_requires", [])) + list(inspection.get("inferred_build_requires", [])) return "setuptools-rust" in [_normalize_requirement(r) for r in requirements] diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index 7dc120191..eae1b6d3f 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -70,6 +70,16 @@ def _is_rust_build_test_impl(ctx): "setuptools-rust inferred from .rs files counts too: it is injected into the build venv", ) asserts.false(env, is_rust({"build_backend": "mesonpy"}), "meson-python is not Rust") + asserts.false( + env, + is_rust({"build_backend": "mesonpy", "inferred_build_requires": ["setuptools-rust"]}), + "stray .rs files under a non-setuptools backend (numpy) do not make a Rust build", + ) + asserts.true( + env, + is_rust({"build_backend": None, "inferred_build_requires": ["setuptools-rust"]}), + "a bare setup.py with .rs sources is setuptools-rust", + ) asserts.equals(env, "setuptools-rust", sdist_build_test_util.normalize_requirement("Setuptools_Rust>=1.7")) return unittest.end(env) From 75c47235750b34d84e48e6eb6efa2002f410b575 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 20:50:23 -0600 Subject: [PATCH 084/103] feat(uv): fail early when a Rust sdist has no rust_toolchain to build with Without a toolchain, cargo or maturin failed deep inside the build action with no hint of the cause. sdist_build already knows at repository time that the sdist builds Rust; it now fails there, naming uv.project(rust_toolchain) and the reason (maturin backend, or setuptools-rust requirement). Hand-wired uv.override_package(toolchains = [...]) entries are trusted as the escape hatch. Docs say why the attribute exists at all: rules_py cannot resolve a Rust toolchain itself without making rules_rust a dependency of every consumer. --- docs/uv.md | 10 ++++++--- uv/private/sdist_build/repository.bzl | 22 +++++++++++++++++++ uv/private/sdist_build/tests/BUILD.bazel | 3 +++ .../sdist_build/tests/repository_test.bzl | 18 +++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index 8b192abac..519bd55d5 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -483,8 +483,10 @@ Rust needs one more step. Every sdist runs its build logic on the exec platform, but in a cross build cargo also *compiles* code for the exec platform and runs it there: `build.rs` scripts and proc-macro crates. Those need the exec platform's Rust standard library in the sysroot, and a toolchain resolved -for the target platform ships only the target's. Declare the toolchain once per -project and rules_py adds an exec-configured sysroot layer next to it: +for the target platform ships only the target's. rules_py cannot resolve a +Rust toolchain on its own without making rules_rust a dependency of every +consumer, so point it at the one your project already registers, once per +project; rules_py adds an exec-configured sysroot layer next to it: ```starlark uv.project( @@ -498,7 +500,9 @@ uv.project( Every sdist in that project whose build backend is maturin, or whose build requirements include setuptools-rust, then gets the toolchain and an exec-configured `rust_host_sysroot` layer wired into its build. No -`uv.override_package` entry is needed for Rust packages. The crates the +`uv.override_package` entry is needed for Rust packages, and a Rust sdist in a +project that declares no `rust_toolchain` fails while the repository is +generated, naming the attribute to set. The crates the sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while the repository is generated and vendored into it; cargo then builds offline, so the build needs no network and works under remote execution. A lock that diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index abd04e52f..dd37a6a65 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -254,6 +254,24 @@ def _cargo_lock_attr(label): _VENDORED_CRATES_ATTR = "\n vendored_crates = \":vendored_crates\"," +def _missing_rust_toolchain(repo_name, rust_toolchain, inspection, toolchains): + """The error for a Rust sdist in a project that declares no Rust toolchain, or None. + + Without one, cargo or maturin fail deep inside the build action with no + hint of the cause. Explicit `uv.override_package(toolchains = [...])` + entries are trusted: they are the escape hatch for wiring a toolchain by + hand, and the rule cannot tell a Rust toolchain from any other. + """ + if rust_toolchain or toolchains or not _is_rust_build(inspection): + return None + if inspection.get("build_backend") == "maturin": + reason = "its build backend is maturin" + else: + reason = "setuptools-rust is among its build requirements" + return ("sdist_build for '{}': this sdist builds Rust ({}) but the project declares no Rust toolchain. " + + "Set `uv.project(rust_toolchain = \"@rules_rust//rust/toolchain:current_rust_toolchain\")`, " + + "or wire one by hand with `uv.override_package(toolchains = [...])`.").format(repo_name, reason) + def _rust_wiring(rust_toolchain, inspection, toolchains): """The generated BUILD's Rust wiring for a project-level `rust_toolchain`. @@ -431,6 +449,9 @@ def _sdist_build_impl(repository_ctx): # a repository the rules_py extension generates, whose repo mapping knows # nothing about the user's rules_rust dependency. rust_toolchain = repository_ctx.attr.rust_toolchain + missing = _missing_rust_toolchain(repository_ctx.name, rust_toolchain, inspection, toolchains) + if missing: + fail(missing) rust = _rust_wiring(str(rust_toolchain) if rust_toolchain else "", inspection, toolchains) rust_layer_load = rust.load_stmt rust_layer_target = rust.target @@ -597,6 +618,7 @@ sdist_build_test_util = struct( config_settings_attr = _config_settings_attr, env_attr = _env_attr, is_rust_build = _is_rust_build, + missing_rust_toolchain = _missing_rust_toolchain, normalize_requirement = _normalize_requirement, rust_wiring = _rust_wiring, ) diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 005836c28..372cc50b4 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -13,6 +13,7 @@ load( "crate_vendoring_test", "env_attr_test", "is_rust_build_test", + "missing_rust_toolchain_test", "rust_wiring_test", ) @@ -30,3 +31,5 @@ is_rust_build_test(name = "is_rust_build_test") rust_wiring_test(name = "rust_wiring_test") crate_vendoring_test(name = "crate_vendoring_test") + +missing_rust_toolchain_test(name = "missing_rust_toolchain_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index eae1b6d3f..e2d1eca1d 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -138,3 +138,21 @@ def _crate_vendoring_test_impl(ctx): return unittest.end(env) crate_vendoring_test = unittest.make(_crate_vendoring_test_impl) + +def _missing_rust_toolchain_test_impl(ctx): + env = unittest.begin(ctx) + missing = sdist_build_test_util.missing_rust_toolchain + maturin = {"build_backend": "maturin"} + st_rust = {"build_backend": "setuptools.build_meta", "build_requires": ["setuptools-rust>=1.7"]} + + asserts.equals(env, None, missing("r", "", {"build_backend": "mesonpy"}, []), "not Rust: nothing to demand") + asserts.equals(env, None, missing("r", "@rules_rust//rust/toolchain:current_rust_toolchain", maturin, []), "declared toolchain") + asserts.equals(env, None, missing("r", "", maturin, ["//tools:my_rust_toolchain"]), "hand-wired toolchains are trusted") + + msg = missing("sdist_build__x__pkg__1_0", "", maturin, []) + asserts.true(env, msg != None and "its build backend is maturin" in msg and "uv.project(rust_toolchain" in msg, "got: {}".format(msg)) + msg = missing("r", "", st_rust, []) + asserts.true(env, msg != None and "setuptools-rust is among its build requirements" in msg, "got: {}".format(msg)) + return unittest.end(env) + +missing_rust_toolchain_test = unittest.make(_missing_rust_toolchain_test_impl) From 7f945864e5f21dc465a24b9f6da0286f7ff9cb3d Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 05:52:04 -0600 Subject: [PATCH 085/103] fix(uv): demand a Rust toolchain only for declared Rust builds The inferred setuptools-rust requirement is a guess from stray .rs files: zstandard ships an optional rust-ext it never builds by default, and the fail-early check refused to generate its repository. A guess still wires the project's toolchain when there is one, but never demands one; the build proceeds unwired, as before, and fails only if the backend needs rustc. --- uv/private/sdist_build/repository.bzl | 21 ++++++++++++++++--- .../sdist_build/tests/repository_test.bzl | 8 ++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index dd37a6a65..d9e4dc0ba 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -196,6 +196,19 @@ def _is_rust_build(inspection): requirements = list(inspection.get("build_requires", [])) + list(inspection.get("inferred_build_requires", [])) return "setuptools-rust" in [_normalize_requirement(r) for r in requirements] +def _declares_rust_build(inspection): + """maturin backend, or setuptools-rust among the sdist's *declared* build requirements. + + The inferred requirement (stray .rs files) is a guess: zstandard ships an + optional Rust extension it never builds by default. A guess wires the + toolchain when the project has one, but is never grounds to demand one. + """ + if not _is_rust_build(inspection): + return False + if inspection.get("build_backend") == "maturin": + return True + return "setuptools-rust" in [_normalize_requirement(r) for r in inspection.get("build_requires", [])] + _RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" _CRATES_IO_SOURCE = "registry+https://github.com/rust-lang/crates.io-index" @@ -258,16 +271,18 @@ def _missing_rust_toolchain(repo_name, rust_toolchain, inspection, toolchains): """The error for a Rust sdist in a project that declares no Rust toolchain, or None. Without one, cargo or maturin fail deep inside the build action with no - hint of the cause. Explicit `uv.override_package(toolchains = [...])` + hint of the cause. Only declared Rust builds are demanding: an inferred + setuptools-rust (see _declares_rust_build) builds unwired, as it always + did, and fails only if the backend really needs rustc. Explicit `uv.override_package(toolchains = [...])` entries are trusted: they are the escape hatch for wiring a toolchain by hand, and the rule cannot tell a Rust toolchain from any other. """ - if rust_toolchain or toolchains or not _is_rust_build(inspection): + if rust_toolchain or toolchains or not _declares_rust_build(inspection): return None if inspection.get("build_backend") == "maturin": reason = "its build backend is maturin" else: - reason = "setuptools-rust is among its build requirements" + reason = "setuptools-rust is among its declared build requirements" return ("sdist_build for '{}': this sdist builds Rust ({}) but the project declares no Rust toolchain. " + "Set `uv.project(rust_toolchain = \"@rules_rust//rust/toolchain:current_rust_toolchain\")`, " + "or wire one by hand with `uv.override_package(toolchains = [...])`.").format(repo_name, reason) diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index e2d1eca1d..fbd090937 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -148,11 +148,17 @@ def _missing_rust_toolchain_test_impl(ctx): asserts.equals(env, None, missing("r", "", {"build_backend": "mesonpy"}, []), "not Rust: nothing to demand") asserts.equals(env, None, missing("r", "@rules_rust//rust/toolchain:current_rust_toolchain", maturin, []), "declared toolchain") asserts.equals(env, None, missing("r", "", maturin, ["//tools:my_rust_toolchain"]), "hand-wired toolchains are trusted") + asserts.equals( + env, + None, + missing("r", "", {"build_backend": "setuptools.build_meta", "build_requires": ["setuptools", "cffi"], "inferred_build_requires": ["setuptools-rust"]}, []), + "inferred setuptools-rust is a guess (zstandard's optional rust-ext): never grounds to demand a toolchain", + ) msg = missing("sdist_build__x__pkg__1_0", "", maturin, []) asserts.true(env, msg != None and "its build backend is maturin" in msg and "uv.project(rust_toolchain" in msg, "got: {}".format(msg)) msg = missing("r", "", st_rust, []) - asserts.true(env, msg != None and "setuptools-rust is among its build requirements" in msg, "got: {}".format(msg)) + asserts.true(env, msg != None and "setuptools-rust is among its declared build requirements" in msg, "got: {}".format(msg)) return unittest.end(env) missing_rust_toolchain_test = unittest.make(_missing_rust_toolchain_test_impl) From 163c39b721392a2c92df7dabffb87c9e90c6725a Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 05:54:30 -0600 Subject: [PATCH 086/103] docs(uv): Rust sdists build with the project's rules_rust or rules_rs toolchain State the design plainly: fetching rustc and cargo is the Rust rulesets' job and rules_py depends on neither, so the project points uv.project at the toolchain it registers. Give the rules_rust label and the rules_rs wiring the e2e uses, and note that only declared Rust builds demand a toolchain. --- docs/uv.md | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index 519bd55d5..8040a3150 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -479,14 +479,25 @@ Rust build path reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other ma toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always wins over the derived value. -Rust needs one more step. Every sdist runs its build logic on the exec -platform, but in a cross build cargo also *compiles* code for the exec platform -and runs it there: `build.rs` scripts and proc-macro crates. Those need the -exec platform's Rust standard library in the sysroot, and a toolchain resolved -for the target platform ships only the target's. rules_py cannot resolve a -Rust toolchain on its own without making rules_rust a dependency of every -consumer, so point it at the one your project already registers, once per -project; rules_py adds an exec-configured sysroot layer next to it: +Rust sdists (maturin, setuptools-rust) build with the Rust toolchain your +project registers. Fetching rustc and cargo is the Rust rulesets' job, and +rules_py depends on neither of them, so point it at the toolchain once per +project and every Rust sdist in that project is wired to it. Either ruleset +works: + +- [rules_rust](https://github.com/bazelbuild/rules_rust): + `rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain"` +- [rules_rs](https://github.com/hermeticbuild/rules_rs): its toolchains are + rules_rust `rust_toolchain` instances declared in the patched `rules_rust` + repository it fetches, so expose that repository and point at its + `current_rust_toolchain`: + + ```starlark + rules_rust_rs = use_extension("@rules_rs//rs:rules_rust.bzl", "rules_rust") + use_repo(rules_rust_rs, rules_rust_rs = "rules_rust") + ``` + + then `rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain"`. ```starlark uv.project( @@ -499,10 +510,15 @@ uv.project( Every sdist in that project whose build backend is maturin, or whose build requirements include setuptools-rust, then gets the toolchain and an -exec-configured `rust_host_sysroot` layer wired into its build. No -`uv.override_package` entry is needed for Rust packages, and a Rust sdist in a -project that declares no `rust_toolchain` fails while the repository is -generated, naming the attribute to set. The crates the +exec-configured `rust_host_sysroot` layer wired into its build. In a cross +build cargo also *compiles* code for the exec platform and runs it there +(`build.rs` scripts, proc-macro crates); that layer supplies the exec +platform's standard library next to the target's, the way rustup keeps +several targets in one install. No `uv.override_package` entry is needed for +Rust packages, and a Rust sdist in a project that declares no +`rust_toolchain` fails while the repository is generated, naming the +attribute to set; only declared Rust builds are demanding, an sdist that +merely ships `.rs` files (zstandard's optional extension) builds as before. The crates the sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while the repository is generated and vendored into it; cargo then builds offline, so the build needs no network and works under remote execution. A lock that @@ -510,10 +526,7 @@ pins crates outside crates.io (git or path sources) is rejected. An sdist without a `Cargo.lock` builds with network access and a warning; give it one with `uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once with `cargo generate-lockfile` on the extracted sdist, and it is vendored and -placed next to the sdist's `Cargo.toml` before the build. Any target exposing -rules_rust's toolchain providers works, so the same label serves -[rules_rs](https://github.com/hermeticbuild/rules_rs) toolchains, which are -declared with rules_rust's `rust_toolchain` rule. +placed next to the sdist's `Cargo.toml` before the build. ### Backend config settings From 203e000391caa09fd03df91ba20e54b4eced580c Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 05:50:10 -0600 Subject: [PATCH 087/103] test(e2e): export the Rust cases' wheels for the native-arch runs pycross-rust, pycross-rust-rs and pycross-tiktoken get the pycross_wheel_export from #1507, so CI installs and runs their cross-built wheels on native amd64 and arm64 runners like every other crossbuild case. The rules_rs case's test file takes the bundle's name so the runner finds it. --- e2e/crossbuild/pycross-rust-rs/BUILD.bazel | 15 +++++++++++++-- ..._pydantic_core.py => test_pydantic_core_rs.py} | 0 e2e/crossbuild/pycross-tiktoken/BUILD.bazel | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) rename e2e/crossbuild/pycross-rust-rs/{test_pydantic_core.py => test_pydantic_core_rs.py} (100%) diff --git a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel index 5d6adbff5..72af3ad3d 100644 --- a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel +++ b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel @@ -5,6 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") _PY = "3.12" @@ -12,9 +13,9 @@ _DEP_GROUP = "pycross_rust_rs" py_test( name = "test_pydantic_core", - srcs = ["test_pydantic_core.py"], + srcs = ["test_pydantic_core_rs.py"], dep_group = _DEP_GROUP, - main = "test_pydantic_core.py", + main = "test_pydantic_core_rs.py", python_version = _PY, deps = ["@pypi_pycross_rust_rs//pydantic_core"], ) @@ -60,3 +61,13 @@ collect_wheels( ], wheels = ["@sdist_build__pycross_rust_rs__pydantic_core__2_47_0//:whl"], ) + +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. +pycross_wheel_export( + name = "pydantic_core_rs", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_pydantic_core_rs.py", + wheel = "@sdist_build__pycross_rust_rs__pydantic_core__2_47_0//:whl", +) diff --git a/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core_rs.py similarity index 100% rename from e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py rename to e2e/crossbuild/pycross-rust-rs/test_pydantic_core_rs.py diff --git a/e2e/crossbuild/pycross-tiktoken/BUILD.bazel b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel index 8b4c80f57..63a01b30f 100644 --- a/e2e/crossbuild/pycross-tiktoken/BUILD.bazel +++ b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel @@ -62,6 +62,8 @@ collect_wheels( ], ) +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. pycross_wheel_export( name = "tiktoken", amd64_platform = ":amd64_linux", From d4d5f126252cfc6cc8d6c51a977d94ec308f6d32 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 3 Sep 2026 09:58:42 -0600 Subject: [PATCH 088/103] feat(uv): rust_toolchain on uv.project wires Rust sdist builds automatically `uv.project(rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain")` declares the project's Rust toolchain once. sdist_build already knows each sdist's build backend and declared build requirements from the configure tool; when the backend is maturin, or setuptools-rust is among the requirements, the generated pep517_native_whl gets the toolchain plus a local rust_host_sysroot layer in `toolchains`. pep517_native_whl derives CARGO/RUSTC/RULES_PY_RUST_HOST_SYSROOT from their make-variables, so no per-package uv.override_package is needed for Rust. rust_host_sysroot moves from e2e/crossbuild/tools into rules_py: it re-resolves the toolchain in the exec configuration, because under a cross transition current_rust_toolchain returns the target-targeting toolchain, whose sysroot lacks the exec-platform std that build scripts and proc-macros need. It reads platform_common.ToolchainInfo only, so rules_py takes no dependency on rules_rust. Requirement names are normalized from their PEP 508 spelling (extras, specifiers and markers dropped): the configure tool reports build requirements as declared, e.g. `setuptools-rust>=1.7`. Inferred setuptools-rust counts too: the configure tool adds it for sdists that ship .rs files without declaring it, and injects it into the build venv, so the build needs the toolchain just the same. The inference is limited to setuptools backends (or a bare setup.py); numpy vendors meson's test suite, .rs files included, and stays a meson build. The helper no longer re-derives "is this a Rust build" from pyproject.toml, which would miss inferred builds: CARGO wired by the rule is the signal for the cargo cross environment. rust_toolchain travels as a label, not a string, so a relative or apparent-repo spelling resolves where the user wrote it. Tests: unittests for the detection and for the BUILD wiring it emits; an analysis test with a fake toolchain proves rust_host_sysroot exports the exec-configured sysroot; pycross-rust is the end-to-end consumer, now with no override at all. --- docs/uv.md | 21 ++++ e2e/crossbuild/MODULE.bazel | 2 +- .../pycross-rust/setup.MODULE.bazel | 17 +--- e2e/crossbuild/tools/BUILD.bazel | 11 --- uv/private/extension/defs.bzl | 10 ++ uv/private/pep517_whl/BUILD.bazel | 5 + .../private/pep517_whl}/rust_layer.bzl | 0 uv/private/pep517_whl/tests/BUILD.bazel | 15 +++ .../pep517_whl/tests/build_helper_test.py | 9 ++ .../pep517_whl/tests/pep517_whl_test.bzl | 25 +++++ uv/private/pep517_whl/tools/build_helper.py | 17 +++- uv/private/sdist_build/repository.bzl | 95 ++++++++++++++++++- uv/private/sdist_build/tests/BUILD.bazel | 12 ++- .../sdist_build/tests/repository_test.bzl | 71 ++++++++++++++ 14 files changed, 281 insertions(+), 29 deletions(-) rename {e2e/crossbuild/tools => uv/private/pep517_whl}/rust_layer.bzl (100%) diff --git a/docs/uv.md b/docs/uv.md index cca7517b0..5e8be6a1c 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -400,6 +400,27 @@ reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other make-variable a toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always wins over the derived value. +Rust needs one more step. Every sdist runs its build logic on the exec +platform, but in a cross build cargo also *compiles* code for the exec platform +and runs it there: `build.rs` scripts and proc-macro crates. Those need the +exec platform's Rust standard library in the sysroot, and a toolchain resolved +for the target platform ships only the target's. Declare the toolchain once per +project and rules_py adds an exec-configured sysroot layer next to it: + +```starlark +uv.project( + hub_name = "pypi", + lock = "//:uv.lock", + pyproject = "//:pyproject.toml", + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", +) +``` + +Every sdist in that project whose build backend is maturin, or whose build +requirements include setuptools-rust, then gets the toolchain and an +exec-configured `rust_host_sysroot` layer wired into its build. No +`uv.override_package` entry is needed for Rust packages. + ### Backend config settings PEP 517 backends take a free-form `config_settings` dictionary. Declare it diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 1e780f375..22ebbadc4 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -47,7 +47,7 @@ register_toolchains("@llvm//toolchain:all") # Cross rust toolchain for the maturin case: the extra triples give cargo a # target std for each linux CPU; the exec platform's std comes from the -# ambient toolchain (see //tools:rust_host_sysroot). +# ambient toolchain (see rules_py's rust_layer.bzl). rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") rust.toolchain( edition = "2021", diff --git a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel index 6aa499d29..9e47530a5 100644 --- a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel @@ -8,10 +8,10 @@ and a rustc wrapper whose sysroot merges the target toolchain's std with the exec platform's std (build scripts/proc-macros are always exec artifacts). -The override lists the resolved rust toolchain and the exec platform's -sysroot (//tools:rust_host_sysroot); pep517_native_whl maps their -CARGO/RUSTC/RUST_HOST_SYSROOT make variables into the helper's env, so no -`env` entry spells them out. +`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build +detects the maturin backend and emits the toolchain plus an exec-configured +rust_host_sysroot into the generated pep517_native_whl, whose +CARGO/RUSTC/RUST_HOST_SYSROOT make variables reach the helper's env. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -24,14 +24,7 @@ uv.project( hub_name = "pypi_pycross_rust", lock = "//pycross-rust:uv.lock", pyproject = "//pycross-rust:pyproject.toml", -) -uv.override_package( - name = "pydantic-core", - lock = "//pycross-rust:uv.lock", - toolchains = [ - "@rules_rust//rust/toolchain:current_rust_toolchain", - "//tools:rust_host_sysroot", - ], + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/tools/BUILD.bazel b/e2e/crossbuild/tools/BUILD.bazel index 7015a55cb..f62dc821f 100644 --- a/e2e/crossbuild/tools/BUILD.bazel +++ b/e2e/crossbuild/tools/BUILD.bazel @@ -2,7 +2,6 @@ load("@aspect_rules_py//py:defs.bzl", "py_binary", "py_library", "py_test") load(":ant_layer.bzl", "ant_home") -load(":rust_layer.bzl", "rust_host_sysroot") # Consumed cross-package by the `collect_wheels` macro (//tools:collect_wheels.bzl), # which declares a py_test with this script as `main` in the caller's package. @@ -32,16 +31,6 @@ py_binary( visibility = ["//visibility:public"], ) -# Re-resolves current_rust_toolchain in the exec configuration: under a -# cross transition the plain label would return the *target*-targeting -# toolchain, whose sysroot lacks the exec platform's rust-std that build -# scripts/proc-macros need (see rust_layer.bzl). -rust_host_sysroot( - name = "rust_host_sysroot", - actual = "@rules_rust//rust/toolchain:current_rust_toolchain", - visibility = ["//visibility:public"], -) - # Ant is architecture-independent (bytecode + launcher scripts), so unlike # the Rust sysroot there's no exec/target split — one $(ANT_HOME) covers # both. Used by //pycross-jdk (jpype1's build shells out to Ant). diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index aa1a6726f..681f51aca 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -607,6 +607,7 @@ def _parse_projects(module_ctx, hub_specs): config_settings = config_settings, monitor_memory = monitor_memory, resource_set = resource_set, + rust_toolchain = project.rust_toolchain, ) has_sbuild = True @@ -885,6 +886,8 @@ def _uv_impl(module_ctx): sbuild_kwargs["extra_env"] = sbuild_cfg.extra_env if sbuild_cfg.config_settings: sbuild_kwargs["config_settings"] = sbuild_cfg.config_settings + if sbuild_cfg.rust_toolchain: + sbuild_kwargs["rust_toolchain"] = sbuild_cfg.rust_toolchain if sbuild_cfg.monitor_memory: sbuild_kwargs["monitor_memory"] = True if sbuild_cfg.resource_set != "default": @@ -959,6 +962,13 @@ _project_tag = tag_class( mandatory = True, doc = "The `uv.lock` pinning this project's dependency graph.", ), + "rust_toolchain": attr.label( + mandatory = False, + doc = "A rules_rust `current_rust_toolchain`-style target. When set, every sdist in " + + "this project whose build backend is maturin or setuptools-rust gets it (plus " + + "rules_py's exec-configured sysroot layer) wired into its build automatically, " + + "with no per-package `uv.override_package(toolchains = ...)`.", + ), "default_build_dependencies": attr.string_list( mandatory = False, default = [ diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 8e17a2603..c3f0eb88e 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -51,3 +51,8 @@ bzl_library( "@bazel_lib//lib:resource_sets", ], ) + +bzl_library( + name = "rust_layer", + srcs = ["rust_layer.bzl"], +) diff --git a/e2e/crossbuild/tools/rust_layer.bzl b/uv/private/pep517_whl/rust_layer.bzl similarity index 100% rename from e2e/crossbuild/tools/rust_layer.bzl rename to uv/private/pep517_whl/rust_layer.bzl diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index ea10f2880..a01114765 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -7,6 +7,7 @@ load("//py:defs.bzl", "py_binary", "py_test") load("//uv/private/pep517_whl:frontend.bzl", "pep517_frontend") load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("//uv/private/pep517_whl:pep517_whl.bzl", "pep517_whl") +load("//uv/private/pep517_whl:rust_layer.bzl", "rust_host_sysroot") load( ":exec_platform_steering_test.bzl", "exec_platform_prefers_native_match_test", @@ -26,6 +27,7 @@ load( "config_settings_args_test", "cross_decision_test", "execroot_collision_toolchain", + "fake_rust_toolchain", "hostile_python_env_target", "interpreter_platform_triple_test", "pep517_native_whl_cross_mode_test", @@ -34,6 +36,7 @@ load( "pep517_native_whl_toolchain_env_test", "pep517_whl_console_scripts_test", "python_host_platform_test", + "rust_host_sysroot_test", "target_python_artifacts_test", ) @@ -367,6 +370,18 @@ pep517_native_whl_derived_env_test( target_under_test = ":__derived_env_override_fixture", ) +fake_rust_toolchain(name = "__fake_rust_toolchain") + +rust_host_sysroot( + name = "__rust_host_sysroot", + actual = ":__fake_rust_toolchain", +) + +rust_host_sysroot_test( + name = "rust_host_sysroot_test", + target_under_test = ":__rust_host_sysroot", +) + execroot_collision_toolchain(name = "__execroot_collision_toolchain") pep517_native_whl( diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index e98b89df7..473aef8a4 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -216,6 +216,15 @@ def test_driver_swapped_flags_preserved(self) -> None: self.assertEqual(env["LDSHARED"], "/wrap/cc -shared -pthread") +class NeedsCargoCrossEnvTest(unittest.TestCase): + def test_cargo_wired_by_the_rule_is_the_signal(self) -> None: + self.assertTrue(build_helper._needs_cargo_cross_env({"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc"})) + + def test_no_rust_toolchain_no_cargo_env(self) -> None: + self.assertFalse(build_helper._needs_cargo_cross_env({})) + self.assertFalse(build_helper._needs_cargo_cross_env({"CARGO": ""}), "an empty CARGO is not a toolchain") + + class MakeCompilerWrapperTest(unittest.TestCase): def test_wrapper_is_executable_and_bakes_the_driver(self) -> None: with tempfile.TemporaryDirectory() as tmp: diff --git a/uv/private/pep517_whl/tests/pep517_whl_test.bzl b/uv/private/pep517_whl/tests/pep517_whl_test.bzl index 2d5f5a273..5b85cc46d 100644 --- a/uv/private/pep517_whl/tests/pep517_whl_test.bzl +++ b/uv/private/pep517_whl/tests/pep517_whl_test.bzl @@ -367,3 +367,28 @@ config_settings_args_test = analysistest.make( ), }, ) + +def _fake_rust_toolchain_impl(ctx): + # The sysroot is this target's own output root: an "-exec" segment in it + # proves the dependent re-resolved us in the exec configuration. + return [platform_common.ToolchainInfo(sysroot = ctx.bin_dir.path, all_files = depset())] + +fake_rust_toolchain = rule( + implementation = _fake_rust_toolchain_impl, + doc = "Stands in for rules_rust's current_rust_toolchain: ToolchainInfo with a sysroot.", +) + +def _rust_host_sysroot_test_impl(ctx): + env = analysistest.begin(ctx) + target = analysistest.target_under_test(env) + variables = target[platform_common.TemplateVariableInfo].variables + sysroot = variables.get("RUST_HOST_SYSROOT", "") + asserts.true(env, sysroot != "", "RUST_HOST_SYSROOT must be exported; got: {}".format(variables)) + asserts.true( + env, + "-exec" in sysroot, + "the sysroot must come from the toolchain re-resolved in the exec configuration; got: " + sysroot, + ) + return analysistest.end(env) + +rust_host_sysroot_test = analysistest.make(_rust_host_sysroot_test_impl) diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index b589e2003..b51e97033 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -966,6 +966,21 @@ def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> st return merged +def _needs_cargo_cross_env(build_env: dict[str, str]) -> bool: + """Whether this cross build compiles Rust. + + The decision is made once, at repository-generation time: sdist_build + wires the project's Rust toolchain into the build only for maturin + backends and setuptools-rust requirements (declared or inferred), and + pep517_native_whl turns its make-variables into CARGO/RUSTC. Their + presence is therefore the signal; the helper does not re-derive it from + pyproject.toml, which would miss inferred setuptools-rust builds. A Rust + toolchain listed on a package that never invokes cargo costs an unused + environment, nothing more. + """ + return bool(build_env.get("CARGO")) + + def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os: str, target_cpu: str, target_libc: str) -> None: """Cross env vars for maturin (Cargo-driven PyO3 builds). @@ -1251,7 +1266,7 @@ def main() -> None: elif backend == "scikit_build_core.build": toolchain = _generate_cmake_toolchain_file(tmp_root, build_env, opts.target_os, opts.target_cpu) cmd += ["-C", "cmake.toolchain-file=" + toolchain] - elif backend == "maturin" and build_env.get("CARGO"): + if _needs_cargo_cross_env(build_env): _configure_cargo_cross_env(build_env, tmp_root, opts.target_os, opts.target_cpu, opts.target_libc) else: print("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!", file=sys.stderr) diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index f63d31333..5299c7270 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -159,6 +159,76 @@ def _config_settings_attr(config_settings): lines = [" {}: {},".format(repr(key), repr(config_settings[key])) for key in sorted(config_settings)] return "\n config_settings = {{\n{}\n }},".format("\n".join(lines)) +_REQUIREMENT_NAME_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-" + +def _normalize_requirement(requirement): + """PEP 508 requirement -> normalized project name (extras, specifiers and markers dropped).""" + name = "" + for ch in requirement.strip().elems(): + if ch not in _REQUIREMENT_NAME_CHARS: + break + name += ch + return name.lower().replace("_", "-").replace(".", "-") + +def _is_rust_build(inspection): + """maturin backend, or setuptools with setuptools-rust among its build requirements. + + Declared requirements come with their PEP 508 spelling; inferred ones + (the configure tool adds setuptools-rust for sdists that ship .rs files + without declaring it) come normalized. Both are injected into the build + venv, so both need the Rust toolchain. + """ + if not inspection: + return False + backend = inspection.get("build_backend") + if backend == "maturin": + return True + + # setuptools-rust only ever rides on a setuptools backend (or none, for a + # bare setup.py). Other backends may ship stray .rs files that make the + # configure tool infer setuptools-rust (numpy vendors meson's test suite), + # and are not Rust builds. + if backend not in (None, "setuptools.build_meta", "setuptools.build_meta:__legacy__"): + return False + requirements = list(inspection.get("build_requires", [])) + list(inspection.get("inferred_build_requires", [])) + return "setuptools-rust" in [_normalize_requirement(r) for r in requirements] + +_RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" + +def _rust_wiring(rust_toolchain, inspection, toolchains): + """The generated BUILD's Rust wiring for a project-level `rust_toolchain`. + + The configure tool already detected the build backend and its declared + requirements, so a Rust-based build (maturin, or setuptools with + setuptools-rust) gets the project's Rust toolchain plus an exec-configured + rust_host_sysroot layer without the user spelling either out per package. + pep517_native_whl derives CARGO/RUSTC/RULES_PY_RUST_HOST_SYSROOT from + their make-variables. + + Args: + rust_toolchain: `uv.project(rust_toolchain = ...)` rendered as a label string, or "". + inspection: The configure tool's JSON, or None. + toolchains: Extra toolchain labels from `uv.override_package`. + + Returns: + struct(load_stmt, target, toolchains): the `load()` line and the + `rust_host_sysroot(...)` target to splice into the BUILD (both "" when + not wired), and the final `toolchains` list. + """ + if not (rust_toolchain and _is_rust_build(inspection)): + return struct(load_stmt = "", target = "", toolchains = list(toolchains)) + target = """ +rust_host_sysroot( + name = "rust_host_sysroot", + actual = {}, +) +""".format(repr(rust_toolchain)) + return struct( + load_stmt = _RUST_LAYER_LOAD, + target = target, + toolchains = [rust_toolchain, ":rust_host_sysroot"] + [t for t in toolchains if t != rust_toolchain], + ) + def _sdist_build_impl(repository_ctx): """Prepares a repository for building a wheel from a source distribution (sdist). @@ -289,9 +359,20 @@ def _sdist_build_impl(repository_ctx): # AR, LD, and STRIP make variables can be synthetic. Only forward explicit # toolchains/env for JDK, Rust, and other package-specific overrides. toolchain_attrs = "" + rust_layer_load = "" + rust_layer_target = "" if is_native: - toolchains = repository_ctx.attr.extra_toolchains + toolchains = list(repository_ctx.attr.extra_toolchains) extra_env = repository_ctx.attr.extra_env + + # str(Label) is the canonical form: the only spelling that resolves inside + # a repository the rules_py extension generates, whose repo mapping knows + # nothing about the user's rules_rust dependency. + rust_toolchain = repository_ctx.attr.rust_toolchain + rust = _rust_wiring(str(rust_toolchain) if rust_toolchain else "", inspection, toolchains) + rust_layer_load = rust.load_stmt + rust_layer_target = rust.target + toolchains = rust.toolchains if toolchains: toolchain_attrs = """ toolchains = [ @@ -333,7 +414,7 @@ pep517_frontend( tool = ":frontend" repository_ctx.file("BUILD.bazel", content = """ -load("@aspect_rules_py//uv/private/pep517_whl:{rule}.bzl", "{rule}"){frontend_load} +load("@aspect_rules_py//uv/private/pep517_whl:{rule}.bzl", "{rule}"){frontend_load}{rust_layer_load} load("@aspect_rules_py//py:defs.bzl", "py_binary") py_binary( @@ -343,7 +424,7 @@ py_binary( deps = {deps}, include_console_scripts = True, ) -{frontend_target} +{frontend_target}{rust_layer_target} {rule}( name = "whl", src = "{src}", @@ -364,6 +445,8 @@ exports_files( monitor_memory_attr = monitor_memory_attr, rule = "pep517_native_whl" if is_native else "pep517_whl", frontend_load = frontend_load, + rust_layer_load = rust_layer_load, + rust_layer_target = rust_layer_target, frontend_target = frontend_target, tool = tool, version = repository_ctx.attr.version, @@ -410,6 +493,9 @@ sdist_build = repository_rule( ), "pre_build_patches": attr.label_list(default = []), "pre_build_patch_strip": attr.int(default = 1), + "rust_toolchain": attr.label( + doc = "Project-level Rust toolchain; wired into the build when the sdist's build backend is Rust-based.", + ), "extra_toolchains": attr.string_list( default = [], doc = "Toolchain labels forwarded to the generated pep517_native_whl(...) `toolchains` list. Set via `uv.override_package(toolchains = [...])`.", @@ -428,4 +514,7 @@ sdist_build = repository_rule( sdist_build_test_util = struct( config_settings_attr = _config_settings_attr, env_attr = _env_attr, + is_rust_build = _is_rust_build, + normalize_requirement = _normalize_requirement, + rust_wiring = _rust_wiring, ) diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 6155cd981..0ebeefa14 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -7,7 +7,13 @@ building its `:whl` exercises the fallback the extension must preserve. """ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load(":repository_test.bzl", "config_settings_attr_test", "env_attr_test") +load( + ":repository_test.bzl", + "config_settings_attr_test", + "env_attr_test", + "is_rust_build_test", + "rust_wiring_test", +) build_test( name = "sdist_fallback_with_anyarch_wheel_build_test", @@ -17,3 +23,7 @@ build_test( config_settings_attr_test(name = "config_settings_attr_test") env_attr_test(name = "env_attr_test") + +is_rust_build_test(name = "is_rust_build_test") + +rust_wiring_test(name = "rust_wiring_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index 1c76b454f..76718f728 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -44,3 +44,74 @@ def _env_attr_test_impl(ctx): return unittest.end(env) env_attr_test = unittest.make(_env_attr_test_impl) + +_TOOLCHAIN = "@rules_rust//rust/toolchain:current_rust_toolchain" + +def _is_rust_build_test_impl(ctx): + env = unittest.begin(ctx) + is_rust = sdist_build_test_util.is_rust_build + + asserts.false(env, is_rust(None), "no inspection: nothing to detect") + asserts.false(env, is_rust({}), "empty inspection: nothing to detect") + asserts.true(env, is_rust({"build_backend": "maturin"}), "maturin is a Rust backend") + asserts.true( + env, + is_rust({"build_backend": "setuptools.build_meta", "build_requires": ["setuptools", "Setuptools_Rust>=1.7"]}), + "setuptools-rust in build requirements, whatever its spelling or specifier", + ) + asserts.false( + env, + is_rust({"build_backend": "setuptools.build_meta", "build_requires": ["setuptools", "wheel"]}), + "plain setuptools is not Rust", + ) + asserts.true( + env, + is_rust({"build_backend": "setuptools.build_meta", "build_requires": ["setuptools"], "inferred_build_requires": ["setuptools-rust"]}), + "setuptools-rust inferred from .rs files counts too: it is injected into the build venv", + ) + asserts.false(env, is_rust({"build_backend": "mesonpy"}), "meson-python is not Rust") + asserts.false( + env, + is_rust({"build_backend": "mesonpy", "inferred_build_requires": ["setuptools-rust"]}), + "stray .rs files under a non-setuptools backend (numpy) do not make a Rust build", + ) + asserts.true( + env, + is_rust({"build_backend": None, "inferred_build_requires": ["setuptools-rust"]}), + "a bare setup.py with .rs sources is setuptools-rust", + ) + asserts.equals(env, "setuptools-rust", sdist_build_test_util.normalize_requirement("Setuptools_Rust>=1.7")) + return unittest.end(env) + +is_rust_build_test = unittest.make(_is_rust_build_test_impl) + +def _rust_wiring_test_impl(ctx): + env = unittest.begin(ctx) + wiring = sdist_build_test_util.rust_wiring + rust_inspection = {"build_backend": "maturin"} + + off = wiring("", rust_inspection, ["//x:jdk"]) + asserts.equals(env, "", off.load_stmt, "no project rust_toolchain: nothing is wired") + asserts.equals(env, "", off.target) + asserts.equals(env, ["//x:jdk"], off.toolchains, "override toolchains pass through untouched") + + not_rust = wiring(_TOOLCHAIN, {"build_backend": "mesonpy"}, []) + asserts.equals(env, "", not_rust.load_stmt, "a non-Rust backend ignores the project rust_toolchain") + asserts.equals(env, [], not_rust.toolchains) + + on = wiring(_TOOLCHAIN, rust_inspection, ["//x:jdk", _TOOLCHAIN]) + asserts.true(env, "rust_layer.bzl" in on.load_stmt and "rust_host_sysroot" in on.load_stmt, "load() for the layer rule") + asserts.true( + env, + 'rust_host_sysroot(\n name = "rust_host_sysroot",\n actual = "{}",\n)'.format(_TOOLCHAIN) in on.target, + "an exec-configured sysroot layer over the project toolchain; got: " + on.target, + ) + asserts.equals( + env, + [_TOOLCHAIN, ":rust_host_sysroot", "//x:jdk"], + on.toolchains, + "toolchain and layer first, override extras after, the toolchain not repeated", + ) + return unittest.end(env) + +rust_wiring_test = unittest.make(_rust_wiring_test_impl) From f27eb24d788fe9853e486783af590438d8ec9425 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 15:21:46 -0600 Subject: [PATCH 089/103] feat(uv): prove rust_toolchain against rules_rs; pass rustc its sysroot explicitly New e2e/crossbuild case pycross-rust-rs builds pydantic-core with rules_rs toolchains: a native import and linux/amd64 + linux/arm64 cross builds through uv.project(rust_toolchain = ...), mirroring pycross-rust. rules_rs declares its toolchains with rules_rust's rust_toolchain rule inside the patched rules_rust repository it provisions, so the same current_rust_toolchain label and providers apply, and both rulesets coexist in one workspace because each carries its own toolchain type. The case pins that the wiring is a provider contract, not a dependency on one ruleset. It also exposed a layout assumption: the helper ran rustc bare, which infers its sysroot from its own location, and rules_rs fetches rustc and rust-std into separate repositories (E0463: can't find crate for `std`). The rule now derives RUST_SYSROOT, the sysroot rules_rust's toolchain assembles, and the helper passes it: natively through a rustc wrapper (--sysroot), under cross as the target side of the merged sysroot instead of dirname(rustc). Tests: unit tests for the native cargo env and for the merge with a rules_rs-style layout; an analysis test with a fake toolchain exporting CARGO/RUSTC/RUST_SYSROOT asserts the derived env keys and that the make-variable names do not leak. --- docs/uv.md | 9 +- e2e/crossbuild/MODULE.bazel | 18 ++ e2e/crossbuild/MODULE.bazel.lock | 257 +++++++++--------- e2e/crossbuild/pycross-rust-rs/BUILD.bazel | 62 +++++ e2e/crossbuild/pycross-rust-rs/pyproject.toml | 12 + .../pycross-rust-rs/setup.MODULE.bazel | 28 ++ .../pycross-rust-rs/test_pydantic_core.py | 19 ++ e2e/crossbuild/pycross-rust-rs/uv.lock | 194 +++++++++++++ uv/private/extension/defs.bzl | 2 +- uv/private/pep517_whl/pep517_native_whl.bzl | 10 +- uv/private/pep517_whl/tests/BUILD.bazel | 30 ++ .../pep517_whl/tests/build_helper_test.py | 48 ++++ .../pep517_whl/tests/pep517_whl_test.bzl | 12 +- uv/private/pep517_whl/tools/build_helper.py | 33 ++- 14 files changed, 595 insertions(+), 139 deletions(-) create mode 100644 e2e/crossbuild/pycross-rust-rs/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-rust-rs/pyproject.toml create mode 100644 e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py create mode 100644 e2e/crossbuild/pycross-rust-rs/uv.lock diff --git a/docs/uv.md b/docs/uv.md index 5e8be6a1c..449f7c88e 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -395,8 +395,8 @@ uv.override_package( ``` `$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(CARGO)`, -`$(RUSTC)` and `$(RUST_HOST_SYSROOT)` as the variables the Rust build path -reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other make-variable a +`$(RUSTC)`, `$(RUST_SYSROOT)` and `$(RUST_HOST_SYSROOT)` as the variables the +Rust build path reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other make-variable a toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always wins over the derived value. @@ -419,7 +419,10 @@ uv.project( Every sdist in that project whose build backend is maturin, or whose build requirements include setuptools-rust, then gets the toolchain and an exec-configured `rust_host_sysroot` layer wired into its build. No -`uv.override_package` entry is needed for Rust packages. +`uv.override_package` entry is needed for Rust packages. Any target exposing +rules_rust's toolchain providers works, so the same label serves +[rules_rs](https://github.com/hermeticbuild/rules_rs) toolchains, which are +declared with rules_rust's `rust_toolchain` rule. ### Backend config settings diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 22ebbadc4..2db6241bb 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -14,6 +14,7 @@ bazel_dep(name = "bazel_lib", version = "3.0.0") bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "llvm", version = "0.8.3") bazel_dep(name = "rules_rust", version = "0.68.0") +bazel_dep(name = "rules_rs", version = "0.0.110") bazel_dep(name = "rules_shell", version = "0.4.1") local_path_override( @@ -61,6 +62,22 @@ use_repo(rust, "rust_toolchains") register_toolchains("@rust_toolchains//:all") +# rules_rs toolchains for //pycross-rust-rs. They are rules_rust `rust_toolchain` +# instances declared in the patched rules_rust repository rules_rs fetches, so +# they register under that repository's toolchain type and never compete with +# the BCR rules_rust toolchains above. +rs_toolchains = use_extension("@rules_rs//rs/toolchains:module_extension.bzl", "toolchains") +rs_toolchains.toolchain( + edition = "2021", + version = "1.92.0", +) +use_repo(rs_toolchains, "default_rust_toolchains") + +rules_rust_rs = use_extension("@rules_rs//rs:rules_rust.bzl", "rules_rust") +use_repo(rules_rust_rs, rules_rust_rs = "rules_rust") + +register_toolchains("@default_rust_toolchains//...") + uv_bin = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv_bin") uv_bin.toolchain(version = "0.11.21") use_repo(uv_bin, "uv") @@ -72,6 +89,7 @@ include("//pycross-meson:setup.MODULE.bazel") include("//pycross-patches:setup.MODULE.bazel") include("//pycross-pure-python:setup.MODULE.bazel") include("//pycross-rust:setup.MODULE.bazel") +include("//pycross-rust-rs:setup.MODULE.bazel") include("//pycross-setuptools:setup.MODULE.bazel") include("//pycross-geohash:setup.MODULE.bazel") include("//pycross-msgpack:setup.MODULE.bazel") diff --git a/e2e/crossbuild/MODULE.bazel.lock b/e2e/crossbuild/MODULE.bazel.lock index 24936b9b4..a5607034e 100644 --- a/e2e/crossbuild/MODULE.bazel.lock +++ b/e2e/crossbuild/MODULE.bazel.lock @@ -31,7 +31,9 @@ "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", "https://bcr.bazel.build/modules/bazel_features/1.42.0/MODULE.bazel": "e8ca15cb2639c5f12183db6dcb678735555d0cdd739b32a0418b6532b5e565f8", "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", + "https://bcr.bazel.build/modules/bazel_features/1.45.0/MODULE.bazel": "7daec6d87ab0703417486d4cb948af0b06f55d4d7c08cbb5978c80e79b538edf", + "https://bcr.bazel.build/modules/bazel_features/1.50.0/MODULE.bazel": "2083ef9c7a469f520890483ccf8e0189d6e71e2117e7752e15e6554433d5ae3e", + "https://bcr.bazel.build/modules/bazel_features/1.50.0/source.json": "e0ee3debde2789ff56e4452e612d126925ba9ab64d4bde79c67f099d2902df9b", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", @@ -42,6 +44,7 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.0/MODULE.bazel": "2ab127ef8d56a739a99bb2ce00ec4c7d1ecc7977d4370c0ca6efd0d8f03d6d99", "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", @@ -55,6 +58,7 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/source.json": "7ad77c1e8c1b84222d9b3f3cae016a76639435744c19330b0b37c0a3c9da7dc0", "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/bzip2/1.0.8.bcr.3/MODULE.bazel": "29ecf4babfd3c762be00d7573c288c083672ab60e79c833ff7f49ee662e54471", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.3/MODULE.bazel": "f1b7bb2dd53e8f2ef984b39485ec8a44e9076dda5c4b8efd2fb4c6a6e856a31d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/MODULE.bazel": "1e5e03c383fa64ebbe0942a225c32168fd6ef6b270351bbec481d47d19d1b96d", "https://bcr.bazel.build/modules/gawk/5.3.2.bcr.7/source.json": "34a83d58ae2f1ef6731d1fc8a1b6f07825741aff3f5993b67b67ec21d2c2946e", @@ -65,13 +69,16 @@ "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/MODULE.bazel": "67ff71bbfb482e58510451c4c8b8cd303c757f7ff79a2aff7cf381277be96f9f", "https://bcr.bazel.build/modules/hermetic_launcher/0.0.14/source.json": "475aa00426677e643e327b4b031d8816a3bc0a134c94d0d0d510cfd67b2cfd2c", + "https://bcr.bazel.build/modules/hermetic_launcher/0.0.8/MODULE.bazel": "3be7b0faca6f1e69e89197999e0b01ce058c42f3e764ef028466f7e0ff77c761", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/llvm/0.8.18/MODULE.bazel": "56d507d49c02498731fa5a95fa48a778368f2d23c0f6184a578d057e58830458", + "https://bcr.bazel.build/modules/llvm/0.8.18/source.json": "ca45abf06bdd842e88acdda4a077038bbecddd3e90050951c2aff5f89b1b522e", "https://bcr.bazel.build/modules/llvm/0.8.3/MODULE.bazel": "dbc1bc13171f8f9980a75524883abef1c491613e8d8d805cd4ffa3767ba9708e", - "https://bcr.bazel.build/modules/llvm/0.8.3/source.json": "4b11874c26a9de53c03a25a517ebc36dee6b458c920fe9ed65e3ca279ff19775", "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", - "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", + "https://bcr.bazel.build/modules/package_metadata/0.0.7/MODULE.bazel": "7adb03933fc8401f495800cf4eafcff0edc6da0ff55c7db223ef69d19f689486", + "https://bcr.bazel.build/modules/package_metadata/0.0.7/source.json": "50639625e937b56115012674c797cca7a05a96b4878c87d803c13dc2b31de8a0", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", @@ -89,7 +96,8 @@ "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", - "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", + "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95", + "https://bcr.bazel.build/modules/protobuf/29.1/source.json": "04cca85dce26b895ed037d98336d860367fe09919208f2ad383f0df1aff63199", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", @@ -112,7 +120,8 @@ "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.22/MODULE.bazel": "94df4328edef9e44d38de5e73b037cd348e75e7ae55f4e21bf07878c41a31ebb", + "https://bcr.bazel.build/modules/rules_cc/0.2.22/source.json": "b2d6d6f9c332ce269ad75b89c6f3168d809a66173c9040210fb9bcc733ab42fa", "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", @@ -154,7 +163,8 @@ "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", - "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96", + "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e", "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", @@ -162,15 +172,20 @@ "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", + "https://bcr.bazel.build/modules/rules_python/1.6.3/MODULE.bazel": "a7b80c42cb3de5ee2a5fa1abc119684593704fcd2fec83165ebe615dec76574f", "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.8.0/MODULE.bazel": "c151c025dbcc93d8f62ab68ecc313c9176a868a0e6386981bf2a12aec77cbe7b", "https://bcr.bazel.build/modules/rules_python/1.9.0/MODULE.bazel": "afc3a05f29f09f2d3ee95ad99a145250dab41a2b2d8d6f82cc91936b3213282c", "https://bcr.bazel.build/modules/rules_python/1.9.0/source.json": "3921ea0b65298d51aead5b9e4a82203d7be9b5918619b58b53f1c259f4e63169", + "https://bcr.bazel.build/modules/rules_rs/0.0.110/MODULE.bazel": "c0c3c938547998dbced9aafea3c67c28d6919a33ea63707b03f1da0359840355", + "https://bcr.bazel.build/modules/rules_rs/0.0.110/source.json": "679b8aad1f16158580dbfd4aac59eea2644740ff34078bc46030a5ec3bfa62f8", "https://bcr.bazel.build/modules/rules_rust/0.68.0/MODULE.bazel": "dcb4fe4396b49d3b2d72bccf634d27499dd2a58dcdfccfe8e17ba15c4bd150ae", "https://bcr.bazel.build/modules/rules_rust/0.68.0/source.json": "e5d5f37874c4af13dbdfbf1220889607d9b3cc51f2831e10c2035b6638442f07", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", - "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/rules_shell/0.8.0/MODULE.bazel": "f6a89f1d6a669a26f28fe814503857055d76306b79cfc11d12399af08d0b80ae", + "https://bcr.bazel.build/modules/rules_shell/0.8.0/source.json": "eb53cc815bc503c6683c5fe12d943f98883f81fc22f51403ec8a95610cba4195", "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", @@ -184,10 +199,15 @@ "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/MODULE.bazel": "b573395fe63aef4299ba095173e2f62ccfee5ad9bbf7acaa95dba73af9fc2b38", "https://bcr.bazel.build/modules/with_cfg.bzl/0.12.0/source.json": "3f3fbaeafecaf629877ad152a2c9def21f8d330d91aa94c5dc75bbb98c10b8b8", + "https://bcr.bazel.build/modules/xz/5.4.5.bcr.8/MODULE.bazel": "e48a69bd54053c2ec5fffc2a29fb70122afd3e83ab6c07068f63bc6553fa57cc", + "https://bcr.bazel.build/modules/zlib-ng/2.3.3.bcr.2/MODULE.bazel": "86130924115bf8dfc4aba286fb49a2ec8d32430a21771db9ccf5381acf0d10cc", + "https://bcr.bazel.build/modules/zlib-ng/2.3.3.bcr.2/source.json": "7aa4112eb2fbb99757e97cf0b7a4e2bdb3464b2b3cfb351bc807ffcb34bd349f", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198", + "https://bcr.bazel.build/modules/zstd/1.5.7.bcr.1/MODULE.bazel": "c5977176dd8555be7a9d598512ae0cae11831259c06f00a5e5e0037d5db4e3f5", + "https://bcr.bazel.build/modules/zstd/1.5.7.bcr.1/source.json": "aa95e0b5aac9d80195b9047d223beaf26b1948be55d49f0e803e180e9ccc6e75" }, "selectedYankedVersions": {}, "moduleExtensions": { @@ -304,123 +324,6 @@ ] } }, - "@@pybind11_bazel+//:python_configure.bzl%extension": { - "general": { - "bzlTransitiveDigest": "D2/qWHU6yQFwRG7Bb+caqrYMha5avsASao2vERrxK24=", - "usagesDigest": "fycyB39YnXIJkfWCIXLUKJMZzANcuLy9ZE73hRucjFk=", - "recordedFileInputs": { - "@@pybind11_bazel+//MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" - }, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_python": { - "repoRuleId": "@@pybind11_bazel+//:python_configure.bzl%python_configure", - "attributes": {} - }, - "pybind11": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "build_file": "@@pybind11_bazel+//:pybind11.BUILD", - "strip_prefix": "pybind11-2.11.1", - "urls": [ - "https://github.com/pybind/pybind11/archive/v2.11.1.zip" - ] - } - } - }, - "recordedRepoMappingEntries": [ - [ - "pybind11_bazel+", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_fuzzing+//fuzzing/private:extensions.bzl%non_module_dependencies": { - "general": { - "bzlTransitiveDigest": "4LouzhF/yT117s7peGnNs9ROomiJXC6Zl5R0oI21jho=", - "usagesDigest": "wy6ISK6UOcBEjj/mvJ/S3WeXoO67X+1llb9yPyFtPgc=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "platforms": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", - "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz" - ], - "sha256": "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74" - } - }, - "rules_python": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "sha256": "d70cd72a7a4880f0000a6346253414825c19cdd40a28289bdf67b8e6480edff8", - "strip_prefix": "rules_python-0.28.0", - "url": "https://github.com/bazelbuild/rules_python/releases/download/0.28.0/rules_python-0.28.0.tar.gz" - } - }, - "bazel_skylib": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "sha256": "cd55a062e763b9349921f0f5db8c3933288dc8ba4f76dd9416aac68acee3cb94", - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz" - ] - } - }, - "com_google_absl": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "urls": [ - "https://github.com/abseil/abseil-cpp/archive/refs/tags/20240116.1.zip" - ], - "strip_prefix": "abseil-cpp-20240116.1", - "integrity": "sha256-7capMWOvWyoYbUaHF/b+I2U6XLMaHmky8KugWvfXYuk=" - } - }, - "rules_fuzzing_oss_fuzz": { - "repoRuleId": "@@rules_fuzzing+//fuzzing/private/oss_fuzz:repository.bzl%oss_fuzz_repository", - "attributes": {} - }, - "honggfuzz": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", - "attributes": { - "build_file": "@@rules_fuzzing+//:honggfuzz.BUILD", - "sha256": "6b18ba13bc1f36b7b950c72d80f19ea67fbadc0ac0bb297ec89ad91f2eaa423e", - "url": "https://github.com/google/honggfuzz/archive/2.5.zip", - "strip_prefix": "honggfuzz-2.5" - } - }, - "rules_fuzzing_jazzer": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar", - "attributes": { - "sha256": "ee6feb569d88962d59cb59e8a31eb9d007c82683f3ebc64955fd5b96f277eec2", - "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer/0.20.1/jazzer-0.20.1.jar" - } - }, - "rules_fuzzing_jazzer_api": { - "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_jar", - "attributes": { - "sha256": "f5a60242bc408f7fa20fccf10d6c5c5ea1fcb3c6f44642fec5af88373ae7aa1b", - "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer-api/0.20.1/jazzer-api-0.20.1.jar" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_fuzzing+", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { "bzlTransitiveDigest": "nvW/NrBXlAmiQw99EMGKkLaD2KbNp2mQDlxdfpr+0Ls=", @@ -1086,6 +989,110 @@ }, "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "notice_version": "3" + }, + "@@rules_rs+//rs/toolchains:module_extension.bzl%toolchains": { + "cargo-1.92.0-aarch64-apple-darwin.tar.xz": "bce6e7def37240c5a63115828017a9fc0ebcb31e64115382f5943b62b71aa34a", + "cargo-1.92.0-aarch64-pc-windows-msvc.tar.xz": "3fc47cc29781190c5075f807836c4b98d411aaf27c59598fbfb2aa781ccf6190", + "cargo-1.92.0-aarch64-unknown-linux-gnu.tar.xz": "cb2ce6be6411b986e25c71ad8a813f9dfbe3461738136fd684e3644f8dd75df4", + "cargo-1.92.0-x86_64-apple-darwin.tar.xz": "b033a7c33aba8af947c9d0ab2785f9696347cded228ffe731897f1c627466262", + "cargo-1.92.0-x86_64-pc-windows-msvc.tar.xz": "f4057534ec58708ed3554957582a6c8e8c6abfee011b5c8ad45c3ab27c0b3076", + "cargo-1.92.0-x86_64-unknown-linux-gnu.tar.xz": "e5e12be2c7126a7036c8adf573078a28b92611f5767cc9bd0a6f7c83081df103", + "clippy-1.92.0-aarch64-apple-darwin.tar.xz": "08c65b6cf8faae3861706f8c97acf2aa6b784ed9455354c3b13495a7cfe5cb84", + "clippy-1.92.0-aarch64-pc-windows-msvc.tar.xz": "2aa2f1288072ea1f870d6d860d09f5911c1305d506f344b65cf5e27b5070e262", + "clippy-1.92.0-aarch64-unknown-linux-gnu.tar.xz": "333ab38c673b589468b8293b525e5704fb52515d9d516ee28d3d34dd5a63d3c3", + "clippy-1.92.0-x86_64-apple-darwin.tar.xz": "39cce87aab3d8b71350edcb3f943fba7bc59581ce1e65e158ee01e64cf0f1cf5", + "clippy-1.92.0-x86_64-pc-windows-msvc.tar.xz": "51a9a67931a3e50eb0c26b4c6a7ec2ef6ddd633319343a2d4767710c1e33b21f", + "clippy-1.92.0-x86_64-unknown-linux-gnu.tar.xz": "2c1bf6e7da8ec50feba03fe188fc9a744ba59e2c6ece7970c13e201d08defa9a", + "rust-analyzer-1.92.0-aarch64-apple-darwin.tar.xz": "e2ec83302123119bbe04ed367fbb5d6d3575555faf7870f7b241f5bdeef3e6ed", + "rust-analyzer-1.92.0-aarch64-pc-windows-msvc.tar.xz": "fc645b480731828254c7691599c9d092032bfb5a728839cb3f2d52e7cce7fcd2", + "rust-analyzer-1.92.0-aarch64-unknown-linux-gnu.tar.xz": "f18c06dab73f5cffab6b7c58a51c3bcbbcc962b08d4a56974e958cac229eb0cd", + "rust-analyzer-1.92.0-x86_64-apple-darwin.tar.xz": "a0a9ef444c3223f0b55ef1ec54945b109c7e7ea7cb8d3f0696290aa2ac51507e", + "rust-analyzer-1.92.0-x86_64-pc-windows-msvc.tar.xz": "edcac488265c48737bf615481970e0a0b07fa98380f49d6322f6d53327a1b51a", + "rust-analyzer-1.92.0-x86_64-unknown-linux-gnu.tar.xz": "1b1dec1ca75c027968646a7524b2ebad070116df5fb625f8802deabe9c0b0b5a", + "rust-src-1.92.0.tar.xz": "333d45eeb76f210966dc5c1440b535dea5876ed0162f9286273c85e7a1e3cb29", + "rust-std-1.92.0-aarch64-apple-darwin.tar.xz": "ea619984fcb8e24b05dbd568d599b8e10d904435ab458dfba6469e03e0fd69aa", + "rust-std-1.92.0-aarch64-apple-ios-macabi.tar.xz": "d0453906db0abe9efb595e1ed59feb131a94c0312c0bc72da6482936667ff8da", + "rust-std-1.92.0-aarch64-apple-ios-sim.tar.xz": "9362b66fbaf2503276ea34f34b41b171269db9ba4dce05dde3472ea9d1852601", + "rust-std-1.92.0-aarch64-apple-ios.tar.xz": "81fb496f94a3f52ec2818a76a7107905b13b37d490ca849d22c0a7a7d7b0125e", + "rust-std-1.92.0-aarch64-linux-android.tar.xz": "ce6350bd43856c630773c93e40310989c6cb98a1178233c44e512a31761943d0", + "rust-std-1.92.0-aarch64-pc-windows-gnullvm.tar.xz": "4e79f57b80040757a3425568b5978986f026daf771649a64021c74bcc138214b", + "rust-std-1.92.0-aarch64-pc-windows-msvc.tar.xz": "b20c5c696af4ecfb683370ca0ee3c76ab8726fe6470ce9f1368d41a5b06ea065", + "rust-std-1.92.0-aarch64-unknown-fuchsia.tar.xz": "6021246b6c0d9d6104c0b350f7cd48a31d5707edaa8063f77f5636fe07bdb79d", + "rust-std-1.92.0-aarch64-unknown-linux-gnu.tar.xz": "ce2ab42c09d633b0a8b4b65a297c700ae0fad47aae890f75894782f95be7e36d", + "rust-std-1.92.0-aarch64-unknown-linux-musl.tar.xz": "94b9f84f21d29825c55a27fbb6b4b9fb9296a4a841aa54d85b95c42445623363", + "rust-std-1.92.0-aarch64-unknown-none-softfloat.tar.xz": "0dc46fafaaa36f53eec49e14a69e1d6d9ac6f0b9624a01081ad311d8139a2be0", + "rust-std-1.92.0-aarch64-unknown-none.tar.xz": "ab6a2edab924739fc2c86e9f8fd8068b379e881a6261a177d66608d3ea4cacb1", + "rust-std-1.92.0-aarch64-unknown-uefi.tar.xz": "f98001222bf23743598382c232b08d3137035b53645a420a1425288d501808af", + "rust-std-1.92.0-arm-linux-androideabi.tar.xz": "d41ec7255556b605dda04201a23e4445b5b86bc6786c703f91eb985bddc9f4ca", + "rust-std-1.92.0-arm-unknown-linux-gnueabi.tar.xz": "35478e20f8cc13912b31f2905b313a2820ddae564b363a66ab7a5da39d12787f", + "rust-std-1.92.0-arm-unknown-linux-gnueabihf.tar.xz": "836ada282b65c57d71f9b7e6fb490832410c954aac905c5437fb0bf851b53c83", + "rust-std-1.92.0-arm-unknown-linux-musleabi.tar.xz": "91d3c5fdbda9ba2e778bb638e3a5d060f3021bbc7a60edf22b0035be4e611b30", + "rust-std-1.92.0-arm-unknown-linux-musleabihf.tar.xz": "20411e3858308add0dadde9ce2059d82cdd6c5339881fa93ac995e733df0f832", + "rust-std-1.92.0-armv7-linux-androideabi.tar.xz": "06ac2f08dcf5c480e7767c0541c9bd7460754ec3a369a4b7097b328eca28fab9", + "rust-std-1.92.0-armv7-unknown-linux-gnueabi.tar.xz": "3d5e3fb14441ea8e6fc6307cbd89efd69be42143ff7f2b8dfb19818ddca993c0", + "rust-std-1.92.0-armv7-unknown-linux-gnueabihf.tar.xz": "e3ac810db43067d8af9e17679d47534e871f1daad8cd0762e67da935681e9e19", + "rust-std-1.92.0-armv7-unknown-linux-musleabi.tar.xz": "89cbf7db934d543754b446a52398081ec40ee6b98ed5bca93ac1dbd5faf48c16", + "rust-std-1.92.0-armv7-unknown-linux-musleabihf.tar.xz": "c7c08a389bd351226fd52266bfe2d2c444597e1bbb5d0307da44bdfa4df62c99", + "rust-std-1.92.0-i686-linux-android.tar.xz": "e45832b005556f65c6d26f05f34bd4ab5ceea8d9b9fefc4175d52b0780ca89db", + "rust-std-1.92.0-i686-pc-windows-gnu.tar.xz": "b3eefe10d4aed3ccbeaff3ae9cd2e0e0a36894c0635d0e69af1c9a698679d75f", + "rust-std-1.92.0-i686-pc-windows-gnullvm.tar.xz": "e6d709f85dea51d81f2f1a030845b732b9f7761d95d93c57c7276b0a451c2993", + "rust-std-1.92.0-i686-pc-windows-msvc.tar.xz": "e5671b276047647e994a7cab99c90ee70c46787572fbe4e266a13c6edb84d5ce", + "rust-std-1.92.0-i686-unknown-freebsd.tar.xz": "e008a0506ec4d5eff30abdf376c7933e235670bd6c5e1131c52bcda097a21116", + "rust-std-1.92.0-i686-unknown-linux-gnu.tar.xz": "abc840631a4462a4c8ec61341110ff653ab2ef86ef3b10f84489d00cc8a9310d", + "rust-std-1.92.0-i686-unknown-linux-musl.tar.xz": "c796874b1343721f575203fa179dc258e09ac45cd95dd6c35c4d5979a3870494", + "rust-std-1.92.0-i686-unknown-uefi.tar.xz": "90da7759e28e62fb82454d4eb4e02ac14320b8da3372e02f9ca4f47f7afbfe40", + "rust-std-1.92.0-loongarch64-unknown-linux-gnu.tar.xz": "62e2568ebf6f1addc750a8c32dd1fa4fef8d27679cbac33b837afeb54f204819", + "rust-std-1.92.0-loongarch64-unknown-linux-musl.tar.xz": "274838eebb615e6d2719157aa53230cd0c3233a1e6f1c975c0f5978198c55da3", + "rust-std-1.92.0-loongarch64-unknown-none.tar.xz": "7e03cbb3aeb5a2c882433f2de0d096455bcab2465729cb0399d1b31e2d400075", + "rust-std-1.92.0-powerpc-unknown-linux-gnu.tar.xz": "c3e809a324b00eb53096c58df38645bb496c6560de334dfe04ed0b77c0605aaa", + "rust-std-1.92.0-powerpc64-unknown-linux-gnu.tar.xz": "2ce706afa4a46b6773340854de877fc63618a40e351298a4e3da8eb482619863", + "rust-std-1.92.0-powerpc64le-unknown-linux-gnu.tar.xz": "eba59766c2d9805c0a1fc82fd723acbb36569e1bec1088c037bba84d965f70ba", + "rust-std-1.92.0-powerpc64le-unknown-linux-musl.tar.xz": "8b515e18b6ac8f8d37ea3cabe644b7f571984333c3b4192b7f5877e79eae7893", + "rust-std-1.92.0-riscv32imac-unknown-none-elf.tar.xz": "5915223db6b8afa173f67eb4fe6f5aff2402351ed9abab1b370d0860be4af6c9", + "rust-std-1.92.0-riscv32imc-unknown-none-elf.tar.xz": "e1c6968ce25ab78f2c5b5460691763a2d39cb71b01d6d54c208d4a8b735b0584", + "rust-std-1.92.0-riscv64gc-unknown-linux-gnu.tar.xz": "8ee20dcf3b1063fa6069b3ce85e1fcf42794dfa783263314865cb53fff42d9e4", + "rust-std-1.92.0-riscv64gc-unknown-linux-musl.tar.xz": "f20d822309900fd6c7230688694baf91e900154e44e6247feca49b7b7a203a57", + "rust-std-1.92.0-riscv64gc-unknown-none-elf.tar.xz": "7eacf6a98786d58ef912643fd5aedc35111712e96a47b7e5d3ccddcdf9fb166d", + "rust-std-1.92.0-s390x-unknown-linux-gnu.tar.xz": "ebf944dc95015498d322504a54e4f9cdb28590f7790aa3a9eb86d6cf4b6c93ff", + "rust-std-1.92.0-sparc64-unknown-linux-gnu.tar.xz": "d85afb14120c3c7367338a565a920db653dccd4bc5062398791d7b62b89fd1fd", + "rust-std-1.92.0-thumbv6m-none-eabi.tar.xz": "f55de77126b60e1da38f8a5cdd127db872155ce9fbb53d4459502dd47b1dd476", + "rust-std-1.92.0-thumbv7em-none-eabi.tar.xz": "fdee017dcebfa8675220c20ca65b945b6eaee744d5d19b92cb0ca5480dd19ba6", + "rust-std-1.92.0-thumbv7em-none-eabihf.tar.xz": "6bfd083ce4917440fb4b04ca39ab4dadc9f40d9dc2775056899857bfa8911fd0", + "rust-std-1.92.0-thumbv7m-none-eabi.tar.xz": "7dc4c92e97db5ce1ddd9fbb7fbb1ad2d367f1c2e20d296a6d6427480c900c315", + "rust-std-1.92.0-thumbv8m.main-none-eabi.tar.xz": "61a6a80d03ebdb80ab06a044d4ec60e3c2bd8dc4d6011e920cf41592df4f0646", + "rust-std-1.92.0-thumbv8m.main-none-eabihf.tar.xz": "24c2f65371a2a5c6a40b51ae0e276ea9afff0479255f180f5e1549a0a4d58fb3", + "rust-std-1.92.0-wasm32-unknown-emscripten.tar.xz": "59b7adf18c0cc416a005fad7f704203b965905eb1c0ed9c556daa3c14048b9f4", + "rust-std-1.92.0-wasm32-unknown-unknown.tar.xz": "6c73f053ccd6adc886f802270ba960fd854e5e1111e4b5cfb875f1fdcfc0eb60", + "rust-std-1.92.0-wasm32-wasip1-threads.tar.xz": "feea056dd657a26560dfddfe4b53daeef3ded83c140b453b6dbdebaabd2a664c", + "rust-std-1.92.0-wasm32-wasip1.tar.xz": "8107dc35f0b6b744d998e766351419b4e0d27cddd6456c461337753a25f29fcd", + "rust-std-1.92.0-wasm32-wasip2.tar.xz": "e69ce601b6b24eea08b0d9e1fb0d9bf2a4188b3109353b272be4d995f687c943", + "rust-std-1.92.0-x86_64-apple-darwin.tar.xz": "6ce143bf9e83c71e200f4180e8774ab22c8c8c2351c88484b13ff13be82c8d57", + "rust-std-1.92.0-x86_64-apple-ios-macabi.tar.xz": "6a292d774653f2deaac743060ec68bfd5d7ff01d9b364e1a7d1e57a679650b47", + "rust-std-1.92.0-x86_64-apple-ios.tar.xz": "b6e38e5f8c9e6fb294681a7951301856b8f9424af4589e14493c0c939338814c", + "rust-std-1.92.0-x86_64-linux-android.tar.xz": "ffd39429435ff2f0763b940dd6afb4b9ccb1ed443eeef4fff9f1e9b3c5730026", + "rust-std-1.92.0-x86_64-pc-windows-gnu.tar.xz": "d4043304ef0e4792fb79a1153cbeca41308aac37cb1af3aa6bc3f0bb6d2276e1", + "rust-std-1.92.0-x86_64-pc-windows-gnullvm.tar.xz": "6169605b3073a7c2d6960bc1c74cb9cd6b65f45ee34e7ede02368e07ce4564cf", + "rust-std-1.92.0-x86_64-pc-windows-msvc.tar.xz": "b4e53a9c9b96a1a0618364791b7728a1c8978101ec6d1ee78fe930e1ef061994", + "rust-std-1.92.0-x86_64-unknown-freebsd.tar.xz": "151929a4255175d14b2cbcb69ef46d9217add23be268b9cd1446f8eab16616f2", + "rust-std-1.92.0-x86_64-unknown-fuchsia.tar.xz": "51ec26391d166e2f190a329919e3c7bd793861f02284aba461a086268725d9f1", + "rust-std-1.92.0-x86_64-unknown-linux-gnu.tar.xz": "5f106805ed86ebf8df287039e53a45cf974391ef4d088c2760776b05b8e48b5d", + "rust-std-1.92.0-x86_64-unknown-linux-musl.tar.xz": "11f0b7efccdb5e7972e3c0fc23693a487abc28b624675c08161d055a016d527e", + "rust-std-1.92.0-x86_64-unknown-netbsd.tar.xz": "db6a8d3a091551701b12e40cc58d4a541adfb63f250074aae90d250329beb8de", + "rust-std-1.92.0-x86_64-unknown-none.tar.xz": "1d8420ab8eb241a35e38b76470277c722bd5a7aa4ac0c7a565ad6f30b37cb852", + "rust-std-1.92.0-x86_64-unknown-uefi.tar.xz": "1b849250cf095269f3a2c7bc2087a919386da7da28e80dc289e6268bc705142d", + "rustc-1.92.0-aarch64-apple-darwin.tar.xz": "15dee753c9217dff4cf45d734b29dc13ce6017d8a55fe34eed75022b39a63ff0", + "rustc-1.92.0-aarch64-pc-windows-msvc.tar.xz": "07ba5606143de3bc916455714f67732fca05805591396a8190d5e88b8863eea3", + "rustc-1.92.0-aarch64-unknown-linux-gnu.tar.xz": "7c8706fad4c038b5eacab0092e15db54d2b365d5f3323ca046fe987f814e7826", + "rustc-1.92.0-src.tar.xz": "ebee170bfe4c4dfc59521a101de651e5534f4dae889756a5c97ca9ea40d0c307", + "rustc-1.92.0-x86_64-apple-darwin.tar.xz": "0facbd5d2742c8e97c53d59c9b5b81db6088cfc285d9ecb99523a50d6765fc5c", + "rustc-1.92.0-x86_64-pc-windows-msvc.tar.xz": "6aec5aba5384ce1041538e71ebebf671d82e29f4fe697bc7844626d94b0dbfe6", + "rustc-1.92.0-x86_64-unknown-linux-gnu.tar.xz": "78b2dd9c6b1fcd2621fa81c611cf5e2d6950690775038b585c64f364422886e0", + "rustfmt-1.92.0-aarch64-apple-darwin.tar.xz": "5d8ea865a7999dc9141603be8a9352745bf8440da051eb1c43f0fcaaf6845441", + "rustfmt-1.92.0-aarch64-pc-windows-msvc.tar.xz": "e626e08df361c5a9127e0e4b5d73f87fd17ed30cc471887ebc033bebe97c0ff2", + "rustfmt-1.92.0-aarch64-unknown-linux-gnu.tar.xz": "1dce37aea2a7cb801f1756ffc531d7140428315a3d2c2f836272547eb7b9dacd", + "rustfmt-1.92.0-x86_64-apple-darwin.tar.xz": "e038bda323ed7f4d417efc5be44c4245d74b8394f9f8393b9d464d662c3a9499", + "rustfmt-1.92.0-x86_64-pc-windows-msvc.tar.xz": "3761b2e8a18d672b2804b0d1864dc122b7bc54343d6a109135c7843de7fa2ace", + "rustfmt-1.92.0-x86_64-unknown-linux-gnu.tar.xz": "38951ee55f21e9170236fc98c8ba373ae4338d863087c6b0a5fa8c4e797d52c4" } } } diff --git a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel new file mode 100644 index 000000000..5d6adbff5 --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel @@ -0,0 +1,62 @@ +# maturin (Cargo/PyO3) cross case on rules_rs toolchains: pydantic-core built +# from its sdist for the host at runtime, and cross-compiled for both linux +# CPUs. Same assertions as //pycross-rust; only the Rust toolchain provider +# differs (see setup.MODULE.bazel). + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") + +_PY = "3.12" + +_DEP_GROUP = "pycross_rust_rs" + +py_test( + name = "test_pydantic_core", + srcs = ["test_pydantic_core.py"], + dep_group = _DEP_GROUP, + main = "test_pydantic_core.py", + python_version = _PY, + deps = ["@pypi_pycross_rust_rs//pydantic_core"], +) + +# The wheel targets under `collect_wheels` are reached through a platform +# transition rather than a py_venv, so nothing sets the dep_group flag for +# them — the platform carries it alongside the libc/version flags the wheel +# resolver needs. +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "rust_rs_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = ["@sdist_build__pycross_rust_rs__pydantic_core__2_47_0//:whl"], +) diff --git a/e2e/crossbuild/pycross-rust-rs/pyproject.toml b/e2e/crossbuild/pycross-rust-rs/pyproject.toml new file mode 100644 index 000000000..4b544807b --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "pycross_rust_rs" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "maturin", + "pydantic-core==2.47.0", +] + +[tool.uv] +no-binary-package = ["pydantic-core"] diff --git a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel new file mode 100644 index 000000000..068fd6d9f --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel @@ -0,0 +1,28 @@ +"""maturin cross case on rules_rs toolchains. + +Same package and assertions as //pycross-rust, built with the toolchains +rules_rs provisions instead of rules_rust's own. rules_rs declares them with +rules_rust's `rust_toolchain` rule inside the patched `rules_rust` repository +it fetches, so `uv.project(rust_toolchain = ...)` points at that repository's +`current_rust_toolchain`: the wiring is a provider contract, not a dependency +on one ruleset's toolchain layout. The two rulesets coexist here because each +carries its own `rules_rust` repository and therefore its own toolchain type. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_rust_rs") +uv.project( + default_build_dependencies = [ + "build", + "maturin", + ], + hub_name = "pypi_pycross_rust_rs", + lock = "//pycross-rust-rs:uv.lock", + pyproject = "//pycross-rust-rs:pyproject.toml", + rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", +) +use_repo( + uv, + "pypi_pycross_rust_rs", + "sdist_build__pycross_rust_rs__pydantic_core__2_47_0", +) diff --git a/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py new file mode 100644 index 000000000..6bf4f92b8 --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +"""Exercises the cross-compiled _pydantic_core extension. + +SchemaValidator is implemented in Rust (PyO3); constructing one and +validating through it proves the .so loads and runs on the target. +""" +from pydantic_core import SchemaValidator, core_schema + + +def main() -> None: + validator = SchemaValidator(core_schema.int_schema()) + result = validator.validate_python("123") + # pydantic-core's lax int mode coerces the numeric string to a real int. + assert result == 123 and isinstance(result, int), "expected int 123, got {!r}".format(result) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pycross-rust-rs/uv.lock b/e2e/crossbuild/pycross-rust-rs/uv.lock new file mode 100644 index 000000000..ab8b074ff --- /dev/null +++ b/e2e/crossbuild/pycross-rust-rs/uv.lock @@ -0,0 +1,194 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "maturin" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/c8/22e5e21b2679c9bce6415ca578034ca2cc9316be0642ae21e051a2d5198c/maturin-1.15.0.tar.gz", hash = "sha256:94b26cc8e8aba61a5f2099715fe640e18c5f678e9a500408b38761263954228a", size = 385504, upload-time = "2026-08-24T12:11:22.665Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/69/5c01b461044eb1f45ddcce006706eb88110c793cdb11c7ae0b5e08492e94/maturin-1.15.0-py3-none-linux_armv6l.whl", hash = "sha256:6bf6dc62e22d4dcfd5a51244ff0d58975fa4979c48209fe84159617648956d82", size = 10206220, upload-time = "2026-08-24T12:10:53.327Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1f/2b431554e11687cdb1077e0cdadcc118c53f611086b3af00c8545a67c6a5/maturin-1.15.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:cd35772633f489841132bc8e71d6fc7f842df30b9c05cd5cdf1ee1ddcb744cc7", size = 19416513, upload-time = "2026-08-24T12:10:56.126Z" }, + { url = "https://files.pythonhosted.org/packages/51/36/e23a21cb34a648b711036b9b2fe1d4f3f4ee24f8db54215d73f1a9a3a3ec/maturin-1.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c40b4eae7bf5ef1f4b1af8d623fe4105016f93578fb15b764e741d08ec3b92dd", size = 10014962, upload-time = "2026-08-24T12:10:58.486Z" }, + { url = "https://files.pythonhosted.org/packages/8c/80/33b15cb2d8f30f12c807955e8f2fd775027692904e30ec0784744ce8cd83/maturin-1.15.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:7eb066372f541f8eb4909c79c5d9bd0b9e8125980bdf1ec9e8aba23c6c8d6c55", size = 10196223, upload-time = "2026-08-24T12:11:00.696Z" }, + { url = "https://files.pythonhosted.org/packages/fe/91/b495e19e2f5c503b540452b2039115e7b2363867e8c5ad4179eb752fa92c/maturin-1.15.0-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:653020a63525bb224e5ab0adf02e17a2e08bc86dbea7fc1399c9a56d7529b99e", size = 10541186, upload-time = "2026-08-24T12:11:02.857Z" }, + { url = "https://files.pythonhosted.org/packages/5d/2b/2abff58037188d852b124871b1f0d720e1c2bfb3d4f1b03d87c52cd66488/maturin-1.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0ebf9767892725083138e671c34482c660317a2f3d6a29fc0e0f34e9d8c99136", size = 10083468, upload-time = "2026-08-24T12:11:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/b7e9f8be99a6627849e81ac7b6694876bce8f50a92995fe17e3cf2610f0a/maturin-1.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7ab7eebffd7b8debca2265985de4eaeb332141276d24b9560b5ad484d4b3add1", size = 10047786, upload-time = "2026-08-24T12:11:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ab/167e3cb7accee11b507dbe53e0e87aeccb376d44ae66284c96ee4df3a9fd/maturin-1.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:126e12e618b4db42f68c779a56d41f82a390145ba36ac3f621d057eb34f5ad9d", size = 13315332, upload-time = "2026-08-24T12:11:09.433Z" }, + { url = "https://files.pythonhosted.org/packages/14/4d/801379f646cbc6b00998e5289b0630a886be3a4ee4c75b6bc9b87478a7f1/maturin-1.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f9d33e6c3f9615c8caceecbbbd440f8eb25a3ddeb687077682cd5eca2e9ae15", size = 10807183, upload-time = "2026-08-24T12:11:11.73Z" }, + { url = "https://files.pythonhosted.org/packages/89/27/2e612e1cbd1580e9e94d4722c227b5180dca27b32b955a34b79918aa1292/maturin-1.15.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:bf29beddd0c6708f112db51d5275fc28b28b9e9c9c5faae387eaef662918b176", size = 10413274, upload-time = "2026-08-24T12:11:14.04Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/202a7b4d75a51f20f84ec9ce3b7345b12b822207072164e2b1c6ef665125/maturin-1.15.0-py3-none-win32.whl", hash = "sha256:da649988be98e87e009e51b1bf0d301b6a301bc0cecbdd60d40d8ba60748d1ca", size = 8928744, upload-time = "2026-08-24T12:11:16.269Z" }, + { url = "https://files.pythonhosted.org/packages/40/dc/4e90da594986ba78dd3bc8a5921ecdcdb11085b22b02a412caab3b225601/maturin-1.15.0-py3-none-win_amd64.whl", hash = "sha256:552c2be4afd43fe8d5c9f3ec8d4c4756d973b8dcbe94c14084390301f50243e1", size = 10335085, upload-time = "2026-08-24T12:11:18.326Z" }, + { url = "https://files.pythonhosted.org/packages/8b/10/15d4314edf130955edf2dc237aa393a8a7c10f2b9b57b89fa2f61f915659/maturin-1.15.0-py3-none-win_arm64.whl", hash = "sha256:c7dc0c66c78d3debdd9c5aa807e861fbcbf07f3505d34b125df74c03986b0f48", size = 9713795, upload-time = "2026-08-24T12:11:20.83Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-rust-rs" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "maturin" }, + { name = "pydantic-core" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "maturin" }, + { name = "pydantic-core", specifier = "==2.47.0" }, +] + +[[package]] +name = "pydantic-core" +version = "2.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/74/319859f70c733f341df03823c8ca27ce9003faaac3ffa3110f3af1c8641a/pydantic_core-2.47.0.tar.gz", hash = "sha256:422c1797a7864b2a9a996435aba92fe571fb80190f67a31edbc1ac040c7b51fe", size = 476601, upload-time = "2026-05-22T13:19:00.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/e0/0da7149bbd84c438beb208e17174d03a798f2c8ce5a978cbc19fb3052be6/pydantic_core-2.47.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fe87ccbc39a103709d0a5afa75240c15a94611af129261e9484bef0bc97960b2", size = 2114007, upload-time = "2026-05-22T13:20:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/51/30/362c68ac4dc1a830066bf250850725d95be0567bb6a85434616ac68f5939/pydantic_core-2.47.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45882c24324f123037982c65eb8d60da778447e6bc87c82241f81d6c6d2c307e", size = 1948028, upload-time = "2026-05-22T13:19:25.939Z" }, + { url = "https://files.pythonhosted.org/packages/60/d6/1dd26612212fab9145a2b0d876459764ad04248331cb6f61ab4909fddc43/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983e39b39547772543f3518557d0a86dbb3b7bb58bf8e82faba1e0cfa3e816d9", size = 1972491, upload-time = "2026-05-22T13:20:35.379Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c4/00b31fd04acf601efff148add88cfe5f3c21f43f872e79f76e4580cfaf18/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3eb92447d3a079b945b61b8cbd6c3ec2954de3655c4efa0ebd35b069e472c2a9", size = 2045790, upload-time = "2026-05-22T13:18:25.672Z" }, + { url = "https://files.pythonhosted.org/packages/8b/33/7d1a8116bde9d259b3289090a2d93b87562001731cdf81d78bef5d1060d8/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af9600c680bec4b8d23c32ddaf7a5d91ed39a2cf758c082e34e860140cdcd87", size = 2223039, upload-time = "2026-05-22T13:20:37.64Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f6/4c94adcfe1bdaad3f8865a2115bed02e02cba809ffab25c0f85c0cc9b78a/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d6098342d4510a9034a500a53b1d737daf9cfc18a47cd21047d02d7d1587557", size = 2282031, upload-time = "2026-05-22T13:17:41.455Z" }, + { url = "https://files.pythonhosted.org/packages/b6/4f/7fe179b37f887297a5bfd7b38a4a26cd485748b6b424c43c73a36c02f57b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a891c20be5110deb1904f639f3615ec5022b3495995850d1abe7b8fa1550b5", size = 2088600, upload-time = "2026-05-22T13:17:36.643Z" }, + { url = "https://files.pythonhosted.org/packages/fa/15/daef331c1571ee986e1410511218c4d58e6ead75e0db735051925caa572b/pydantic_core-2.47.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:13990d357a50078e382b15fa3ce3f08043223b4be3eaeb340b184f54c1a2397a", size = 2112087, upload-time = "2026-05-22T13:19:30.024Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c7/7cfbb736f9ac501a92171e93bf640d065a13e12dcbcfb7effd21cce2f1ca/pydantic_core-2.47.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0f7343305387bb5884f24d384b7978ad099a277b27529e592c041a502a37c32", size = 2171199, upload-time = "2026-05-22T13:19:12.183Z" }, + { url = "https://files.pythonhosted.org/packages/5f/03/48e63b1f7d2088d747dde98b5dd7b89a46fff9173b6c10dc6189289c4aa5/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2c5e11bb1be2de2707c9367f364e73091ef30d34be54b3a4564d7421ac1a16bd", size = 2176850, upload-time = "2026-05-22T13:17:39.318Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/e653f7723f1dff5c054dada5f5d7f2c294067c087a52188847a0414cff2e/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e1b52aa981e034896712460c899ee30707c8c6a385e79bb7648aac76c748a3da", size = 2315368, upload-time = "2026-05-22T13:18:36.365Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ff/5aa6fcde3bd427648fee1a363671d8b4852c716603acd77091fb4cf1fc3d/pydantic_core-2.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d57d46021c20d4efc28f69b4ca4670dffbb7bdafa51d1967b747849726ec643b", size = 2351750, upload-time = "2026-05-22T13:19:28.187Z" }, + { url = "https://files.pythonhosted.org/packages/85/1d/6ee14bea4426d6bc421033d8d6ec69a6938d5773f7bd1d535b221fa48a7b/pydantic_core-2.47.0-cp311-cp311-win32.whl", hash = "sha256:d93c02ae8bd33f73624319d85cba47e754155c5bf104c0c5ca96fcd1f3094939", size = 1971464, upload-time = "2026-05-22T13:20:30.718Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6b/e466253efba866851af6e1094c488b4c5fb6adbfd8993d13e12b2a575541/pydantic_core-2.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:859ca679f00e5feb11b58b616eb7bc0efbb13654be21f5c898e510e27671c900", size = 2070625, upload-time = "2026-05-22T13:18:17.224Z" }, + { url = "https://files.pythonhosted.org/packages/c1/27/10628ab2df9f2421b6f3b88add9e026f1cb79198be417ee7d684ef0de5d7/pydantic_core-2.47.0-cp311-cp311-win_arm64.whl", hash = "sha256:482667e5b7a3e97b0836f33a716199c4ec6ba9c896ca4db6eae799ec527c1e64", size = 2052484, upload-time = "2026-05-22T13:17:32.654Z" }, + { url = "https://files.pythonhosted.org/packages/19/23/2daeff7346433ad9a3567852dd7a716329f9a7952dcf1ee74b166271bdc7/pydantic_core-2.47.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:70a7aeba54854f5d97da65cb1a61f000f53df3704cab41cd81d65ab127ddd031", size = 2108216, upload-time = "2026-05-22T13:19:31.898Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/2989cb5112b892b7dc13af570ff57d0f383f770fc88bbb644262df1b3017/pydantic_core-2.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c0e97329e38228f57fe1f2d91ba0ef39cc75cc1a84fe6ef58942d2fc6cb406bf", size = 1951502, upload-time = "2026-05-22T13:19:54.702Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a6/2417d8b1856cf7579a21e2679f02417b910e4f29120303e2c45137525072/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:faf83e50714837af72f13e9369c50377552a4a74049d4477bed51c7e5822d94b", size = 1975590, upload-time = "2026-05-22T13:17:26.586Z" }, + { url = "https://files.pythonhosted.org/packages/fc/71/0cd0813355b385bef8fa9a719982e0b44847afedc043b988c9f7c5d02ca9/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f50abe60347bf8afe2b2f58db86cf3ac6e418eec7ffa01d9dc90ba29fc64f243", size = 2055885, upload-time = "2026-05-22T13:20:42.378Z" }, + { url = "https://files.pythonhosted.org/packages/a3/33/5687c6dcf8ecca106c95b2a49f04a633320ab49961da6e57682db37b4482/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f13b18e7dec056336f29ee77dea3cc5db0271d6215cac7249cc5c61b0a49d293", size = 2235292, upload-time = "2026-05-22T13:19:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/36/98/08e81f1a0f0aa82cfa1a4d07b66eb116740fd6c82ba4baa8f96d4b377132/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3aaabbdbbbb8dff33fa053ffb2c980f39dec745fc03592f50e1e010449129841", size = 2308945, upload-time = "2026-05-22T13:18:38.113Z" }, + { url = "https://files.pythonhosted.org/packages/04/f1/6e35bdbdb79f96e630265297452d709b2ebd5facfbd83d3eb702eee24939/pydantic_core-2.47.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d2907ee6d15cf26787bfbeb4c42e18e52f358086eab91baea961a0d909248d6", size = 2093861, upload-time = "2026-05-22T13:20:26.271Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c4/6a48e5da6a567bcf6d3ab113d2d476e1b93e3be941b4c486918f1c9d6714/pydantic_core-2.47.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:c413761260967f4dbb51135e1b49f30a1c29e15bf371fbb39754ed6475739545", size = 2124948, upload-time = "2026-05-22T13:18:15.728Z" }, + { url = "https://files.pythonhosted.org/packages/94/a1/e356c98dfc6bd5e6e166f2c832865a62941370b17a7199d35bc5999fecc8/pydantic_core-2.47.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bb527ac6e5a9721023b24615e1a55c01f47c60007f08b7d2afb89ff9c7a0e22", size = 2182065, upload-time = "2026-05-22T13:19:07.986Z" }, + { url = "https://files.pythonhosted.org/packages/63/aa/6e99aac0a891b05cc522cc464aebeec2bb877fa4744be641a013ebc1785a/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b3abf7fd5e6abe483a63413f9cd26b7c93c20780e19c8556434c7279f6b2f10c", size = 2185830, upload-time = "2026-05-22T13:18:34.551Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/c6c5c1ad40b4d58f11d6e754e9c3990a2a3cfff20a9cf5c1f0a855a791b2/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:9cefe43d17a5a273d71697c084d3787defa7f578cd5fab4cef4c66d13c9e44b2", size = 2327330, upload-time = "2026-05-22T13:19:48.203Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f8/064747538297e385a1f197f35551d1bf6093e88c5ce9b4e15c035f0a1cfe/pydantic_core-2.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:38a8b5371b7938e4f6c31060dbd51d3b3229aef7c43eaac2eb8b153e43c3f189", size = 2366505, upload-time = "2026-05-22T13:20:11.895Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d5/2d8715ef982c0b1875e42f4248b48439133a2781f0be77f0e4dbc84d147d/pydantic_core-2.47.0-cp312-cp312-win32.whl", hash = "sha256:b87e95e644df2a36bd631dd0d6e097aa73d19a55adf7b1724ebdeece3d9c76b7", size = 1957410, upload-time = "2026-05-22T13:17:38.025Z" }, + { url = "https://files.pythonhosted.org/packages/0e/ea/9d908a80798db41c7c38926259ed74d015869f0afe4be6ed56f71793a084/pydantic_core-2.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0078c5695322050ccedbc86eafaf3e2548439782c51d99e575de0e31b9fe4f4", size = 2072354, upload-time = "2026-05-22T13:17:42.779Z" }, + { url = "https://files.pythonhosted.org/packages/fe/78/5549cba47c662ec7f05d79527474786e5ff7f08ef3e65a409a8a2ab6013e/pydantic_core-2.47.0-cp312-cp312-win_arm64.whl", hash = "sha256:7eedc31996e9eba3bdfbbc380805ac6d765c889b7e93b17cd00ecb0200fd6dca", size = 2035452, upload-time = "2026-05-22T13:18:18.75Z" }, + { url = "https://files.pythonhosted.org/packages/7a/91/810cabda42f7fdd13b349702694e1140f6071fd42d1e542d606d5ad0c2d4/pydantic_core-2.47.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:263560ece98bffbbc0a8047ce60b8a278c859db6a2a4e30d9454b02891045eca", size = 2108548, upload-time = "2026-05-22T13:18:09.878Z" }, + { url = "https://files.pythonhosted.org/packages/fa/87/f444a6d63bcbdff3c45291df842941ed56c568f45dd3742f25afb567b5a2/pydantic_core-2.47.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a7fdaff39a66bf66e9037da482575513d2f20bfb02ea9d9222b5cb3b902fc695", size = 1951421, upload-time = "2026-05-22T13:20:32.973Z" }, + { url = "https://files.pythonhosted.org/packages/f5/09/c90dff5407c11e59023161c84df19dd5ed93966a23b2f08cd21d45812ab9/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e6c8ee5ce8c270bfae09763ae4bbbccfe81090c97d670a621fb86cb1ef6042", size = 1976554, upload-time = "2026-05-22T13:19:04.085Z" }, + { url = "https://files.pythonhosted.org/packages/95/cf/55fbe9f1b396f91005cd1cb7acf2bcf380a1f1b57e261ac78bcdc0ff42f3/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e38cdae682cfec4b3816722dccf6376ca59049726d57dca83c2fe7cc13665589", size = 2055005, upload-time = "2026-05-22T13:18:12.809Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c6/4f7cbaa62582e95c080cdd45fb5d4350ff05dac87ea32930c75dcb427bf1/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc3193ff0b7e2e168f84c6185e70475738c191f3154e0af8f897cd0f8f9a489", size = 2235489, upload-time = "2026-05-22T13:19:13.994Z" }, + { url = "https://files.pythonhosted.org/packages/31/75/16913c82ffd194c537222b3d0e8a05c11681e551add67308ec4af6023724/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57ff41672a615f38af528ee904602be51c653248354e5db8e9252668abe91e68", size = 2308360, upload-time = "2026-05-22T13:18:39.894Z" }, + { url = "https://files.pythonhosted.org/packages/05/9f/b24bb1b764fc360adace5df806a81fd62ef1662df2973891e487c3fd5a2c/pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473b9a2b2a1f0dd55cbb32d2b902f93babe7f141a0bb48fb4d3d4d2b3e93e9a0", size = 2092549, upload-time = "2026-05-22T13:17:45.38Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d3/0268ea5972b91178250c0a573bb54c17f697665cd2aa35623087a3589fc6/pydantic_core-2.47.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:195f9c4ac43a7b2a044a7b86631c3352abdb820bed2823ea29f98f779255f459", size = 2123849, upload-time = "2026-05-22T13:18:03.817Z" }, + { url = "https://files.pythonhosted.org/packages/8f/92/26b2147738a89f78925775bb4b34ae53f981ce880ee77ee2c2ccbc49466a/pydantic_core-2.47.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c1cd10d39ef1ff8bcd68b6865bee9c434631ac0608d402fe86e678851c2e2a5", size = 2181733, upload-time = "2026-05-22T13:17:35.308Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fa/8a858dde4784c7245b7216ab9a71518cb1a898a83ffb5c0509181789de19/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7cbe66352fe2b39511d49150e5b52159429cd21f5633a3e801dd2c43829dcdca", size = 2184065, upload-time = "2026-05-22T13:18:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/69/20/ea165877f965622e021f04d63330f9ceb55ede0aefa862863e06a9a610cb/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e35192a1d53e55d510d8bb1023c988c7cdae6d94539074971741b2a7656e49a1", size = 2326881, upload-time = "2026-05-22T13:18:41.477Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d6/ad22a6f0941be5a5478e6c378d0ec3c7641be96d7a86a3ea1f9e9830a269/pydantic_core-2.47.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81de54576de2e20baec76cc5afae2820f9049e6fdc4f357bac3391da02d0ba97", size = 2365574, upload-time = "2026-05-22T13:20:02.947Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4e/eb5e3429dd29311e75ab89313cde09b709b0637fd88838d2cb4a98760b02/pydantic_core-2.47.0-cp313-cp313-win32.whl", hash = "sha256:05da6647bdfd3888936ac10aa39b239d659f3c93dff281af0fc5943eb55629dd", size = 1955451, upload-time = "2026-05-22T13:17:31.178Z" }, + { url = "https://files.pythonhosted.org/packages/15/12/ec107c12aa8729c766285d4aa6caa5f5addf8b2ef6cfd35c455a3ca5c66e/pydantic_core-2.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:021220e0a03b66112737ee1fc49759340ce8fafb8d9ade1b7fb366b06033fa45", size = 2071285, upload-time = "2026-05-22T13:19:50.585Z" }, + { url = "https://files.pythonhosted.org/packages/f4/02/b003a55acfeb35823925d1cd502b80e3fe6c5d477865c36815fbefdf49ac/pydantic_core-2.47.0-cp313-cp313-win_arm64.whl", hash = "sha256:55156ee2f6f561ea4e25ab55f84bd70b9c9ed2546a834cb2b038fe10225aaa37", size = 2034804, upload-time = "2026-05-22T13:18:32.64Z" }, + { url = "https://files.pythonhosted.org/packages/ef/46/a4675c783822e229bf04e290ae28cf5a057b00a46039498743b066e0fefd/pydantic_core-2.47.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6e37a6974fbd8fa7cae12285a76970d50b3689ffd6ed7c7fdd176ba81dd22d0e", size = 2104537, upload-time = "2026-05-22T13:18:05.312Z" }, + { url = "https://files.pythonhosted.org/packages/67/bb/f6d6d1dd8362d616b227b55af8bc2d1b7d4ea842facb7c50a82298ba3b9d/pydantic_core-2.47.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2433b8524785cc117e602233bc574879bc8d87f09523edeec51665d5c46cf42d", size = 1951581, upload-time = "2026-05-22T13:18:14.244Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ae/7d01ed8658ccf8beae8a3fcf2cd023c3ba0ab0b19d3f456845a709cece94/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f9f2be064c8bf1189f46f7062fd42765d94f59cfb7db7ef8db19563192110a", size = 1978461, upload-time = "2026-05-22T13:19:15.829Z" }, + { url = "https://files.pythonhosted.org/packages/80/e5/dd38ccbd1e68f1c3fd7f8b413a8b32db11bd16d5999c3dc3aed4e54290df/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1f0a9659a2eb161573418e3138f616101ba21bbd2ff04916dca7b6712155e015", size = 2049444, upload-time = "2026-05-22T13:19:06.258Z" }, + { url = "https://files.pythonhosted.org/packages/7d/63/0cb998f3f4ea4255ab6d891e2537d4566cd31630df0d406ce45b00306729/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2995074b99242aa28991e0120a3c881babc139e08750a05b7ea7d140644e091d", size = 2231772, upload-time = "2026-05-22T13:20:05.22Z" }, + { url = "https://files.pythonhosted.org/packages/3f/20/2cacf5c4a1bdda1356351df38f343c6cf13af6194e6e0ee0f7967395793f/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5b224dc04c3ff9b08c24419464eb7f6ad7a1049e12284a00bf80df82bd15fdb", size = 2305322, upload-time = "2026-05-22T13:20:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/e3/8f/b7e09086bd48b1ef3f74227ed98907496924a622c7f9315cf661946233c6/pydantic_core-2.47.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:264361b7236d4374fef6342908f87d084a0d58a2f8d0811e99f714309cb0ba7e", size = 2097748, upload-time = "2026-05-22T13:20:21.248Z" }, + { url = "https://files.pythonhosted.org/packages/bd/27/2927049e93f6fbbaa838b2bb656dbd63c6d6fcaab9909d632fd93573ebd9/pydantic_core-2.47.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:53368beaf693f6302a6e33bdefe950857534a04d282811421bd20176d0fb5636", size = 2122971, upload-time = "2026-05-22T13:19:37.977Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3b/80b58a0c7f4339f024ad5c5b6316bef895536abf75c45dc85f0c83ae1a92/pydantic_core-2.47.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5d2177b44ba7d9d86850f865f362feeaac6a2ed8517a9b505b97ff0b7fdbd7dd", size = 2181287, upload-time = "2026-05-22T13:18:20.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0a/dfcb9575603aaf113d2cae1fb622570046a210276eba2267764b3f83f4f2/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fb57a6b538ec7a01b937986bc093aec530fb056135b6bc9cfdd0bf8460c25bc2", size = 2177842, upload-time = "2026-05-22T13:17:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/57/c2/31a198c8180b417d18410e7640c505b39c51ac291aca34f71ac37093f4c4/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:18c9c7c3a18e9bdbf1215d913f6bd00e17595dc92949817935cb87a3cf5f1697", size = 2321802, upload-time = "2026-05-22T13:17:54.495Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/052d872b61f88d2f71b3d881c08abfbe33cb9d64bd988712bb4fb973001c/pydantic_core-2.47.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2f72a382886ca85bb1247303b9134cf9978c9d454de62e710a1ebcd9d2131927", size = 2363870, upload-time = "2026-05-22T13:18:45.053Z" }, + { url = "https://files.pythonhosted.org/packages/be/60/c8c985d4081dafaa88fe6ac6a41ebe2b82d289c391b2bcbd3508f585e7a9/pydantic_core-2.47.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:cdf4dc2cdd0eacad1bd81c4d25422b4c25b206acae095d2d64e5d5cb7facc6b3", size = 1369335, upload-time = "2026-05-22T13:17:51.719Z" }, + { url = "https://files.pythonhosted.org/packages/42/70/30dfcc18dc5552f7235ae2ffd7b699a1ba0d38ebfcdb97f371c792d61601/pydantic_core-2.47.0-cp314-cp314-win32.whl", hash = "sha256:1e859dd5e06e9807080e14995db131649a77c61131cc464a7fe492a69ce82488", size = 1952107, upload-time = "2026-05-22T13:20:24.07Z" }, + { url = "https://files.pythonhosted.org/packages/fa/49/f5c517ba99b9e1036ead16cedd0fc189dbcbf900fb0b85b746b6a0b9b389/pydantic_core-2.47.0-cp314-cp314-win_amd64.whl", hash = "sha256:234ecade0e358caa1ea516c218b3f61e61e30532cad1a8bb12f2487325838548", size = 2071388, upload-time = "2026-05-22T13:18:46.74Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6c/6b95e00ed7a3c7f78cb8544bc34cb29412c05512af507fc4466912576d50/pydantic_core-2.47.0-cp314-cp314-win_arm64.whl", hash = "sha256:58158d0111e86893bc35aacabe509f951ed303cddf8cdba43533190bde317914", size = 2026046, upload-time = "2026-05-22T13:18:22.112Z" }, + { url = "https://files.pythonhosted.org/packages/22/2c/fa67f96f381ba3c83e8cd75a6eb3c538e123d8d02e19d80383bff01ffda0/pydantic_core-2.47.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:24017fd3befd4d7cc4a8c71f4a1e9a44d29fdc91723c5446b0e795ab808adee7", size = 2102407, upload-time = "2026-05-22T13:17:46.882Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e8/99abe6c33db3dda235a2095eae5fdd03266857abd9be1c50ed97a59587c3/pydantic_core-2.47.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dfa0820888cc4549fcce7e6bd8affa7d75198d885ccd0bb0760def4bb8461862", size = 1931963, upload-time = "2026-05-22T13:18:23.776Z" }, + { url = "https://files.pythonhosted.org/packages/5c/dd/96d1884f65737f793e64b6b8745ee793e3cb4735e086ead0a40e5349294e/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d507f331756f7066cde7c9f35ed78fa78223a54369dbc8a34d6da7a5074fa1", size = 1973492, upload-time = "2026-05-22T13:17:22.128Z" }, + { url = "https://files.pythonhosted.org/packages/07/8c/0504f091c75b229cd07d61b45464d7c5291c3ecf2e7d847f215fe81cf5e5/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c4a885fb50c05903bc703a00830616e680304fdcdd90fc9535a52e72debe712", size = 2035548, upload-time = "2026-05-22T13:17:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bf/e9f69c55ef6c945d29e4afb306f62a15354bfd09f1ee25d9aecd4c6cbb82/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b107cbd764bf68f12a57c7aa5846d868bc7463490a1ac2d0f19bffef624c5a9", size = 2238356, upload-time = "2026-05-22T13:19:10.309Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/dfbd214487033093f5946c1fd5915ae5dc6b278efe764397b5e2ef8092a8/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b5f46412c8226d0c8f1f423c324c75afe342e4b854836933579fb484f68598c", size = 2284799, upload-time = "2026-05-22T13:17:27.959Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ec/f80488fa26a6b27bd0d1267f35b0fce3bfeec23ca97021085a94ccd3adc3/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90cbf7e35d597503cbdb5cd85409cbb75f377290bc7e8e37cc5dfe4f5cc66cf8", size = 2107895, upload-time = "2026-05-22T13:18:27.282Z" }, + { url = "https://files.pythonhosted.org/packages/9b/1d/67ac210745f63a982b145d8f281dc76bd347d98052792f087224a178da54/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:04ee7ba7172cb4484af51b2890f19069d35773698abc8c6ebb651f52fbf41134", size = 2102797, upload-time = "2026-05-22T13:19:40.139Z" }, + { url = "https://files.pythonhosted.org/packages/6c/75/f3b9bd4d88fcaad9a5abf2ec6969f37a70e34f40a5f8d2d78077f168e83d/pydantic_core-2.47.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a7acb3e120ddba94372b8146e62ea3a0bce203180e34641c817c87f995c91e0", size = 2160123, upload-time = "2026-05-22T13:19:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/e94ac13bd17c341e86c4b67deb47b63718208fe413034fdb01e7a4bf1dd8/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:1a2f7ceb58013d167d8c96f10ec9b3a137018c819ba356f68ff1cb74302fd22e", size = 2164386, upload-time = "2026-05-22T13:18:48.372Z" }, + { url = "https://files.pythonhosted.org/packages/36/e5/862ff195402f5b08db9ad4d9ebe7cbed993f51528aab7edcb62531442556/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:482b097637fec5037eb13fe9f9d5fe47e568a5b451d686bc2b854076cc0b50ca", size = 2303767, upload-time = "2026-05-22T13:18:50.211Z" }, + { url = "https://files.pythonhosted.org/packages/c2/05/c8ebbb97cf44686fc9cc64a6bb86ac72a8871426a9f61417e395d77c4894/pydantic_core-2.47.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a8c7f5fad73eb404f4b84c75f3d9d3865b748ded248b7366341db6e516fc502b", size = 2361148, upload-time = "2026-05-22T13:18:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8b/4695ec6ce81eda7cc822383de993c5b2c289cfc84d3f032a30c55eb238fc/pydantic_core-2.47.0-cp314-cp314t-win32.whl", hash = "sha256:f343c39928097175acf2f7d0cba5c00b0f62265d88a173a4ce264266ac849bd9", size = 1939588, upload-time = "2026-05-22T13:19:42.151Z" }, + { url = "https://files.pythonhosted.org/packages/96/4d/bc2e188ab648b3ab284e80a0340c5d5b9723c22572c6e36ba39eb300e718/pydantic_core-2.47.0-cp314-cp314t-win_amd64.whl", hash = "sha256:52d40e074da44e42b2425aedebd513e405a31807036ef597175117a9b01743a6", size = 2049697, upload-time = "2026-05-22T13:18:08.244Z" }, + { url = "https://files.pythonhosted.org/packages/6f/46/ca1e6813e029993e57340c6a37740450c51919e3809472f79060f4d64cf0/pydantic_core-2.47.0-cp314-cp314t-win_arm64.whl", hash = "sha256:25cac08c9735e61e5c0b9f7a85c438661fc0e9da226afdfa984c3da6c5942a5a", size = 2025906, upload-time = "2026-05-22T13:17:50.322Z" }, + { url = "https://files.pythonhosted.org/packages/1e/a3/7391a9a511aba60ba119dcbc221a36109dd05ff498dcd6e6ff7222a21b76/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:dbe50ffd50c7e1b8e3bedafafd10fabe8a7cf51916f995fd57316eb1293f2439", size = 2112946, upload-time = "2026-05-22T13:18:54.846Z" }, + { url = "https://files.pythonhosted.org/packages/71/74/1d0fe337fa5a89069731206be4da2b41793b8f8fe28f34ed4d941028a62f/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:67c3f4b57a1cda846a9b6258e0ef70f99b0757d0b6a55f7e3e5b100620937d2c", size = 1940704, upload-time = "2026-05-22T13:18:00.366Z" }, + { url = "https://files.pythonhosted.org/packages/ac/75/d40231aed211f97ffc3264d7a7c98d1f52f7b9c8d165cee75c8c1c13e5c3/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1e025c83b3987784191ec5aa78cfb94686f1ba73d98ae4d520c09cdecda8d", size = 1985024, upload-time = "2026-05-22T13:17:29.331Z" }, + { url = "https://files.pythonhosted.org/packages/a6/bc/e27d3fb897c5b059a508b88eb7c4cc1f0fe600be3231728bb003e1e2b464/pydantic_core-2.47.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547cac87585ab8a6e9495fd3be22ae8ccaabb3c909f6ae589a180677c105cc8", size = 2136202, upload-time = "2026-05-22T13:17:34.031Z" }, + { url = "https://files.pythonhosted.org/packages/4e/21/81cc7e3acbf7d4eed41e9585e81b5840aaf6ddbe65974a20946038d6516b/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:d648515c65f8871ceca6a0446be32fb1a0aae414db3907ec0df6cc2380dd0c04", size = 2098016, upload-time = "2026-05-22T13:18:56.902Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6e/c98e869e9f754f18088ad9b55887972d08606e7bf81dba088779e927eb65/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3292813ac8ed17671a5b1ac8256b6e98b96c29c1c6d061c35899e2f6e0444cac", size = 1931175, upload-time = "2026-05-22T13:20:07.566Z" }, + { url = "https://files.pythonhosted.org/packages/5d/65/ce0d773f4b51dc332764ba1bd585c81f62d5c92231a66d152aff16be8dfa/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf3cfcea028f41a9b42a47f4a53d72ca4274d04e3ee525bd58ca89ea8c5e1910", size = 1995356, upload-time = "2026-05-22T13:19:44.143Z" }, + { url = "https://files.pythonhosted.org/packages/19/2c/6e63683a77d342c93bad67bb0762ca8fe1d8418acc8617d70ccdcc5ec5ff/pydantic_core-2.47.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52afdd8640d59890539060e91c8a494cf96b463e63b2ba499cc5c23abcb5e96b", size = 2144893, upload-time = "2026-05-22T13:17:59.008Z" }, + { url = "https://files.pythonhosted.org/packages/f1/bf/06a01e2f6668aa10646e5c9b050a609d975a93d58454e26e16fd9f82cd38/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ff201e8b93cd6a3849ec3fecb1d642d0391ca4a387f1162adaadddfd1986598c", size = 2114751, upload-time = "2026-05-22T13:18:02.245Z" }, + { url = "https://files.pythonhosted.org/packages/41/50/caf4cc67fdd664baf89bfe264d72079e901a02d903c813ced9de173cdd69/pydantic_core-2.47.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eba39fca6e1fc7c58a5e6b5c320c6eec86014f7075dfa0fb1a79076e00304b3a", size = 1947894, upload-time = "2026-05-22T13:19:36.12Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c0/96ba102865c9ccb945a758272741d00175837bf32bb71750f6e2bf4543fb/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b494566e8e7e1a3992a550900902d6c0051538e53f5957e24003e7775638a24", size = 2131698, upload-time = "2026-05-22T13:18:58.55Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f8/ee7c5d4eafaecdeaf92ce84f48d748c139888e90fa25b2ae988c5aea874c/pydantic_core-2.47.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c96f745745fe778a92e74f40675c57b80dd46fc98186c9020e5ba4514a0470bd", size = 2157797, upload-time = "2026-05-22T13:17:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/08/69/b3eba1d0e015cee3906f7056cfd9ed383f6cef486fde5398a002df2594e4/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dbfb8f8ac48a8fd5a9f83cdbba0a23796f3ff5f9421c735808ed134d3318046f", size = 2177829, upload-time = "2026-05-22T13:20:09.611Z" }, + { url = "https://files.pythonhosted.org/packages/8a/36/a0ceff9b7c3a0980128c9ef763db1e9fe9c2b1fcecf6ed055e88af39f123/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:4ded2d8dc3beb086623ab3256b81a0b51fc026c94eb363f480aec09b204a1cbd", size = 2307425, upload-time = "2026-05-22T13:19:46.177Z" }, + { url = "https://files.pythonhosted.org/packages/d6/0a/930e210e95ade33ecacabc4ba822aa1662a0aaf843d2cf57abce27fb95b1/pydantic_core-2.47.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:25f8aa59fd3f85651387c37b289cd8f0bbc8f632e7dad13c6b837759e78be88d", size = 2351547, upload-time = "2026-05-22T13:17:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0c/90941408bb6c1e84563d99177c9e62c536dce0388b5a8bf37b90b4f6f095/pydantic_core-2.47.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:0ae0096729c64aa6155cef74e75d1945017b01cfb82f313a18d843fafc497476", size = 2180871, upload-time = "2026-05-22T13:19:56.696Z" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index 681f51aca..28bb8a09b 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -1027,7 +1027,7 @@ _override_package_tag = tag_class( ), "toolchains": attr.label_list( default = [], - doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", + doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_SYSROOT, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", ), "env": attr.string_dict( default = {}, diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index 688e68373..89d092117 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -26,13 +26,15 @@ _CC_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/cpp:toolchain_type") # TemplateVariableInfo make-variable -> build helper env key, for the # toolchains a native build commonly layers in: rules_rust's -# current_rust_toolchain (CARGO/RUSTC), an exec-configured rust sysroot -# layer (RUST_HOST_SYSROOT), a Java runtime (JAVA/JAVABASE) and an Ant layer -# (ANT_HOME/ANT_BIN_DIR). The env keys are the helper's contract -# (build_helper.py absolutizes exactly this set). +# current_rust_toolchain (CARGO/RUSTC and its generated RUST_SYSROOT, where +# rustc and rust-std meet whatever repositories they were fetched into), an +# exec-configured rust sysroot layer (RUST_HOST_SYSROOT), a Java runtime +# (JAVA/JAVABASE) and an Ant layer (ANT_HOME/ANT_BIN_DIR). The env keys are +# the helper's contract (build_helper.py absolutizes exactly this set). _DERIVED_ENV = { "CARGO": "CARGO", "RUSTC": "RUSTC", + "RUST_SYSROOT": "RULES_PY_RUST_SYSROOT", "RUST_HOST_SYSROOT": "RULES_PY_RUST_HOST_SYSROOT", "JAVA": "JAVA", "JAVABASE": "JAVA_HOME", diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index a01114765..3d356bf19 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -382,6 +382,36 @@ rust_host_sysroot_test( target_under_test = ":__rust_host_sysroot", ) +# The shape sdist_build generates for a Rust sdist: the toolchain plus its +# exec-configured sysroot layer. Their make-variables must reach the helper +# under its env names, and the make-variable names themselves must not. +pep517_native_whl( + name = "__derived_rust_env_fixture", + src = ":__stub_sdist", + tags = ["manual"], + tool = ":__stub_tool", + toolchains = [ + ":__fake_rust_toolchain", + ":__rust_host_sysroot", + ], + version = "0.0.1", +) + +pep517_native_whl_derived_env_test( + name = "derived_rust_env_test", + absent_keys = [ + "RUST_SYSROOT", + "RUST_HOST_SYSROOT", + ], + derived_keys = [ + "CARGO", + "RUSTC", + "RULES_PY_RUST_SYSROOT", + "RULES_PY_RUST_HOST_SYSROOT", + ], + target_under_test = ":__derived_rust_env_fixture", +) + execroot_collision_toolchain(name = "__execroot_collision_toolchain") pep517_native_whl( diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 473aef8a4..3b65ff520 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -765,6 +765,54 @@ def test_rustc_wrapper_uses_merged_sysroot(self) -> None: self.assertTrue(path.islink(path.join(merged, "aarch64-unknown-linux-gnu"))) + def test_target_sysroot_from_toolchain_wins_over_rustc_location(self) -> None: + # rules_rs-style layout: rustc in one repository, rust-std in another, + # both assembled into the toolchain's generated sysroot. + tmp = tempfile.mkdtemp() + target_rustc = path.join(tmp, "rustc_repo", "bin", "rustc") + makedirs(path.dirname(target_rustc)) + open(target_rustc, "w").close() + generated = path.join(tmp, "generated_sysroot") + makedirs(path.join(generated, "lib", "rustlib", "aarch64-unknown-linux-gnu")) + host_sysroot = path.join(tmp, "host_sysroot") + makedirs(path.join(host_sysroot, "lib", "rustlib", "x86_64-unknown-linux-gnu")) + + env = self._env() + env["RUSTC"] = target_rustc + env["RULES_PY_RUST_SYSROOT"] = generated + env["RULES_PY_RUST_HOST_SYSROOT"] = host_sysroot + build_helper._configure_cargo_cross_env(env, tmp, "linux", "aarch64", "glibc") + + merged = path.join(tmp, ".rust_sysroot", "lib", "rustlib") + self.assertTrue(path.islink(path.join(merged, "aarch64-unknown-linux-gnu"))) + self.assertTrue(path.islink(path.join(merged, "x86_64-unknown-linux-gnu"))) + + +class CargoNativeEnvTest(unittest.TestCase): + def test_rustc_gets_the_toolchain_sysroot(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_SYSROOT": "/tc/sysroot", "RULES_PY_RUST_HOST_SYSROOT": "/exec/sysroot"} + build_helper._configure_cargo_native_env(env, tmp) + with open(env["RUSTC"]) as f: + content = f.read() + self.assertIn('"--sysroot", \'/tc/sysroot\'', content) + self.assertIn("/tc/bin/rustc", content) + self.assertTrue(os.access(env["RUSTC"], os.X_OK)) + + def test_host_sysroot_is_the_fallback(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "RULES_PY_RUST_HOST_SYSROOT": "/exec/sysroot"} + build_helper._configure_cargo_native_env(env, tmp) + with open(env["RUSTC"]) as f: + self.assertIn("/exec/sysroot", f.read()) + + def test_no_rust_toolchain_leaves_rustc_alone(self) -> None: + tmp = tempfile.mkdtemp() + env = {"RUSTC": "/usr/bin/rustc"} + build_helper._configure_cargo_native_env(env, tmp) + self.assertEqual("/usr/bin/rustc", env["RUSTC"]) + + class BuildBackendTest(unittest.TestCase): def test_declared_backend(self) -> None: data = {"build-system": {"build-backend": "mesonpy"}} diff --git a/uv/private/pep517_whl/tests/pep517_whl_test.bzl b/uv/private/pep517_whl/tests/pep517_whl_test.bzl index 5b85cc46d..794ad056f 100644 --- a/uv/private/pep517_whl/tests/pep517_whl_test.bzl +++ b/uv/private/pep517_whl/tests/pep517_whl_test.bzl @@ -370,8 +370,16 @@ config_settings_args_test = analysistest.make( def _fake_rust_toolchain_impl(ctx): # The sysroot is this target's own output root: an "-exec" segment in it - # proves the dependent re-resolved us in the exec configuration. - return [platform_common.ToolchainInfo(sysroot = ctx.bin_dir.path, all_files = depset())] + # proves the dependent re-resolved us in the exec configuration. The + # make-variables mirror what rules_rust's current_rust_toolchain exports. + return [ + platform_common.ToolchainInfo(sysroot = ctx.bin_dir.path, all_files = depset()), + platform_common.TemplateVariableInfo({ + "CARGO": "/fake/bin/cargo", + "RUSTC": "/fake/bin/rustc", + "RUST_SYSROOT": ctx.bin_dir.path + "/fake_sysroot", + }), + ] fake_rust_toolchain = rule( implementation = _fake_rust_toolchain_impl, diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index b51e97033..f66cc5f9c 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -189,7 +189,7 @@ def _override_tool(env: dict[str, str], key: str, wrapper: str) -> None: def _absolutize_tool_paths(env: dict[str, str]) -> None: """Resolve toolchain paths before the backend changes cwd.""" - for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): + for key in ("JAVA_HOME", "JAVA", "CARGO", "RUSTC", "RULES_PY_RUST_SYSROOT", "RULES_PY_RUST_HOST_SYSROOT", "ANT_HOME", "RULES_PY_ANT_BIN_DIR"): value = env.get(key) if value: env[key] = _absolutize_path(value) @@ -929,7 +929,7 @@ def _generate_cmake_toolchain_file( """ -def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> str: +def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str, target_sysroot: str | None = None) -> str: """Symlink-merge the target toolchain's sysroot with the host's rust-std. A cross rust_toolchain's sysroot has no exec-platform rust-std, but @@ -938,8 +938,12 @@ def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str) -> st by side in one install; recreate that by merging the two Bazel-fetched single-target sysroots. The host's rustlib entries win: exec-platform code must resolve against exec-platform std. + + The target sysroot is the toolchain's generated one when known: rulesets + such as rules_rs fetch rustc and rust-std into separate repositories, so + the directory above rustc holds no std at all. """ - target_sysroot = path.dirname(path.dirname(target_rustc)) + target_sysroot = target_sysroot or path.dirname(path.dirname(target_rustc)) merged = path.join(tmpdir, ".rust_sysroot") if path.exists(merged): return merged @@ -1003,7 +1007,7 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os host_sysroot = build_env.get("RULES_PY_RUST_HOST_SYSROOT") if host_sysroot: - merged_sysroot = _merge_rust_sysroot(tmpdir, build_env["RUSTC"], host_sysroot) + merged_sysroot = _merge_rust_sysroot(tmpdir, build_env["RUSTC"], host_sysroot, build_env.get("RULES_PY_RUST_SYSROOT")) build_env["RUSTC"] = _write_generated_file( path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=merged_sysroot), @@ -1021,6 +1025,25 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os build_env["MATURIN_PEP517_ARGS"] = (interpreter_arg + " " + existing).strip() +def _configure_cargo_native_env(build_env: dict[str, str], tmpdir: str) -> None: + """Point rustc at the toolchain's sysroot for a native build. + + Bare rustc infers its sysroot from its own location, which only works + when rust-std was unpacked next to it. rules_rust's toolchain always + publishes the sysroot it assembled (RUST_SYSROOT), so pass that + explicitly; the exec-configured layer's sysroot is the same toolchain in + native mode and serves as the fallback. + """ + sysroot = build_env.get("RULES_PY_RUST_SYSROOT") or build_env.get("RULES_PY_RUST_HOST_SYSROOT") + if not (build_env.get("CARGO") and sysroot): + return + build_env["RUSTC"] = _write_generated_file( + path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), + _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=sysroot), + executable=True, + ) + + def _build_backend(pyproject_data: dict[str, object] | None) -> str | None: """The [build-system].build-backend value, or None when undeclared.""" build_system = (pyproject_data or {}).get("build-system", {}) @@ -1268,6 +1291,8 @@ def main() -> None: cmd += ["-C", "cmake.toolchain-file=" + toolchain] if _needs_cargo_cross_env(build_env): _configure_cargo_cross_env(build_env, tmp_root, opts.target_os, opts.target_cpu, opts.target_libc) + else: + _configure_cargo_native_env(build_env, tmp_root) else: print("Error: Unable to detect build command! Neither pyproject.toml nor setup.py found!", file=sys.stderr) raise SystemExit(1) From 694c8fce79214115e81ca19cbe09d2c108190c4c Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 19:23:33 -0600 Subject: [PATCH 090/103] feat(uv): vendor the crates a Rust sdist's Cargo.lock pins, build offline Cargo fetched its dependencies inside the build action, with whatever network the sandbox allowed: not hermetic, not reproducible beyond the lock the sdist happened to ship, and dead under remote execution. The C-family backends never had this problem: their build deps come from the uv lock and their toolchains are action inputs. sdist_configure now reads the sdist's Cargo.lock (anywhere in the tree, shallowest first: setuptools-rust keeps its crate under src/) and reports the crates it pins. For a Rust build, sdist_build downloads each crates.io crate through Bazel's downloader with the lock's checksum into a cargo vendor directory, and the generated pep517_native_whl passes it to the helper, which writes the source replacement into the sandbox CARGO_HOME and sets CARGO_NET_OFFLINE. Locks pinning git or path sources are rejected outright. Sdists without a Cargo.lock build online with a warning, or take one from uv.override_package(cargo_lock = ...): vendored the same way and placed next to the crate's Cargo.toml before the build. pycross-tiktoken (setuptools-rust, no shipped lock) is that consumer. e2e/crossbuild now runs every sdist build with sandbox network blocked; the whole suite passes offline, Rust cases included. --- docs/uv.md | 10 +- e2e/crossbuild/.bazelrc | 6 + e2e/crossbuild/MODULE.bazel | 1 + e2e/crossbuild/pycross-tiktoken/BUILD.bazel | 62 +++ e2e/crossbuild/pycross-tiktoken/Cargo.lock | 255 ++++++++++ .../pycross-tiktoken/pyproject.toml | 14 + .../pycross-tiktoken/setup.MODULE.bazel | 35 ++ .../pycross-tiktoken/test_tiktoken.py | 29 ++ e2e/crossbuild/pycross-tiktoken/uv.lock | 455 ++++++++++++++++++ uv/private/extension/defs.bzl | 13 +- uv/private/pep517_whl/pep517_native_whl.bzl | 31 +- uv/private/pep517_whl/tests/BUILD.bazel | 24 + uv/private/pep517_whl/tests/Cargo.lock | 5 + .../pep517_whl/tests/build_helper_test.py | 60 +++ .../pep517_whl/tests/pep517_whl_test.bzl | 26 + .../vendor/fake-0.1.0/.cargo-checksum.json | 1 + .../tests/vendor/fake-0.1.0/Cargo.toml | 3 + uv/private/pep517_whl/tools/build_helper.py | 43 ++ uv/private/sdist_build/attrs.bzl | 4 + uv/private/sdist_build/repository.bzl | 86 +++- uv/private/sdist_build/tests/BUILD.bazel | 3 + .../sdist_build/tests/repository_test.bzl | 23 + uv/private/sdist_configure/detect_native.py | 56 +++ .../sdist_configure/detect_native_test.py | 97 ++++ 24 files changed, 1337 insertions(+), 5 deletions(-) create mode 100644 e2e/crossbuild/pycross-tiktoken/BUILD.bazel create mode 100644 e2e/crossbuild/pycross-tiktoken/Cargo.lock create mode 100644 e2e/crossbuild/pycross-tiktoken/pyproject.toml create mode 100644 e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel create mode 100644 e2e/crossbuild/pycross-tiktoken/test_tiktoken.py create mode 100644 e2e/crossbuild/pycross-tiktoken/uv.lock create mode 100644 uv/private/pep517_whl/tests/Cargo.lock create mode 100644 uv/private/pep517_whl/tests/vendor/fake-0.1.0/.cargo-checksum.json create mode 100644 uv/private/pep517_whl/tests/vendor/fake-0.1.0/Cargo.toml diff --git a/docs/uv.md b/docs/uv.md index 449f7c88e..6bb83ab33 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -419,7 +419,15 @@ uv.project( Every sdist in that project whose build backend is maturin, or whose build requirements include setuptools-rust, then gets the toolchain and an exec-configured `rust_host_sysroot` layer wired into its build. No -`uv.override_package` entry is needed for Rust packages. Any target exposing +`uv.override_package` entry is needed for Rust packages. The crates the +sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while +the repository is generated and vendored into it; cargo then builds offline, +so the build needs no network and works under remote execution. A lock that +pins crates outside crates.io (git or path sources) is rejected. An sdist +without a `Cargo.lock` builds with network access and a warning; give it one +with `uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once +with `cargo generate-lockfile` on the extracted sdist, and it is vendored and +placed next to the sdist's `Cargo.toml` before the build. Any target exposing rules_rust's toolchain providers works, so the same label serves [rules_rs](https://github.com/hermeticbuild/rules_rs) toolchains, which are declared with rules_rust's `rust_toolchain` rule. diff --git a/e2e/crossbuild/.bazelrc b/e2e/crossbuild/.bazelrc index 6cb312c68..5787752e5 100644 --- a/e2e/crossbuild/.bazelrc +++ b/e2e/crossbuild/.bazelrc @@ -10,6 +10,12 @@ common --incompatible_strict_action_env # configuration-stripped cache keys; those that don't still work normally. build --experimental_output_paths=strip +# Every sdist build must be hermetic: build deps come from the uv lock, the +# C/C++ and Rust toolchains are action inputs, and cargo runs offline against +# the crates sdist_build vendored from the sdist's Cargo.lock. A backend that +# reaches for the network fails here instead of passing by accident. +build --sandbox_default_allow_network=false + # Build without the bytes common:ci --remote_download_outputs=minimal common:ci --nobuild_runfile_links diff --git a/e2e/crossbuild/MODULE.bazel b/e2e/crossbuild/MODULE.bazel index 2db6241bb..a9c5b855e 100644 --- a/e2e/crossbuild/MODULE.bazel +++ b/e2e/crossbuild/MODULE.bazel @@ -90,6 +90,7 @@ include("//pycross-patches:setup.MODULE.bazel") include("//pycross-pure-python:setup.MODULE.bazel") include("//pycross-rust:setup.MODULE.bazel") include("//pycross-rust-rs:setup.MODULE.bazel") +include("//pycross-tiktoken:setup.MODULE.bazel") include("//pycross-setuptools:setup.MODULE.bazel") include("//pycross-geohash:setup.MODULE.bazel") include("//pycross-msgpack:setup.MODULE.bazel") diff --git a/e2e/crossbuild/pycross-tiktoken/BUILD.bazel b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel new file mode 100644 index 000000000..5738feba2 --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel @@ -0,0 +1,62 @@ +# tiktoken ships official prebuilt wheels for linux/amd64 and linux/arm64, but +# [tool.uv] no-binary-package forces it to build from sdist here. A second +# setuptools-rust package alongside //pycross-bcrypt, exercising OpenAI's BPE +# tokenizer core on the same build-backend path. + +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("//tools:collect_wheels.bzl", "collect_wheels") + +exports_files(["Cargo.lock"]) + +_PY = "3.12" + +_DEP_GROUP = "pycross_tiktoken" + +py_test( + name = "test_tiktoken", + srcs = ["test_tiktoken.py"], + dep_group = _DEP_GROUP, + main = "test_tiktoken.py", + python_version = _PY, + deps = ["@pypi_pycross_tiktoken//tiktoken"], +) + +_PLATFORM_FLAGS = [ + "--@aspect_rules_py//uv/private/constraints/platform:platform_libc=glibc", + "--@aspect_rules_py//uv/private/constraints/platform:platform_version=2.39", + "--@aspect_rules_py//uv/private/constraints/dep_group:dep_group=" + _DEP_GROUP, + "--@aspect_rules_py//py/private/interpreter:python_version=" + _PY, +] + +platform( + name = "amd64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + flags = _PLATFORM_FLAGS, +) + +platform( + name = "arm64_linux", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + flags = _PLATFORM_FLAGS, +) + +collect_wheels( + name = "tiktoken_wheels", + expected_tags = [ + "linux_x86_64", + "linux_aarch64", + ], + platforms = [ + ":amd64_linux", + ":arm64_linux", + ], + wheels = [ + "@sdist_build__pycross_tiktoken__tiktoken__0_13_0//:whl", + ], +) diff --git a/e2e/crossbuild/pycross-tiktoken/Cargo.lock b/e2e/crossbuild/pycross-tiktoken/Cargo.lock new file mode 100644 index 000000000..774d53efa --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/Cargo.lock @@ -0,0 +1,255 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bstr" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "regex-automata", + "serde_core", +] + +[[package]] +name = "fancy-regex" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12" +dependencies = [ + "libc", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", +] + +[[package]] +name = "pyo3-build-config" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e" +dependencies = [ + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.5", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" + +[[package]] +name = "tiktoken" +version = "0.13.0" +dependencies = [ + "bstr", + "fancy-regex", + "pyo3", + "regex", + "rustc-hash", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" diff --git a/e2e/crossbuild/pycross-tiktoken/pyproject.toml b/e2e/crossbuild/pycross-tiktoken/pyproject.toml new file mode 100644 index 000000000..e9f8e5375 --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "pycross_tiktoken" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [ + "build", + "setuptools", + "setuptools-rust", + "tiktoken==0.13.0", + "wheel", +] + +[tool.uv] +no-binary-package = ["tiktoken"] diff --git a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel new file mode 100644 index 000000000..b359dfd38 --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel @@ -0,0 +1,35 @@ +"""tiktoken: setuptools-rust sdist build. + +`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build detects +setuptools-rust in the build requirements and emits the toolchain plus the +exec-platform sysroot into the generated pep517_native_whl. +""" + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_pycross_tiktoken") +uv.project( + default_build_dependencies = [ + "build", + "setuptools", + "setuptools-rust", + "wheel", + ], + hub_name = "pypi_pycross_tiktoken", + lock = "//pycross-tiktoken:uv.lock", + pyproject = "//pycross-tiktoken:pyproject.toml", + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", +) + +# tiktoken's sdist ships no Cargo.lock, so nothing pins its crates; this one +# (`cargo generate-lockfile` on the extracted sdist) lets sdist_build vendor +# them and the build run offline like every other case here. +uv.override_package( + name = "tiktoken", + cargo_lock = "//pycross-tiktoken:Cargo.lock", + lock = "//pycross-tiktoken:uv.lock", +) +use_repo( + uv, + "pypi_pycross_tiktoken", + "sdist_build__pycross_tiktoken__tiktoken__0_13_0", +) diff --git a/e2e/crossbuild/pycross-tiktoken/test_tiktoken.py b/e2e/crossbuild/pycross-tiktoken/test_tiktoken.py new file mode 100644 index 000000000..adcd5a463 --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/test_tiktoken.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +"""Round-trip encode/decode through tiktoken built from its sdist. + +Ported from the spike workspace's //tiktoken:tiktoken_main.py. tiktoken's real +encodings download their BPE vocab over the network on first use, which is not +available in a sandboxed cross build. We build a minimal byte-level encoding so +encode() must exercise the compiled Rust core (_tiktoken.CoreBPE). +""" + +import tiktoken + + +def main() -> None: + mergeable_ranks = {bytes([i]): i for i in range(256)} + enc = tiktoken.Encoding( + name="byte-level-test", + pat_str=r".+", + mergeable_ranks=mergeable_ranks, + special_tokens={}, + ) + tokens = enc.encode("hi") + assert tokens == [104, 105], "expected [104, 105], got {}".format(tokens) + decoded = enc.decode(tokens) + assert decoded == "hi", "expected 'hi', got {!r}".format(decoded) + print("OK") + + +if __name__ == "__main__": + main() diff --git a/e2e/crossbuild/pycross-tiktoken/uv.lock b/e2e/crossbuild/pycross-tiktoken/uv.lock new file mode 100644 index 000000000..ceb9b108f --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/uv.lock @@ -0,0 +1,455 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "build" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b7/1db48a9ce2984842c8c886432ec8a2719613322e868a966ba82a28862f25/build-1.6.0.tar.gz", hash = "sha256:bd2c8afc603e7a2e0ce70e2ea85f0a6d02043bafbd307f5bada0f98669eca5af", size = 113825, upload-time = "2026-08-27T21:01:16.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e5/aa1e81b21aea0ce0ba435311837a37d4cb936e7461f9fecac08580073ba9/build-1.6.0-py3-none-any.whl", hash = "sha256:f7aaf1ebbb79178a02ba248bb524f2176b256017e17e8e4bd4289c7b38cc2bad", size = 31187, upload-time = "2026-08-27T21:01:14.957Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", size = 363585, upload-time = "2026-08-15T08:16:46.646Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", size = 251189, upload-time = "2026-08-15T08:16:48.287Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", size = 239724, upload-time = "2026-08-15T08:16:49.67Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", size = 280078, upload-time = "2026-08-15T08:16:51.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", size = 276650, upload-time = "2026-08-15T08:16:52.625Z" }, + { url = "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", size = 262325, upload-time = "2026-08-15T08:16:54.085Z" }, + { url = "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", size = 261140, upload-time = "2026-08-15T08:16:55.604Z" }, + { url = "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", size = 252791, upload-time = "2026-08-15T08:16:57.103Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", size = 240730, upload-time = "2026-08-15T08:16:58.418Z" }, + { url = "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", size = 280791, upload-time = "2026-08-15T08:16:59.918Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", size = 259598, upload-time = "2026-08-15T08:17:01.421Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", size = 278217, upload-time = "2026-08-15T08:17:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", size = 263417, upload-time = "2026-08-15T08:17:04.216Z" }, + { url = "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl", hash = "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", size = 181774, upload-time = "2026-08-15T08:17:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", size = 206653, upload-time = "2026-08-15T08:17:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", size = 185630, upload-time = "2026-08-15T08:17:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, + { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, + { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, + { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, + { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, + { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, + { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, + { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "idna" +version = "3.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pycross-tiktoken" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "tiktoken" }, + { name = "wheel" }, +] + +[package.metadata] +requires-dist = [ + { name = "build" }, + { name = "setuptools" }, + { name = "setuptools-rust" }, + { name = "tiktoken", specifier = "==0.13.0" }, + { name = "wheel" }, +] + +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + +[[package]] +name = "regex" +version = "2026.7.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e5/cef4de2bac939280b68d32adc659478845238a8274f2f79c465063f590ad/regex-2026.7.19-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ac777001cdfc28b72477d93c8564bb7583081ea8fb45cdca3d568e0a4f87183c", size = 494012, upload-time = "2026-07-19T00:16:39.927Z" }, + { url = "https://files.pythonhosted.org/packages/ff/87/e86f51eb117457bb7803132ffe5cb6e2841e2b5bea4cc85d397f3c6e257d/regex-2026.7.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:59787bd5f8c70aa339084e961d2996b53fbdeab4d5393bba5c1fe1fc32e02bae", size = 295281, upload-time = "2026-07-19T00:16:41.433Z" }, + { url = "https://files.pythonhosted.org/packages/41/2e/2360c41d8080a3d9ec7e5c90fad6eab3b50192869d10e9a5609e48c8177b/regex-2026.7.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:90c633e7e8d6bf4e992b8b36ce69e018f834b641dd6de8cea6d78c06ffa119c5", size = 290615, upload-time = "2026-07-19T00:16:43.058Z" }, + { url = "https://files.pythonhosted.org/packages/cf/69/b65ba4344efbc771b28fe5dde84cbbb6c8f9551165952fe78def5b9dde6a/regex-2026.7.19-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:87ccab0db8d5f4fbb0272642113c1adb2ffc698c16d3a0944580222331fa7a20", size = 791804, upload-time = "2026-07-19T00:16:44.662Z" }, + { url = "https://files.pythonhosted.org/packages/81/b6/a40dfa0dc6224b36f620c00296eacc830489cbf8c2837b6750dfe6170375/regex-2026.7.19-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e50d748a32da622f256e8d505867f5d3c43a837c6a9f0efb149655fadd1042a", size = 861723, upload-time = "2026-07-19T00:16:46.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/02/735991dee71abd83196a7962f7ed8bf5aa05720ff06e2d3ff896a85e2bbb/regex-2026.7.19-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf1516fe58fc104f39b2d1dbe2d5e27d0cd45c4be2e42ba6ee0cc763701ec3c7", size = 905932, upload-time = "2026-07-19T00:16:47.956Z" }, + { url = "https://files.pythonhosted.org/packages/45/6c/e7098d8b846ccdbf431d8c081b61e496526a27a28094ed09e0dce21b3f54/regex-2026.7.19-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09f3e5287f94f17b709dc9a9e70865855feee835c861613be144218ce4ca82cc", size = 801407, upload-time = "2026-07-19T00:16:49.43Z" }, + { url = "https://files.pythonhosted.org/packages/8a/18/34b69274e2649bcc7d9b089c2b2983fb2632d8ecf667e359593be9072e79/regex-2026.7.19-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6383cd2ed53a646c659ba1fe65727db76437fdaa069e697a0b44a51d5843d864", size = 774448, upload-time = "2026-07-19T00:16:51.352Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e6/0a72247d025585fd3800b98e040b84d562a88af6303347100484849f4f01/regex-2026.7.19-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:09d3007fc76249a83cdd33de160d50e6cb77f54e09d8fa9e7148e10607ce24af", size = 783297, upload-time = "2026-07-19T00:16:53.071Z" }, + { url = "https://files.pythonhosted.org/packages/b1/aa/c4f65ae7dd02a36b323a70c4cff326e1f3442361aaebc9311100a130d54f/regex-2026.7.19-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f8c6e7a1cfa3dc9d0ee2de0e65e834537fa29992cc3976ffec914afc35c5dd5", size = 854736, upload-time = "2026-07-19T00:16:54.607Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/668082bcc817b9e694189b84997aeba7385b7779faa6711788679c482e35/regex-2026.7.19-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b2ea4a3e8357be8849e833beeae757ac3c7a6b3fc055c03c808a53c91ad30d82", size = 763298, upload-time = "2026-07-19T00:16:56.289Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fb/2d07ad555e7af88aa5f867fdafa47a8d945ee237c20af3ebceb46a820835/regex-2026.7.19-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:80115dd39481fd3a4b4080220799dbcacb921a844de4b827264ececacbe17c78", size = 844430, upload-time = "2026-07-19T00:16:57.933Z" }, + { url = "https://files.pythonhosted.org/packages/51/15/c82a471fe3dce56f03745635b43aa456c40dc0db089e07ef148b331507d1/regex-2026.7.19-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6ce43a0269d68cee79a7d1ade7def53c20f8f2a047b92d7b5d5bcc73ae88327", size = 789683, upload-time = "2026-07-19T00:16:59.583Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f4/7532a2c59d56f5398902c20de60f0c9a5d1cd364e42a051b48e1b210be7b/regex-2026.7.19-cp311-cp311-win32.whl", hash = "sha256:9be2a6647740dd3cca6acb24e87f03d7632cd280dbce9bbe40c26353a215a45d", size = 266778, upload-time = "2026-07-19T00:17:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/cf1bc631db154eb95520d9d5dbc2371ff77a0f014bbf7d748fed8496aa63/regex-2026.7.19-cp311-cp311-win_amd64.whl", hash = "sha256:8d3469c91dd92ee41b7c95280edbd975ef1ba9195086686623a1c6e8935ce965", size = 277983, upload-time = "2026-07-19T00:17:02.571Z" }, + { url = "https://files.pythonhosted.org/packages/8d/bd/56ceaf170e875d5a6761bf2bfd0d040f1cacc896850d5e40cb29b11bbd06/regex-2026.7.19-cp311-cp311-win_arm64.whl", hash = "sha256:36aacfb15faaff3ced55afbf35ec72f50d4aee22082c4f7fe0573a33e2fca92e", size = 276961, upload-time = "2026-07-19T00:17:04.135Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b9/d11d7e501ac8fd7d617684423ebb9561e0b998481c1e4cbc0cb212c5d74a/regex-2026.7.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2cc3460cedf7579948486eab03bc9ad7089df4d7281c0f47f4afe03e8d13f02d", size = 496778, upload-time = "2026-07-19T00:17:05.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a9/a5ab6f312f24318019170dc485d5421fe4f89e43a98640da50d95a8a7041/regex-2026.7.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0e9554c8785eac5cffe6300f69a91f58ba72bc88a5f8d661235ad7c6aa5b8ccd", size = 297122, upload-time = "2026-07-19T00:17:07.59Z" }, + { url = "https://files.pythonhosted.org/packages/b3/63/4cab4d7f2d384a144d420b763d97674cb70619c878ea6fcd7640d0e62143/regex-2026.7.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7da47a0f248977f08e2cb659ff3c17ddc13a4d39b3a7baa0a81bf5b415430f6", size = 292009, upload-time = "2026-07-19T00:17:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/102a81b218298957d4ea7d2f084fae537a71add9d6ff93c8e67284c5f45e/regex-2026.7.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93db40c8de0815baab96a06e08a984bac71f989d13bab789e382158c5d426797", size = 796708, upload-time = "2026-07-19T00:17:11.542Z" }, + { url = "https://files.pythonhosted.org/packages/78/b5/dc136af5629938a037cd2b304c12240e132ec92f38be8ff9cc89af2a1f2d/regex-2026.7.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:66bd62c59a5427746e8c44becae1d9b99d22fb13f30f492083dfb9ad7c45cc18", size = 865651, upload-time = "2026-07-19T00:17:13.312Z" }, + { url = "https://files.pythonhosted.org/packages/e0/75/67402ae3cd9c8c988a4c805d15ee3eef015e7ca4cb112cf3e640fc1f4153/regex-2026.7.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1649eb39fcc9ea80c4d2f110fde2b8ab2aef3877b98f02ab9b14e961f418c511", size = 911756, upload-time = "2026-07-19T00:17:15.015Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8e/096d00c7c480ef2ff4265349b14e2261d4ab787ba1f74e2e80d1c58079c3/regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dce8ec9695f531a1b8a6f314fd4b393adcccf2ea861db480cdf97a301d01a68", size = 801798, upload-time = "2026-07-19T00:17:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/41/e7ecac6edb5722417f85cc67eaf386322fbe8acf6918ec2fdc37c20dd9d0/regex-2026.7.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3080a7fd38ef049bd489e01c970c97dd84ff446a885b0f1f6b26d9b1ad13ce11", size = 776933, upload-time = "2026-07-19T00:17:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/6f/69/03c9b3f058d66403e0ca2c938696e81d51cd4c6d47ec5265f02f96948d9a/regex-2026.7.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d793a7988e04fcb1e2e135567443d82173225d657419ec09414a9b5a145b986", size = 784338, upload-time = "2026-07-19T00:17:21.057Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f7/b38ab3d43f284afbb618fcd15d0e77eb786ae461ce1f6bc7494619ddc0f2/regex-2026.7.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e8b0abe7d870f53ca5143895fef7d1041a0c831a140d3dc2c760dd7ba25d4a8b", size = 860452, upload-time = "2026-07-19T00:17:23.119Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/ff60ef0571121714f3cf9920bc183071e384a10b556d042e0fdb06cc07a5/regex-2026.7.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4e5413bd5f13d3a4e3539ca98f70f75e7fca92518dd7f117f030ebedd10b60cb", size = 765958, upload-time = "2026-07-19T00:17:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0f/bd34021162c0ab47f9a315bd56cd5642e920c8e5668a75ef6c6a6fca590d/regex-2026.7.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:73b133a9e6fb512858e7f065e96f1180aa46646bc74a83aea62f1d314f3dd035", size = 851765, upload-time = "2026-07-19T00:17:26.993Z" }, + { url = "https://files.pythonhosted.org/packages/2a/20/a2ca43edade0595cccfdc98636739f536d9e26898e7dbddc2b9e98898953/regex-2026.7.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbe6493fbd27321b1d1f2dd4f5c7e5bd4d8b1d7cab7f32fd67db3d0b2ed8248a", size = 789714, upload-time = "2026-07-19T00:17:28.699Z" }, + { url = "https://files.pythonhosted.org/packages/5d/47/e02db4015d424fc83c00ea0ac8c5e5ec14397943de9abf909d5ce3a25931/regex-2026.7.19-cp312-cp312-win32.whl", hash = "sha256:ddd67571c10869f65a5d7dde536d1e066e306cc90de57d7de4d5f34802428bb5", size = 267157, upload-time = "2026-07-19T00:17:31.051Z" }, + { url = "https://files.pythonhosted.org/packages/08/8e/c780c131f79b42ed22d1bd7da4096c2c35f813e835acd02ef0f018bd892c/regex-2026.7.19-cp312-cp312-win_amd64.whl", hash = "sha256:e30d40268a28d54ce0437031750497004c22602b8e3ab891f759b795a003b312", size = 277777, upload-time = "2026-07-19T00:17:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3d/84165e4299ff76f3a40fe1f2abf939e976f693383a08d2beea6af62bd2c1/regex-2026.7.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f035d9dc1d25eff9d361456572231c7d27b5ccd473ca7dc0adfce732bd006d40", size = 496552, upload-time = "2026-07-19T00:17:36.808Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/a65293e6e4cf28eb7ee1be5335a5386c40d6742e9f47fafc8fec785e16c7/regex-2026.7.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42572142ed0b9d5d261ba727157c426510da78e20828b66bbb855098b8a4e38", size = 296983, upload-time = "2026-07-19T00:17:38.816Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/2d0564e93d87bc48618360ddca232a2ca612bbdf53ce8465d45ca5ce14ee/regex-2026.7.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40b34dd88658e4fedd2fddbf0275ac970d00614b731357f425722a3ed1983d11", size = 291832, upload-time = "2026-07-19T00:17:40.726Z" }, + { url = "https://files.pythonhosted.org/packages/07/cd/42dfbabff3dfc9603c501c0e2e2c5adbb09d127b267bf5348de0af338c15/regex-2026.7.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c41c63992bf1874cebb6e7f56fd7d3c007924659a604ae3d90e427d40d4fd13", size = 796775, upload-time = "2026-07-19T00:17:42.382Z" }, + { url = "https://files.pythonhosted.org/packages/df/5d/f6a4839f2b934e3eed5973fd07f5929ee97d4c98939fb275ea23c274ee16/regex-2026.7.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d3372064506b94dd2c67c845f2db8062e9e9ba84d04e33cb96d7d33c11fe1ae", size = 865687, upload-time = "2026-07-19T00:17:44.185Z" }, + { url = "https://files.pythonhosted.org/packages/14/b0/b47d6c36049bc59806a50bd4c86ced70bbe058d787f80281b1d7a9b0e024/regex-2026.7.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fce7760bf283405b2c7999cab3da4e72f7deca6396013115e3f7a955db9760da", size = 911962, upload-time = "2026-07-19T00:17:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/2a/be/ff61f28f9273658cfe23acbbac5217221f6519960ed401e61dfdab12bc35/regex-2026.7.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0d702548d89d572b2929879bc883bb7a4c4709efafe4512cadee56c55c9bd15", size = 801817, upload-time = "2026-07-19T00:17:48.25Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bb/8b4f7f26b333f9f79e1b453613c39bb4776f51d38ae66dd0ba31d6b354ca/regex-2026.7.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d446c6ac40bb6e05025ccee55b84d80fe9bf8e93010ffc4bb9484f13d498835f", size = 776908, upload-time = "2026-07-19T00:17:50.183Z" }, + { url = "https://files.pythonhosted.org/packages/09/13/610110fc5921d380516d03c26b652555f08aa0d23ea78a771231873c3638/regex-2026.7.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c3501bfa814ab07b5580741f9bf78dfdfe146a04057f82df9e2402d2a975939", size = 784426, upload-time = "2026-07-19T00:17:52.454Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f5/1ef9e2a83a5947c57ebff0b377cb5727c3d5ec1992317a320d035cd0dbb6/regex-2026.7.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c4585c3e64b4f9e583b4d2683f18f5d5d872b3d71dcf24594b74ecc23602fa96", size = 860600, upload-time = "2026-07-19T00:17:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/a0/02/073af33a3ec149241d11c80acea91e722aa0adbf05addd50f251c4fe89c3/regex-2026.7.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:571fde9741eb0ccde23dd4e0c1d50fbae910e901fa7e629faf39b2dda740d220", size = 765950, upload-time = "2026-07-19T00:17:56.041Z" }, + { url = "https://files.pythonhosted.org/packages/81/a9/d1e9f819dc394a568ef370cd56cf25394e957a2235f8370f23b576e5a475/regex-2026.7.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:15b364b9b98d6d2fe1a85034c23a3180ff913f46caddc3895f6fd65186255ccc", size = 851794, upload-time = "2026-07-19T00:17:57.897Z" }, + { url = "https://files.pythonhosted.org/packages/03/3a/8ae83eda7579feacdf984e71fb9e70635fb6f832eeddca58427ec4fca926/regex-2026.7.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffd8893ccc1c2fce6e0d6ca402d716fe1b29db70c7132609a05955e31b2aa8f2", size = 789845, upload-time = "2026-07-19T00:17:59.97Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/c195cbfe5a75fdec64d8f6554fd15237b837919d2c61bdc141d7c807b08b/regex-2026.7.19-cp313-cp313-win32.whl", hash = "sha256:f0fa4fa9c3632d708742baf2282f2055c11d888a790362670a403cbf48a2c404", size = 267135, upload-time = "2026-07-19T00:18:01.958Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/a11de8404b7272b70acb45c1c05987cce60b45d5693da2e176f0e390d564/regex-2026.7.19-cp313-cp313-win_amd64.whl", hash = "sha256:d51ffd3427640fa2da6ade574ceba932f210ad095f65fcc450a2b0a0d454868e", size = 277747, upload-time = "2026-07-19T00:18:04.121Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/0f5c8eff1b4f1f3d83276d365fccecf666afcc7d947420943bf394d07adb/regex-2026.7.19-cp313-cp313-win_arm64.whl", hash = "sha256:c670fe7be5b6020b76bc6e8d2196074657e1327595bca93a389e1a76ab130ad8", size = 277129, upload-time = "2026-07-19T00:18:05.821Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4c/44b74742052cedda40f9ae469532a037112f7311a36669a891fba8984bb0/regex-2026.7.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db47b561c9afd884baa1f96f797c9ca369872c4b65912bc691cfa99e68340af2", size = 501134, upload-time = "2026-07-19T00:18:07.567Z" }, + { url = "https://files.pythonhosted.org/packages/f0/45/bbd038b5e39ee5613a5a689290145b40058cc152c41de9cc23639d2b9734/regex-2026.7.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65dcd28d3eba2ab7c2fd906485cc301392b47cc2234790d27d4e4814e02cdfda", size = 299418, upload-time = "2026-07-19T00:18:09.38Z" }, + { url = "https://files.pythonhosted.org/packages/65/38/c5bde94b4cedfd5850d64c3f08222d8e1600e84f6ee71d9b44b4b8163f74/regex-2026.7.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f2e7f8e2ab6c2922be02c7ec45185aa5bd771e2e57b95455ee343a44d8130dff", size = 294486, upload-time = "2026-07-19T00:18:11.188Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6a/2f5e107cb26c960b781967178899daf2787a7ab151844ed3c01d6fc95474/regex-2026.7.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe31f28c94402043161876a258a9c6f757cb485905c7614ce8d6cd40e6b7bdc1", size = 811643, upload-time = "2026-07-19T00:18:12.975Z" }, + { url = "https://files.pythonhosted.org/packages/37/d4/a2f963406d7d73a62eed84ba05a258afb6cad1b21aa4517443ce40506b78/regex-2026.7.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f8f6fa298bb4f7f58a33334406218ba74716e68feddf5e4e54cd5d8082705abf", size = 871081, upload-time = "2026-07-19T00:18:14.733Z" }, + { url = "https://files.pythonhosted.org/packages/45/a3/44be546340bedb15f13063f5e7fe16793ea4d9ea2e805d09bd174ac27724/regex-2026.7.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cc1b2440423a851fad781309dd87843868f4f66a6bcd1ddb9225cf4ec2c84732", size = 917372, upload-time = "2026-07-19T00:18:16.724Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f6/e0870b0fd2a40dba0074e4b76e514b21313d37946c9248453e34ec43923e/regex-2026.7.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ac59a0900474a52b7c04af8196affc22bd9842acb0950df12f7b813e983609a", size = 816089, upload-time = "2026-07-19T00:18:18.617Z" }, + { url = "https://files.pythonhosted.org/packages/ae/27/957e8e22690ad6634572b39b71f130a6105f4d0718bb16849eac00fff147/regex-2026.7.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4896db1f4ce0576765b8272aa922df324e0f5b9bb2c3d03044ff32a7234a9aba", size = 785206, upload-time = "2026-07-19T00:18:20.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/a4/186e410941e731037c01166069ab86da9f65e8f8110c18009ccf4bd623ee/regex-2026.7.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4e6883a021db30511d9fb8cfb0f222ce1f2c369f7d4d8b0448f449a93ba0bdfc", size = 800431, upload-time = "2026-07-19T00:18:22.716Z" }, + { url = "https://files.pythonhosted.org/packages/73/9f/e4e10e023d291d64a33e246610b724493bf1ce98e0e59c9b7c837e5acfb7/regex-2026.7.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:09523a592938aa9f587fb74467c63ff0cf88fc3df14c82ab0f0517dcf76aaa62", size = 864906, upload-time = "2026-07-19T00:18:24.772Z" }, + { url = "https://files.pythonhosted.org/packages/24/57/ccb20b6be5f1f52a053d1ba2a8f7a077edb9d918248b8490d7506c6832b3/regex-2026.7.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1ebac3474b8589fce2f9b225b650afd61448f7c73a5d0255a10cc6366471aed1", size = 773559, upload-time = "2026-07-19T00:18:27.008Z" }, + { url = "https://files.pythonhosted.org/packages/a3/82/f3b263cf8fad927dc102891da8502e718b7ff9d19af7a2a07c03865d7188/regex-2026.7.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4a0530bb1b8c1c985e7e2122e2b4d3aedd8a3c21c6bfddae6767c4405668b56e", size = 857739, upload-time = "2026-07-19T00:18:29.107Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/1687bd1b6c2aed5e672ccf845fc11557821fe7366d921b50889ea5ce57bf/regex-2026.7.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef7eeb108c47ce7bcc9513e51bcb1bf57e8f483d52fce68a8642e3527141ae0", size = 804522, upload-time = "2026-07-19T00:18:31.362Z" }, + { url = "https://files.pythonhosted.org/packages/76/7c/cc4e7655181b2d9235b704f2c5e19d8eff002bbc437bae59baee0e381aca/regex-2026.7.19-cp313-cp313t-win32.whl", hash = "sha256:64b6ca7391a1395c2638dd5c7456d67bea44fc6c5e8e92c5dc8aa6a8f23292b4", size = 269141, upload-time = "2026-07-19T00:18:33.479Z" }, + { url = "https://files.pythonhosted.org/packages/bb/14/961b4c7b05a2391c32dbc85e27773076671ef8f97f36cec70fe414734c02/regex-2026.7.19-cp313-cp313t-win_amd64.whl", hash = "sha256:f04b9f56b0e0614c0126be12c2c2d9f8850c1e57af302bd0a63bed379d4af974", size = 280036, upload-time = "2026-07-19T00:18:35.419Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/795644550d788ddbb6dc458c95895f8009978ea6d6ea76b005eb3f45e8c9/regex-2026.7.19-cp313-cp313t-win_arm64.whl", hash = "sha256:fcee38cd8e5089d6d4f048ba1233b3ad76e5954f545382180889112ff5cb712d", size = 279394, upload-time = "2026-07-19T00:18:37.454Z" }, + { url = "https://files.pythonhosted.org/packages/d2/25/0c4c452f8ef3efe456745b2f33195f5904b573fb4c2ff3f0cb9ec188461e/regex-2026.7.19-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a81758ed242b861b72e778ba34d41366441a2e10b16b472784c88da2dea7e2dd", size = 496750, upload-time = "2026-07-19T00:18:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/24/9e/b70ca6c1704f6c7cd32a9e143c86cc5968d10981eca284bad670c245ea7d/regex-2026.7.19-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4aa5435cdb3eb6f55fe98a171b05e3fbcd95fadaa4aa32acf62afd9b0cfdbcac", size = 297093, upload-time = "2026-07-19T00:18:41.583Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/0b692da2520d51fbff19c88b83d97e4c702909dd02386c585998b7e2dbed/regex-2026.7.19-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:60be8693a1dadc210bbcbc0db3e26da5f7d01d1d5a3da594e99b4fa42df404f5", size = 292043, upload-time = "2026-07-19T00:18:43.347Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a7/1d478e614016045a33feae57446215f9fd65b665a5ceb2f891fb3183bc52/regex-2026.7.19-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d19662dbedbe783d323196312d38f5ba53cf56296378252171985da6899887d3", size = 797214, upload-time = "2026-07-19T00:18:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ae/11b9c9411d92c30e3d2db32df5a31133e4a99a8fc397a604fd08f6c4bffb/regex-2026.7.19-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d15df07081d91b76ff20d43f94592ee110330152d617b730fdbe5ef9fb680053", size = 866433, upload-time = "2026-07-19T00:18:47.315Z" }, + { url = "https://files.pythonhosted.org/packages/b1/62/2b2efc4992f91d6d204b24c647c9f9412e85379d92b7c0ab9fdae622327e/regex-2026.7.19-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:56ad4d9f77df871a99e25c37091052a02528ec0eb059de928ee33956b854b45b", size = 911360, upload-time = "2026-07-19T00:18:49.588Z" }, + { url = "https://files.pythonhosted.org/packages/14/71/986ceea9aa3da548bf1357cad89b63915ec6d21ec957c8113b29ece567df/regex-2026.7.19-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7322ec6cc9fba9d49ab888bb82d67ac5625627aa168f0165139b17018df3fb8a", size = 801275, upload-time = "2026-07-19T00:18:51.767Z" }, + { url = "https://files.pythonhosted.org/packages/15/be/ce9d9534b2cda96eab32c548261224b9b4e220a4126f098f60f42ae7b4cd/regex-2026.7.19-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9c7472192ebfad53a6be7c4a8bfb2d64b81c0e93a1fc8c57e1dd0b638297b5d1", size = 777131, upload-time = "2026-07-19T00:18:54.053Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/58b5c710f2c3929515a25f3a1ca0dad0dcd4518d4fff3cf23bc7adb8dcd2/regex-2026.7.19-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c10b82c2634df08dfb13b1f04e38fe310d086ee092f4f69c0c8da234251e556e", size = 785020, upload-time = "2026-07-19T00:18:56.579Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/5fe091935b74f15fe0f97998c215cae418d1c0413f6258c7d4d2e83aa37f/regex-2026.7.19-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:17ed5692f6acc4183e98331101a5f9e4f64d72fe58b753da4d444a2c77d05b12", size = 861263, upload-time = "2026-07-19T00:18:58.64Z" }, + { url = "https://files.pythonhosted.org/packages/d8/fa/d60bf82e10841eef62a9e32aac401468f05fddfbcb2942e342b1ba3d2433/regex-2026.7.19-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:22a992de9a0d91bda927bf02b94351d737a0302905432c88a53de7c4b9ce62e2", size = 766199, upload-time = "2026-07-19T00:19:00.705Z" }, + { url = "https://files.pythonhosted.org/packages/bf/5d/11e64d151b0662b81d6bf644c74dc118d461df85bdf2577fadbbf751788a/regex-2026.7.19-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:618a0aed532be87294c4477b0481f3aa0f1520f4014a4374dd4cf789b4cd2c97", size = 851317, upload-time = "2026-07-19T00:19:03.015Z" }, + { url = "https://files.pythonhosted.org/packages/7c/34/532efb87488d90807bae6a443d357ee5e2728a478c597619c8aaa17cc0bd/regex-2026.7.19-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ce9e679f776649746729b6c86382da519ef649c8e34cc41df0d2e5e0f6c36d4", size = 789557, upload-time = "2026-07-19T00:19:05.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/90/3a8d5ca977171ec3ae21a71207d2228b2663bde14d7f7ef0e6363ecf9290/regex-2026.7.19-cp314-cp314-win32.whl", hash = "sha256:73f272fba87b8ccfe70a137d02a54af386f6d27aa509fbffdd978f5947aae1aa", size = 272531, upload-time = "2026-07-19T00:19:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/96/e1/8862885e70409de70e8c005f57fb2e7be8d9ef0317250d60f4c9660a300d/regex-2026.7.19-cp314-cp314-win_amd64.whl", hash = "sha256:d721e53758b2cca74990185eb0671dd466d7a388a1a45d0c6f4c13cef41a68ac", size = 280831, upload-time = "2026-07-19T00:19:09.46Z" }, + { url = "https://files.pythonhosted.org/packages/08/82/2693e53e29f9104d9de95d37ce4dd826bd32d5f9c0085d3aa6ac042675c4/regex-2026.7.19-cp314-cp314-win_arm64.whl", hash = "sha256:65fa6cb38ed5e9c3637e68e544f598b39c3b86b808ed0627a67b68320384b459", size = 281099, upload-time = "2026-07-19T00:19:11.398Z" }, + { url = "https://files.pythonhosted.org/packages/92/b7/9a01aa16461a18cde9d7b9c3ab21e501db2ce33725f53014342b91df2b0a/regex-2026.7.19-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:5a2721c8720e2cb3c209925dfb9200199b4b07361c9e01d321719404b21458b3", size = 501121, upload-time = "2026-07-19T00:19:13.425Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/bbaeca815dc9191c424c94a4fdc5c87c75748a64a6271821212ebdd4e1a3/regex-2026.7.19-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:199535629f25caf89698039af3d1ad5fcae7f933e2112c73f1cdf49165c99518", size = 299415, upload-time = "2026-07-19T00:19:15.43Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d6/0dd1a321afaab95eb7ff44aa0f637301786f1dc71c6b797b9ed236ed8890/regex-2026.7.19-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9b60d7814174f059e5de4ab98271cc5ba9259cfea55273a81544dceea32dc8d9", size = 294483, upload-time = "2026-07-19T00:19:17.879Z" }, + { url = "https://files.pythonhosted.org/packages/92/5f/40bacf91d0904f812e13bbbab3864604c463eced8afdc54aeaa50492ea95/regex-2026.7.19-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbece16025afda5e3031af0c4059207e61dcf73ef13af844964f57f387d1c435", size = 811833, upload-time = "2026-07-19T00:19:20.102Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/4902744261f775aeede8b5627314b38482da29cf49a57b66a6fb753246c5/regex-2026.7.19-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d24ecb4f5e009ea0bd275ee37ad9953b32005e2e5e60f8bbae16da0dbbf0d3a0", size = 871270, upload-time = "2026-07-19T00:19:22.365Z" }, + { url = "https://files.pythonhosted.org/packages/16/70/6980c9be6bf21c0a60ed3e0aea39cf419ecf3b08d1d9947bc56e196ef186/regex-2026.7.19-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8cae6fd77a5b72dae505084b1a2ee0360139faf72fedbab667cd7cc65aae7a6a", size = 917534, upload-time = "2026-07-19T00:19:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/52/92/8b2bd872782ce8c42691e39acb38eb8efe014e5ddb78ad7d943d6f197ce9/regex-2026.7.19-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9724e6cb5e478cd7d8cabf027826178739cb18cf0e117d0e32814d479fa02276", size = 816135, upload-time = "2026-07-19T00:19:26.919Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/33a602f657bdc4041f17d79f92ab18261d255d91a06117a6e29df023e5e2/regex-2026.7.19-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:572fc57b0009c735ee56c175ea021b637a15551a312f56734277f923d6fd0f6c", size = 785492, upload-time = "2026-07-19T00:19:29.192Z" }, + { url = "https://files.pythonhosted.org/packages/9e/36/0987cf4cb271680064a70d24a475873775a151d0b7058698a006cb0cae4a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:20568e182eb82d39a6bf7cff3fd58566f14c75c6f74b2c8c96537eecf9010e3a", size = 800658, upload-time = "2026-07-19T00:19:31.392Z" }, + { url = "https://files.pythonhosted.org/packages/a8/24/c14f31c135e1ba55fa4f9a58ca98d0842512bf6188230763c31c8f449e3b/regex-2026.7.19-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:1d58561843f0ff7dc78b4c28b5e2dc388f3eff94ebc8a232a3adba961fc00009", size = 865073, upload-time = "2026-07-19T00:19:33.485Z" }, + { url = "https://files.pythonhosted.org/packages/14/85/181a12211f22469f24d2de1ebddfe397d2396e2c29013b9a58134a91069a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:61bb1bd45520aacd56dd80943bd34991fb5350afdd1f36f2282230fd5154a218", size = 773684, upload-time = "2026-07-19T00:19:35.599Z" }, + { url = "https://files.pythonhosted.org/packages/23/58/bd1a0c1a62251366f8d21f41b1ea3c76994962071b8b6ea42f72d505c0f0/regex-2026.7.19-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:cd3584591ea4429026cdb931b054342c2bcf189b44ff367f8d5c15bc092a2966", size = 857769, upload-time = "2026-07-19T00:19:37.738Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4f/f7e2dad6756b2fe1fe75dd90a628c3b45f249d39f948dd90cd2476325417/regex-2026.7.19-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cc26a66e212fa5d6c6170c3a40d99d888db3020c6fdab1523250d4341382e44", size = 804546, upload-time = "2026-07-19T00:19:40.229Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d7/01d31d5bdb09bc026fab77f59a371fdf8f9b292e4810546c56182ca70498/regex-2026.7.19-cp314-cp314t-win32.whl", hash = "sha256:2c4e61e2e1be56f63ec3cc618aa9e0de81ef6f43d177205451840022e24f5b78", size = 274526, upload-time = "2026-07-19T00:19:42.398Z" }, + { url = "https://files.pythonhosted.org/packages/52/0e/cea4ce73bc0a8247a0748228ae6669984c7e1f8134b6fa66e59c0572e0ea/regex-2026.7.19-cp314-cp314t-win_amd64.whl", hash = "sha256:c639ea314df70a7b2811e8020448c75af8c9445f5a60f8a4ced81c306a9380c2", size = 283763, upload-time = "2026-07-19T00:19:44.644Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b6/26e41975febae63b7a6e3e02f32cff6cff2e4f10d19c929082f56aebf7c6/regex-2026.7.19-cp314-cp314t-win_arm64.whl", hash = "sha256:9a15e785f244f3e07847b984ce8773fc3da10a9f3c131cc49a4c5b4d672b4547", size = 283451, upload-time = "2026-07-19T00:19:46.639Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "semantic-version" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, +] + +[[package]] +name = "setuptools" +version = "84.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, +] + +[[package]] +name = "setuptools-rust" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "semantic-version" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/ba/b31781d61bf9ee3c232a1d1160db11c11cdeae1d44e06c90723b25a8279f/setuptools_rust-1.13.0.tar.gz", hash = "sha256:f2afcf4baeee689910ce49cfa8aad4e08cce72f417449bcc32891b8664fdc726", size = 314100, upload-time = "2026-06-27T21:45:02.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/80/909e46e684e47b116ed145bf2a1a8f5f7c9d90e8c3f8f7fce6a529c0068d/setuptools_rust-1.13.0-py3-none-any.whl", hash = "sha256:666439c4d90e968bb625bcf87ec0aa02b4f49e599d2f5dc255c633a04e8eca99", size = 30536, upload-time = "2026-06-27T21:45:01.583Z" }, +] + +[[package]] +name = "tiktoken" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/4c/1bc81f4cd53e827c4ee67ca951b5935724716049452d8dfa09b8b82372bb/tiktoken-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7bfe1849caa65d1e1d9871817170ec497bbb7984e182012e1bdce72f66608cdb", size = 1036353, upload-time = "2026-05-15T04:50:21.757Z" }, + { url = "https://files.pythonhosted.org/packages/75/91/10b9c7076bc02c246c853201fdbbe300a4b8c5ed7b84c25f7403f4e32655/tiktoken-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26", size = 984644, upload-time = "2026-05-15T04:50:23.256Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e4/fceae98015fab47fcd49b8bd7f46145bcd187a47e0add1e5378ed67ef980/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4", size = 1119261, upload-time = "2026-05-15T04:50:24.348Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/fe42ad00de01a8c4a49ad8649a2c8a316835a9cad5961b11d21eac0020a5/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173", size = 1138253, upload-time = "2026-05-15T04:50:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/ccee1ecccca107e9a16efcecdeeb964c325305038554d466ece65b42338f/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff", size = 1185747, upload-time = "2026-05-15T04:50:27.02Z" }, + { url = "https://files.pythonhosted.org/packages/9d/03/cd0cba295522b91eb55c6b2704f1df895f8226cfe60ab10d4d51d0cc9e69/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed", size = 1241265, upload-time = "2026-05-15T04:50:28.815Z" }, + { url = "https://files.pythonhosted.org/packages/7e/25/a10efd564402d82c2ff50d12057353ace447aa8007deceaa48641f63d35c/tiktoken-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc1c44cd37b43fc46bae593129164f4f281e82ea116b57a85aa81bda57eafc94", size = 876509, upload-time = "2026-05-15T04:50:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/85/8e/144bde4e01df66b34bb865557c7cd754ed08b036217ebd79c9db5e9048a9/tiktoken-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:32ac870a806cfb260a02d0cb70426aef02e038297f8ad50df5040bb5af360791", size = 1034888, upload-time = "2026-05-15T04:50:31.579Z" }, + { url = "https://files.pythonhosted.org/packages/36/18/d4ac9d20956cdebca04841316660ed584c2fecdc2b81722a28bc7ad3b1e4/tiktoken-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b", size = 982970, upload-time = "2026-05-15T04:50:32.961Z" }, + { url = "https://files.pythonhosted.org/packages/74/ed/6bb8d05b9f731f749fee5c6f5ca63e981143c826a5985877330507bd13b7/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7", size = 1115741, upload-time = "2026-05-15T04:50:34.475Z" }, + { url = "https://files.pythonhosted.org/packages/34/de/2ca96b07a82d972b74fe4b46de055b79c904e45c7eab699354a0bfa697dc/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649", size = 1136523, upload-time = "2026-05-15T04:50:35.782Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/9dafec002c2d4424378563cf4cf5c7fb93631d2a55013c8b87554ee4012c/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b", size = 1181954, upload-time = "2026-05-15T04:50:36.99Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d0/1f8578c45b2f24759b46f0b50d31878c63c73e6bf0f2227e10ec5c5408dc/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91", size = 1240069, upload-time = "2026-05-15T04:50:38.221Z" }, + { url = "https://files.pythonhosted.org/packages/aa/90/28d7f154888610aa9237e541986beb62b479df29d193a5a0617dbb1514d0/tiktoken-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f2d16e7a7c783ad81f36e457d046d1f1c8af70b22aec8a13238efe531977c41", size = 874748, upload-time = "2026-05-15T04:50:39.587Z" }, + { url = "https://files.pythonhosted.org/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228, upload-time = "2026-05-15T04:50:40.988Z" }, + { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978, upload-time = "2026-05-15T04:50:42.195Z" }, + { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355, upload-time = "2026-05-15T04:50:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772, upload-time = "2026-05-15T04:50:44.782Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415, upload-time = "2026-05-15T04:50:46.422Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879, upload-time = "2026-05-15T04:50:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829, upload-time = "2026-05-15T04:50:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600, upload-time = "2026-05-15T04:50:50.4Z" }, + { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516, upload-time = "2026-05-15T04:50:52.03Z" }, + { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518, upload-time = "2026-05-15T04:50:53.543Z" }, + { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867, upload-time = "2026-05-15T04:50:55.191Z" }, + { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826, upload-time = "2026-05-15T04:50:56.296Z" }, + { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, + { url = "https://files.pythonhosted.org/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820, upload-time = "2026-05-15T04:50:59.528Z" }, + { url = "https://files.pythonhosted.org/packages/8c/93/0dd6adca026a616c3a92974566b43381eea4b475ce1f36c062b8271a9ac5/tiktoken-0.13.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaaaef47c2406277181d2086484c317bf7fc433e2d5d03ff94f56b0dcec87471", size = 1034977, upload-time = "2026-05-15T04:51:00.957Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5ec6e6bc5b30bed6d93f7f2162d8f6b32437b3ba27cb527cfe004f6109c9/tiktoken-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ca8b310bd93b3772cb1b7922d915446864860f562bdfe4825c63a0aed3fb28cd", size = 983635, upload-time = "2026-05-15T04:51:02.629Z" }, + { url = "https://files.pythonhosted.org/packages/94/b0/c8ae9aff00d625c50659b4513e707a0462c4bf5d4d6cc1b802103225c02e/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:32e0c12305105002c047b3bb1070b0dd9a73b0cb3b2856a8972b810e7a4f5881", size = 1116036, upload-time = "2026-05-15T04:51:04.082Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ac/6a5dddd1d0a6018ecb389bd0353e6b4a515eb4d2286611bd0ace1937b9e1/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:5ba5fd62507a932d1241346179e3b39bc7bf7408f03c272652d93b3bedf5db24", size = 1135544, upload-time = "2026-05-15T04:51:05.229Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b8/585032b4384b2f7dcdaddcb52865c83a701a420d09e3c2b4a2be1c450c57/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d108bc2d470fc53c8ecd24f2c0fd2b5f98c33e87cdb6aa2e9b8c5dced703d273", size = 1182217, upload-time = "2026-05-15T04:51:06.517Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b6/993ff1ded3958215fd341a847b8e5ffeb5de473f435296870d314fc91ac4/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb99cb5127449f58d0a2d5f5ccfb390d8dbdfd919c221246caaee29d8725ed51", size = 1239404, upload-time = "2026-05-15T04:51:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3d/fef7e06e3b33e7538db0ced734cf9fe23b6832d2ac4990c119c377aec55e/tiktoken-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:115c4f26ffa11caac8b54eea35c2ad38c612c20a48d35dd15d70a02ac6f51f58", size = 918686, upload-time = "2026-05-15T04:51:08.925Z" }, + { url = "https://files.pythonhosted.org/packages/c1/82/a7fc44582bc32ab00de988a2299bf77c077f59068b233109e34b7d6ca7e6/tiktoken-0.13.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:472527e9132952f2fbf77cd290658bacf003d4d5a3fabc18e5fbd407cbae4d9b", size = 1034454, upload-time = "2026-05-15T04:51:10.035Z" }, + { url = "https://files.pythonhosted.org/packages/37/d0/24d8a890c14f432a05cea669c17bebeaa99f96a7c79523b590f564246411/tiktoken-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e2f67d27c9626cdd25fe33d9313c5cdb3d8d82da646b68d6eb8e7e9c20e6448", size = 982976, upload-time = "2026-05-15T04:51:11.23Z" }, + { url = "https://files.pythonhosted.org/packages/49/b7/2ab43f62788a9266187a9bfc1d3af99ad83e5eaa25fbef168a69cd5ad14f/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2b920b35805cd64585a37c3dc7ce65fba4d2d36016be01e1d7942482ca29093a", size = 1115526, upload-time = "2026-05-15T04:51:12.608Z" }, + { url = "https://files.pythonhosted.org/packages/64/39/1494321ed323ce7a14d88e3cd6cb9058625977df1c6961ddc492bd10a9f3/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:493af3aa28a4aaf2e3d2600a2ee717252c9bf5ab38fff94eb5a02db5ab77e5ad", size = 1136466, upload-time = "2026-05-15T04:51:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/96/d9/dfd086aa2d918c563a140720e0ce296cada1634efd2783d5cf51e05f984e/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6644c9c2b5cf3916f5a3641d7d12fdb3f006a7b3d9ff6acdaec44e29ab1ff91e", size = 1181863, upload-time = "2026-05-15T04:51:15.025Z" }, + { url = "https://files.pythonhosted.org/packages/2f/68/a18b4f307086954fdae32714cb4f85562e34f9d34ab206e61f1816aa6018/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cb65b60b9408563676d874a3a4ee573370066f0dc4e29d84e82e989c6517424", size = 1239218, upload-time = "2026-05-15T04:51:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/16/5b/f2aa703a4fc5d2dff73460a7d46cc2f3f44aa0f3dd8eeb20d2a0ecf68862/tiktoken-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:85b78cc3a2c3d48723ca751fa981f1fedccd54194ca0471b957364353a898b07", size = 918110, upload-time = "2026-05-15T04:51:17.237Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "wheel" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/20/50ed6bdf27dec98b568a8ae25dc599f35baa3d9709f9e83fd1edb56b9a90/wheel-0.48.0.tar.gz", hash = "sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322", size = 66471, upload-time = "2026-08-11T22:02:27.327Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/29/69cfbb602cd91690c55d38ba9fe53e6a7e76a6fa647bf38f19c138d25449/wheel-0.48.0-py3-none-any.whl", hash = "sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab", size = 33320, upload-time = "2026-08-11T22:02:26.1Z" }, +] diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index 28bb8a09b..94ddaa261 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -275,13 +275,14 @@ def _parse_projects(module_ctx, hub_specs): override.toolchains or override.env or override.config_settings or + override.cargo_lock or override.monitor_memory or override.resource_set != "default" ) if has_target and has_modifications: fail("uv.override_package() for '{}': `target` is mutually exclusive with modification attributes. Use `target` for full replacement OR build, patch, and data attributes for modifications, not both.".format(override.name)) if not has_target and not has_modifications: - fail("uv.override_package() for '{}': must specify either `target` for full replacement or at least one modification attribute (console_scripts, pre_build_patches, post_install_patches, exclude_glob, extra_deps, extra_data, toolchains, env, monitor_memory, resource_set).".format(override.name)) + fail("uv.override_package() for '{}': must specify either `target` for full replacement or at least one modification attribute (console_scripts, pre_build_patches, post_install_patches, exclude_glob, extra_deps, extra_data, toolchains, env, config_settings, cargo_lock, monitor_memory, resource_set).".format(override.name)) unscoped_matches = {i: 0 for i, override in enumerate(mod.tags.override_package) if override.lock == None} @@ -534,6 +535,7 @@ def _parse_projects(module_ctx, hub_specs): monitor_memory = pkg_override.monitor_memory, pre_build_patches = pkg_override.pre_build_patches, pre_build_patch_strip = pkg_override.pre_build_patch_strip, + cargo_lock = pkg_override.cargo_lock, supported = [], toolchains = pkg_override.toolchains, ) @@ -584,12 +586,14 @@ def _parse_projects(module_ctx, hub_specs): extra_toolchains = [] extra_env = {} config_settings = {} + cargo_lock = None monitor_memory = False resource_set = "default" if pkg_override: extra_toolchains = [str(t) for t in pkg_override.toolchains] extra_env = pkg_override.env config_settings = pkg_override.config_settings + cargo_lock = pkg_override.cargo_lock monitor_memory = pkg_override.monitor_memory resource_set = pkg_override.resource_set @@ -605,6 +609,7 @@ def _parse_projects(module_ctx, hub_specs): extra_toolchains = extra_toolchains, extra_env = extra_env, config_settings = config_settings, + cargo_lock = cargo_lock, monitor_memory = monitor_memory, resource_set = resource_set, rust_toolchain = project.rust_toolchain, @@ -886,6 +891,8 @@ def _uv_impl(module_ctx): sbuild_kwargs["extra_env"] = sbuild_cfg.extra_env if sbuild_cfg.config_settings: sbuild_kwargs["config_settings"] = sbuild_cfg.config_settings + if sbuild_cfg.cargo_lock: + sbuild_kwargs["cargo_lock"] = sbuild_cfg.cargo_lock if sbuild_cfg.rust_toolchain: sbuild_kwargs["rust_toolchain"] = sbuild_cfg.rust_toolchain if sbuild_cfg.monitor_memory: @@ -1033,6 +1040,10 @@ _override_package_tag = tag_class( default = {}, doc = "Extra environment variables merged into the build action's `env` dict. Values may reference $(VAR) make-variables sourced from extra `toolchains` listed above. Prefix an execroot-relative path with `$(EXECROOT)/` so it remains valid after the backend changes into the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the configured C++ action tools.", ), + "cargo_lock": attr.label( + allow_single_file = True, + doc = "Cargo.lock for a Rust sdist that ships none. Its crates.io entries are vendored while the repository is generated and the file is placed next to the sdist's Cargo.toml before the build, so cargo builds offline. Requires the project's `rust_toolchain`.", + ), "config_settings": attr.string_list_dict( default = {}, doc = "PEP 517 `config_settings` for this package's build backend. Each key maps to a list of values: a single value reaches the backend as a string, several as a list. Keys and their meaning are defined by the backend, e.g. `{\"setup-args\": [\"-Dblas=none\"]}` for meson-python or `{\"cmake.define.FOO\": [\"1\"]}` for scikit-build-core. Applies to pure and native source builds.", diff --git a/uv/private/pep517_whl/pep517_native_whl.bzl b/uv/private/pep517_whl/pep517_native_whl.bzl index 89d092117..46a5f35dd 100644 --- a/uv/private/pep517_whl/pep517_native_whl.bzl +++ b/uv/private/pep517_whl/pep517_native_whl.bzl @@ -251,6 +251,15 @@ cross_identity_test_util = struct( target_python_artifacts = _target_python_artifacts, ) +def _vendor_dir(files): + """The `vendor/` root shared by the vendored crate files, from any one of them.""" + for f in files.to_list(): + marker = "/vendor/" + idx = f.path.find(marker) + if idx != -1: + return f.path[:idx + len(marker) - 1] + return None + def _pep517_native_whl(ctx): archive = ctx.file.src @@ -310,6 +319,16 @@ def _pep517_native_whl(ctx): env[_INFER_CXX_COMPANION] = "1" cross_args = [] + cargo_args = [] + if ctx.attr.vendored_crates: + vendored = ctx.attr.vendored_crates[DefaultInfo].files + extra_inputs.append(vendored) + vendor_dir = _vendor_dir(vendored) + if vendor_dir: + cargo_args = ["--cargo-vendor-dir", vendor_dir] + if ctx.file.cargo_lock: + extra_inputs.append(depset([ctx.file.cargo_lock])) + cargo_args = cargo_args + ["--cargo-lock", ctx.file.cargo_lock.path] if cross: cc_toolchain = cc_toolchain_raw if hasattr(cc_toolchain, "cc_provider_in_toolchain") and hasattr(cc_toolchain, "cc"): @@ -373,7 +392,7 @@ def _pep517_native_whl(ctx): progress_message = "Native source compiling {} to a whl".format(archive.basename), executable = tool, toolchain = None, - arguments = ctx.attr.args + [patch_args] + memory_args(ctx) + config_setting_args(ctx) + cross_args + [ + arguments = ctx.attr.args + [patch_args] + memory_args(ctx) + config_setting_args(ctx) + cross_args + cargo_args + [ "--execroot-marker", _EXECROOT_MARKER, archive.path, @@ -423,6 +442,16 @@ constraints of the target platform. "the unpacked source tree. Omit CC/CXX/AR/LD/STRIP to use the " + "configured C++ action tools.", ), + "cargo_lock": attr.label( + allow_single_file = True, + doc = "Cargo.lock placed next to the sdist's Cargo.toml before the build, replacing the sdist's own if any.", + ), + "vendored_crates": attr.label( + allow_files = True, + doc = "A cargo vendor directory (one subdirectory per crate, each with its " + + "`.cargo-checksum.json`), as sdist_build materializes it from the sdist's " + + "Cargo.lock. The build runs cargo offline against it.", + ), "_platform_libc": attr.label( default = "//uv/private/constraints/platform:platform_libc", doc = "Read in cross mode to pick the rust target triple (gnu vs musl).", diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index 3d356bf19..a030af921 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -34,6 +34,7 @@ load( "pep517_native_whl_derived_env_test", "pep517_native_whl_execroot_collision_test", "pep517_native_whl_toolchain_env_test", + "pep517_native_whl_vendored_crates_test", "pep517_whl_console_scripts_test", "python_host_platform_test", "rust_host_sysroot_test", @@ -412,6 +413,29 @@ pep517_native_whl_derived_env_test( target_under_test = ":__derived_rust_env_fixture", ) +# sdist_build's vendor directory shape: one subdirectory per crate with its +# .cargo-checksum.json. The rule must hand the helper the vendor root and +# ship every file as an action input. +filegroup( + name = "__vendored_crates", + srcs = glob(["vendor/**"]), +) + +pep517_native_whl( + name = "__vendored_crates_fixture", + src = ":__stub_sdist", + cargo_lock = "Cargo.lock", + tags = ["manual"], + tool = ":__stub_tool", + vendored_crates = ":__vendored_crates", + version = "0.0.1", +) + +pep517_native_whl_vendored_crates_test( + name = "vendored_crates_test", + target_under_test = ":__vendored_crates_fixture", +) + execroot_collision_toolchain(name = "__execroot_collision_toolchain") pep517_native_whl( diff --git a/uv/private/pep517_whl/tests/Cargo.lock b/uv/private/pep517_whl/tests/Cargo.lock new file mode 100644 index 000000000..6c2d4a188 --- /dev/null +++ b/uv/private/pep517_whl/tests/Cargo.lock @@ -0,0 +1,5 @@ +version = 4 + +[[package]] +name = "fixture" +version = "0.0.1" diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 3b65ff520..ae1cfd910 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -788,6 +788,66 @@ def test_target_sysroot_from_toolchain_wins_over_rustc_location(self) -> None: self.assertTrue(path.islink(path.join(merged, "x86_64-unknown-linux-gnu"))) +class InjectCargoLockTest(unittest.TestCase): + def _tree(self, manifest_rel: str) -> tuple[str, str]: + tmp = tempfile.mkdtemp() + manifest = path.join(tmp, "worktree", manifest_rel) + makedirs(path.dirname(manifest), exist_ok=True) + open(manifest, "w").close() + lock = path.join(tmp, "user.Cargo.lock") + with open(lock, "w") as f: + f.write("version = 4\n") + return path.join(tmp, "worktree"), lock + + def test_lock_lands_next_to_the_root_manifest(self) -> None: + worktree, lock = self._tree("Cargo.toml") + dest = build_helper._inject_cargo_lock(worktree, lock) + self.assertEqual(path.join(worktree, "Cargo.lock"), dest) + with open(dest) as f: + self.assertEqual("version = 4\n", f.read()) + + def test_nested_manifest_is_found_at_any_depth(self) -> None: + # bcrypt keeps its crate under src/_bcrypt/. + worktree, lock = self._tree(path.join("src", "_bcrypt", "Cargo.toml")) + self.assertEqual(path.join(worktree, "src", "_bcrypt", "Cargo.lock"), build_helper._inject_cargo_lock(worktree, lock)) + + def test_shallowest_manifest_wins(self) -> None: + worktree, lock = self._tree("Cargo.toml") + deeper = path.join(worktree, "vendor", "dep", "Cargo.toml") + makedirs(path.dirname(deeper)) + open(deeper, "w").close() + self.assertEqual(path.join(worktree, "Cargo.lock"), build_helper._inject_cargo_lock(worktree, lock)) + + def test_no_manifest_no_copy(self) -> None: + worktree = tempfile.mkdtemp() + self.assertIsNone(build_helper._inject_cargo_lock(worktree, "/nonexistent/Cargo.lock")) + self.assertIsNone(build_helper._inject_cargo_lock(worktree, "")) + + +class CargoOfflineTest(unittest.TestCase): + def test_vendor_dir_replaces_crates_io_and_forbids_network(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "CARGO_HOME": path.join(tmp, ".cargo_home")} + build_helper._configure_cargo_offline(env, "/exec/external/repo/vendor") + with open(path.join(tmp, ".cargo_home", "config.toml")) as f: + config = f.read() + self.assertIn('[source.crates-io]\nreplace-with = "vendored-sources"', config) + self.assertIn('[source.vendored-sources]\ndirectory = "/exec/external/repo/vendor"', config) + self.assertEqual("true", env["CARGO_NET_OFFLINE"]) + + def test_no_cargo_home_means_no_cargo(self) -> None: + env = {"RUSTC": "/usr/bin/rustc"} + build_helper._configure_cargo_offline(env, "/vendor") + self.assertNotIn("CARGO_NET_OFFLINE", env) + + def test_no_vendor_dir_leaves_cargo_online(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "CARGO_HOME": tmp} + build_helper._configure_cargo_offline(env, "") + self.assertNotIn("CARGO_NET_OFFLINE", env) + self.assertFalse(path.exists(path.join(tmp, "config.toml"))) + + class CargoNativeEnvTest(unittest.TestCase): def test_rustc_gets_the_toolchain_sysroot(self) -> None: tmp = tempfile.mkdtemp() diff --git a/uv/private/pep517_whl/tests/pep517_whl_test.bzl b/uv/private/pep517_whl/tests/pep517_whl_test.bzl index 794ad056f..36007ffaf 100644 --- a/uv/private/pep517_whl/tests/pep517_whl_test.bzl +++ b/uv/private/pep517_whl/tests/pep517_whl_test.bzl @@ -400,3 +400,29 @@ def _rust_host_sysroot_test_impl(ctx): return analysistest.end(env) rust_host_sysroot_test = analysistest.make(_rust_host_sysroot_test_impl) + +def _vendored_crates_test_impl(ctx): + env = analysistest.begin(ctx) + target = analysistest.target_under_test(env) + actions = [a for a in target.actions if a.mnemonic == "PySdistNativeBuild"] + asserts.equals(env, 1, len(actions), "expected exactly one PySdistNativeBuild action") + if actions: + argv = list(actions[0].argv) + asserts.true(env, "--cargo-vendor-dir" in argv, "the vendor dir must reach the helper; got: {}".format(argv)) + if "--cargo-vendor-dir" in argv: + vendor_dir = argv[argv.index("--cargo-vendor-dir") + 1] + asserts.true(env, vendor_dir.endswith("/tests/vendor"), "the vendor root, not a crate file; got: " + vendor_dir) + inputs = [f.path for f in actions[0].inputs.to_list()] + asserts.true( + env, + any([p.endswith("/vendor/fake-0.1.0/.cargo-checksum.json") for p in inputs]), + "vendored crate files must be action inputs", + ) + asserts.true(env, "--cargo-lock" in argv, "the supplied Cargo.lock must reach the helper; got: {}".format(argv)) + if "--cargo-lock" in argv: + lock = argv[argv.index("--cargo-lock") + 1] + asserts.true(env, lock.endswith("/tests/Cargo.lock"), "got: " + lock) + asserts.true(env, lock in inputs, "the Cargo.lock must be an action input") + return analysistest.end(env) + +pep517_native_whl_vendored_crates_test = analysistest.make(_vendored_crates_test_impl) diff --git a/uv/private/pep517_whl/tests/vendor/fake-0.1.0/.cargo-checksum.json b/uv/private/pep517_whl/tests/vendor/fake-0.1.0/.cargo-checksum.json new file mode 100644 index 000000000..7d32cc001 --- /dev/null +++ b/uv/private/pep517_whl/tests/vendor/fake-0.1.0/.cargo-checksum.json @@ -0,0 +1 @@ +{"package": "0000", "files": {}} diff --git a/uv/private/pep517_whl/tests/vendor/fake-0.1.0/Cargo.toml b/uv/private/pep517_whl/tests/vendor/fake-0.1.0/Cargo.toml new file mode 100644 index 000000000..ef0c7d700 --- /dev/null +++ b/uv/private/pep517_whl/tests/vendor/fake-0.1.0/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "fake" +version = "0.1.0" diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index f66cc5f9c..62ca5b19a 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -9,7 +9,9 @@ from __future__ import annotations from argparse import ArgumentParser +import glob import importlib +import json import os import platform as _platform import re @@ -1025,6 +1027,42 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os build_env["MATURIN_PEP517_ARGS"] = (interpreter_arg + " " + existing).strip() +def _inject_cargo_lock(worktree: str, lock_path: str) -> str | None: + """Copy a user-supplied Cargo.lock next to the source tree's top-level Cargo.toml. + + Returns the destination, or None when the tree has no Cargo.toml (the lock + is then meaningless and cargo would ignore it anyway). + """ + if not lock_path: + return None + # Shallowest manifest wins: setuptools-rust crates live in subdirectories + # (bcrypt: src/_bcrypt/Cargo.toml), maturin ones at the top. + manifests = sorted(glob.glob(path.join(worktree, "**", "Cargo.toml"), recursive=True), key=lambda m: (m.count(os.sep), m)) + if not manifests: + return None + dest = path.join(path.dirname(manifests[0]), "Cargo.lock") + shutil.copyfile(lock_path, dest) + return dest + + +def _configure_cargo_offline(build_env: dict[str, str], vendor_dir: str) -> None: + """Point cargo at the vendored crates and forbid the network. + + CARGO_HOME is the sandbox-local one _compiler_env created for the wired + toolchain; without a toolchain there is no cargo to configure. + """ + cargo_home = build_env.get("CARGO_HOME") + if not (vendor_dir and cargo_home): + return + makedirs(cargo_home, exist_ok=True) + with open(path.join(cargo_home, "config.toml"), "a") as f: + f.write( + '[source.crates-io]\nreplace-with = "vendored-sources"\n\n' + '[source.vendored-sources]\ndirectory = {}\n'.format(json.dumps(_absolutize_path(vendor_dir))) + ) + build_env["CARGO_NET_OFFLINE"] = "true" + + def _configure_cargo_native_env(build_env: dict[str, str], tmpdir: str) -> None: """Point rustc at the toolchain's sysroot for a native build. @@ -1160,6 +1198,8 @@ def _wheel_platform_error( PARSER.add_argument("srcarchive") PARSER.add_argument("output", help="Path the single built wheel is written to") PARSER.add_argument("--monitor-memory", action="store_true") +PARSER.add_argument("--cargo-vendor-dir", default="", help="Cargo vendor directory; cargo runs offline against it") +PARSER.add_argument("--cargo-lock", default="", help="Cargo.lock to place next to the source tree's Cargo.toml") PARSER.add_argument( "--config-setting", action="append", @@ -1230,6 +1270,9 @@ def main() -> None: target_cpu=opts.target_cpu, ) + _configure_cargo_offline(build_env, opts.cargo_vendor_dir) + _inject_cargo_lock(t, opts.cargo_lock) + if _legacy_metadata_conflicts_with_pyproject(t): print( "Warning: falling back to setup.py because pyproject.toml omits dynamic dependency metadata " diff --git a/uv/private/sdist_build/attrs.bzl b/uv/private/sdist_build/attrs.bzl index e3de20d9c..04889a83a 100644 --- a/uv/private/sdist_build/attrs.bzl +++ b/uv/private/sdist_build/attrs.bzl @@ -8,6 +8,7 @@ def validate_build_attrs( monitor_memory, pre_build_patches, pre_build_patch_strip, + cargo_lock, supported, toolchains, error): @@ -21,6 +22,7 @@ def validate_build_attrs( monitor_memory: Whether to monitor the wheel-build action's memory. pre_build_patches: Patches applied before building the wheel. pre_build_patch_strip: Strip count for pre-build patches. + cargo_lock: A user-supplied Cargo.lock, or None. supported: Names of attributes consumed by the selected build path. toolchains: Toolchains used by the wheel-build action. error: Failure message with one `{}` slot for unsupported names. @@ -40,6 +42,8 @@ def validate_build_attrs( active.append("pre_build_patches") if pre_build_patch_strip != 1: active.append("pre_build_patch_strip") + if cargo_lock: + active.append("cargo_lock") if toolchains: active.append("toolchains") unsupported = [name for name in active if name not in supported] diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 5299c7270..abd04e52f 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -24,6 +24,9 @@ def _write_context_file(repository_ctx, available_deps): "deps": [str(d) for d in repository_ctx.attr.deps], "available_deps": available_deps, } + if repository_ctx.attr.cargo_lock: + # A user-supplied lock replaces whatever the sdist ships (usually nothing). + context["cargo_lock"] = str(repository_ctx.path(repository_ctx.attr.cargo_lock)) context_path = repository_ctx.path("_configure_context.json") repository_ctx.file("_configure_context.json", content = json.encode(context)) @@ -195,6 +198,62 @@ def _is_rust_build(inspection): _RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" +_CRATES_IO_SOURCE = "registry+https://github.com/rust-lang/crates.io-index" + +def _crate_url(name, version): + return "https://static.crates.io/crates/{name}/{name}-{version}.crate".format(name = name, version = version) + +def _unsupported_crate_sources(crates): + """Crates that cannot be vendored hermetically: anything not on crates.io.""" + return ["{}@{} ({})".format(c["name"], c["version"], c["source"]) for c in crates if c.get("source") != _CRATES_IO_SOURCE or not c.get("checksum")] + +def _vendor_crates(repository_ctx, crates): + """Materialize a Cargo.lock's crates.io dependencies as a cargo vendor directory. + + Cargo otherwise downloads them inside the build action, which needs + network in the sandbox and cannot work under remote execution. Bazel's + downloader fetches each crate with the checksum the lock records, so the + build is as pinned as the lock is; the per-crate `.cargo-checksum.json` + is what cargo's `vendored-sources` replacement requires. + """ + unsupported = _unsupported_crate_sources(crates) + if unsupported: + fail("sdist_build for '{}': cannot vendor crates that are not on crates.io with a checksum: {}. Provide a Cargo.lock that pins them to crates.io.".format( + repository_ctx.name, + ", ".join(unsupported), + )) + repository_ctx.report_progress("Vendoring {} crates for {}".format(len(crates), repository_ctx.name)) + downloads = [] + for crate in crates: + # .crate files are gzipped tarballs; extract() picks the format from the name. + archive = "_crates/{}-{}.tar.gz".format(crate["name"], crate["version"]) + token = repository_ctx.download( + url = _crate_url(crate["name"], crate["version"]), + output = archive, + sha256 = crate["checksum"], + block = False, + ) + downloads.append((token, crate, archive)) + for token, crate, archive in downloads: + token.wait() + crate_dir = "vendor/{}-{}".format(crate["name"], crate["version"]) + repository_ctx.extract(archive, output = crate_dir, stripPrefix = "{}-{}".format(crate["name"], crate["version"])) + repository_ctx.file(crate_dir + "/.cargo-checksum.json", json.encode({"package": crate["checksum"], "files": {}})) + repository_ctx.delete("_crates") + +_VENDORED_CRATES_TARGET = """ +filegroup( + name = "vendored_crates", + srcs = glob(["vendor/**"]), +) +""" + +def _cargo_lock_attr(label): + """Renders the generated rule call's `cargo_lock` attribute.""" + return "\n cargo_lock = {},".format(repr(label)) + +_VENDORED_CRATES_ATTR = "\n vendored_crates = \":vendored_crates\"," + def _rust_wiring(rust_toolchain, inspection, toolchains): """The generated BUILD's Rust wiring for a project-level `rust_toolchain`. @@ -296,6 +355,7 @@ def _sdist_build_impl(repository_ctx): monitor_memory = repository_ctx.attr.monitor_memory, pre_build_patches = repository_ctx.attr.pre_build_patches, pre_build_patch_strip = repository_ctx.attr.pre_build_patch_strip, + cargo_lock = repository_ctx.attr.cargo_lock, supported = [ "config_settings", "monitor_memory", @@ -361,6 +421,8 @@ def _sdist_build_impl(repository_ctx): toolchain_attrs = "" rust_layer_load = "" rust_layer_target = "" + vendored_crates_target = "" + vendored_crates_attr = "" if is_native: toolchains = list(repository_ctx.attr.extra_toolchains) extra_env = repository_ctx.attr.extra_env @@ -373,6 +435,17 @@ def _sdist_build_impl(repository_ctx): rust_layer_load = rust.load_stmt rust_layer_target = rust.target toolchains = rust.toolchains + if rust.load_stmt: + crates = inspection.get("cargo_crates") if inspection else None + if crates: + _vendor_crates(repository_ctx, crates) + vendored_crates_target = _VENDORED_CRATES_TARGET + vendored_crates_attr = _VENDORED_CRATES_ATTR + if repository_ctx.attr.cargo_lock: + vendored_crates_attr += _cargo_lock_attr(str(repository_ctx.attr.cargo_lock)) + elif crates == None: + # buildifier: disable=print + print("WARNING: {} builds Rust but its sdist ships no Cargo.lock; cargo will fetch crates during the build. Declare the lock to make the build hermetic.".format(repository_ctx.name)) if toolchains: toolchain_attrs = """ toolchains = [ @@ -424,12 +497,12 @@ py_binary( deps = {deps}, include_console_scripts = True, ) -{frontend_target}{rust_layer_target} +{frontend_target}{rust_layer_target}{vendored_crates_target} {rule}( name = "whl", src = "{src}", tool = "{tool}", - version = "{version}",{console_scripts_attr}{config_settings_attr}{monitor_memory_attr}{resource_set_attr}{patch_attrs}{toolchain_attrs} + version = "{version}",{console_scripts_attr}{config_settings_attr}{monitor_memory_attr}{resource_set_attr}{patch_attrs}{toolchain_attrs}{vendored_crates_attr} visibility = ["//visibility:public"], ) @@ -447,6 +520,8 @@ exports_files( frontend_load = frontend_load, rust_layer_load = rust_layer_load, rust_layer_target = rust_layer_target, + vendored_crates_target = vendored_crates_target, + vendored_crates_attr = vendored_crates_attr, frontend_target = frontend_target, tool = tool, version = repository_ctx.attr.version, @@ -493,6 +568,10 @@ sdist_build = repository_rule( ), "pre_build_patches": attr.label_list(default = []), "pre_build_patch_strip": attr.int(default = 1), + "cargo_lock": attr.label( + allow_single_file = True, + doc = "Cargo.lock to vendor from and inject into the build in place of the sdist's. Set via `uv.override_package(cargo_lock = ...)`.", + ), "rust_toolchain": attr.label( doc = "Project-level Rust toolchain; wired into the build when the sdist's build backend is Rust-based.", ), @@ -512,6 +591,9 @@ sdist_build = repository_rule( ) sdist_build_test_util = struct( + cargo_lock_attr = _cargo_lock_attr, + crate_url = _crate_url, + unsupported_crate_sources = _unsupported_crate_sources, config_settings_attr = _config_settings_attr, env_attr = _env_attr, is_rust_build = _is_rust_build, diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 0ebeefa14..005836c28 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -10,6 +10,7 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") load( ":repository_test.bzl", "config_settings_attr_test", + "crate_vendoring_test", "env_attr_test", "is_rust_build_test", "rust_wiring_test", @@ -27,3 +28,5 @@ env_attr_test(name = "env_attr_test") is_rust_build_test(name = "is_rust_build_test") rust_wiring_test(name = "rust_wiring_test") + +crate_vendoring_test(name = "crate_vendoring_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index 76718f728..eae1b6d3f 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -115,3 +115,26 @@ def _rust_wiring_test_impl(ctx): return unittest.end(env) rust_wiring_test = unittest.make(_rust_wiring_test_impl) + +def _crate_vendoring_test_impl(ctx): + env = unittest.begin(ctx) + asserts.equals( + env, + "https://static.crates.io/crates/ahash/ahash-0.8.11.crate", + sdist_build_test_util.crate_url("ahash", "0.8.11"), + ) + crates_io = "registry+https://github.com/rust-lang/crates.io-index" + ok = {"name": "ahash", "version": "0.8.11", "source": crates_io, "checksum": "e89d"} + git = {"name": "pyo3-fork", "version": "0.22.0", "source": "git+https://github.com/x/pyo3#abc", "checksum": ""} + unchecked = {"name": "odd", "version": "1.0.0", "source": crates_io, "checksum": ""} + asserts.equals(env, [], sdist_build_test_util.unsupported_crate_sources([ok]), "crates.io with a checksum vendors fine") + asserts.equals(env, '\n cargo_lock = "@@//pkg:Cargo.lock",', sdist_build_test_util.cargo_lock_attr("@@//pkg:Cargo.lock")) + asserts.equals( + env, + ["pyo3-fork@0.22.0 (git+https://github.com/x/pyo3#abc)", "odd@1.0.0 (" + crates_io + ")"], + sdist_build_test_util.unsupported_crate_sources([ok, git, unchecked]), + "git sources and checksum-less entries cannot be vendored hermetically", + ) + return unittest.end(env) + +crate_vendoring_test = unittest.make(_crate_vendoring_test_impl) diff --git a/uv/private/sdist_configure/detect_native.py b/uv/private/sdist_configure/detect_native.py index 833863756..549d639b2 100644 --- a/uv/private/sdist_configure/detect_native.py +++ b/uv/private/sdist_configure/detect_native.py @@ -67,6 +67,7 @@ class ConfigureContext(TypedDict, total=False): src: str + cargo_lock: str version: str deps: list[str] available_deps: dict[str, str] @@ -74,6 +75,7 @@ class ConfigureContext(TypedDict, total=False): class _OptionalDetectionResult(TypedDict, total=False): backend_path: list[str] + cargo_crates: list[dict[str, str]] class DetectionResult(_OptionalDetectionResult): @@ -402,6 +404,46 @@ def _extract_names(key: str) -> list[str]: # --- Detection --- +def _parse_cargo_lock(content: str) -> list[dict[str, str]]: + """The dependency crates a Cargo.lock pins: name, version, source, checksum. + + Packages without a `source` are the workspace's own crates (the root + package, path dependencies) and are already in the sdist; everything else + is what cargo would otherwise fetch at build time. + """ + if tomllib is None: + return [] + try: + data = tomllib.loads(content) + except tomllib.TOMLDecodeError: + return [] + crates = [] + for pkg in data.get("package", []): + source = pkg.get("source") + if not source: + continue + crates.append({ + "name": str(pkg.get("name", "")), + "version": str(pkg.get("version", "")), + "source": str(source), + "checksum": str(pkg.get("checksum", "")), + }) + return crates + + +def _find_cargo_lock(members: Sequence[str]) -> str | None: + """The sdist's Cargo.lock, wherever its crate lives. + + setuptools-rust projects keep the crate in a subdirectory (bcrypt: + src/_bcrypt/Cargo.lock); maturin ones at the top. With several locks the + shallowest is the workspace's. + """ + locks = [m for m in members if PurePosixPath(m).name == "Cargo.lock"] + if not locks: + return None + return min(locks, key=lambda m: (len(PurePosixPath(m).parts), m)) + + def _find_config_file(members: Sequence[str], filename: str) -> str | None: """Find a config file, accounting for the typical top-level sdist directory.""" if filename in members: @@ -494,6 +536,18 @@ def detect(archive_path: str, context: ConfigureContext) -> DetectionResult: if content: declared.extend(_parse_setup_cfg_build_requires(content)) + cargo_crates = None + context_lock = context.get("cargo_lock") + if context_lock: + with open(context_lock, encoding="utf-8") as f: + cargo_crates = _parse_cargo_lock(f.read()) + else: + cargo_lock_path = _find_cargo_lock(members) + if cargo_lock_path: + content = read_fn(cargo_lock_path) + if content: + cargo_crates = _parse_cargo_lock(content) + # Match the root distribution name rather than path depth: setuptools # src-layout projects place their own egg-info below src/ or another # package directory, while differently named metadata may be vendored. @@ -595,6 +649,8 @@ def detect(archive_path: str, context: ConfigureContext) -> DetectionResult: } if backend_path is not None: result["backend_path"] = backend_path + if cargo_crates is not None: + result["cargo_crates"] = cargo_crates return result diff --git a/uv/private/sdist_configure/detect_native_test.py b/uv/private/sdist_configure/detect_native_test.py index 1238ff5ba..ad555c95d 100644 --- a/uv/private/sdist_configure/detect_native_test.py +++ b/uv/private/sdist_configure/detect_native_test.py @@ -892,3 +892,100 @@ def test_setup_cfg_and_setup_py_merged() -> None: if failures: print(f"Failures: {', '.join(failures)}") sys.exit(1) + + +# --- Cargo.lock --- + +_CARGO_LOCK = """\ +version = 4 + +[[package]] +name = "pkg" +version = "1.0.0" +dependencies = ["ahash", "local-helper"] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" + +[[package]] +name = "local-helper" +version = "0.1.0" + +[[package]] +name = "pyo3-fork" +version = "0.22.0" +source = "git+https://github.com/example/pyo3?rev=abc123#abc123" +""" + + +def test_cargo_lock_crates() -> None: + archive = _make_tar_gz({ + "pkg-1.0/": None, + "pkg-1.0/Cargo.lock": _CARGO_LOCK, + "pkg-1.0/src/lib.rs": "", + }) + result = detect(archive, {}) + # Workspace crates (no source) are in the sdist already; everything else is a fetch. + assert result["cargo_crates"] == [ + { + "name": "ahash", + "version": "0.8.11", + "source": "registry+https://github.com/rust-lang/crates.io-index", + "checksum": "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011", + }, + { + "name": "pyo3-fork", + "version": "0.22.0", + "source": "git+https://github.com/example/pyo3?rev=abc123#abc123", + "checksum": "", + }, + ] + + +def test_no_cargo_lock_reports_nothing() -> None: + archive = _make_tar_gz({"pkg-1.0/": None, "pkg-1.0/src/lib.rs": ""}) + result = detect(archive, {}) + assert "cargo_crates" not in result + + +def test_context_cargo_lock_replaces_the_sdists() -> None: + archive = _make_tar_gz({ + "pkg-1.0/": None, + "pkg-1.0/Cargo.lock": _CARGO_LOCK, + "pkg-1.0/src/lib.rs": "", + }) + provided = os.path.join(tempfile.mkdtemp(), "Cargo.lock") + with open(provided, "w") as f: + f.write( + '[[package]]\nname = "pkg"\nversion = "1.0.0"\n\n' + '[[package]]\nname = "bstr"\nversion = "1.10.0"\n' + 'source = "registry+https://github.com/rust-lang/crates.io-index"\n' + 'checksum = "abcd"\n' + ) + result = detect(archive, {"cargo_lock": provided}) + assert [c["name"] for c in result["cargo_crates"]] == ["bstr"] + + +def test_nested_cargo_lock_is_found() -> None: + # setuptools-rust layout: the crate lives in a subdirectory. + archive = _make_tar_gz({ + "pkg-1.0/": None, + "pkg-1.0/src/_pkg/Cargo.lock": _CARGO_LOCK, + "pkg-1.0/src/_pkg/src/lib.rs": "", + }) + result = detect(archive, {}) + assert [c["name"] for c in result["cargo_crates"]] == ["ahash", "pyo3-fork"] + + +def test_shallowest_cargo_lock_wins() -> None: + archive = _make_tar_gz({ + "pkg-1.0/": None, + "pkg-1.0/Cargo.lock": _CARGO_LOCK, + "pkg-1.0/vendor/dep/Cargo.lock": '[[package]]\nname = "other"\nversion = "1.0.0"\nsource = "registry+x"\nchecksum = "1"\n', + "pkg-1.0/src/lib.rs": "", + }) + result = detect(archive, {}) + assert [c["name"] for c in result["cargo_crates"]] == ["ahash", "pyo3-fork"] From 1825f70df2b5ddcb0ebbd6b16a9e0d2cc12916cc Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 8 Sep 2026 20:50:23 -0600 Subject: [PATCH 091/103] feat(uv): fail early when a declared Rust sdist has no rust_toolchain Without a toolchain, cargo or maturin fail deep inside the build action with no hint of the cause. sdist_build now fails while the repository is generated, naming the attribute to set, when the sdist declares a Rust build: a maturin backend, or setuptools-rust among its declared build requirements. Explicit uv.override_package(toolchains = [...]) entries are trusted as the by-hand escape hatch. Inferred setuptools-rust (stray .rs files) is only a guess and never demands a toolchain: zstandard ships an optional rust-ext it does not build by default. A guess still wires the project's toolchain when there is one; without one the build proceeds unwired, as before, and fails only if the backend really needs rustc. --- docs/uv.md | 10 +++-- uv/private/sdist_build/repository.bzl | 37 +++++++++++++++++++ uv/private/sdist_build/tests/BUILD.bazel | 3 ++ .../sdist_build/tests/repository_test.bzl | 24 ++++++++++++ 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index 6bb83ab33..f5c9462cd 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -404,8 +404,10 @@ Rust needs one more step. Every sdist runs its build logic on the exec platform, but in a cross build cargo also *compiles* code for the exec platform and runs it there: `build.rs` scripts and proc-macro crates. Those need the exec platform's Rust standard library in the sysroot, and a toolchain resolved -for the target platform ships only the target's. Declare the toolchain once per -project and rules_py adds an exec-configured sysroot layer next to it: +for the target platform ships only the target's. rules_py cannot resolve a +Rust toolchain on its own without making rules_rust a dependency of every +consumer, so point it at the one your project already registers, once per +project; rules_py adds an exec-configured sysroot layer next to it: ```starlark uv.project( @@ -419,7 +421,9 @@ uv.project( Every sdist in that project whose build backend is maturin, or whose build requirements include setuptools-rust, then gets the toolchain and an exec-configured `rust_host_sysroot` layer wired into its build. No -`uv.override_package` entry is needed for Rust packages. The crates the +`uv.override_package` entry is needed for Rust packages, and a Rust sdist in a +project that declares no `rust_toolchain` fails while the repository is +generated, naming the attribute to set. The crates the sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while the repository is generated and vendored into it; cargo then builds offline, so the build needs no network and works under remote execution. A lock that diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index abd04e52f..d9e4dc0ba 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -196,6 +196,19 @@ def _is_rust_build(inspection): requirements = list(inspection.get("build_requires", [])) + list(inspection.get("inferred_build_requires", [])) return "setuptools-rust" in [_normalize_requirement(r) for r in requirements] +def _declares_rust_build(inspection): + """maturin backend, or setuptools-rust among the sdist's *declared* build requirements. + + The inferred requirement (stray .rs files) is a guess: zstandard ships an + optional Rust extension it never builds by default. A guess wires the + toolchain when the project has one, but is never grounds to demand one. + """ + if not _is_rust_build(inspection): + return False + if inspection.get("build_backend") == "maturin": + return True + return "setuptools-rust" in [_normalize_requirement(r) for r in inspection.get("build_requires", [])] + _RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" _CRATES_IO_SOURCE = "registry+https://github.com/rust-lang/crates.io-index" @@ -254,6 +267,26 @@ def _cargo_lock_attr(label): _VENDORED_CRATES_ATTR = "\n vendored_crates = \":vendored_crates\"," +def _missing_rust_toolchain(repo_name, rust_toolchain, inspection, toolchains): + """The error for a Rust sdist in a project that declares no Rust toolchain, or None. + + Without one, cargo or maturin fail deep inside the build action with no + hint of the cause. Only declared Rust builds are demanding: an inferred + setuptools-rust (see _declares_rust_build) builds unwired, as it always + did, and fails only if the backend really needs rustc. Explicit `uv.override_package(toolchains = [...])` + entries are trusted: they are the escape hatch for wiring a toolchain by + hand, and the rule cannot tell a Rust toolchain from any other. + """ + if rust_toolchain or toolchains or not _declares_rust_build(inspection): + return None + if inspection.get("build_backend") == "maturin": + reason = "its build backend is maturin" + else: + reason = "setuptools-rust is among its declared build requirements" + return ("sdist_build for '{}': this sdist builds Rust ({}) but the project declares no Rust toolchain. " + + "Set `uv.project(rust_toolchain = \"@rules_rust//rust/toolchain:current_rust_toolchain\")`, " + + "or wire one by hand with `uv.override_package(toolchains = [...])`.").format(repo_name, reason) + def _rust_wiring(rust_toolchain, inspection, toolchains): """The generated BUILD's Rust wiring for a project-level `rust_toolchain`. @@ -431,6 +464,9 @@ def _sdist_build_impl(repository_ctx): # a repository the rules_py extension generates, whose repo mapping knows # nothing about the user's rules_rust dependency. rust_toolchain = repository_ctx.attr.rust_toolchain + missing = _missing_rust_toolchain(repository_ctx.name, rust_toolchain, inspection, toolchains) + if missing: + fail(missing) rust = _rust_wiring(str(rust_toolchain) if rust_toolchain else "", inspection, toolchains) rust_layer_load = rust.load_stmt rust_layer_target = rust.target @@ -597,6 +633,7 @@ sdist_build_test_util = struct( config_settings_attr = _config_settings_attr, env_attr = _env_attr, is_rust_build = _is_rust_build, + missing_rust_toolchain = _missing_rust_toolchain, normalize_requirement = _normalize_requirement, rust_wiring = _rust_wiring, ) diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 005836c28..372cc50b4 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -13,6 +13,7 @@ load( "crate_vendoring_test", "env_attr_test", "is_rust_build_test", + "missing_rust_toolchain_test", "rust_wiring_test", ) @@ -30,3 +31,5 @@ is_rust_build_test(name = "is_rust_build_test") rust_wiring_test(name = "rust_wiring_test") crate_vendoring_test(name = "crate_vendoring_test") + +missing_rust_toolchain_test(name = "missing_rust_toolchain_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index eae1b6d3f..fbd090937 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -138,3 +138,27 @@ def _crate_vendoring_test_impl(ctx): return unittest.end(env) crate_vendoring_test = unittest.make(_crate_vendoring_test_impl) + +def _missing_rust_toolchain_test_impl(ctx): + env = unittest.begin(ctx) + missing = sdist_build_test_util.missing_rust_toolchain + maturin = {"build_backend": "maturin"} + st_rust = {"build_backend": "setuptools.build_meta", "build_requires": ["setuptools-rust>=1.7"]} + + asserts.equals(env, None, missing("r", "", {"build_backend": "mesonpy"}, []), "not Rust: nothing to demand") + asserts.equals(env, None, missing("r", "@rules_rust//rust/toolchain:current_rust_toolchain", maturin, []), "declared toolchain") + asserts.equals(env, None, missing("r", "", maturin, ["//tools:my_rust_toolchain"]), "hand-wired toolchains are trusted") + asserts.equals( + env, + None, + missing("r", "", {"build_backend": "setuptools.build_meta", "build_requires": ["setuptools", "cffi"], "inferred_build_requires": ["setuptools-rust"]}, []), + "inferred setuptools-rust is a guess (zstandard's optional rust-ext): never grounds to demand a toolchain", + ) + + msg = missing("sdist_build__x__pkg__1_0", "", maturin, []) + asserts.true(env, msg != None and "its build backend is maturin" in msg and "uv.project(rust_toolchain" in msg, "got: {}".format(msg)) + msg = missing("r", "", st_rust, []) + asserts.true(env, msg != None and "setuptools-rust is among its declared build requirements" in msg, "got: {}".format(msg)) + return unittest.end(env) + +missing_rust_toolchain_test = unittest.make(_missing_rust_toolchain_test_impl) From af368fc366cde391f0de550fc3c16dd99e5ce78e Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 05:50:10 -0600 Subject: [PATCH 092/103] test(e2e): export the Rust cases' wheels for the native-arch runs pycross-rust, pycross-rust-rs and pycross-tiktoken get the pycross_wheel_export from #1507, so CI installs and runs their cross-built wheels on native amd64 and arm64 runners like every other crossbuild case. The rules_rs case's test file takes the bundle's name so the runner finds it. The crossbuild README lists the Rust cases alongside the other backends. --- e2e/README.md | 11 ++++++----- e2e/crossbuild/pycross-rust-rs/BUILD.bazel | 15 +++++++++++++-- ..._pydantic_core.py => test_pydantic_core_rs.py} | 0 e2e/crossbuild/pycross-rust/BUILD.bazel | 11 +++++++++++ e2e/crossbuild/pycross-tiktoken/BUILD.bazel | 11 +++++++++++ 5 files changed, 41 insertions(+), 7 deletions(-) rename e2e/crossbuild/pycross-rust-rs/{test_pydantic_core.py => test_pydantic_core_rs.py} (100%) diff --git a/e2e/README.md b/e2e/README.md index b0a5b05d5..9fa4da8fd 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -45,11 +45,12 @@ support rests on a single case: setuptools/distutils C extensions (`pycross-geohash`, `pycross-psutil`, `pycross-msgpack`, `pycross-setuptools`), meson-python (`pycross-meson`, `pycross-numpy`), scikit-build-core/CMake (`pycross-cmake`, `pycross-jdk` — the latter also needing a JDK and a -hermetically vendored Apache Ant) and maturin/PyO3 (`pycross-rust`). -Every case builds for linux/amd64 and linux/arm64; in-suite verification is -structural (`Tag:` metadata, ELF arch of every bundled `.so`), and the -non-Rust cases export a wheel bundle that CI installs and runs on NATIVE -amd64 and arm64 runners — no emulation in the verdict. The suites are isolated from +hermetically vendored Apache Ant), maturin/PyO3 (`pycross-rust` on a +rules_rust toolchain, `pycross-rust-rs` on a rules_rs one) and setuptools-rust +(`pycross-tiktoken`). Every case builds for linux/amd64 and linux/arm64; +in-suite verification is structural (`Tag:` metadata, ELF arch of every +bundled `.so`), and each case exports a wheel bundle that CI installs and runs +on NATIVE amd64 and arm64 runners — no emulation in the verdict. The suites are isolated from `e2e/cases` because their hubs need package-specific configuration (`default_build_dependencies`, pre-build patches, a larger `resource_set`) that would otherwise leak onto unrelated packages sharing the hub. On a macOS diff --git a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel index 5d6adbff5..72af3ad3d 100644 --- a/e2e/crossbuild/pycross-rust-rs/BUILD.bazel +++ b/e2e/crossbuild/pycross-rust-rs/BUILD.bazel @@ -5,6 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") _PY = "3.12" @@ -12,9 +13,9 @@ _DEP_GROUP = "pycross_rust_rs" py_test( name = "test_pydantic_core", - srcs = ["test_pydantic_core.py"], + srcs = ["test_pydantic_core_rs.py"], dep_group = _DEP_GROUP, - main = "test_pydantic_core.py", + main = "test_pydantic_core_rs.py", python_version = _PY, deps = ["@pypi_pycross_rust_rs//pydantic_core"], ) @@ -60,3 +61,13 @@ collect_wheels( ], wheels = ["@sdist_build__pycross_rust_rs__pydantic_core__2_47_0//:whl"], ) + +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. +pycross_wheel_export( + name = "pydantic_core_rs", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_pydantic_core_rs.py", + wheel = "@sdist_build__pycross_rust_rs__pydantic_core__2_47_0//:whl", +) diff --git a/e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py b/e2e/crossbuild/pycross-rust-rs/test_pydantic_core_rs.py similarity index 100% rename from e2e/crossbuild/pycross-rust-rs/test_pydantic_core.py rename to e2e/crossbuild/pycross-rust-rs/test_pydantic_core_rs.py diff --git a/e2e/crossbuild/pycross-rust/BUILD.bazel b/e2e/crossbuild/pycross-rust/BUILD.bazel index 89be3e313..9d2b872d4 100644 --- a/e2e/crossbuild/pycross-rust/BUILD.bazel +++ b/e2e/crossbuild/pycross-rust/BUILD.bazel @@ -5,6 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") _PY = "3.12" @@ -60,3 +61,13 @@ collect_wheels( ], wheels = ["@sdist_build__pycross_rust__pydantic_core__2_47_0//:whl"], ) + +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. +pycross_wheel_export( + name = "pydantic_core", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_pydantic_core.py", + wheel = "@sdist_build__pycross_rust__pydantic_core__2_47_0//:whl", +) diff --git a/e2e/crossbuild/pycross-tiktoken/BUILD.bazel b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel index 5738feba2..63a01b30f 100644 --- a/e2e/crossbuild/pycross-tiktoken/BUILD.bazel +++ b/e2e/crossbuild/pycross-tiktoken/BUILD.bazel @@ -5,6 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") load("//tools:collect_wheels.bzl", "collect_wheels") +load("//tools:wheel_export.bzl", "pycross_wheel_export") exports_files(["Cargo.lock"]) @@ -60,3 +61,13 @@ collect_wheels( "@sdist_build__pycross_tiktoken__tiktoken__0_13_0//:whl", ], ) + +# Execution verification: the cross-built wheel is installed and the case's +# standalone test is run on a native runner of the target architecture. +pycross_wheel_export( + name = "tiktoken", + amd64_platform = ":amd64_linux", + arm64_platform = ":arm64_linux", + main = "test_tiktoken.py", + wheel = "@sdist_build__pycross_tiktoken__tiktoken__0_13_0//:whl", +) From 1f4c6cd8d8b5b81d86240cd4e099286e1c324867 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 05:54:30 -0600 Subject: [PATCH 093/103] docs(uv): Rust sdists build with the project's rules_rust or rules_rs toolchain State the design plainly: fetching rustc and cargo is the Rust rulesets' job and rules_py depends on neither, so the project points uv.project at the toolchain it registers. Give the rules_rust label and the rules_rs wiring the e2e uses, and note that only declared Rust builds demand a toolchain. --- docs/uv.md | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index f5c9462cd..f168f3e2c 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -400,14 +400,25 @@ Rust build path reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other ma toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always wins over the derived value. -Rust needs one more step. Every sdist runs its build logic on the exec -platform, but in a cross build cargo also *compiles* code for the exec platform -and runs it there: `build.rs` scripts and proc-macro crates. Those need the -exec platform's Rust standard library in the sysroot, and a toolchain resolved -for the target platform ships only the target's. rules_py cannot resolve a -Rust toolchain on its own without making rules_rust a dependency of every -consumer, so point it at the one your project already registers, once per -project; rules_py adds an exec-configured sysroot layer next to it: +Rust sdists (maturin, setuptools-rust) build with the Rust toolchain your +project registers. Fetching rustc and cargo is the Rust rulesets' job, and +rules_py depends on neither of them, so point it at the toolchain once per +project and every Rust sdist in that project is wired to it. Either ruleset +works: + +- [rules_rust](https://github.com/bazelbuild/rules_rust): + `rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain"` +- [rules_rs](https://github.com/hermeticbuild/rules_rs): its toolchains are + rules_rust `rust_toolchain` instances declared in the patched `rules_rust` + repository it fetches, so expose that repository and point at its + `current_rust_toolchain`: + + ```starlark + rules_rust_rs = use_extension("@rules_rs//rs:rules_rust.bzl", "rules_rust") + use_repo(rules_rust_rs, rules_rust_rs = "rules_rust") + ``` + + then `rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain"`. ```starlark uv.project( @@ -420,10 +431,15 @@ uv.project( Every sdist in that project whose build backend is maturin, or whose build requirements include setuptools-rust, then gets the toolchain and an -exec-configured `rust_host_sysroot` layer wired into its build. No -`uv.override_package` entry is needed for Rust packages, and a Rust sdist in a -project that declares no `rust_toolchain` fails while the repository is -generated, naming the attribute to set. The crates the +exec-configured `rust_host_sysroot` layer wired into its build. In a cross +build cargo also *compiles* code for the exec platform and runs it there +(`build.rs` scripts, proc-macro crates); that layer supplies the exec +platform's standard library next to the target's, the way rustup keeps +several targets in one install. No `uv.override_package` entry is needed for +Rust packages, and a Rust sdist in a project that declares no +`rust_toolchain` fails while the repository is generated, naming the +attribute to set; only declared Rust builds are demanding, an sdist that +merely ships `.rs` files (zstandard's optional extension) builds as before. The crates the sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while the repository is generated and vendored into it; cargo then builds offline, so the build needs no network and works under remote execution. A lock that @@ -431,10 +447,7 @@ pins crates outside crates.io (git or path sources) is rejected. An sdist without a `Cargo.lock` builds with network access and a warning; give it one with `uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once with `cargo generate-lockfile` on the extracted sdist, and it is vendored and -placed next to the sdist's `Cargo.toml` before the build. Any target exposing -rules_rust's toolchain providers works, so the same label serves -[rules_rs](https://github.com/hermeticbuild/rules_rs) toolchains, which are -declared with rules_rust's `rust_toolchain` rule. +placed next to the sdist's `Cargo.toml` before the build. ### Backend config settings From 3bf25a155a3d8717554a34c7e19e5b25538624af Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 15:39:06 -0600 Subject: [PATCH 094/103] feat(uv): declare Rust toolchains with uv.package_toolchains(), not on uv.project() `uv.project()` goes back to hub, lock and pyproject. The toolchains the module's sdists build with move to their own tag on the same extension, resolved in _parse_projects next to override_package and annotate_packages and producing the same sdist_build repositories: uv.package_toolchains(rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain") Without `lock` the declaration covers every uv.project() of the module, one line per MODULE.bazel instead of one per lock. With `lock` it applies to that project only and wins over the module-wide one, which is how a workspace builds one project on rules_rust and another on rules_rs. Two declarations with the same scope, a lock without a uv.project(), and a tag naming no toolchain fail with their own messages. The attribute stays `rust_toolchain` rather than a generic list because sdist_build has to know which toolchain is the Rust one to wire it only into Rust builds with the exec-sysroot layer; other project-level toolchains get their own attribute when needed. `cargo_lock` remains per package on override_package: it is data for the offline crate vendoring, not a toolchain. e2e/crossbuild exercises the three scopes: pycross-rust declares the module-wide rules_rust toolchain, pycross-rust-rs overrides it for its lock with the rules_rs one, pycross-tiktoken inherits. --- docs/uv.md | 34 +++++---- .../pycross-rust-rs/setup.MODULE.bazel | 10 ++- .../pycross-rust/setup.MODULE.bazel | 23 +++--- .../pycross-tiktoken/setup.MODULE.bazel | 8 +- uv/private/extension/defs.bzl | 75 +++++++++++++++++-- uv/private/extension/tests/defs_test.bzl | 60 ++++++++++++++- uv/private/sdist_build/repository.bzl | 6 +- .../sdist_build/tests/repository_test.bzl | 2 +- 8 files changed, 171 insertions(+), 47 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index f168f3e2c..2fe6f1dfb 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -401,10 +401,10 @@ toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always wins over the derived value. Rust sdists (maturin, setuptools-rust) build with the Rust toolchain your -project registers. Fetching rustc and cargo is the Rust rulesets' job, and -rules_py depends on neither of them, so point it at the toolchain once per -project and every Rust sdist in that project is wired to it. Either ruleset -works: +module registers. Fetching rustc and cargo is the Rust rulesets' job, and +rules_py depends on neither of them, so point it at the toolchain once and +every Rust sdist of every `uv.project()` in the module is wired to it. Either +ruleset works: - [rules_rust](https://github.com/bazelbuild/rules_rust): `rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain"` @@ -421,24 +421,32 @@ works: then `rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain"`. ```starlark -uv.project( - hub_name = "pypi", - lock = "//:uv.lock", - pyproject = "//:pyproject.toml", +uv.package_toolchains( rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) ``` -Every sdist in that project whose build backend is maturin, or whose build -requirements include setuptools-rust, then gets the toolchain and an +Scope a declaration with `lock` to apply it to one project only; it wins over +the module-wide one for that project. That is how a workspace builds one +project on rules_rust and another on rules_rs: + +```starlark +uv.package_toolchains( + lock = "//other:uv.lock", + rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", +) +``` + +Every sdist whose build backend is maturin, or whose build requirements +include setuptools-rust, then gets the toolchain and an exec-configured `rust_host_sysroot` layer wired into its build. In a cross build cargo also *compiles* code for the exec platform and runs it there (`build.rs` scripts, proc-macro crates); that layer supplies the exec platform's standard library next to the target's, the way rustup keeps several targets in one install. No `uv.override_package` entry is needed for -Rust packages, and a Rust sdist in a project that declares no -`rust_toolchain` fails while the repository is generated, naming the -attribute to set; only declared Rust builds are demanding, an sdist that +Rust packages, and a Rust sdist in a module with no `uv.package_toolchains()` +covering its project fails while the repository is generated, naming the +declaration to add; only declared Rust builds are demanding, an sdist that merely ships `.rs` files (zstandard's optional extension) builds as before. The crates the sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while the repository is generated and vendored into it; cargo then builds offline, diff --git a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel index 068fd6d9f..efe8af085 100644 --- a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel @@ -3,14 +3,19 @@ Same package and assertions as //pycross-rust, built with the toolchains rules_rs provisions instead of rules_rust's own. rules_rs declares them with rules_rust's `rust_toolchain` rule inside the patched `rules_rust` repository -it fetches, so `uv.project(rust_toolchain = ...)` points at that repository's -`current_rust_toolchain`: the wiring is a provider contract, not a dependency +it fetches, so the lock-scoped `uv.package_toolchains()` below points at that +repository's `current_rust_toolchain`, overriding the module-wide rules_rust +one for this project only: the wiring is a provider contract, not a dependency on one ruleset's toolchain layout. The two rulesets coexist here because each carries its own `rules_rust` repository and therefore its own toolchain type. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") uv.declare_hub(hub_name = "pypi_pycross_rust_rs") +uv.package_toolchains( + lock = "//pycross-rust-rs:uv.lock", + rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", +) uv.project( default_build_dependencies = [ "build", @@ -19,7 +24,6 @@ uv.project( hub_name = "pypi_pycross_rust_rs", lock = "//pycross-rust-rs:uv.lock", pyproject = "//pycross-rust-rs:pyproject.toml", - rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel index 9e47530a5..265a06ec5 100644 --- a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel @@ -1,21 +1,17 @@ -"""maturin (Cargo/PyO3) cross-compilation case. +"""maturin (Cargo/PyO3) cross case: pydantic-core built from its sdist. -pydantic-core 2.47.0 is forced to build from its sdist (`[tool.uv] -no-binary-package`): a Rust extension whose maturin backend needs the -cargo cross env `build_helper` sets up — CARGO_BUILD_TARGET (triple keyed -by the target's libc), CARGO_TARGET__LINKER, PYO3_CROSS_PYTHON_VERSION, -and a rustc wrapper whose sysroot merges the target toolchain's std with -the exec platform's std (build scripts/proc-macros are always exec -artifacts). - -`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build -detects the maturin backend and emits the toolchain plus an exec-configured -rust_host_sysroot into the generated pep517_native_whl, whose -CARGO/RUSTC/RUST_HOST_SYSROOT make variables reach the helper's env. +The module-wide `uv.package_toolchains(rust_toolchain = ...)` below is all +the Rust wiring for this workspace: sdist_build detects the maturin backend +(or setuptools-rust) and wires that toolchain, plus rules_py's +exec-configured sysroot layer, into every such build. //pycross-tiktoken +inherits it; //pycross-rust-rs overrides it for its own lock. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") uv.declare_hub(hub_name = "pypi_pycross_rust") +uv.package_toolchains( + rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", +) uv.project( default_build_dependencies = [ "build", @@ -24,7 +20,6 @@ uv.project( hub_name = "pypi_pycross_rust", lock = "//pycross-rust:uv.lock", pyproject = "//pycross-rust:pyproject.toml", - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) use_repo( uv, diff --git a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel index b359dfd38..70f4659b3 100644 --- a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel @@ -1,8 +1,9 @@ """tiktoken: setuptools-rust sdist build. -`uv.project(rust_toolchain = ...)` is all the Rust wiring: sdist_build detects -setuptools-rust in the build requirements and emits the toolchain plus the -exec-platform sysroot into the generated pep517_native_whl. +The module-wide `uv.package_toolchains()` (see //pycross-rust) is all the Rust +wiring: sdist_build detects setuptools-rust in the build requirements and +emits the toolchain plus the exec-platform sysroot into the generated +pep517_native_whl. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") @@ -17,7 +18,6 @@ uv.project( hub_name = "pypi_pycross_tiktoken", lock = "//pycross-tiktoken:uv.lock", pyproject = "//pycross-tiktoken:pyproject.toml", - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) # tiktoken's sdist ships no Cargo.lock, so nothing pins its crates; this one diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index 94ddaa261..84ee00d8e 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -203,6 +203,43 @@ def _parse_hubs(module_ctx): return hub_specs +def parse_package_toolchains(tags, project_locks, module_name): + """Resolve a module's `uv.package_toolchains()` tags into per-lock and module-wide toolchains. + + Args: + tags: The module's `package_toolchains` tags (anything with `lock` and + `rust_toolchain` fields). + project_locks: Lock labels of the module's own `uv.project()` tags. + module_name: For error messages. + + Returns: + struct(default, by_lock, error): `default` is the module-wide tag or + None, `by_lock` maps a lock label to its tag, and `error` is the message + to fail with, or None. Two tags with the same scope, an unknown lock and + a tag that names no toolchain are errors. + """ + default = None + by_lock = {} + for tag in tags: + if not tag.rust_toolchain: + return struct(default = None, by_lock = {}, error = "uv.package_toolchains() in module '{}': set at least one toolchain (rust_toolchain).".format(module_name)) + if tag.lock == None: + if default != None: + return struct(default = None, by_lock = {}, error = "uv.package_toolchains() in module '{}': more than one module-wide declaration; scope all but one with `lock`.".format(module_name)) + default = tag + elif tag.lock not in project_locks: + return struct(default = None, by_lock = {}, error = "uv.package_toolchains() refers to lock '{}', but module '{}' has no uv.project() for that lock.".format(tag.lock, module_name)) + elif tag.lock in by_lock: + return struct(default = None, by_lock = {}, error = "uv.package_toolchains() in module '{}': lock '{}' is declared twice.".format(module_name, tag.lock)) + else: + by_lock[tag.lock] = tag + return struct(default = default, by_lock = by_lock, error = None) + +def project_rust_toolchain(package_toolchains, lock): + """The Rust toolchain for the project pinned by `lock`: its own declaration, else the module-wide one, else None.""" + tag = package_toolchains.by_lock.get(lock) or package_toolchains.default + return tag.rust_toolchain if tag else None + def _parse_projects(module_ctx, hub_specs): """Resolve every `uv.project()` declaration into repository-rule inputs. @@ -286,6 +323,10 @@ def _parse_projects(module_ctx, hub_specs): unscoped_matches = {i: 0 for i, override in enumerate(mod.tags.override_package) if override.lock == None} + package_toolchains = parse_package_toolchains(mod.tags.package_toolchains, project_locks, mod.name) + if package_toolchains.error: + fail(package_toolchains.error) + for project in mod.tags.project: project_data = toml.decode_file(module_ctx, project.pyproject) lock_data = toml.decode_file(module_ctx, project.lock) @@ -612,7 +653,7 @@ def _parse_projects(module_ctx, hub_specs): cargo_lock = cargo_lock, monitor_memory = monitor_memory, resource_set = resource_set, - rust_toolchain = project.rust_toolchain, + rust_toolchain = project_rust_toolchain(package_toolchains, project.lock), ) has_sbuild = True @@ -969,13 +1010,6 @@ _project_tag = tag_class( mandatory = True, doc = "The `uv.lock` pinning this project's dependency graph.", ), - "rust_toolchain": attr.label( - mandatory = False, - doc = "A rules_rust `current_rust_toolchain`-style target. When set, every sdist in " + - "this project whose build backend is maturin or setuptools-rust gets it (plus " + - "rules_py's exec-configured sysroot layer) wired into its build automatically, " + - "with no per-package `uv.override_package(toolchains = ...)`.", - ), "default_build_dependencies": attr.string_list( mandatory = False, default = [ @@ -1087,6 +1121,30 @@ project locks declared by the same module. Specifying `target` requires `lock` and is mutually exclusive with all other modification attributes.""", ) +_package_toolchains_tag = tag_class( + attrs = { + "lock": attr.label( + mandatory = False, + doc = "Scope the declaration to the `uv.project()` pinned by this `uv.lock`. Without it the " + + "declaration applies to every project of the module; a `lock`-scoped one wins over it.", + ), + "rust_toolchain": attr.label( + mandatory = False, + doc = "A rules_rust `current_rust_toolchain`-style target: any target exposing rules_rust's " + + "toolchain providers, from rules_rust or rules_rs. Every sdist whose build backend is " + + "maturin or setuptools-rust gets it, plus rules_py's exec-configured sysroot layer, wired " + + "into its build automatically, with no per-package `uv.override_package(toolchains = ...)`.", + ), + }, + doc = """Toolchains for the sdists a module's `uv.project()` declarations build from source. + +The extension detects which sdists need which toolchain (a maturin backend or +setuptools-rust for Rust) and wires it into their builds; nothing is named per +package. One declaration without `lock` covers every project of the module, +and a `lock`-scoped one overrides it for that project. A tag must set at +least one toolchain.""", +) + uv = module_extension( implementation = _uv_impl, tag_classes = { @@ -1094,5 +1152,6 @@ uv = module_extension( "project": _project_tag, "annotate_packages": _annotations_tag, "override_package": _override_package_tag, + "package_toolchains": _package_toolchains_tag, }, ) diff --git a/uv/private/extension/tests/defs_test.bzl b/uv/private/extension/tests/defs_test.bzl index 1d31956a3..6d807e4f0 100644 --- a/uv/private/extension/tests/defs_test.bzl +++ b/uv/private/extension/tests/defs_test.bzl @@ -1,7 +1,7 @@ """Unit tests for helpers in defs.bzl""" load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") -load("//uv/private/extension:defs.bzl", "dedupe_shared_installs", "map_scc_installs", "parse_declared_console_script", "shared_install_key") +load("//uv/private/extension:defs.bzl", "dedupe_shared_installs", "map_scc_installs", "parse_declared_console_script", "parse_package_toolchains", "project_rust_toolchain", "shared_install_key") load("//uv/private/extension:graph_utils.bzl", "collect_build_deps") load("//uv/private/extension:lockfile.bzl", "url_basename") @@ -205,6 +205,59 @@ def _map_scc_installs_conditional_union_test_impl(ctx): map_scc_installs_conditional_union_test = unittest.make(_map_scc_installs_conditional_union_test_impl) +def _tag(lock = None, rust_toolchain = None): + return struct(lock = lock, rust_toolchain = rust_toolchain) + +_RULES_RUST = "@rules_rust//rust/toolchain:current_rust_toolchain" +_RULES_RS = "@rules_rust_rs//rust/toolchain:current_rust_toolchain" + +def _package_toolchains_scope_test_impl(ctx): + env = unittest.begin(ctx) + locks = {"//a:uv.lock": True, "//b:uv.lock": True} + + none = parse_package_toolchains([], locks, "m") + asserts.equals(env, None, none.error) + asserts.equals(env, None, project_rust_toolchain(none, "//a:uv.lock"), "no declaration: no toolchain") + + module_wide = parse_package_toolchains([_tag(rust_toolchain = _RULES_RUST)], locks, "m") + asserts.equals(env, None, module_wide.error) + asserts.equals(env, _RULES_RUST, project_rust_toolchain(module_wide, "//a:uv.lock"), "a lock-less declaration covers every project") + asserts.equals(env, _RULES_RUST, project_rust_toolchain(module_wide, "//b:uv.lock")) + + mixed = parse_package_toolchains( + [_tag(rust_toolchain = _RULES_RUST), _tag(lock = "//b:uv.lock", rust_toolchain = _RULES_RS)], + locks, + "m", + ) + asserts.equals(env, None, mixed.error) + asserts.equals(env, _RULES_RUST, project_rust_toolchain(mixed, "//a:uv.lock"), "unscoped projects keep the module-wide toolchain") + asserts.equals(env, _RULES_RS, project_rust_toolchain(mixed, "//b:uv.lock"), "a lock-scoped declaration wins for its project") + + scoped_only = parse_package_toolchains([_tag(lock = "//b:uv.lock", rust_toolchain = _RULES_RS)], locks, "m") + asserts.equals(env, None, project_rust_toolchain(scoped_only, "//a:uv.lock"), "a lock-scoped declaration leaves other projects alone") + return unittest.end(env) + +package_toolchains_scope_test = unittest.make(_package_toolchains_scope_test_impl) + +def _package_toolchains_errors_test_impl(ctx): + env = unittest.begin(ctx) + locks = {"//a:uv.lock": True} + + err = parse_package_toolchains([_tag(rust_toolchain = _RULES_RUST), _tag(rust_toolchain = _RULES_RS)], locks, "m").error + asserts.true(env, err != None and "more than one module-wide" in err, "two module-wide declarations: got {}".format(err)) + + err = parse_package_toolchains([_tag(lock = "//a:uv.lock", rust_toolchain = _RULES_RUST), _tag(lock = "//a:uv.lock", rust_toolchain = _RULES_RS)], locks, "m").error + asserts.true(env, err != None and "declared twice" in err, "same lock twice: got {}".format(err)) + + err = parse_package_toolchains([_tag(lock = "//nope:uv.lock", rust_toolchain = _RULES_RUST)], locks, "m").error + asserts.true(env, err != None and "has no uv.project() for that lock" in err, "unknown lock: got {}".format(err)) + + err = parse_package_toolchains([_tag()], locks, "m").error + asserts.true(env, err != None and "at least one toolchain" in err, "empty tag: got {}".format(err)) + return unittest.end(env) + +package_toolchains_errors_test = unittest.make(_package_toolchains_errors_test_impl) + def defs_test_suite(): unittest.suite( "url_basename_tests", @@ -222,6 +275,11 @@ def defs_test_suite(): "dedupe_shared_installs_tests", dedupe_shared_installs_test, ) + unittest.suite( + "package_toolchains_tests", + package_toolchains_scope_test, + package_toolchains_errors_test, + ) unittest.suite( "map_scc_installs_tests", map_scc_installs_transitive_cycle_test, diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index d9e4dc0ba..3da8eabc2 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -284,11 +284,11 @@ def _missing_rust_toolchain(repo_name, rust_toolchain, inspection, toolchains): else: reason = "setuptools-rust is among its declared build requirements" return ("sdist_build for '{}': this sdist builds Rust ({}) but the project declares no Rust toolchain. " + - "Set `uv.project(rust_toolchain = \"@rules_rust//rust/toolchain:current_rust_toolchain\")`, " + + "Declare `uv.package_toolchains(rust_toolchain = \"@rules_rust//rust/toolchain:current_rust_toolchain\")`, " + "or wire one by hand with `uv.override_package(toolchains = [...])`.").format(repo_name, reason) def _rust_wiring(rust_toolchain, inspection, toolchains): - """The generated BUILD's Rust wiring for a project-level `rust_toolchain`. + """The generated BUILD's Rust wiring for the project's `rust_toolchain`. The configure tool already detected the build backend and its declared requirements, so a Rust-based build (maturin, or setuptools with @@ -298,7 +298,7 @@ def _rust_wiring(rust_toolchain, inspection, toolchains): their make-variables. Args: - rust_toolchain: `uv.project(rust_toolchain = ...)` rendered as a label string, or "". + rust_toolchain: The `uv.package_toolchains(rust_toolchain = ...)` that applies to the project, rendered as a label string, or "". inspection: The configure tool's JSON, or None. toolchains: Extra toolchain labels from `uv.override_package`. diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index fbd090937..2ef535c05 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -156,7 +156,7 @@ def _missing_rust_toolchain_test_impl(ctx): ) msg = missing("sdist_build__x__pkg__1_0", "", maturin, []) - asserts.true(env, msg != None and "its build backend is maturin" in msg and "uv.project(rust_toolchain" in msg, "got: {}".format(msg)) + asserts.true(env, msg != None and "its build backend is maturin" in msg and "uv.package_toolchains(rust_toolchain" in msg, "got: {}".format(msg)) msg = missing("r", "", st_rust, []) asserts.true(env, msg != None and "setuptools-rust is among its declared build requirements" in msg, "got: {}".format(msg)) return unittest.end(env) From a15fe91b2fee2f45a88f59ac42c830e819a33d67 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 15:59:38 -0600 Subject: [PATCH 095/103] fix(uv): forbid maturin from downloading a Rust toolchain of its own maturin 1.8+ fetches rustc through puccinialin when it finds no cargo, so a Rust sdist with no toolchain wired, or one the setuptools-rust inference left unwired, would build with a toolchain downloaded inside the action. Every sdist build now carries MATURIN_NO_INSTALL_RUST=1; a package env entry still wins. --- docs/uv.md | 3 +++ uv/private/pep517_whl/tests/build_helper_test.py | 12 ++++++++++++ uv/private/pep517_whl/tools/build_helper.py | 12 ++++++++++++ 3 files changed, 27 insertions(+) diff --git a/docs/uv.md b/docs/uv.md index 2fe6f1dfb..b5c1c7058 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -456,6 +456,9 @@ without a `Cargo.lock` builds with network access and a warning; give it one with `uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once with `cargo generate-lockfile` on the extracted sdist, and it is vendored and placed next to the sdist's `Cargo.toml` before the build. +maturin is told not to download a Rust toolchain of its own +(`MATURIN_NO_INSTALL_RUST=1`): a Rust sdist with no toolchain wired fails +instead of fetching rustc inside the build. ### Backend config settings diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index ae1cfd910..46f3af6f9 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -824,6 +824,18 @@ def test_no_manifest_no_copy(self) -> None: self.assertIsNone(build_helper._inject_cargo_lock(worktree, "")) +class ForbidBackendToolchainDownloadsTest(unittest.TestCase): + def test_maturin_may_not_download_rust(self) -> None: + env: dict[str, str] = {} + build_helper._forbid_backend_toolchain_downloads(env) + self.assertEqual("1", env["MATURIN_NO_INSTALL_RUST"]) + + def test_explicit_package_env_wins(self) -> None: + env = {"MATURIN_NO_INSTALL_RUST": "0"} + build_helper._forbid_backend_toolchain_downloads(env) + self.assertEqual("0", env["MATURIN_NO_INSTALL_RUST"]) + + class CargoOfflineTest(unittest.TestCase): def test_vendor_dir_replaces_crates_io_and_forbids_network(self) -> None: tmp = tempfile.mkdtemp() diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 62ca5b19a..0ef977a3f 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -1045,6 +1045,17 @@ def _inject_cargo_lock(worktree: str, lock_path: str) -> str | None: return dest +def _forbid_backend_toolchain_downloads(build_env: dict[str, str]) -> None: + """Backends must use the toolchain they were given, or fail. + + maturin 1.8+ downloads a Rust toolchain (puccinialin) when it finds no + cargo: a Rust sdist without a wired toolchain, or one the inference left + unwired, would then fetch rustc from the network inside the action and + build with it. Set for every build; it is inert for other backends. + """ + build_env.setdefault("MATURIN_NO_INSTALL_RUST", "1") + + def _configure_cargo_offline(build_env: dict[str, str], vendor_dir: str) -> None: """Point cargo at the vendored crates and forbid the network. @@ -1270,6 +1281,7 @@ def main() -> None: target_cpu=opts.target_cpu, ) + _forbid_backend_toolchain_downloads(build_env) _configure_cargo_offline(build_env, opts.cargo_vendor_dir) _inject_cargo_lock(t, opts.cargo_lock) From 0c8eae12af0400e550b4c2844e86d9061a516b99 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 16:03:50 -0600 Subject: [PATCH 096/103] feat(uv): reproducible rustc wrapper and cc-rs environment for Rust sdists The rustc wrapper only injected --sysroot, so a Rust wheel carried the sandbox and execroot paths of the host that built it (debug info, panic locations) and LLVM's per-host module ids in symbol names: the wheel action itself hits the remote cache, but its bytes differ per host, so every downstream action (whl_install, venvs) misses. The wrapper now remaps the sandbox root and the execroot away and compiles target crates as a single codegen unit; build scripts and proc-macros, which never reach the wheel, keep cargo's codegen. Native builds treat every crate as target. Crates with C or C++ sources (ring, zstd-sys) build them through cc-rs, which looks up CC_, CXX_, AR_ and RANLIB_ before falling back to the PATH; only CARGO_TARGET__LINKER was set, so those objects came from whatever compiler the runner had. Cross builds now export the wired C toolchain under both spellings, with a ranlib wrapper over `ar s` for toolchains that ship none. The linker stays the C driver: linking with c++ would add an implicit libstdc++ dependency to every Rust extension, not only the ones with C++ sources. Tests run the generated wrapper around an argv-echoing rustc and check the cc-rs variables end to end through the cross env. --- docs/uv.md | 8 ++ .../pep517_whl/tests/build_helper_test.py | 69 ++++++++++++++++- uv/private/pep517_whl/tools/build_helper.py | 75 +++++++++++++++---- 3 files changed, 135 insertions(+), 17 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index b5c1c7058..2bddffb5d 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -460,6 +460,14 @@ maturin is told not to download a Rust toolchain of its own (`MATURIN_NO_INSTALL_RUST=1`): a Rust sdist with no toolchain wired fails instead of fetching rustc inside the build. +The rustc cargo runs is a wrapper that also makes the extension independent +of where the action ran: sandbox and execroot paths are remapped out of the +binaries (`--remap-path-prefix`) and target crates compile as one codegen +unit, so the wheel's bytes match across hosts and downstream actions hit the +cache. Crates that compile C or C++ through cc-rs (`ring`, `zstd-sys`) find +the wired C toolchain under `CC_`, `CXX_`, `AR_` and +`RANLIB_` instead of whatever is on the PATH. + ### Backend config settings PEP 517 backends take a free-form `config_settings` dictionary. Declare it diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index 46f3af6f9..c151316c4 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -681,7 +681,7 @@ def test_ranlib_routes_ar_s(self) -> None: # that is the host's ranlib against the target's archives. The wrapper # must route `ar s` (ranlib's POSIX spelling) through our AR. content, tmp = self._toolchain("linux", "x86_64") - ranlib = path.join(tmp, "cmake_ranlib") + ranlib = path.join(tmp, ".aspect_rules_py_compilers", "ranlib") self.assertIn('set(CMAKE_RANLIB "{}")'.format(ranlib), content) with open(ranlib) as f: wrapper = f.read() @@ -860,6 +860,73 @@ def test_no_vendor_dir_leaves_cargo_online(self) -> None: self.assertFalse(path.exists(path.join(tmp, "config.toml"))) +class RustcWrapperTest(unittest.TestCase): + """Runs the generated rustc wrapper around an argv-echoing fake rustc.""" + + def _fake_rustc(self, tmp: str) -> str: + rustc = path.join(tmp, "tc", "bin", "rustc") + makedirs(path.dirname(rustc)) + with open(rustc, "w") as f: + f.write('#!/bin/sh\nprintf \'%s\\n\' "$@"\n') + os.chmod(rustc, 0o755) + return rustc + + def test_paths_are_remapped_and_target_crates_get_one_codegen_unit(self) -> None: + tmp = tempfile.mkdtemp() + wrapper = build_helper._write_rustc_wrapper(tmp, self._fake_rustc(tmp), "/tc/sysroot", "aarch64-unknown-linux-gnu") + argv = _run_wrapper(wrapper, ["--crate-name", "ext", "--target", "aarch64-unknown-linux-gnu"]) + self.assertEqual(["--sysroot", "/tc/sysroot"], argv[:2]) + self.assertIn("--remap-path-prefix", argv) + remapped = [argv[i + 1] for i, a in enumerate(argv) if a == "--remap-path-prefix"] + self.assertIn(path.abspath(tmp) + "/=", remapped, "the sandbox root is remapped away") + self.assertIn(os.getcwd() + "=", remapped, "the execroot is remapped away") + self.assertIn("codegen-units=1", argv) + self.assertEqual(["--crate-name", "ext", "--target", "aarch64-unknown-linux-gnu"], argv[-4:], "cargo's own arguments come last, untouched") + + def test_exec_platform_crates_keep_cargo_codegen(self) -> None: + tmp = tempfile.mkdtemp() + wrapper = build_helper._write_rustc_wrapper(tmp, self._fake_rustc(tmp), "/tc/sysroot", "aarch64-unknown-linux-gnu") + argv = _run_wrapper(wrapper, ["--crate-name", "build_script_build"]) + self.assertNotIn("codegen-units=1", argv, "build scripts and proc-macros never reach the wheel") + self.assertIn("--remap-path-prefix", argv) + + def test_native_build_treats_every_crate_as_target(self) -> None: + tmp = tempfile.mkdtemp() + wrapper = build_helper._write_rustc_wrapper(tmp, self._fake_rustc(tmp), "/tc/sysroot", None) + argv = _run_wrapper(wrapper, ["--crate-name", "ext"]) + self.assertIn("codegen-units=1", argv) + + +class CcRsEnvTest(unittest.TestCase): + def test_cc_rs_finds_the_wired_toolchain_under_both_spellings(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CC": "/w/cc", "CXX": "/w/c++", "AR": "/w/ar"} + build_helper._cc_rs_env(env, tmp, "aarch64-unknown-linux-gnu") + for spelling in ("aarch64-unknown-linux-gnu", "aarch64_unknown_linux_gnu"): + self.assertEqual("/w/cc", env["CC_" + spelling]) + self.assertEqual("/w/c++", env["CXX_" + spelling]) + self.assertEqual("/w/ar", env["AR_" + spelling]) + ranlib = env["RANLIB_" + spelling] + self.assertTrue(os.access(ranlib, os.X_OK)) + with open(ranlib) as f: + self.assertIn('exec "/w/ar" s "$@"', f.read()) + + def test_no_ar_no_archiver_vars(self) -> None: + env = {"CC": "/w/cc", "CXX": "/w/c++"} + build_helper._cc_rs_env(env, tempfile.mkdtemp(), "x86_64-unknown-linux-gnu") + self.assertNotIn("AR_x86_64-unknown-linux-gnu", env) + self.assertNotIn("RANLIB_x86_64_unknown_linux_gnu", env) + self.assertEqual("/w/cc", env["CC_x86_64_unknown_linux_gnu"]) + + def test_cross_env_exports_cc_rs_vars(self) -> None: + tmp = tempfile.mkdtemp() + env = {"CARGO": "/tc/bin/cargo", "RUSTC": "/tc/bin/rustc", "CC": "/w/cc", "CXX": "/w/c++", "AR": "/w/ar"} + build_helper._configure_cargo_cross_env(env, tmp, "linux", "x86_64", "musl") + self.assertEqual("/w/cc", env["CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER"]) + self.assertEqual("/w/cc", env["CC_x86_64-unknown-linux-musl"]) + self.assertEqual("/w/c++", env["CXX_x86_64_unknown_linux_musl"]) + + class CargoNativeEnvTest(unittest.TestCase): def test_rustc_gets_the_toolchain_sysroot(self) -> None: tmp = tempfile.mkdtemp() diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 0ef977a3f..75446ea9a 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -886,11 +886,7 @@ def _generate_cmake_toolchain_file( contain spaces, which unquoted set() would parse as list separators. """ ar = build_env.get("AR", "ar") - ranlib = _write_generated_file( - path.join(tmpdir, "cmake_ranlib"), - '#!/bin/sh\nexec "{}" s "$@"\n'.format(ar), - executable=True, - ) + ranlib = _ranlib_wrapper(tmpdir, ar) return _write_generated_file( path.join(tmpdir, "cross_toolchain.cmake"), textwrap.dedent("""\ @@ -923,14 +919,68 @@ def _generate_cmake_toolchain_file( ("darwin", "libsystem"): "apple-darwin", } +# Beyond the explicit sysroot, the wrapper makes the compiled artifacts +# independent of where the action ran: rustc bakes source paths into debug +# info and panic messages, and the sandbox root and execroot differ per host +# and per action, so they are remapped away. A single codegen unit keeps +# LLVM's module ids, which leak into symbol names, stable across hosts; it +# is applied to target crates only (build scripts and proc-macros never +# reach the wheel), or to everything in a native build where cargo passes +# no --target. _RUSTC_WRAPPER = """#!/usr/bin/env python3 import os import sys -os.execv({rustc!r}, [{rustc!r}, "--sysroot", {sysroot!r}] + sys.argv[1:]) +args = sys.argv[1:] +final = [{rustc!r}, "--sysroot", {sysroot!r}] +for prefix in {remap_prefixes!r}: + final += ["--remap-path-prefix", prefix + "/=", "--remap-path-prefix", prefix + "="] +target = {target_triple!r} +if target is None or target in args: + final += ["-C", "codegen-units=1"] +os.execv(final[0], final + args) """ +def _write_rustc_wrapper(tmpdir: str, rustc: str, sysroot: str, target_triple: str | None) -> str: + """The rustc cargo runs: explicit sysroot, reproducible paths and codegen (see _RUSTC_WRAPPER).""" + return _write_generated_file( + path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), + _RUSTC_WRAPPER.format( + rustc=rustc, + sysroot=sysroot, + remap_prefixes=[path.abspath(tmpdir), os.getcwd()], + target_triple=target_triple, + ), + executable=True, + ) + + +def _ranlib_wrapper(tmpdir: str, ar: str) -> str: + """`ar s` is ranlib: a ranlib for toolchains that ship none as a separate tool.""" + return _write_generated_file( + path.join(tmpdir, ".aspect_rules_py_compilers", "ranlib"), + '#!/bin/sh\nexec "{}" s "$@"\n'.format(ar), + executable=True, + ) + + +def _cc_rs_env(build_env: dict[str, str], tmpdir: str, triple: str) -> None: + """Point cc-rs at the wired C toolchain for crates that compile C or C++. + + cc-rs (ring, zstd-sys, ...) looks up CC_, CXX_, AR_ + and RANLIB_, in the dashed and the underscored spelling, before + falling back to whatever `cc` is on PATH. The generic CC/CXX/AR only + steer host compiles. + """ + ar = build_env.get("AR", "") + tools = {"CC": build_env.get("CC", ""), "CXX": build_env.get("CXX", ""), "AR": ar, "RANLIB": _ranlib_wrapper(tmpdir, ar) if ar else ""} + for spelling in (triple, triple.replace("-", "_")): + for tool, value in tools.items(): + if value: + build_env["{}_{}".format(tool, spelling)] = value + + def _merge_rust_sysroot(tmpdir: str, target_rustc: str, host_sysroot: str, target_sysroot: str | None = None) -> str: """Symlink-merge the target toolchain's sysroot with the host's rust-std. @@ -1002,6 +1052,7 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os build_env["CARGO_BUILD_TARGET"] = triple linker_var = "CARGO_TARGET_{}_LINKER".format(triple.upper().replace("-", "_")) build_env[linker_var] = build_env["CC"] + _cc_rs_env(build_env, tmpdir, triple) # pyo3-ffi refuses to cross-compile without an explicit target Python # version. Unused (harmless) for non-PyO3 crates. @@ -1010,11 +1061,7 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os host_sysroot = build_env.get("RULES_PY_RUST_HOST_SYSROOT") if host_sysroot: merged_sysroot = _merge_rust_sysroot(tmpdir, build_env["RUSTC"], host_sysroot, build_env.get("RULES_PY_RUST_SYSROOT")) - build_env["RUSTC"] = _write_generated_file( - path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), - _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=merged_sysroot), - executable=True, - ) + build_env["RUSTC"] = _write_rustc_wrapper(tmpdir, build_env["RUSTC"], merged_sysroot, triple) # In cross mode maturin name-parses its -i interpreter argument for a # "pythonX.Y"-shaped basename instead of executing it; our venv's @@ -1086,11 +1133,7 @@ def _configure_cargo_native_env(build_env: dict[str, str], tmpdir: str) -> None: sysroot = build_env.get("RULES_PY_RUST_SYSROOT") or build_env.get("RULES_PY_RUST_HOST_SYSROOT") if not (build_env.get("CARGO") and sysroot): return - build_env["RUSTC"] = _write_generated_file( - path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), - _RUSTC_WRAPPER.format(rustc=build_env["RUSTC"], sysroot=sysroot), - executable=True, - ) + build_env["RUSTC"] = _write_rustc_wrapper(tmpdir, build_env["RUSTC"], sysroot, None) def _build_backend(pyproject_data: dict[str, object] | None) -> str | None: From 5e93608e546c5a90f217aeb9ffcefaaa797dd9fc Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 16:22:44 -0600 Subject: [PATCH 097/103] fix(uv): turn off maturin's SBOM so Rust wheels are reproducible The CycloneDX SBOM maturin writes into the wheel records every crate as path+file:////..., and the sandbox id differs per action, so two builds of one sdist never produced the same wheel even with the rustc wrapper remapping paths. maturin 1.15 has no flag or variable for it, only the [tool.maturin.sbom] table, appended to the extracted pyproject.toml unless the sdist configures it itself. --- docs/uv.md | 5 ++-- .../pep517_whl/tests/build_helper_test.py | 27 +++++++++++++++++++ uv/private/pep517_whl/tools/build_helper.py | 26 ++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index 2bddffb5d..bcd5b2684 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -463,8 +463,9 @@ instead of fetching rustc inside the build. The rustc cargo runs is a wrapper that also makes the extension independent of where the action ran: sandbox and execroot paths are remapped out of the binaries (`--remap-path-prefix`) and target crates compile as one codegen -unit, so the wheel's bytes match across hosts and downstream actions hit the -cache. Crates that compile C or C++ through cc-rs (`ring`, `zstd-sys`) find +unit, and maturin's SBOM, which records sandbox paths, is turned off unless +the sdist configures it; the wheel's bytes then match across hosts and +downstream actions hit the cache. Crates that compile C or C++ through cc-rs (`ring`, `zstd-sys`) find the wired C toolchain under `CC_`, `CXX_`, `AR_` and `RANLIB_` instead of whatever is on the PATH. diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index c151316c4..a02e03e0b 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -897,6 +897,33 @@ def test_native_build_treats_every_crate_as_target(self) -> None: self.assertIn("codegen-units=1", argv) +class DisableMaturinSbomTest(unittest.TestCase): + def _worktree(self, pyproject: str | None) -> str: + tmp = tempfile.mkdtemp() + if pyproject is not None: + with open(path.join(tmp, "pyproject.toml"), "w") as f: + f.write(pyproject) + return tmp + + def test_sbom_is_turned_off(self) -> None: + tmp = self._worktree('[build-system]\nbuild-backend = "maturin"\n') + self.assertTrue(build_helper._disable_maturin_sbom(tmp)) + with open(path.join(tmp, "pyproject.toml")) as f: + content = f.read() + self.assertIn("[tool.maturin.sbom]\nrust = false\nauditwheel = false\n", content) + self.assertTrue(content.startswith("[build-system]"), "the sdist's own configuration is kept") + + def test_explicit_sbom_configuration_is_respected(self) -> None: + original = '[tool.maturin.sbom]\nrust = true\n' + tmp = self._worktree(original) + self.assertFalse(build_helper._disable_maturin_sbom(tmp)) + with open(path.join(tmp, "pyproject.toml")) as f: + self.assertEqual(original, f.read()) + + def test_no_pyproject_no_change(self) -> None: + self.assertFalse(build_helper._disable_maturin_sbom(self._worktree(None))) + + class CcRsEnvTest(unittest.TestCase): def test_cc_rs_finds_the_wired_toolchain_under_both_spellings(self) -> None: tmp = tempfile.mkdtemp() diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 75446ea9a..77a489faa 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -1074,6 +1074,30 @@ def _configure_cargo_cross_env(build_env: dict[str, str], tmpdir: str, target_os build_env["MATURIN_PEP517_ARGS"] = (interpreter_arg + " " + existing).strip() +_MATURIN_SBOM_OFF = "\n[tool.maturin.sbom]\nrust = false\nauditwheel = false\n" + + +def _disable_maturin_sbom(worktree: str) -> bool: + """Turn off maturin's CycloneDX SBOM unless the sdist configures it itself. + + The SBOM records every crate as `path+file:////...`: the sandbox + id differs per action, so two builds of one sdist never produce the same + wheel while it is on. maturin 1.15 offers no flag or variable for it, only + the `[tool.maturin.sbom]` table, so it is appended to the extracted + pyproject.toml. Returns whether the file was changed. + """ + pyproject = path.join(worktree, "pyproject.toml") + if not path.exists(pyproject): + return False + with open(pyproject, encoding="utf-8") as f: + content = f.read() + if "[tool.maturin.sbom]" in content: + return False + with open(pyproject, "a", encoding="utf-8") as f: + f.write(_MATURIN_SBOM_OFF) + return True + + def _inject_cargo_lock(worktree: str, lock_path: str) -> str | None: """Copy a user-supplied Cargo.lock next to the source tree's top-level Cargo.toml. @@ -1327,6 +1351,8 @@ def main() -> None: _forbid_backend_toolchain_downloads(build_env) _configure_cargo_offline(build_env, opts.cargo_vendor_dir) _inject_cargo_lock(t, opts.cargo_lock) + if _build_backend(_load_pyproject_data(t)) == "maturin": + _disable_maturin_sbom(t) if _legacy_metadata_conflicts_with_pyproject(t): print( From bc446420aebe9d41ab4bf1c6e1a9a42056011a19 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Thu, 10 Sep 2026 20:15:51 -0600 Subject: [PATCH 098/103] feat(uv): package_toolchains scopes to a package and carries generic toolchains Two review asks on uv.package_toolchains(). A declaration can now name a package, like uv.override_package(): `name` alone covers that package in every project of the module, `name` with `lock` covers it in one project. And the tag carries `toolchains`, the generic list uv.override_package() forwards per package, so a JDK or Ant reach every source build of a module or project with one declaration. Each attribute resolves from the most specific declaration that sets it: package in lock, package everywhere, lock, module. `rust_toolchain` stays its own attribute because sdist_build wires it only into maturin and setuptools-rust builds with the exec-sysroot layer, while `toolchains` is forwarded as-is. A `name` that matches no source build fails, like an uv.override_package() that matches nothing; two declarations with the same scope fail. pycross-jdk moves its JDK and Ant from the per-package override to a lock-scoped declaration. --- docs/uv.md | 30 ++-- e2e/crossbuild/pycross-jdk/setup.MODULE.bazel | 7 +- uv/private/extension/defs.bzl | 151 ++++++++++++++---- uv/private/extension/tests/defs_test.bzl | 89 +++++++---- 4 files changed, 196 insertions(+), 81 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index bcd5b2684..6b3785985 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -382,23 +382,29 @@ useful when a pre-build patch removes stale entry-point metadata. ### Build-time toolchains A native sdist build may need tools beyond the C++ toolchain: a JDK for JNI -extensions, cargo and rustc for Rust extensions, Ant. List them on the -package's override and their well-known make-variables reach the build +extensions, Ant, cargo and rustc for Rust extensions. Declare them once with +`uv.package_toolchains()` and their well-known make-variables reach the build environment on their own: ```starlark -uv.override_package( +uv.package_toolchains( lock = "//:uv.lock", - name = "jpype1", toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"], ) ``` -`$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(CARGO)`, -`$(RUSTC)`, `$(RUST_SYSROOT)` and `$(RUST_HOST_SYSROOT)` as the variables the -Rust build path reads; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise. Any other make-variable a -toolchain exports still needs an explicit `env` entry (`"FOO": "$(FOO)"`), -and an explicit entry always wins over the derived value. +`toolchains` is forwarded to every sdist built from source in scope. The scope +is the module when neither `lock` nor `name` is given, one project with +`lock`, one package everywhere with `name`, or one package in one project with +both; each attribute resolves from the most specific declaration that sets it. +`uv.override_package(toolchains = ...)` still works for a single package. + +`$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(ANT_HOME)` and +`$(ANT_BIN_DIR)` likewise; `$(CARGO)`, `$(RUSTC)`, `$(RUST_SYSROOT)` and +`$(RUST_HOST_SYSROOT)` as the variables the Rust build path reads, for +toolchains wired by hand. Any other make-variable a toolchain exports still +needs an explicit `env` entry (`"FOO": "$(FOO)"`), and an explicit entry always +wins over the derived value. Rust sdists (maturin, setuptools-rust) build with the Rust toolchain your module registers. Fetching rustc and cargo is the Rust rulesets' job, and @@ -426,9 +432,9 @@ uv.package_toolchains( ) ``` -Scope a declaration with `lock` to apply it to one project only; it wins over -the module-wide one for that project. That is how a workspace builds one -project on rules_rust and another on rules_rs: +Scope a declaration with `lock` to apply it to one project only, or with +`name` to one package; the most specific declaration wins. That is how a +workspace builds one project on rules_rust and another on rules_rs: ```starlark uv.package_toolchains( diff --git a/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel b/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel index 6ea63a6a7..a18a60631 100644 --- a/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel @@ -1,5 +1,9 @@ """jpype1: setuptools sdist whose build shells out to Ant/javac to produce a JAR before compiling the _jpype C++ extension. + +The JDK and Ant reach the build through a lock-scoped +`uv.package_toolchains(toolchains = ...)`: jpype1 is the only source build in +this project, so nothing needs the per-package `uv.override_package(toolchains)`. """ bazel_dep(name = "rules_java", version = "8.14.0") @@ -19,8 +23,7 @@ uv.project( lock = "//pycross-jdk:uv.lock", pyproject = "//pycross-jdk:pyproject.toml", ) -uv.override_package( - name = "jpype1", +uv.package_toolchains( lock = "//pycross-jdk:uv.lock", toolchains = [ "//pycross-jdk:jdk", diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index 84ee00d8e..a80f92691 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -204,41 +204,102 @@ def _parse_hubs(module_ctx): return hub_specs def parse_package_toolchains(tags, project_locks, module_name): - """Resolve a module's `uv.package_toolchains()` tags into per-lock and module-wide toolchains. + """Index a module's `uv.package_toolchains()` tags by scope. Args: - tags: The module's `package_toolchains` tags (anything with `lock` and - `rust_toolchain` fields). + tags: The module's `package_toolchains` tags (anything with `lock`, + `name`, `rust_toolchain` and `toolchains` fields). project_locks: Lock labels of the module's own `uv.project()` tags. module_name: For error messages. Returns: - struct(default, by_lock, error): `default` is the module-wide tag or - None, `by_lock` maps a lock label to its tag, and `error` is the message - to fail with, or None. Two tags with the same scope, an unknown lock and - a tag that names no toolchain are errors. + struct(default, by_lock, by_package, hits, error): `default` is the + module-wide tag or None; `by_lock` maps a lock label to its tag; + `by_package` maps (lock or None, normalized package name) to its tag; + `hits` counts, per index of a `name`-scoped tag, the packages it + applied to (see check_package_toolchains_matched); `error` is the + message to fail with, or None. Two tags with the same scope, an + unknown lock and a tag that names no toolchain are errors. """ default = None by_lock = {} - for tag in tags: - if not tag.rust_toolchain: - return struct(default = None, by_lock = {}, error = "uv.package_toolchains() in module '{}': set at least one toolchain (rust_toolchain).".format(module_name)) - if tag.lock == None: + by_package = {} + hits = {} + err = None + for i, tag in enumerate(tags): + if not tag.rust_toolchain and not tag.toolchains: + err = "uv.package_toolchains() in module '{}': set at least one of `rust_toolchain` or `toolchains`.".format(module_name) + elif tag.lock != None and tag.lock not in project_locks: + err = "uv.package_toolchains() refers to lock '{}', but module '{}' has no uv.project() for that lock.".format(tag.lock, module_name) + elif tag.name: + key = (tag.lock, normalize_name(tag.name)) + if key in by_package: + err = "uv.package_toolchains() in module '{}': package '{}' is declared twice for {}.".format(module_name, tag.name, "lock '{}'".format(tag.lock) if tag.lock != None else "every lock") + by_package[key] = tag + hits[i] = 0 + elif tag.lock != None: + if tag.lock in by_lock: + err = "uv.package_toolchains() in module '{}': lock '{}' is declared twice.".format(module_name, tag.lock) + by_lock[tag.lock] = tag + else: if default != None: - return struct(default = None, by_lock = {}, error = "uv.package_toolchains() in module '{}': more than one module-wide declaration; scope all but one with `lock`.".format(module_name)) + err = "uv.package_toolchains() in module '{}': more than one module-wide declaration; scope all but one with `lock` or `name`.".format(module_name) default = tag - elif tag.lock not in project_locks: - return struct(default = None, by_lock = {}, error = "uv.package_toolchains() refers to lock '{}', but module '{}' has no uv.project() for that lock.".format(tag.lock, module_name)) - elif tag.lock in by_lock: - return struct(default = None, by_lock = {}, error = "uv.package_toolchains() in module '{}': lock '{}' is declared twice.".format(module_name, tag.lock)) - else: - by_lock[tag.lock] = tag - return struct(default = default, by_lock = by_lock, error = None) + if err: + return struct(default = None, by_lock = {}, by_package = {}, hits = {}, error = err) + return struct(default = default, by_lock = by_lock, by_package = by_package, hits = hits, error = None) + +def resolve_package_toolchains(package_toolchains, lock, name, tags = None): + """The toolchains for one sdist: each attribute from the most specific declaration that sets it. -def project_rust_toolchain(package_toolchains, lock): - """The Rust toolchain for the project pinned by `lock`: its own declaration, else the module-wide one, else None.""" - tag = package_toolchains.by_lock.get(lock) or package_toolchains.default - return tag.rust_toolchain if tag else None + Precedence: the package within its lock, the package in every lock, the + lock, the module. `rust_toolchain` and `toolchains` resolve independently, + so a package-level Rust toolchain does not discard a module-wide JDK. + + Args: + package_toolchains: As returned by parse_package_toolchains. + lock: The project's lock label. + name: The package's normalized name. + tags: The module's tags, to count which `name`-scoped ones applied. + + Returns: + struct(rust_toolchain, toolchains): a label or None, and a list of + label strings. + """ + candidates = [ + package_toolchains.by_package.get((lock, name)), + package_toolchains.by_package.get((None, name)), + package_toolchains.by_lock.get(lock), + package_toolchains.default, + ] + candidates = [c for c in candidates if c != None] + if tags != None: + for i, tag in enumerate(tags): + if tag.name and tag in candidates: + package_toolchains.hits[i] += 1 + rust_toolchain = None + toolchains = [] + for c in candidates: + if c.rust_toolchain: + rust_toolchain = c.rust_toolchain + break + for c in candidates: + if c.toolchains: + toolchains = [str(t) for t in c.toolchains] + break + return struct(rust_toolchain = rust_toolchain, toolchains = toolchains) + +def check_package_toolchains_matched(package_toolchains, tags, module_name): + """The error for a `name`-scoped declaration that applied to no package, or None.""" + for i, count in package_toolchains.hits.items(): + if not count: + tag = tags[i] + return "uv.package_toolchains() for '{}' matches no package building from source in {} of module '{}'.".format( + tag.name, + "lock '{}'".format(tag.lock) if tag.lock != None else "any uv.project() lock", + module_name, + ) + return None def _parse_projects(module_ctx, hub_specs): """Resolve every `uv.project()` declaration into repository-rule inputs. @@ -638,6 +699,9 @@ def _parse_projects(module_ctx, hub_specs): monitor_memory = pkg_override.monitor_memory resource_set = pkg_override.resource_set + pkg_toolchains = resolve_package_toolchains(package_toolchains, project.lock, normalize_name(package["name"]), mod.tags.package_toolchains) + extra_toolchains = extra_toolchains + [t for t in pkg_toolchains.toolchains if t not in extra_toolchains] + sbuild_specs[sbuild_id] = struct( src = sdist, deps = ["@{0}//:{1}".format(*it) for it in build_deps], @@ -653,7 +717,7 @@ def _parse_projects(module_ctx, hub_specs): cargo_lock = cargo_lock, monitor_memory = monitor_memory, resource_set = resource_set, - rust_toolchain = project_rust_toolchain(package_toolchains, project.lock), + rust_toolchain = pkg_toolchains.rust_toolchain, ) has_sbuild = True @@ -768,6 +832,10 @@ def _parse_projects(module_ctx, hub_specs): for cfg in cfgs.keys(): hub_cfg.packages.setdefault(package, {})[cfg] = "@{}//:{}".format(project_id, package) + unmatched = check_package_toolchains_matched(package_toolchains, mod.tags.package_toolchains, mod.name) + if unmatched: + fail(unmatched) + for i, override in enumerate(mod.tags.override_package): if override.lock == None and not unscoped_matches[i]: if override.version: @@ -1068,7 +1136,7 @@ _override_package_tag = tag_class( ), "toolchains": attr.label_list( default = [], - doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_SYSROOT, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", + doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list; `uv.package_toolchains(toolchains = ...)` does the same for a whole project or module. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_SYSROOT, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", ), "env": attr.string_dict( default = {}, @@ -1126,23 +1194,38 @@ _package_toolchains_tag = tag_class( "lock": attr.label( mandatory = False, doc = "Scope the declaration to the `uv.project()` pinned by this `uv.lock`. Without it the " + - "declaration applies to every project of the module; a `lock`-scoped one wins over it.", + "declaration applies to every project of the module.", + ), + "name": attr.string( + mandatory = False, + doc = "Scope the declaration to one package, like `uv.override_package`; with `lock`, to that " + + "package in that project only. Must match a package that builds from source.", ), "rust_toolchain": attr.label( mandatory = False, doc = "A rules_rust `current_rust_toolchain`-style target: any target exposing rules_rust's " + - "toolchain providers, from rules_rust or rules_rs. Every sdist whose build backend is " + - "maturin or setuptools-rust gets it, plus rules_py's exec-configured sysroot layer, wired " + - "into its build automatically, with no per-package `uv.override_package(toolchains = ...)`.", + "toolchain providers, from rules_rust or rules_rs. Every sdist in scope whose build backend " + + "is maturin or setuptools-rust gets it, plus rules_py's exec-configured sysroot layer, wired " + + "into its build automatically; other sdists ignore it.", + ), + "toolchains": attr.label_list( + default = [], + doc = "Toolchain targets forwarded to every source build in scope, as `uv.override_package(toolchains = ...)` " + + "does for one package: their `TemplateVariableInfo` make-variables become available for `$(VAR)` " + + "expansion in `env`, and the well-known ones (JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the " + + "build environment automatically.", ), }, doc = """Toolchains for the sdists a module's `uv.project()` declarations build from source. -The extension detects which sdists need which toolchain (a maturin backend or -setuptools-rust for Rust) and wires it into their builds; nothing is named per -package. One declaration without `lock` covers every project of the module, -and a `lock`-scoped one overrides it for that project. A tag must set at -least one toolchain.""", +`rust_toolchain` is detected into place: the extension wires it only into +builds whose backend is maturin or setuptools-rust. `toolchains` is forwarded +as-is to every source build in scope. Scope is the module (no `lock`, no +`name`), one project (`lock`), one package everywhere (`name`) or one package +in one project (both); each attribute resolves from the most specific +declaration that sets it. Two declarations with the same scope fail, and a +`name` that matches no source build fails. A tag must set at least one of the +two attributes.""", ) uv = module_extension( diff --git a/uv/private/extension/tests/defs_test.bzl b/uv/private/extension/tests/defs_test.bzl index 6d807e4f0..75af8ee44 100644 --- a/uv/private/extension/tests/defs_test.bzl +++ b/uv/private/extension/tests/defs_test.bzl @@ -1,7 +1,8 @@ """Unit tests for helpers in defs.bzl""" load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") -load("//uv/private/extension:defs.bzl", "dedupe_shared_installs", "map_scc_installs", "parse_declared_console_script", "parse_package_toolchains", "project_rust_toolchain", "shared_install_key") +load("//uv/private:normalize_name.bzl", "normalize_name") +load("//uv/private/extension:defs.bzl", "check_package_toolchains_matched", "dedupe_shared_installs", "map_scc_installs", "parse_declared_console_script", "parse_package_toolchains", "resolve_package_toolchains", "shared_install_key") load("//uv/private/extension:graph_utils.bzl", "collect_build_deps") load("//uv/private/extension:lockfile.bzl", "url_basename") @@ -205,55 +206,77 @@ def _map_scc_installs_conditional_union_test_impl(ctx): map_scc_installs_conditional_union_test = unittest.make(_map_scc_installs_conditional_union_test_impl) -def _tag(lock = None, rust_toolchain = None): - return struct(lock = lock, rust_toolchain = rust_toolchain) +def _tag(lock = None, name = None, rust_toolchain = None, toolchains = []): + return struct(lock = lock, name = name, rust_toolchain = rust_toolchain, toolchains = toolchains) _RULES_RUST = "@rules_rust//rust/toolchain:current_rust_toolchain" _RULES_RS = "@rules_rust_rs//rust/toolchain:current_rust_toolchain" +_NIGHTLY = "//tools:nightly_rust" +_JDK = "@bazel_tools//tools/jdk:current_java_runtime" +_ANT = "//tools:ant_home" +_LOCKS = {"//a:uv.lock": True, "//b:uv.lock": True} + +def _resolve(tags, lock, name): + parsed = parse_package_toolchains(tags, _LOCKS, "m") + return parsed, resolve_package_toolchains(parsed, lock, name, tags) def _package_toolchains_scope_test_impl(ctx): env = unittest.begin(ctx) - locks = {"//a:uv.lock": True, "//b:uv.lock": True} - - none = parse_package_toolchains([], locks, "m") - asserts.equals(env, None, none.error) - asserts.equals(env, None, project_rust_toolchain(none, "//a:uv.lock"), "no declaration: no toolchain") - - module_wide = parse_package_toolchains([_tag(rust_toolchain = _RULES_RUST)], locks, "m") - asserts.equals(env, None, module_wide.error) - asserts.equals(env, _RULES_RUST, project_rust_toolchain(module_wide, "//a:uv.lock"), "a lock-less declaration covers every project") - asserts.equals(env, _RULES_RUST, project_rust_toolchain(module_wide, "//b:uv.lock")) - - mixed = parse_package_toolchains( - [_tag(rust_toolchain = _RULES_RUST), _tag(lock = "//b:uv.lock", rust_toolchain = _RULES_RS)], - locks, - "m", - ) - asserts.equals(env, None, mixed.error) - asserts.equals(env, _RULES_RUST, project_rust_toolchain(mixed, "//a:uv.lock"), "unscoped projects keep the module-wide toolchain") - asserts.equals(env, _RULES_RS, project_rust_toolchain(mixed, "//b:uv.lock"), "a lock-scoped declaration wins for its project") - scoped_only = parse_package_toolchains([_tag(lock = "//b:uv.lock", rust_toolchain = _RULES_RS)], locks, "m") - asserts.equals(env, None, project_rust_toolchain(scoped_only, "//a:uv.lock"), "a lock-scoped declaration leaves other projects alone") + _, none = _resolve([], "//a:uv.lock", "pkg") + asserts.equals(env, None, none.rust_toolchain, "no declaration: no toolchain") + asserts.equals(env, [], none.toolchains) + + _, module_wide = _resolve([_tag(rust_toolchain = _RULES_RUST, toolchains = [_JDK])], "//b:uv.lock", "pkg") + asserts.equals(env, _RULES_RUST, module_wide.rust_toolchain, "a lock-less, name-less declaration covers every package of every project") + asserts.equals(env, [_JDK], module_wide.toolchains) + + tags = [ + _tag(rust_toolchain = _RULES_RUST, toolchains = [_JDK]), + _tag(lock = "//b:uv.lock", rust_toolchain = _RULES_RS), + _tag(name = "Pydantic_Core", rust_toolchain = _NIGHTLY), + _tag(lock = "//b:uv.lock", name = "jpype1", toolchains = [_ANT]), + ] + _, a_pkg = _resolve(tags, "//a:uv.lock", "pkg") + asserts.equals(env, _RULES_RUST, a_pkg.rust_toolchain, "unscoped projects keep the module-wide toolchain") + _, b_pkg = _resolve(tags, "//b:uv.lock", "pkg") + asserts.equals(env, _RULES_RS, b_pkg.rust_toolchain, "a lock-scoped declaration wins over the module-wide one for its project") + asserts.equals(env, [_JDK], b_pkg.toolchains, "attributes resolve independently: the lock declaration sets no toolchains, so the module-wide list applies") + _, b_pydantic = _resolve(tags, "//b:uv.lock", normalize_name("pydantic-core")) + asserts.equals(env, _NIGHTLY, b_pydantic.rust_toolchain, "a package declaration (normalized name) wins over the lock one, in every lock") + _, b_jpype = _resolve(tags, "//b:uv.lock", "jpype1") + asserts.equals(env, [_ANT], b_jpype.toolchains, "a package-in-lock declaration is the most specific") + asserts.equals(env, _RULES_RS, b_jpype.rust_toolchain, "and leaves the other attribute to the next scope") + _, a_jpype = _resolve(tags, "//a:uv.lock", "jpype1") + asserts.equals(env, [_JDK], a_jpype.toolchains, "a package-in-lock declaration does not reach the same package in another lock") return unittest.end(env) package_toolchains_scope_test = unittest.make(_package_toolchains_scope_test_impl) def _package_toolchains_errors_test_impl(ctx): env = unittest.begin(ctx) - locks = {"//a:uv.lock": True} - err = parse_package_toolchains([_tag(rust_toolchain = _RULES_RUST), _tag(rust_toolchain = _RULES_RS)], locks, "m").error - asserts.true(env, err != None and "more than one module-wide" in err, "two module-wide declarations: got {}".format(err)) + def error(tags): + return parse_package_toolchains(tags, _LOCKS, "m").error - err = parse_package_toolchains([_tag(lock = "//a:uv.lock", rust_toolchain = _RULES_RUST), _tag(lock = "//a:uv.lock", rust_toolchain = _RULES_RS)], locks, "m").error + err = error([_tag(rust_toolchain = _RULES_RUST), _tag(toolchains = [_JDK])]) + asserts.true(env, err != None and "more than one module-wide" in err, "two module-wide declarations: got {}".format(err)) + err = error([_tag(lock = "//a:uv.lock", rust_toolchain = _RULES_RUST), _tag(lock = "//a:uv.lock", rust_toolchain = _RULES_RS)]) asserts.true(env, err != None and "declared twice" in err, "same lock twice: got {}".format(err)) - - err = parse_package_toolchains([_tag(lock = "//nope:uv.lock", rust_toolchain = _RULES_RUST)], locks, "m").error + err = error([_tag(name = "x", rust_toolchain = _RULES_RUST), _tag(name = "X", toolchains = [_JDK])]) + asserts.true(env, err != None and "package 'X' is declared twice" in err, "same package twice (normalized): got {}".format(err)) + asserts.equals(env, None, error([_tag(name = "x", rust_toolchain = _RULES_RUST), _tag(lock = "//a:uv.lock", name = "x", toolchains = [_JDK])]), "the same package everywhere and in one lock are two scopes") + err = error([_tag(lock = "//nope:uv.lock", rust_toolchain = _RULES_RUST)]) asserts.true(env, err != None and "has no uv.project() for that lock" in err, "unknown lock: got {}".format(err)) - - err = parse_package_toolchains([_tag()], locks, "m").error - asserts.true(env, err != None and "at least one toolchain" in err, "empty tag: got {}".format(err)) + err = error([_tag()]) + asserts.true(env, err != None and "at least one of" in err, "empty tag: got {}".format(err)) + + tags = [_tag(name = "ghost", rust_toolchain = _RULES_RUST), _tag(name = "pkg", toolchains = [_JDK])] + parsed, _ = _resolve(tags, "//a:uv.lock", "pkg") + err = check_package_toolchains_matched(parsed, tags, "m") + asserts.true(env, err != None and "'ghost' matches no package" in err, "a name that never applied: got {}".format(err)) + resolve_package_toolchains(parsed, "//b:uv.lock", "ghost", tags) + asserts.equals(env, None, check_package_toolchains_matched(parsed, tags, "m"), "once every name applied somewhere, nothing to report") return unittest.end(env) package_toolchains_errors_test = unittest.make(_package_toolchains_errors_test_impl) From efa605ab5885cd68fcc85f7c354cf1b996dbd26f Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 15 Sep 2026 13:38:22 -0600 Subject: [PATCH 099/103] feat(uv): host-independent symbol hashes for Rust wheels Cargo's `-C metadata=` hash, which rustc mangles into every symbol and uses as the crate's stable id, mixes in `rustc -vV` (host triple included) and the paths of host-compiled build scripts, so a wheel's `.so` differed by build host even with paths remapped. The rustc wrapper now gives target crates a hash derived from host-independent identity: the toolchain's `rustc --version` string, `CARGO_PKG_NAME` and `CARGO_PKG_VERSION` from the environment cargo hands rustc, the crate name, its types, cfgs, target and the codegen options its profile sets. Two versions of one package hash apart, and so do the two compilations a native build makes of one crate under differing `build-override` and normal profiles. Path-carrying options (`linker`, `link-arg`) are excluded; `-C extra-filename` stays cargo's so artifact names never collide. Host crates keep cargo's hash: they never reach the wheel. The wrapper is exercised around an argv-echoing fake rustc: same hash from two sandboxes, different across versions, features and toolchains, host crates untouched, both `-C metadata=` spellings. --- .../pep517_whl/tests/build_helper_test.py | 87 ++++++++++++++++- uv/private/pep517_whl/tools/build_helper.py | 94 +++++++++++++++++-- 2 files changed, 170 insertions(+), 11 deletions(-) diff --git a/uv/private/pep517_whl/tests/build_helper_test.py b/uv/private/pep517_whl/tests/build_helper_test.py index a02e03e0b..883b333a5 100644 --- a/uv/private/pep517_whl/tests/build_helper_test.py +++ b/uv/private/pep517_whl/tests/build_helper_test.py @@ -432,11 +432,15 @@ def test_parser_accepts_and_defaults_target_flags(self) -> None: -def _run_wrapper(wrapper: str, args: list[str]) -> list[str]: +def _run_wrapper(wrapper: str, args: list[str], env: dict[str, str] | None = None) -> list[str]: import subprocess result = subprocess.run( - [wrapper] + args, capture_output=True, text=True, check=True + [wrapper] + args, + capture_output=True, + text=True, + check=True, + env={**os.environ, **env} if env else None, ) return result.stdout.split() @@ -896,6 +900,85 @@ def test_native_build_treats_every_crate_as_target(self) -> None: argv = _run_wrapper(wrapper, ["--crate-name", "ext"]) self.assertIn("codegen-units=1", argv) + _TARGET = "aarch64-unknown-linux-gnu" + _CRATE = ["--crate-name", "ext", "--crate-type", "cdylib", "--cfg", 'feature="fast"', "--cfg", "abi3"] + _PKG = {"CARGO_PKG_NAME": "ext", "CARGO_PKG_VERSION": "1.2.3"} + + def _metadata(self, argv: list[str]) -> str: + values = [argv[i + 1] for i, a in enumerate(argv) if a == "-C" and argv[i + 1].startswith("metadata=")] + self.assertEqual(1, len(values), argv) + return values[0][len("metadata="):] + + def test_target_crate_symbol_hash_is_host_independent(self) -> None: + # Same toolchain, same crate, built from two sandboxes with different + # cargo hashes: the mangled-symbol hash must agree. + digests = [] + for cargo_hash in ("deadbeefcafef00d", "0123456789abcdef"): + tmp = tempfile.mkdtemp() + wrapper = build_helper._write_rustc_wrapper(tmp, self._fake_rustc(tmp), "/tc/sysroot", self._TARGET) + argv = _run_wrapper( + wrapper, + self._CRATE + ["-C", "metadata=" + cargo_hash, "-C", "extra-filename=-" + cargo_hash, "--target", self._TARGET], + env=self._PKG, + ) + digests.append(self._metadata(argv)) + self.assertIn("extra-filename=-" + cargo_hash, argv, "cargo's artifact names are left alone") + self.assertEqual(digests[0], digests[1]) + self.assertRegex(digests[0], r"^[0-9a-f]{16}$") + + def test_symbol_hash_separates_crate_identities(self) -> None: + tmp = tempfile.mkdtemp() + wrapper = build_helper._write_rustc_wrapper(tmp, self._fake_rustc(tmp), "/tc/sysroot", self._TARGET) + base = self._CRATE + ["-C", "metadata=aaaa", "--target", self._TARGET] + same = self._metadata(_run_wrapper(wrapper, base, env=self._PKG)) + other_version = self._metadata(_run_wrapper(wrapper, base, env={**self._PKG, "CARGO_PKG_VERSION": "2.0.0"})) + other_features = self._metadata(_run_wrapper(wrapper, base + ["--cfg", 'feature="extra"'], env=self._PKG)) + reordered = self._metadata(_run_wrapper(wrapper, ["--cfg", "abi3", "--cfg", 'feature="fast"', "--crate-type", "cdylib", "--crate-name", "ext", "-C", "metadata=bbbb", "--target", self._TARGET], env=self._PKG)) + self.assertNotEqual(same, other_version, "two versions of one package must not share symbol hashes") + self.assertNotEqual(same, other_features) + self.assertEqual(same, reordered, "argument order is cargo's business, not identity") + + def test_symbol_hash_tracks_the_toolchain(self) -> None: + tmp_a, tmp_b = tempfile.mkdtemp(), tempfile.mkdtemp() + rustc_b = self._fake_rustc(tmp_b) + with open(rustc_b, "w") as f: + f.write('#!/bin/sh\nif [ "$1" = --version ]; then echo "rustc 1.91.0 (other)"; exit 0; fi\nprintf \'%s\\n\' "$@"\n') + args = self._CRATE + ["-C", "metadata=aaaa", "--target", self._TARGET] + a = self._metadata(_run_wrapper(build_helper._write_rustc_wrapper(tmp_a, self._fake_rustc(tmp_a), "/s", self._TARGET), args, env=self._PKG)) + b = self._metadata(_run_wrapper(build_helper._write_rustc_wrapper(tmp_b, rustc_b, "/s", self._TARGET), args, env=self._PKG)) + self.assertNotEqual(a, b, "a toolchain upgrade must change the hashes") + + def test_profile_separates_the_two_native_compilations_of_one_crate(self) -> None: + # A native build compiles a crate once for a proc-macro (build-override + # profile) and once as a normal dependency when the profiles differ; + # the two must not share a stable crate id. Paths in codegen options + # are per sandbox and must not take part. + tmp = tempfile.mkdtemp() + wrapper = build_helper._write_rustc_wrapper(tmp, self._fake_rustc(tmp), "/tc/sysroot", None) + base = ["--crate-name", "proc_macro2", "--crate-type", "lib", "-C", "metadata=aaaa"] + env = {"CARGO_PKG_NAME": "proc-macro2", "CARGO_PKG_VERSION": "1.0.90"} + normal = self._metadata(_run_wrapper(wrapper, base + ["-C", "opt-level=3", "-C", "linker=" + tmp + "/cc"], env=env)) + override = self._metadata(_run_wrapper(wrapper, base + ["-C", "opt-level=0", "-C", "linker=" + tmp + "/cc"], env=env)) + other_linker = self._metadata(_run_wrapper(wrapper, base + ["-C", "opt-level=3", "-C", "linker=/elsewhere/cc"], env=env)) + joined = self._metadata(_run_wrapper(wrapper, base + ["-Copt-level=3", "--codegen", "linker=/x"], env=env)) + self.assertNotEqual(normal, override) + self.assertEqual(normal, other_linker) + self.assertEqual(normal, joined, "both spellings of a codegen option are one identity") + + def test_exec_platform_crates_keep_cargo_metadata(self) -> None: + tmp = tempfile.mkdtemp() + wrapper = build_helper._write_rustc_wrapper(tmp, self._fake_rustc(tmp), "/tc/sysroot", self._TARGET) + argv = _run_wrapper(wrapper, ["--crate-name", "build_script_build", "-C", "metadata=cafe"], env=self._PKG) + self.assertEqual("cafe", self._metadata(argv)) + + def test_joined_metadata_spelling(self) -> None: + tmp = tempfile.mkdtemp() + wrapper = build_helper._write_rustc_wrapper(tmp, self._fake_rustc(tmp), "/tc/sysroot", None) + argv = _run_wrapper(wrapper, ["--crate-name", "ext", "-Cmetadata=cafe"], env=self._PKG) + joined = [a for a in argv if a.startswith("-Cmetadata=")] + self.assertEqual(1, len(joined)) + self.assertNotEqual("-Cmetadata=cafe", joined[0]) + class DisableMaturinSbomTest(unittest.TestCase): def _worktree(self, pyproject: str | None) -> str: diff --git a/uv/private/pep517_whl/tools/build_helper.py b/uv/private/pep517_whl/tools/build_helper.py index 77a489faa..3dad06cf7 100644 --- a/uv/private/pep517_whl/tools/build_helper.py +++ b/uv/private/pep517_whl/tools/build_helper.py @@ -919,18 +919,30 @@ def _generate_cmake_toolchain_file( ("darwin", "libsystem"): "apple-darwin", } -# Beyond the explicit sysroot, the wrapper makes the compiled artifacts -# independent of where the action ran: rustc bakes source paths into debug -# info and panic messages, and the sandbox root and execroot differ per host -# and per action, so they are remapped away. A single codegen unit keeps -# LLVM's module ids, which leak into symbol names, stable across hosts; it -# is applied to target crates only (build scripts and proc-macros never -# reach the wheel), or to everything in a native build where cargo passes -# no --target. +# The rustc cargo runs. Sandbox and execroot paths differ per host and per +# action, so they are remapped away. A single codegen unit keeps LLVM's +# module ids, which leak into symbol names, stable across hosts; it is +# applied to target crates only (build scripts and proc-macros never reach +# the wheel), or to everything in a native build where cargo passes no +# --target. Cargo's `-C metadata=` hash, which every mangled symbol carries +# and rustc uses as the crate's stable id, mixes in `rustc -vV` (host triple +# included) and the paths of host-compiled build scripts; target crates get +# one derived from host-independent identity instead: the toolchain's +# release string, the package cargo names in the environment it hands rustc, +# the crate name, its types, its cfgs, the target and the codegen options +# that define its profile. Two versions of one package hash apart, and so do +# the two compilations of one crate a native build makes when the +# `build-override` profile differs from the normal one (cargo shares them +# only when the profiles agree). Options carrying paths (`linker`, +# `link-arg`) are left out: those are per sandbox. `-C extra-filename` stays +# cargo's so its own artifact names never collide. _RUSTC_WRAPPER = """#!/usr/bin/env python3 +import hashlib import os import sys +PROFILE_OPTIONS = {profile_options!r} + args = sys.argv[1:] final = [{rustc!r}, "--sysroot", {sysroot!r}] for prefix in {remap_prefixes!r}: @@ -938,12 +950,74 @@ def _generate_cmake_toolchain_file( target = {target_triple!r} if target is None or target in args: final += ["-C", "codegen-units=1"] + identity = [ + {toolchain!r}, + os.environ.get("CARGO_PKG_NAME", ""), + os.environ.get("CARGO_PKG_VERSION", ""), + target or "", + ] + crate_types = [] + cfgs = [] + codegen = [] + for i, arg in enumerate(args): + if arg == "--crate-name" and i + 1 < len(args): + identity.append(args[i + 1]) + elif arg == "--crate-type" and i + 1 < len(args): + crate_types.append(args[i + 1]) + elif arg == "--cfg" and i + 1 < len(args): + cfgs.append(args[i + 1]) + else: + option = None + if arg in ("-C", "--codegen") and i + 1 < len(args): + option = args[i + 1] + elif arg.startswith("-C") and "=" in arg: + option = arg[2:] + if option is not None and option.split("=", 1)[0] in PROFILE_OPTIONS: + codegen.append(option) + identity += sorted(crate_types) + sorted(cfgs) + sorted(codegen) + metadata = "metadata=" + hashlib.sha256("\\0".join(identity).encode()).hexdigest()[:16] + for i, arg in enumerate(args): + if arg.startswith("metadata=") and i > 0 and args[i - 1] in ("-C", "--codegen"): + args[i] = metadata + elif arg.startswith("-Cmetadata="): + args[i] = "-C" + metadata os.execv(final[0], final + args) """ +# Codegen options cargo derives from the profile: the identity of a +# compilation of one crate beyond its name, version, cfgs and target. +_RUSTC_PROFILE_OPTIONS = ( + "opt-level", + "debuginfo", + "debug-assertions", + "overflow-checks", + "panic", + "lto", + "embed-bitcode", + "strip", + "target-cpu", + "target-feature", + "relocation-model", + "symbol-mangling-version", +) + + +def _rustc_identity(rustc: str) -> str: + """The toolchain's release string (`rustc 1.90.0 (hash date)`): the same on every host. + + Falls back to the binary's name, loudly: symbol hashes then no longer + track toolchain upgrades, which is harmless within a build but worth + knowing about. + """ + try: + return check_output([rustc, "--version"], text=True, stderr=STDOUT).strip() + except (OSError, CalledProcessError) as exc: + print("Warning: {} --version failed ({}); symbol hashes will not track the toolchain release.".format(rustc, exc), file=sys.stderr) + return path.basename(rustc) + def _write_rustc_wrapper(tmpdir: str, rustc: str, sysroot: str, target_triple: str | None) -> str: - """The rustc cargo runs: explicit sysroot, reproducible paths and codegen (see _RUSTC_WRAPPER).""" + """The rustc cargo runs: explicit sysroot, reproducible paths, codegen and symbol hashes (see _RUSTC_WRAPPER).""" return _write_generated_file( path.join(tmpdir, ".aspect_rules_py_rustc", "rustc"), _RUSTC_WRAPPER.format( @@ -951,6 +1025,8 @@ def _write_rustc_wrapper(tmpdir: str, rustc: str, sysroot: str, target_triple: s sysroot=sysroot, remap_prefixes=[path.abspath(tmpdir), os.getcwd()], target_triple=target_triple, + toolchain=_rustc_identity(rustc), + profile_options=_RUSTC_PROFILE_OPTIONS, ), executable=True, ) From bd3666ee5aa33cb4a3df4d00069d1bb0890fd09f Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 15 Sep 2026 13:38:22 -0600 Subject: [PATCH 100/103] test(e2e): per-case test.sh scripts in crossbuild crossbuild/test.sh becomes the same aggregator cases/test.sh is: it runs every `/test.sh`, so a case that needs a real `bazel run`, the host's identity or network the action sandbox denies owns its own script instead of growing the workspace-level one. The macOS amd64 cross build of pycross-geohash moves to pycross-geohash/test.sh. --- e2e/crossbuild/pycross-geohash/BUILD.bazel | 2 +- e2e/crossbuild/pycross-geohash/test.sh | 18 ++++++++++ e2e/crossbuild/test.sh | 39 ++++++++++++++++------ 3 files changed, 48 insertions(+), 11 deletions(-) create mode 100755 e2e/crossbuild/pycross-geohash/test.sh diff --git a/e2e/crossbuild/pycross-geohash/BUILD.bazel b/e2e/crossbuild/pycross-geohash/BUILD.bazel index d2eb341e2..d656aa682 100644 --- a/e2e/crossbuild/pycross-geohash/BUILD.bazel +++ b/e2e/crossbuild/pycross-geohash/BUILD.bazel @@ -69,7 +69,7 @@ pycross_wheel_export( ) # macOS arm64 -> macOS amd64 cross target, exercised only from a real macOS -# host by //:test.sh. Manual rather than target_compatible_with: the +# host by pycross-geohash/test.sh. Manual rather than target_compatible_with: the # transition always resolves to os:macos, so the constraint cannot tell a # Linux host apart from a macOS one. No libc flags: the target is not Linux. platform( diff --git a/e2e/crossbuild/pycross-geohash/test.sh b/e2e/crossbuild/pycross-geohash/test.sh new file mode 100755 index 000000000..112548808 --- /dev/null +++ b/e2e/crossbuild/pycross-geohash/test.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# +# geohash_macos_wheels is tagged "manual" (see BUILD.bazel), so this is the +# only place that runs it — and only on a real macOS host, the one with an +# Xcode SDK to cross-build the macOS amd64 wheel from. +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")/.." # e2e/crossbuild workspace root + +BAZEL="${BAZEL:-bazel}" + +if [[ "$(uname)" != "Darwin" ]]; then + echo "Linux host — skipping the macOS cross target (no Xcode SDK available from here)" + exit 0 +fi + +echo "macOS host detected — cross-building the macOS amd64 wheel too" +"$BAZEL" test --test_output=errors //pycross-geohash:geohash_macos_wheels_tags_test diff --git a/e2e/crossbuild/test.sh b/e2e/crossbuild/test.sh index 107a0fc74..8c548e1c8 100755 --- a/e2e/crossbuild/test.sh +++ b/e2e/crossbuild/test.sh @@ -1,13 +1,32 @@ #!/usr/bin/env bash -# geohash_macos_wheels is tagged "manual" (see pycross-geohash/BUILD.bazel), -# so this is the only place that runs it — and only on a real macOS host. -set -euo pipefail +# +# Script-driven checks for the crossbuild workspace. +# +# A few cases can't be an `sh_test` under `//...` — they need a real +# top-level `bazel run`, the host's identity, or network the action sandbox +# denies (`--sandbox_default_allow_network=false`). Each ships a +# `/test.sh`; this aggregator runs them all so CI only has to discover +# one entrypoint per workspace via `e2e/*/test.sh`. +# +# Override bazel with $BAZEL. Each sub-script self-locates, so cwd here only +# needs to make the `*/test.sh` glob resolve. +set -uo pipefail -cd "$(dirname "${BASH_SOURCE[0]}")" +cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1 # e2e/crossbuild -if [[ "$(uname)" == "Darwin" ]]; then - echo "macOS host detected — cross-building the macOS amd64 wheel too" - bazel test --test_output=errors //pycross-geohash:geohash_macos_wheels_tags_test -else - echo "Linux host — skipping macOS cross target (no Xcode SDK available from here)" -fi +status=0 +for script in */test.sh; do + # Skip bazel's convenience symlinks (bazel-bin, bazel-crossbuild, …); after + # `bazel test //...` runs, bazel-crossbuild/test.sh resolves into the + # output tree and re-invoking bazel from there is an error. + case "${script}" in bazel-*/test.sh) continue ;; esac + echo "::group::${script}" + if bash "${script}"; then + echo "PASS: ${script}" + else + echo "FAIL: ${script}" + status=1 + fi + echo "::endgroup::" +done +exit "${status}" From fc7451230c42a77b2668cfe19e102271c00ce322 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 15 Sep 2026 13:38:22 -0600 Subject: [PATCH 101/103] feat(uv): `:cargo_lock` target generates a Rust sdist's Cargo.lock Every sdist_build repository of a Rust sdist now carries a `cargo_lock_generator` target. `bazel run` extracts the sdist, runs `cargo generate-lockfile` on its shallowest manifest with the project's own `rust_toolchain` (cargo and rustc from the toolchain's runfiles) and copies the lock into the workspace: `-.Cargo.lock` at the root, the first argument, or in place when `uv.override_package(cargo_lock = ...)` already declares one. It prints the override to add. The warning for an sdist that ships no Cargo.lock names the target. The generated script is checked in an analysis test around a fake toolchain exposing cargo and rustc as Files; the BUILD rendering and the lock path derivation have unit tests; pycross-tiktoken/test.sh runs the real target against crates.io and checks the result is a lock for that crate. Regenerating tiktoken's declared lock reproduces the checked-in file byte for byte. docs: the generator, the symbol-hash normalization, and why rules_py writes no PYO3_CONFIG_FILE (maturin writes its own in a cross build; setuptools-rust derives the target from PYO3_CROSS_PYTHON_VERSION). --- docs/uv.md | 55 +++++-- e2e/README.md | 11 +- e2e/crossbuild/pycross-tiktoken/test.sh | 27 +++ uv/private/pep517_whl/BUILD.bazel | 5 + uv/private/pep517_whl/cargo_lock.bzl | 155 ++++++++++++++++++ uv/private/pep517_whl/tests/BUILD.bazel | 31 ++++ .../pep517_whl/tests/pep517_whl_test.bzl | 57 ++++++- uv/private/sdist_build/repository.bzl | 52 ++++-- uv/private/sdist_build/tests/BUILD.bazel | 3 + .../sdist_build/tests/repository_test.bzl | 30 ++++ 10 files changed, 396 insertions(+), 30 deletions(-) create mode 100755 e2e/crossbuild/pycross-tiktoken/test.sh create mode 100644 uv/private/pep517_whl/cargo_lock.bzl diff --git a/docs/uv.md b/docs/uv.md index 6b3785985..c2d25a3fe 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -458,22 +458,51 @@ sdist's `Cargo.lock` pins on crates.io are fetched with their checksums while the repository is generated and vendored into it; cargo then builds offline, so the build needs no network and works under remote execution. A lock that pins crates outside crates.io (git or path sources) is rejected. An sdist -without a `Cargo.lock` builds with network access and a warning; give it one -with `uv.override_package(cargo_lock = "//:pkg.Cargo.lock")`, generated once -with `cargo generate-lockfile` on the extracted sdist, and it is vendored and -placed next to the sdist's `Cargo.toml` before the build. -maturin is told not to download a Rust toolchain of its own -(`MATURIN_NO_INSTALL_RUST=1`): a Rust sdist with no toolchain wired fails -instead of fetching rustc inside the build. +without a `Cargo.lock` builds with network access and a warning naming the +`:cargo_lock` target of its generated repository. `bazel run` that target +and it resolves the crates with the project's own Rust toolchain and writes +the lock into the workspace: + +``` +bazel run @sdist_build__my_project__tiktoken__0_13_0//:cargo_lock -- third_party/tiktoken.Cargo.lock +``` + +The repository is `sdist_build______`, with the +project's `pyproject.toml` name; the warning prints it in canonical form, +so either add it to `use_repo` or spell it with `@@` as printed. The argument +is the workspace-relative output, `-.Cargo.lock` at the root +when omitted. Declare the file with +`uv.override_package(cargo_lock = "//third_party:tiktoken.Cargo.lock")` and +it is vendored and placed next to the sdist's `Cargo.toml` before the build; +once declared, the target regenerates that file in place. maturin is told +not to download a Rust toolchain of its own (`MATURIN_NO_INSTALL_RUST=1`): a +Rust sdist with no toolchain wired fails instead of fetching rustc inside the +build. The rustc cargo runs is a wrapper that also makes the extension independent of where the action ran: sandbox and execroot paths are remapped out of the -binaries (`--remap-path-prefix`) and target crates compile as one codegen -unit, and maturin's SBOM, which records sandbox paths, is turned off unless -the sdist configures it; the wheel's bytes then match across hosts and -downstream actions hit the cache. Crates that compile C or C++ through cc-rs (`ring`, `zstd-sys`) find -the wired C toolchain under `CC_`, `CXX_`, `AR_` and -`RANLIB_` instead of whatever is on the PATH. +binaries (`--remap-path-prefix`), target crates compile as one codegen unit, +and the `-C metadata=` hash cargo mangles into every symbol, which mixes in +the host's `rustc -vV` output and the paths of host-compiled build scripts, +is replaced for target crates by one derived from the toolchain's release +string and the crate's own identity (package name and version, crate name, +types, cfgs, target and the codegen options its profile sets). maturin's +SBOM, which records sandbox paths, is turned +off unless the sdist configures it. The wheel's bytes then match across hosts +and downstream actions hit the cache. Crates that compile C or C++ through +cc-rs (`ring`, `zstd-sys`) find the wired C toolchain under `CC_`, +`CXX_`, `AR_` and `RANLIB_` instead of whatever is on +the PATH. + +PyO3 needs no configuration file from rules_py: in a cross build maturin +writes its own `PYO3_CONFIG_FILE` from the `--interpreter` it is handed, and +setuptools-rust builds derive pointer width and ABI from +`PYO3_CROSS_PYTHON_VERSION` and the target triple, which the helper sets. A +PyO3 release older than the Python it is built for refuses to compile and +names `PYO3_USE_STABLE_ABI_FORWARD_COMPATIBILITY=1` as the way to build +against the stable ABI anyway; pass it through +`uv.override_package(env = {...})` for that package rather than globally, +since it changes the wheel's ABI tag. ### Backend config settings diff --git a/e2e/README.md b/e2e/README.md index 9fa4da8fd..9b8d7d1cb 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -53,10 +53,13 @@ bundled `.so`), and each case exports a wheel bundle that CI installs and runs on NATIVE amd64 and arm64 runners — no emulation in the verdict. The suites are isolated from `e2e/cases` because their hubs need package-specific configuration (`default_build_dependencies`, pre-build patches, a larger `resource_set`) -that would otherwise leak onto unrelated packages sharing the hub. On a macOS -host, `test.sh` additionally cross-builds `pycross-geohash` for macOS amd64 -(a manual target: the platform transition always resolves to os:macos, so -`target_compatible_with` cannot tell hosts apart). +that would otherwise leak onto unrelated packages sharing the hub. Like +`cases`, its `test.sh` aggregates the per-case `/test.sh` scripts that +cannot be an `sh_test`: `pycross-geohash` cross-builds for macOS amd64 on a +macOS host only (a manual target: the platform transition always resolves to +os:macos, so `target_compatible_with` cannot tell hosts apart), and +`pycross-tiktoken` runs the `:cargo_lock` generator of its sdist repository, +which needs `bazel run` and the crates.io index the action sandbox denies. Each isolated workspace points back at repo-root rules_py with `local_path_override(path = "../..")`. diff --git a/e2e/crossbuild/pycross-tiktoken/test.sh b/e2e/crossbuild/pycross-tiktoken/test.sh new file mode 100755 index 000000000..256131cc2 --- /dev/null +++ b/e2e/crossbuild/pycross-tiktoken/test.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# +# Every Rust sdist_build repository carries a `:cargo_lock` target: `bazel run` +# resolves the sdist's crates with the project's own Rust toolchain and writes +# the lock into the workspace, the file `uv.override_package(cargo_lock = ...)` +# then vendors. tiktoken is the case that needs one — its sdist ships no lock — +# so regenerate it into a scratch path and check it is a real lock for that +# crate. It cannot be an sh_test: the target writes through +# BUILD_WORKSPACE_DIRECTORY and cargo reads the crates.io index over the +# network, which the action sandbox denies. crates.io moves, so the exact +# contents are not pinned; the checked-in Cargo.lock is what the build uses. +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")/.." # e2e/crossbuild workspace root + +BAZEL="${BAZEL:-bazel}" + +scratch="$(mktemp -d)" +trap 'rm -rf "$scratch"' EXIT + +"$BAZEL" run @sdist_build__pycross_tiktoken__tiktoken__0_13_0//:cargo_lock -- "$scratch/Cargo.lock" + +lock="$scratch/Cargo.lock" +grep -q '^version = 4$' "$lock" || { echo "FAIL: not a Cargo.lock: $lock" >&2; exit 1; } +grep -q '^name = "tiktoken"$' "$lock" || { echo "FAIL: the root crate is missing from $lock" >&2; exit 1; } +grep -q 'source = "registry+https://github.com/rust-lang/crates.io-index"' "$lock" || { echo "FAIL: no crates.io dependency resolved in $lock" >&2; exit 1; } +echo "generated lock pins $(grep -c '^\[\[package\]\]' "$lock") packages" diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index c3f0eb88e..10be7e7b0 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -56,3 +56,8 @@ bzl_library( name = "rust_layer", srcs = ["rust_layer.bzl"], ) + +bzl_library( + name = "cargo_lock", + srcs = ["cargo_lock.bzl"], +) diff --git a/uv/private/pep517_whl/cargo_lock.bzl b/uv/private/pep517_whl/cargo_lock.bzl new file mode 100644 index 000000000..5b5f5f402 --- /dev/null +++ b/uv/private/pep517_whl/cargo_lock.bzl @@ -0,0 +1,155 @@ +"""`bazel run`-able Cargo.lock generation for a Rust sdist. + +sdist_build vendors the crates a Rust sdist's `Cargo.lock` pins so cargo +builds offline. An sdist that ships no lock (tiktoken) builds online with a +warning until the project supplies one through +`uv.override_package(cargo_lock = ...)`. This rule produces that file with +the toolchain the build itself uses: `bazel run` extracts the sdist, runs +`cargo generate-lockfile` on its manifest and copies the result into the +workspace. Every `sdist_build__*` repository generated for a Rust sdist +carries one as `:cargo_lock`. +""" + +_SCRIPT = """#!/usr/bin/env bash +# Generated by aspect_rules_py: Cargo.lock for {sdist_name} with the project's Rust toolchain. +set -o errexit -o nounset -o pipefail + +runfiles="${{RUNFILES_DIR:-$(cd .. && pwd)}}" +sdist="$runfiles/{sdist}" +cargo="$runfiles/{cargo}" +export RUSTC="$runfiles/{rustc}" + +workspace="${{BUILD_WORKSPACE_DIRECTORY:-}}" +if [ -z "$workspace" ]; then + echo "error: run this target with \\`bazel run\\`; it writes the lock into the workspace" >&2 + exit 1 +fi +out="${{1:-{default_output}}}" +case "$out" in + /*) ;; + *) out="$workspace/$out" ;; +esac + +work="$(mktemp -d)" +trap 'rm -rf "$work"' EXIT +case "$sdist" in + *.zip) unzip -q "$sdist" -d "$work" ;; + *) tar -xf "$sdist" -C "$work" ;; +esac + +# The shallowest Cargo.toml is the crate (maturin: top level; setuptools-rust: +# a subdirectory such as src/_bcrypt), the same choice the build makes when +# it places the lock next to the manifest. +manifest="" +for depth in 1 2 3 4 5 6 7 8; do + manifest="$(find "$work" -mindepth "$depth" -maxdepth "$depth" -name Cargo.toml -type f | LC_ALL=C sort | head -n 1)" + [ -n "$manifest" ] && break +done +if [ -z "$manifest" ]; then + echo "error: {sdist_name} has no Cargo.toml; nothing to lock" >&2 + exit 1 +fi + +"$cargo" generate-lockfile --manifest-path "$manifest" +lock_dir="$(dirname "$("$cargo" locate-project --workspace --message-format plain --manifest-path "$manifest")")" +mkdir -p "$(dirname "$out")" +cp "$lock_dir/Cargo.lock" "$out" + +echo "Wrote $out" +case "$out" in + "$workspace"/*) + rel="${{out#"$workspace"/}}" + case "$rel" in + */*) label="//${{rel%/*}}:${{rel##*/}}" ;; + *) label="//:$rel" ;; + esac + echo "Declare it on the package so sdist_build vendors its crates and the build runs offline:" + echo " uv.override_package(name = \\"{package}\\", cargo_lock = \\"$label\\", lock = \\"\\")" + ;; + *) + echo "Move it into the workspace and declare it with uv.override_package(name = \\"{package}\\", cargo_lock = \\"//...\\") so sdist_build vendors its crates." + ;; +esac +""" + +def _tool(toolchain, name): + """A tool the toolchain exposes as a File, or via an executable target.""" + value = getattr(toolchain, name, None) + if type(value) == "File": + return value + if value != None and DefaultInfo in value: + return value[DefaultInfo].files_to_run.executable + return None + +def _runfiles_path(ctx, file): + """`file` below the runfiles root, whichever repository it belongs to.""" + if file.short_path.startswith("../"): + return file.short_path[len("../"):] + return ctx.workspace_name + "/" + file.short_path + +def _sdist_stem(basename): + for suffix in (".tar.gz", ".tgz", ".tar.bz2", ".tar.xz", ".tar", ".zip"): + if basename.endswith(suffix): + return basename[:-len(suffix)] + return basename + +def _cargo_lock_generator_impl(ctx): + toolchain = ctx.attr.rust_toolchain[platform_common.ToolchainInfo] + cargo = _tool(toolchain, "cargo") + rustc = _tool(toolchain, "rustc") + if cargo == None or rustc == None: + fail("{}: rust_toolchain {} exposes no cargo and rustc; it must be a rules_rust `rust_toolchain`, such as `current_rust_toolchain`.".format(ctx.label, ctx.attr.rust_toolchain.label)) + + sdist_name = ctx.file.sdist.basename + stem = _sdist_stem(sdist_name) + package = stem.rsplit("-", 1)[0] + script = ctx.actions.declare_file(ctx.label.name + ".sh") + ctx.actions.write( + output = script, + content = _SCRIPT.format( + sdist_name = sdist_name, + sdist = _runfiles_path(ctx, ctx.file.sdist), + cargo = _runfiles_path(ctx, cargo), + rustc = _runfiles_path(ctx, rustc), + default_output = ctx.attr.output or stem + ".Cargo.lock", + package = package, + ), + is_executable = True, + ) + + transitive = [] + all_files = getattr(toolchain, "all_files", None) + if all_files: + transitive.append(depset(all_files) if type(all_files) == "list" else all_files) + runfiles = ctx.runfiles(files = [ctx.file.sdist, cargo, rustc], transitive_files = depset(transitive = transitive)) + default_runfiles = ctx.attr.rust_toolchain[DefaultInfo].default_runfiles + if default_runfiles: + runfiles = runfiles.merge(default_runfiles) + return [DefaultInfo(executable = script, runfiles = runfiles)] + +cargo_lock_generator = rule( + implementation = _cargo_lock_generator_impl, + doc = """`bazel run` this target to write the sdist's `Cargo.lock` into the workspace. + +The lock is resolved with the project's own Rust toolchain (`cargo +generate-lockfile` on the sdist's shallowest `Cargo.toml`, the manifest the +build places the lock next to). The first argument overrides the output +path, relative to the workspace root.""", + executable = True, + attrs = { + "sdist": attr.label( + allow_single_file = True, + mandatory = True, + doc = "The source distribution archive.", + ), + "rust_toolchain": attr.label( + mandatory = True, + providers = [platform_common.ToolchainInfo], + doc = "A ruleset `rust_toolchain` exposing `cargo` and `rustc`; the project's `uv.package_toolchains(rust_toolchain = ...)`.", + ), + "output": attr.string( + default = "", + doc = "Default workspace-relative output path. Empty: `-.Cargo.lock` at the workspace root.", + ), + }, +) diff --git a/uv/private/pep517_whl/tests/BUILD.bazel b/uv/private/pep517_whl/tests/BUILD.bazel index a030af921..a46d3b8ec 100644 --- a/uv/private/pep517_whl/tests/BUILD.bazel +++ b/uv/private/pep517_whl/tests/BUILD.bazel @@ -4,6 +4,7 @@ load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load("@tar.bzl//tar:mtree.bzl", "mtree_mutate", "mtree_spec") load("@tar.bzl//tar:tar.bzl", "tar_rule") load("//py:defs.bzl", "py_binary", "py_test") +load("//uv/private/pep517_whl:cargo_lock.bzl", "cargo_lock_generator") load("//uv/private/pep517_whl:frontend.bzl", "pep517_frontend") load("//uv/private/pep517_whl:pep517_native_whl.bzl", "pep517_native_whl") load("//uv/private/pep517_whl:pep517_whl.bzl", "pep517_whl") @@ -24,6 +25,7 @@ load( load( ":pep517_whl_test.bzl", "absolutize_flag_test", + "cargo_lock_generator_test", "config_settings_args_test", "cross_decision_test", "execroot_collision_toolchain", @@ -383,6 +385,35 @@ rust_host_sysroot_test( target_under_test = ":__rust_host_sysroot", ) +# The `:cargo_lock` target sdist_build generates next to a Rust sdist's whl: +# a `bazel run` script over the same toolchain's cargo and rustc. +cargo_lock_generator( + name = "__cargo_lock", + rust_toolchain = ":__fake_rust_toolchain", + sdist = ":__stub_sdist", + tags = ["manual"], +) + +cargo_lock_generator_test( + name = "cargo_lock_generator_test", + expected_output = "__stub_sdist.Cargo.lock", + target_under_test = ":__cargo_lock", +) + +cargo_lock_generator( + name = "__cargo_lock_declared", + output = "third_party/pkg.Cargo.lock", + rust_toolchain = ":__fake_rust_toolchain", + sdist = ":__stub_sdist", + tags = ["manual"], +) + +cargo_lock_generator_test( + name = "cargo_lock_generator_declared_output_test", + expected_output = "third_party/pkg.Cargo.lock", + target_under_test = ":__cargo_lock_declared", +) + # The shape sdist_build generates for a Rust sdist: the toolchain plus its # exec-configured sysroot layer. Their make-variables must reach the helper # under its env names, and the make-variable names themselves must not. diff --git a/uv/private/pep517_whl/tests/pep517_whl_test.bzl b/uv/private/pep517_whl/tests/pep517_whl_test.bzl index 36007ffaf..dcc3e6a0b 100644 --- a/uv/private/pep517_whl/tests/pep517_whl_test.bzl +++ b/uv/private/pep517_whl/tests/pep517_whl_test.bzl @@ -371,9 +371,21 @@ config_settings_args_test = analysistest.make( def _fake_rust_toolchain_impl(ctx): # The sysroot is this target's own output root: an "-exec" segment in it # proves the dependent re-resolved us in the exec configuration. The - # make-variables mirror what rules_rust's current_rust_toolchain exports. + # make-variables mirror what rules_rust's current_rust_toolchain exports; + # `cargo` and `rustc` are Files, as rust_toolchain publishes them. + tools = [] + for name in ("cargo", "rustc"): + tool = ctx.actions.declare_file("{}/bin/{}".format(ctx.label.name, name)) + ctx.actions.write(tool, "#!/bin/sh\nexit 0\n", is_executable = True) + tools.append(tool) return [ - platform_common.ToolchainInfo(sysroot = ctx.bin_dir.path, all_files = depset()), + DefaultInfo(files = depset(tools)), + platform_common.ToolchainInfo( + sysroot = ctx.bin_dir.path, + all_files = depset(tools), + cargo = tools[0], + rustc = tools[1], + ), platform_common.TemplateVariableInfo({ "CARGO": "/fake/bin/cargo", "RUSTC": "/fake/bin/rustc", @@ -383,7 +395,46 @@ def _fake_rust_toolchain_impl(ctx): fake_rust_toolchain = rule( implementation = _fake_rust_toolchain_impl, - doc = "Stands in for rules_rust's current_rust_toolchain: ToolchainInfo with a sysroot.", + doc = "Stands in for rules_rust's current_rust_toolchain: ToolchainInfo with a sysroot, cargo and rustc.", +) + +def _script_value(content, variable): + """The right-hand side of `variable="..."` in the generated script, or None.""" + for line in content.splitlines(): + if line.startswith(variable + "="): + return line[len(variable) + 1:].strip('"') + return None + +def _cargo_lock_generator_test_impl(ctx): + env = analysistest.begin(ctx) + target = analysistest.target_under_test(env) + writes = [a for a in target.actions if a.mnemonic == "FileWrite"] + asserts.equals(env, 1, len(writes), "the launcher is one written script") + if not writes: + return analysistest.end(env) + content = writes[0].content + asserts.equals(env, target[DefaultInfo].files_to_run.executable, writes[0].outputs.to_list()[0], "the script is the executable") + + sdist = _script_value(content, "sdist") or "" + cargo = _script_value(content, "cargo") or "" + rustc = _script_value(content, "export RUSTC") or "" + asserts.true(env, sdist.startswith("$runfiles/") and sdist.endswith("/uv/private/pep517_whl/tests/__stub_sdist.tar.gz"), "sdist below the runfiles root; got: " + sdist) + asserts.true(env, cargo.endswith("/__fake_rust_toolchain/bin/cargo"), "the toolchain's cargo; got: " + cargo) + asserts.true(env, rustc.endswith("/__fake_rust_toolchain/bin/rustc"), "the toolchain's rustc, exported for cargo; got: " + rustc) + asserts.true(env, 'out="${1:-' + ctx.attr.expected_output + '}"' in content, "default output {}; got:\n{}".format(ctx.attr.expected_output, content)) + asserts.true(env, "generate-lockfile --manifest-path" in content and "locate-project --workspace" in content, "cargo resolves the lock at the workspace root of the shallowest manifest") + asserts.true(env, 'name = \\"__stub_sdist\\"' in content, "the override snippet names the package; got:\n" + content) + + runfiles = [f.basename for f in target[DefaultInfo].default_runfiles.files.to_list()] + for needed in ("__stub_sdist.tar.gz", "cargo", "rustc"): + asserts.true(env, needed in runfiles, "{} must be a runfile; got {}".format(needed, runfiles)) + return analysistest.end(env) + +cargo_lock_generator_test = analysistest.make( + _cargo_lock_generator_test_impl, + attrs = { + "expected_output": attr.string(mandatory = True, doc = "Workspace-relative path the script writes when run without arguments."), + }, ) def _rust_host_sysroot_test_impl(ctx): diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 3da8eabc2..5a047c68e 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -210,6 +210,7 @@ def _declares_rust_build(inspection): return "setuptools-rust" in [_normalize_requirement(r) for r in inspection.get("build_requires", [])] _RUST_LAYER_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:rust_layer.bzl\", \"rust_host_sysroot\")" +_CARGO_LOCK_LOAD = "\nload(\"@aspect_rules_py//uv/private/pep517_whl:cargo_lock.bzl\", \"cargo_lock_generator\")" _CRATES_IO_SOURCE = "registry+https://github.com/rust-lang/crates.io-index" @@ -287,7 +288,17 @@ def _missing_rust_toolchain(repo_name, rust_toolchain, inspection, toolchains): "Declare `uv.package_toolchains(rust_toolchain = \"@rules_rust//rust/toolchain:current_rust_toolchain\")`, " + "or wire one by hand with `uv.override_package(toolchains = [...])`.").format(repo_name, reason) -def _rust_wiring(rust_toolchain, inspection, toolchains): +def _lock_output(cargo_lock): + """Workspace-relative path of a `uv.override_package(cargo_lock = ...)` label, or "". + + The generator regenerates a declared lock in place; a lock in another + repository cannot be written to, so it falls back to the default name. + """ + if cargo_lock == None or getattr(cargo_lock, "repo_name", cargo_lock.workspace_name): + return "" + return cargo_lock.package + "/" + cargo_lock.name if cargo_lock.package else cargo_lock.name + +def _rust_wiring(rust_toolchain, inspection, toolchains, src = "", lock_output = ""): """The generated BUILD's Rust wiring for the project's `rust_toolchain`. The configure tool already detected the build backend and its declared @@ -295,28 +306,42 @@ def _rust_wiring(rust_toolchain, inspection, toolchains): setuptools-rust) gets the project's Rust toolchain plus an exec-configured rust_host_sysroot layer without the user spelling either out per package. pep517_native_whl derives CARGO/RUSTC/RULES_PY_RUST_HOST_SYSROOT from - their make-variables. + their make-variables. The same toolchain drives a `:cargo_lock` target + that `bazel run` uses to write the sdist's Cargo.lock into the workspace. Args: rust_toolchain: The `uv.package_toolchains(rust_toolchain = ...)` that applies to the project, rendered as a label string, or "". inspection: The configure tool's JSON, or None. toolchains: Extra toolchain labels from `uv.override_package`. + src: The sdist label string, for the `:cargo_lock` target. + lock_output: Workspace-relative path the `:cargo_lock` target writes by default, or "" for its own default. Returns: - struct(load_stmt, target, toolchains): the `load()` line and the - `rust_host_sysroot(...)` target to splice into the BUILD (both "" when - not wired), and the final `toolchains` list. + struct(load_stmt, target, toolchains): the `load()` lines and the + `rust_host_sysroot(...)` and `cargo_lock_generator(...)` targets to + splice into the BUILD (both "" when not wired), and the final + `toolchains` list. """ if not (rust_toolchain and _is_rust_build(inspection)): return struct(load_stmt = "", target = "", toolchains = list(toolchains)) target = """ rust_host_sysroot( name = "rust_host_sysroot", - actual = {}, + actual = {toolchain}, ) -""".format(repr(rust_toolchain)) + +cargo_lock_generator( + name = "cargo_lock",{output} + rust_toolchain = {toolchain}, + sdist = {src}, +) +""".format( + toolchain = repr(rust_toolchain), + src = repr(src), + output = "\n output = {},".format(repr(lock_output)) if lock_output else "", + ) return struct( - load_stmt = _RUST_LAYER_LOAD, + load_stmt = _RUST_LAYER_LOAD + _CARGO_LOCK_LOAD, target = target, toolchains = [rust_toolchain, ":rust_host_sysroot"] + [t for t in toolchains if t != rust_toolchain], ) @@ -467,7 +492,13 @@ def _sdist_build_impl(repository_ctx): missing = _missing_rust_toolchain(repository_ctx.name, rust_toolchain, inspection, toolchains) if missing: fail(missing) - rust = _rust_wiring(str(rust_toolchain) if rust_toolchain else "", inspection, toolchains) + rust = _rust_wiring( + str(rust_toolchain) if rust_toolchain else "", + inspection, + toolchains, + src = str(repository_ctx.attr.src), + lock_output = _lock_output(repository_ctx.attr.cargo_lock), + ) rust_layer_load = rust.load_stmt rust_layer_target = rust.target toolchains = rust.toolchains @@ -481,7 +512,7 @@ def _sdist_build_impl(repository_ctx): vendored_crates_attr += _cargo_lock_attr(str(repository_ctx.attr.cargo_lock)) elif crates == None: # buildifier: disable=print - print("WARNING: {} builds Rust but its sdist ships no Cargo.lock; cargo will fetch crates during the build. Declare the lock to make the build hermetic.".format(repository_ctx.name)) + print("WARNING: {name} builds Rust but its sdist ships no Cargo.lock; cargo will fetch crates during the build. Generate one with `bazel run @@{name}//:cargo_lock` and declare it with `uv.override_package(cargo_lock = ...)` to make the build hermetic.".format(name = repository_ctx.name)) if toolchains: toolchain_attrs = """ toolchains = [ @@ -633,6 +664,7 @@ sdist_build_test_util = struct( config_settings_attr = _config_settings_attr, env_attr = _env_attr, is_rust_build = _is_rust_build, + lock_output = _lock_output, missing_rust_toolchain = _missing_rust_toolchain, normalize_requirement = _normalize_requirement, rust_wiring = _rust_wiring, diff --git a/uv/private/sdist_build/tests/BUILD.bazel b/uv/private/sdist_build/tests/BUILD.bazel index 372cc50b4..364ff3c19 100644 --- a/uv/private/sdist_build/tests/BUILD.bazel +++ b/uv/private/sdist_build/tests/BUILD.bazel @@ -13,6 +13,7 @@ load( "crate_vendoring_test", "env_attr_test", "is_rust_build_test", + "lock_output_test", "missing_rust_toolchain_test", "rust_wiring_test", ) @@ -30,6 +31,8 @@ is_rust_build_test(name = "is_rust_build_test") rust_wiring_test(name = "rust_wiring_test") +lock_output_test(name = "lock_output_test") + crate_vendoring_test(name = "crate_vendoring_test") missing_rust_toolchain_test(name = "missing_rust_toolchain_test") diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index 2ef535c05..d5024b7f6 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -112,10 +112,40 @@ def _rust_wiring_test_impl(ctx): on.toolchains, "toolchain and layer first, override extras after, the toolchain not repeated", ) + asserts.true(env, "cargo_lock.bzl" in on.load_stmt and "cargo_lock_generator" in on.load_stmt, "load() for the lock generator") + + with_src = wiring(_TOOLCHAIN, rust_inspection, [], src = "@@sdist__pkg//file") + asserts.true( + env, + 'cargo_lock_generator(\n name = "cargo_lock",\n rust_toolchain = "{}",\n sdist = "@@sdist__pkg//file",\n)'.format(_TOOLCHAIN) in with_src.target, + "a `bazel run` lock generator over the same toolchain and sdist; got: " + with_src.target, + ) + declared = wiring(_TOOLCHAIN, rust_inspection, [], src = "@@sdist__pkg//file", lock_output = "third_party/pkg.Cargo.lock") + asserts.true( + env, + ' name = "cargo_lock",\n output = "third_party/pkg.Cargo.lock",\n' in declared.target, + "a declared lock is regenerated in place; got: " + declared.target, + ) return unittest.end(env) rust_wiring_test = unittest.make(_rust_wiring_test_impl) +# Label() is a loading-phase constructor; the fixtures live at module level. +_NESTED_LOCK = Label("@@//third_party:pkg.Cargo.lock") +_ROOT_LOCK = Label("@@//:pkg.Cargo.lock") +_FOREIGN_LOCK = Label("@@other_repo//x:Cargo.lock") + +def _lock_output_test_impl(ctx): + env = unittest.begin(ctx) + lock_output = sdist_build_test_util.lock_output + asserts.equals(env, "", lock_output(None), "no declared lock: the generator picks its default name") + asserts.equals(env, "third_party/pkg.Cargo.lock", lock_output(_NESTED_LOCK)) + asserts.equals(env, "pkg.Cargo.lock", lock_output(_ROOT_LOCK), "root-package labels have no directory") + asserts.equals(env, "", lock_output(_FOREIGN_LOCK), "another repository cannot be written to") + return unittest.end(env) + +lock_output_test = unittest.make(_lock_output_test_impl) + def _crate_vendoring_test_impl(ctx): env = unittest.begin(ctx) asserts.equals( From 2957fe99c2d7b3ec125a8b6cbcffc6c304d38f57 Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 15 Sep 2026 13:57:19 -0600 Subject: [PATCH 102/103] feat(uv)!: uv.rust_toolchain() replaces uv.package_toolchains() The Rust toolchain gets its own tag, `uv.rust_toolchain(toolchain = ..., lock = ...)`, scoped to the module or to one project's lock; a lock-scoped declaration wins for its project. Detection makes the wide scope precise: sdist_build wires the toolchain only into builds whose backend is maturin or setuptools-rust, so nothing else sees it. Toolchains a single package needs beyond Rust (a JDK, Ant) stay where they were before bc446420, on `uv.override_package(toolchains = ...)`. Their files become action inputs of that package's build alone, instead of every sdist built from source in the scope. The `name`-scoped variant and the "matches no source build" check go away with the generic list; pycross-jdk returns to its per-package override. `cargo_lock` remains an override_package attribute: a lock pins one sdist version's crates, a build input like pre_build_patches, not a toolchain. --- docs/uv.md | 44 ++--- e2e/crossbuild/pycross-jdk/setup.MODULE.bazel | 11 +- .../pycross-rust-rs/setup.MODULE.bazel | 6 +- .../pycross-rust/setup.MODULE.bazel | 14 +- .../pycross-tiktoken/setup.MODULE.bazel | 2 +- uv/private/extension/defs.bzl | 162 +++++------------- uv/private/extension/tests/defs_test.bzl | 81 +++------ uv/private/pep517_whl/cargo_lock.bzl | 2 +- uv/private/sdist_build/repository.bzl | 4 +- .../sdist_build/tests/repository_test.bzl | 2 +- 10 files changed, 108 insertions(+), 220 deletions(-) diff --git a/docs/uv.md b/docs/uv.md index c2d25a3fe..94ef10eb5 100644 --- a/docs/uv.md +++ b/docs/uv.md @@ -382,22 +382,22 @@ useful when a pre-build patch removes stale entry-point metadata. ### Build-time toolchains A native sdist build may need tools beyond the C++ toolchain: a JDK for JNI -extensions, Ant, cargo and rustc for Rust extensions. Declare them once with -`uv.package_toolchains()` and their well-known make-variables reach the build -environment on their own: +extensions, Ant, cargo and rustc for Rust extensions. Tools one package needs +go on that package's override and their well-known make-variables reach the +build environment on their own: ```starlark -uv.package_toolchains( +uv.override_package( + name = "jpype1", lock = "//:uv.lock", toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"], ) ``` -`toolchains` is forwarded to every sdist built from source in scope. The scope -is the module when neither `lock` nor `name` is given, one project with -`lock`, one package everywhere with `name`, or one package in one project with -both; each attribute resolves from the most specific declaration that sets it. -`uv.override_package(toolchains = ...)` still works for a single package. +Toolchain files become inputs of that package's build action and of no +other, which is what keeps a JDK out of every unrelated sdist build. Rust is +the exception with its own declaration below: rules_py detects which sdists +build Rust, so one module-wide declaration is precise. `$(JAVA)` and `$(JAVABASE)` arrive as `JAVA` and `JAVA_HOME`; `$(ANT_HOME)` and `$(ANT_BIN_DIR)` likewise; `$(CARGO)`, `$(RUSTC)`, `$(RUST_SYSROOT)` and @@ -408,12 +408,12 @@ wins over the derived value. Rust sdists (maturin, setuptools-rust) build with the Rust toolchain your module registers. Fetching rustc and cargo is the Rust rulesets' job, and -rules_py depends on neither of them, so point it at the toolchain once and -every Rust sdist of every `uv.project()` in the module is wired to it. Either -ruleset works: +rules_py depends on neither of them, so point `uv.rust_toolchain()` at the +toolchain once and every Rust sdist of every `uv.project()` in the module is +wired to it. Either ruleset works: - [rules_rust](https://github.com/bazelbuild/rules_rust): - `rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain"` + `toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain"` - [rules_rs](https://github.com/hermeticbuild/rules_rs): its toolchains are rules_rust `rust_toolchain` instances declared in the patched `rules_rust` repository it fetches, so expose that repository and point at its @@ -424,22 +424,22 @@ ruleset works: use_repo(rules_rust_rs, rules_rust_rs = "rules_rust") ``` - then `rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain"`. + then `toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain"`. ```starlark -uv.package_toolchains( - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", +uv.rust_toolchain( + toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) ``` -Scope a declaration with `lock` to apply it to one project only, or with -`name` to one package; the most specific declaration wins. That is how a -workspace builds one project on rules_rust and another on rules_rs: +Scope a declaration with `lock` to apply it to one project only; it wins over +the module-wide one for that project. That is how a workspace builds one +project on rules_rust and another on rules_rs: ```starlark -uv.package_toolchains( +uv.rust_toolchain( lock = "//other:uv.lock", - rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", + toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", ) ``` @@ -450,7 +450,7 @@ build cargo also *compiles* code for the exec platform and runs it there (`build.rs` scripts, proc-macro crates); that layer supplies the exec platform's standard library next to the target's, the way rustup keeps several targets in one install. No `uv.override_package` entry is needed for -Rust packages, and a Rust sdist in a module with no `uv.package_toolchains()` +Rust packages, and a Rust sdist in a module with no `uv.rust_toolchain()` covering its project fails while the repository is generated, naming the declaration to add; only declared Rust builds are demanding, an sdist that merely ships `.rs` files (zstandard's optional extension) builds as before. The crates the diff --git a/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel b/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel index a18a60631..a012be233 100644 --- a/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-jdk/setup.MODULE.bazel @@ -1,9 +1,7 @@ """jpype1: setuptools sdist whose build shells out to Ant/javac to produce a -JAR before compiling the _jpype C++ extension. - -The JDK and Ant reach the build through a lock-scoped -`uv.package_toolchains(toolchains = ...)`: jpype1 is the only source build in -this project, so nothing needs the per-package `uv.override_package(toolchains)`. +JAR before compiling the _jpype C++ extension. The JDK and Ant are +package-specific build inputs, so they ride on `uv.override_package(toolchains)` +and reach no other sdist's action inputs. """ bazel_dep(name = "rules_java", version = "8.14.0") @@ -23,7 +21,8 @@ uv.project( lock = "//pycross-jdk:uv.lock", pyproject = "//pycross-jdk:pyproject.toml", ) -uv.package_toolchains( +uv.override_package( + name = "jpype1", lock = "//pycross-jdk:uv.lock", toolchains = [ "//pycross-jdk:jdk", diff --git a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel index efe8af085..f3b1e464b 100644 --- a/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rust-rs/setup.MODULE.bazel @@ -3,7 +3,7 @@ Same package and assertions as //pycross-rust, built with the toolchains rules_rs provisions instead of rules_rust's own. rules_rs declares them with rules_rust's `rust_toolchain` rule inside the patched `rules_rust` repository -it fetches, so the lock-scoped `uv.package_toolchains()` below points at that +it fetches, so the lock-scoped `uv.rust_toolchain()` below points at that repository's `current_rust_toolchain`, overriding the module-wide rules_rust one for this project only: the wiring is a provider contract, not a dependency on one ruleset's toolchain layout. The two rulesets coexist here because each @@ -12,9 +12,9 @@ carries its own `rules_rust` repository and therefore its own toolchain type. uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") uv.declare_hub(hub_name = "pypi_pycross_rust_rs") -uv.package_toolchains( +uv.rust_toolchain( lock = "//pycross-rust-rs:uv.lock", - rust_toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", + toolchain = "@rules_rust_rs//rust/toolchain:current_rust_toolchain", ) uv.project( default_build_dependencies = [ diff --git a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel index 265a06ec5..b521580c3 100644 --- a/e2e/crossbuild/pycross-rust/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-rust/setup.MODULE.bazel @@ -1,16 +1,16 @@ """maturin (Cargo/PyO3) cross case: pydantic-core built from its sdist. -The module-wide `uv.package_toolchains(rust_toolchain = ...)` below is all -the Rust wiring for this workspace: sdist_build detects the maturin backend -(or setuptools-rust) and wires that toolchain, plus rules_py's -exec-configured sysroot layer, into every such build. //pycross-tiktoken -inherits it; //pycross-rust-rs overrides it for its own lock. +The module-wide `uv.rust_toolchain()` below is all the Rust wiring for this +workspace: sdist_build detects the maturin backend (or setuptools-rust) and +wires that toolchain, plus rules_py's exec-configured sysroot layer, into +every such build. //pycross-tiktoken inherits it; //pycross-rust-rs overrides +it for its own lock. """ uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") uv.declare_hub(hub_name = "pypi_pycross_rust") -uv.package_toolchains( - rust_toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", +uv.rust_toolchain( + toolchain = "@rules_rust//rust/toolchain:current_rust_toolchain", ) uv.project( default_build_dependencies = [ diff --git a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel index 70f4659b3..46bf77c30 100644 --- a/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel +++ b/e2e/crossbuild/pycross-tiktoken/setup.MODULE.bazel @@ -1,6 +1,6 @@ """tiktoken: setuptools-rust sdist build. -The module-wide `uv.package_toolchains()` (see //pycross-rust) is all the Rust +The module-wide `uv.rust_toolchain()` (see //pycross-rust) is all the Rust wiring: sdist_build detects setuptools-rust in the build requirements and emits the toolchain plus the exec-platform sysroot into the generated pep517_native_whl. diff --git a/uv/private/extension/defs.bzl b/uv/private/extension/defs.bzl index a80f92691..d402dbc2a 100644 --- a/uv/private/extension/defs.bzl +++ b/uv/private/extension/defs.bzl @@ -203,103 +203,48 @@ def _parse_hubs(module_ctx): return hub_specs -def parse_package_toolchains(tags, project_locks, module_name): - """Index a module's `uv.package_toolchains()` tags by scope. +def parse_rust_toolchains(tags, project_locks, module_name): + """Index a module's `uv.rust_toolchain()` tags by scope. Args: - tags: The module's `package_toolchains` tags (anything with `lock`, - `name`, `rust_toolchain` and `toolchains` fields). + tags: The module's `rust_toolchain` tags (anything with `lock` and + `toolchain` fields). project_locks: Lock labels of the module's own `uv.project()` tags. module_name: For error messages. Returns: - struct(default, by_lock, by_package, hits, error): `default` is the - module-wide tag or None; `by_lock` maps a lock label to its tag; - `by_package` maps (lock or None, normalized package name) to its tag; - `hits` counts, per index of a `name`-scoped tag, the packages it - applied to (see check_package_toolchains_matched); `error` is the - message to fail with, or None. Two tags with the same scope, an - unknown lock and a tag that names no toolchain are errors. + struct(default, by_lock, error): `default` is the module-wide tag or + None; `by_lock` maps a lock label to its tag; `error` is the message + to fail with, or None. Two tags with the same scope and an unknown + lock are errors. """ default = None by_lock = {} - by_package = {} - hits = {} - err = None - for i, tag in enumerate(tags): - if not tag.rust_toolchain and not tag.toolchains: - err = "uv.package_toolchains() in module '{}': set at least one of `rust_toolchain` or `toolchains`.".format(module_name) - elif tag.lock != None and tag.lock not in project_locks: - err = "uv.package_toolchains() refers to lock '{}', but module '{}' has no uv.project() for that lock.".format(tag.lock, module_name) - elif tag.name: - key = (tag.lock, normalize_name(tag.name)) - if key in by_package: - err = "uv.package_toolchains() in module '{}': package '{}' is declared twice for {}.".format(module_name, tag.name, "lock '{}'".format(tag.lock) if tag.lock != None else "every lock") - by_package[key] = tag - hits[i] = 0 + for tag in tags: + if tag.lock != None and tag.lock not in project_locks: + err = "uv.rust_toolchain() refers to lock '{}', but module '{}' has no uv.project() for that lock.".format(tag.lock, module_name) elif tag.lock != None: - if tag.lock in by_lock: - err = "uv.package_toolchains() in module '{}': lock '{}' is declared twice.".format(module_name, tag.lock) + err = "uv.rust_toolchain() in module '{}': lock '{}' is declared twice.".format(module_name, tag.lock) if tag.lock in by_lock else None by_lock[tag.lock] = tag else: - if default != None: - err = "uv.package_toolchains() in module '{}': more than one module-wide declaration; scope all but one with `lock` or `name`.".format(module_name) + err = "uv.rust_toolchain() in module '{}': more than one module-wide declaration; scope all but one with `lock`.".format(module_name) if default != None else None default = tag if err: - return struct(default = None, by_lock = {}, by_package = {}, hits = {}, error = err) - return struct(default = default, by_lock = by_lock, by_package = by_package, hits = hits, error = None) + return struct(default = None, by_lock = {}, error = err) + return struct(default = default, by_lock = by_lock, error = None) -def resolve_package_toolchains(package_toolchains, lock, name, tags = None): - """The toolchains for one sdist: each attribute from the most specific declaration that sets it. - - Precedence: the package within its lock, the package in every lock, the - lock, the module. `rust_toolchain` and `toolchains` resolve independently, - so a package-level Rust toolchain does not discard a module-wide JDK. +def resolve_rust_toolchain(rust_toolchains, lock): + """The Rust toolchain for one project's sdists: its lock's declaration, else the module's, else None. Args: - package_toolchains: As returned by parse_package_toolchains. + rust_toolchains: As returned by parse_rust_toolchains. lock: The project's lock label. - name: The package's normalized name. - tags: The module's tags, to count which `name`-scoped ones applied. Returns: - struct(rust_toolchain, toolchains): a label or None, and a list of - label strings. + The toolchain label, or None. """ - candidates = [ - package_toolchains.by_package.get((lock, name)), - package_toolchains.by_package.get((None, name)), - package_toolchains.by_lock.get(lock), - package_toolchains.default, - ] - candidates = [c for c in candidates if c != None] - if tags != None: - for i, tag in enumerate(tags): - if tag.name and tag in candidates: - package_toolchains.hits[i] += 1 - rust_toolchain = None - toolchains = [] - for c in candidates: - if c.rust_toolchain: - rust_toolchain = c.rust_toolchain - break - for c in candidates: - if c.toolchains: - toolchains = [str(t) for t in c.toolchains] - break - return struct(rust_toolchain = rust_toolchain, toolchains = toolchains) - -def check_package_toolchains_matched(package_toolchains, tags, module_name): - """The error for a `name`-scoped declaration that applied to no package, or None.""" - for i, count in package_toolchains.hits.items(): - if not count: - tag = tags[i] - return "uv.package_toolchains() for '{}' matches no package building from source in {} of module '{}'.".format( - tag.name, - "lock '{}'".format(tag.lock) if tag.lock != None else "any uv.project() lock", - module_name, - ) - return None + tag = rust_toolchains.by_lock.get(lock) or rust_toolchains.default + return tag.toolchain if tag != None else None def _parse_projects(module_ctx, hub_specs): """Resolve every `uv.project()` declaration into repository-rule inputs. @@ -384,9 +329,9 @@ def _parse_projects(module_ctx, hub_specs): unscoped_matches = {i: 0 for i, override in enumerate(mod.tags.override_package) if override.lock == None} - package_toolchains = parse_package_toolchains(mod.tags.package_toolchains, project_locks, mod.name) - if package_toolchains.error: - fail(package_toolchains.error) + rust_toolchains = parse_rust_toolchains(mod.tags.rust_toolchain, project_locks, mod.name) + if rust_toolchains.error: + fail(rust_toolchains.error) for project in mod.tags.project: project_data = toml.decode_file(module_ctx, project.pyproject) @@ -699,9 +644,6 @@ def _parse_projects(module_ctx, hub_specs): monitor_memory = pkg_override.monitor_memory resource_set = pkg_override.resource_set - pkg_toolchains = resolve_package_toolchains(package_toolchains, project.lock, normalize_name(package["name"]), mod.tags.package_toolchains) - extra_toolchains = extra_toolchains + [t for t in pkg_toolchains.toolchains if t not in extra_toolchains] - sbuild_specs[sbuild_id] = struct( src = sdist, deps = ["@{0}//:{1}".format(*it) for it in build_deps], @@ -717,7 +659,7 @@ def _parse_projects(module_ctx, hub_specs): cargo_lock = cargo_lock, monitor_memory = monitor_memory, resource_set = resource_set, - rust_toolchain = pkg_toolchains.rust_toolchain, + rust_toolchain = resolve_rust_toolchain(rust_toolchains, project.lock), ) has_sbuild = True @@ -832,10 +774,6 @@ def _parse_projects(module_ctx, hub_specs): for cfg in cfgs.keys(): hub_cfg.packages.setdefault(package, {})[cfg] = "@{}//:{}".format(project_id, package) - unmatched = check_package_toolchains_matched(package_toolchains, mod.tags.package_toolchains, mod.name) - if unmatched: - fail(unmatched) - for i, override in enumerate(mod.tags.override_package): if override.lock == None and not unscoped_matches[i]: if override.version: @@ -1136,7 +1074,7 @@ _override_package_tag = tag_class( ), "toolchains": attr.label_list( default = [], - doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list; `uv.package_toolchains(toolchains = ...)` does the same for a whole project or module. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_SYSROOT, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", + doc = "Extra toolchain targets forwarded to the generated pep517_native_whl(...) call's `toolchains` list. Each target's TemplateVariableInfo make-variables become available for $(VAR) expansion in `env`; the well-known ones (CARGO, RUSTC, RUST_SYSROOT, RUST_HOST_SYSROOT, JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the build environment automatically.", ), "env": attr.string_dict( default = {}, @@ -1144,7 +1082,7 @@ _override_package_tag = tag_class( ), "cargo_lock": attr.label( allow_single_file = True, - doc = "Cargo.lock for a Rust sdist that ships none. Its crates.io entries are vendored while the repository is generated and the file is placed next to the sdist's Cargo.toml before the build, so cargo builds offline. Requires the project's `rust_toolchain`.", + doc = "Cargo.lock for a Rust sdist that ships none. Its crates.io entries are vendored while the repository is generated and the file is placed next to the sdist's Cargo.toml before the build, so cargo builds offline. Requires a `uv.rust_toolchain()` covering the project.", ), "config_settings": attr.string_list_dict( default = {}, @@ -1189,43 +1127,29 @@ project locks declared by the same module. Specifying `target` requires `lock` and is mutually exclusive with all other modification attributes.""", ) -_package_toolchains_tag = tag_class( +_rust_toolchain_tag = tag_class( attrs = { - "lock": attr.label( - mandatory = False, - doc = "Scope the declaration to the `uv.project()` pinned by this `uv.lock`. Without it the " + - "declaration applies to every project of the module.", - ), - "name": attr.string( - mandatory = False, - doc = "Scope the declaration to one package, like `uv.override_package`; with `lock`, to that " + - "package in that project only. Must match a package that builds from source.", - ), - "rust_toolchain": attr.label( - mandatory = False, + "toolchain": attr.label( + mandatory = True, doc = "A rules_rust `current_rust_toolchain`-style target: any target exposing rules_rust's " + "toolchain providers, from rules_rust or rules_rs. Every sdist in scope whose build backend " + "is maturin or setuptools-rust gets it, plus rules_py's exec-configured sysroot layer, wired " + "into its build automatically; other sdists ignore it.", ), - "toolchains": attr.label_list( - default = [], - doc = "Toolchain targets forwarded to every source build in scope, as `uv.override_package(toolchains = ...)` " + - "does for one package: their `TemplateVariableInfo` make-variables become available for `$(VAR)` " + - "expansion in `env`, and the well-known ones (JAVA, JAVABASE, ANT_HOME, ANT_BIN_DIR) reach the " + - "build environment automatically.", + "lock": attr.label( + mandatory = False, + doc = "Scope the declaration to the `uv.project()` pinned by this `uv.lock`. Without it the " + + "declaration applies to every project of the module; a lock-scoped one wins for its project.", ), }, - doc = """Toolchains for the sdists a module's `uv.project()` declarations build from source. - -`rust_toolchain` is detected into place: the extension wires it only into -builds whose backend is maturin or setuptools-rust. `toolchains` is forwarded -as-is to every source build in scope. Scope is the module (no `lock`, no -`name`), one project (`lock`), one package everywhere (`name`) or one package -in one project (both); each attribute resolves from the most specific -declaration that sets it. Two declarations with the same scope fail, and a -`name` that matches no source build fails. A tag must set at least one of the -two attributes.""", + doc = """The Rust toolchain for the sdists a module's `uv.project()` declarations build from source. + +The toolchain is detected into place: the extension wires it only into builds +whose backend is maturin or setuptools-rust, so one module-wide declaration is +enough and reaches nothing else. Scope is the module (no `lock`) or one +project (`lock`); two declarations with the same scope fail. Toolchains a +single package needs beyond Rust (a JDK, Ant) go on +`uv.override_package(toolchains = ...)`.""", ) uv = module_extension( @@ -1235,6 +1159,6 @@ uv = module_extension( "project": _project_tag, "annotate_packages": _annotations_tag, "override_package": _override_package_tag, - "package_toolchains": _package_toolchains_tag, + "rust_toolchain": _rust_toolchain_tag, }, ) diff --git a/uv/private/extension/tests/defs_test.bzl b/uv/private/extension/tests/defs_test.bzl index 75af8ee44..e15921eb9 100644 --- a/uv/private/extension/tests/defs_test.bzl +++ b/uv/private/extension/tests/defs_test.bzl @@ -2,7 +2,7 @@ load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") load("//uv/private:normalize_name.bzl", "normalize_name") -load("//uv/private/extension:defs.bzl", "check_package_toolchains_matched", "dedupe_shared_installs", "map_scc_installs", "parse_declared_console_script", "parse_package_toolchains", "resolve_package_toolchains", "shared_install_key") +load("//uv/private/extension:defs.bzl", "dedupe_shared_installs", "map_scc_installs", "parse_declared_console_script", "parse_rust_toolchains", "resolve_rust_toolchain", "shared_install_key") load("//uv/private/extension:graph_utils.bzl", "collect_build_deps") load("//uv/private/extension:lockfile.bzl", "url_basename") @@ -206,80 +206,45 @@ def _map_scc_installs_conditional_union_test_impl(ctx): map_scc_installs_conditional_union_test = unittest.make(_map_scc_installs_conditional_union_test_impl) -def _tag(lock = None, name = None, rust_toolchain = None, toolchains = []): - return struct(lock = lock, name = name, rust_toolchain = rust_toolchain, toolchains = toolchains) +def _tag(lock = None, toolchain = None): + return struct(lock = lock, toolchain = toolchain) _RULES_RUST = "@rules_rust//rust/toolchain:current_rust_toolchain" _RULES_RS = "@rules_rust_rs//rust/toolchain:current_rust_toolchain" -_NIGHTLY = "//tools:nightly_rust" -_JDK = "@bazel_tools//tools/jdk:current_java_runtime" -_ANT = "//tools:ant_home" _LOCKS = {"//a:uv.lock": True, "//b:uv.lock": True} -def _resolve(tags, lock, name): - parsed = parse_package_toolchains(tags, _LOCKS, "m") - return parsed, resolve_package_toolchains(parsed, lock, name, tags) +def _resolve(tags, lock): + return resolve_rust_toolchain(parse_rust_toolchains(tags, _LOCKS, "m"), lock) -def _package_toolchains_scope_test_impl(ctx): +def _rust_toolchain_scope_test_impl(ctx): env = unittest.begin(ctx) + asserts.equals(env, None, _resolve([], "//a:uv.lock"), "no declaration: no toolchain") + asserts.equals(env, _RULES_RUST, _resolve([_tag(toolchain = _RULES_RUST)], "//b:uv.lock"), "a lock-less declaration covers every project") - _, none = _resolve([], "//a:uv.lock", "pkg") - asserts.equals(env, None, none.rust_toolchain, "no declaration: no toolchain") - asserts.equals(env, [], none.toolchains) - - _, module_wide = _resolve([_tag(rust_toolchain = _RULES_RUST, toolchains = [_JDK])], "//b:uv.lock", "pkg") - asserts.equals(env, _RULES_RUST, module_wide.rust_toolchain, "a lock-less, name-less declaration covers every package of every project") - asserts.equals(env, [_JDK], module_wide.toolchains) - - tags = [ - _tag(rust_toolchain = _RULES_RUST, toolchains = [_JDK]), - _tag(lock = "//b:uv.lock", rust_toolchain = _RULES_RS), - _tag(name = "Pydantic_Core", rust_toolchain = _NIGHTLY), - _tag(lock = "//b:uv.lock", name = "jpype1", toolchains = [_ANT]), - ] - _, a_pkg = _resolve(tags, "//a:uv.lock", "pkg") - asserts.equals(env, _RULES_RUST, a_pkg.rust_toolchain, "unscoped projects keep the module-wide toolchain") - _, b_pkg = _resolve(tags, "//b:uv.lock", "pkg") - asserts.equals(env, _RULES_RS, b_pkg.rust_toolchain, "a lock-scoped declaration wins over the module-wide one for its project") - asserts.equals(env, [_JDK], b_pkg.toolchains, "attributes resolve independently: the lock declaration sets no toolchains, so the module-wide list applies") - _, b_pydantic = _resolve(tags, "//b:uv.lock", normalize_name("pydantic-core")) - asserts.equals(env, _NIGHTLY, b_pydantic.rust_toolchain, "a package declaration (normalized name) wins over the lock one, in every lock") - _, b_jpype = _resolve(tags, "//b:uv.lock", "jpype1") - asserts.equals(env, [_ANT], b_jpype.toolchains, "a package-in-lock declaration is the most specific") - asserts.equals(env, _RULES_RS, b_jpype.rust_toolchain, "and leaves the other attribute to the next scope") - _, a_jpype = _resolve(tags, "//a:uv.lock", "jpype1") - asserts.equals(env, [_JDK], a_jpype.toolchains, "a package-in-lock declaration does not reach the same package in another lock") + tags = [_tag(toolchain = _RULES_RUST), _tag(lock = "//b:uv.lock", toolchain = _RULES_RS)] + asserts.equals(env, _RULES_RUST, _resolve(tags, "//a:uv.lock"), "unscoped projects keep the module-wide toolchain") + asserts.equals(env, _RULES_RS, _resolve(tags, "//b:uv.lock"), "a lock-scoped declaration wins for its project") + asserts.equals(env, None, _resolve([_tag(lock = "//b:uv.lock", toolchain = _RULES_RS)], "//a:uv.lock"), "a lock-scoped declaration alone reaches no other project") return unittest.end(env) -package_toolchains_scope_test = unittest.make(_package_toolchains_scope_test_impl) +rust_toolchain_scope_test = unittest.make(_rust_toolchain_scope_test_impl) -def _package_toolchains_errors_test_impl(ctx): +def _rust_toolchain_errors_test_impl(ctx): env = unittest.begin(ctx) def error(tags): - return parse_package_toolchains(tags, _LOCKS, "m").error + return parse_rust_toolchains(tags, _LOCKS, "m").error - err = error([_tag(rust_toolchain = _RULES_RUST), _tag(toolchains = [_JDK])]) + err = error([_tag(toolchain = _RULES_RUST), _tag(toolchain = _RULES_RS)]) asserts.true(env, err != None and "more than one module-wide" in err, "two module-wide declarations: got {}".format(err)) - err = error([_tag(lock = "//a:uv.lock", rust_toolchain = _RULES_RUST), _tag(lock = "//a:uv.lock", rust_toolchain = _RULES_RS)]) + err = error([_tag(lock = "//a:uv.lock", toolchain = _RULES_RUST), _tag(lock = "//a:uv.lock", toolchain = _RULES_RS)]) asserts.true(env, err != None and "declared twice" in err, "same lock twice: got {}".format(err)) - err = error([_tag(name = "x", rust_toolchain = _RULES_RUST), _tag(name = "X", toolchains = [_JDK])]) - asserts.true(env, err != None and "package 'X' is declared twice" in err, "same package twice (normalized): got {}".format(err)) - asserts.equals(env, None, error([_tag(name = "x", rust_toolchain = _RULES_RUST), _tag(lock = "//a:uv.lock", name = "x", toolchains = [_JDK])]), "the same package everywhere and in one lock are two scopes") - err = error([_tag(lock = "//nope:uv.lock", rust_toolchain = _RULES_RUST)]) + err = error([_tag(lock = "//nope:uv.lock", toolchain = _RULES_RUST)]) asserts.true(env, err != None and "has no uv.project() for that lock" in err, "unknown lock: got {}".format(err)) - err = error([_tag()]) - asserts.true(env, err != None and "at least one of" in err, "empty tag: got {}".format(err)) - - tags = [_tag(name = "ghost", rust_toolchain = _RULES_RUST), _tag(name = "pkg", toolchains = [_JDK])] - parsed, _ = _resolve(tags, "//a:uv.lock", "pkg") - err = check_package_toolchains_matched(parsed, tags, "m") - asserts.true(env, err != None and "'ghost' matches no package" in err, "a name that never applied: got {}".format(err)) - resolve_package_toolchains(parsed, "//b:uv.lock", "ghost", tags) - asserts.equals(env, None, check_package_toolchains_matched(parsed, tags, "m"), "once every name applied somewhere, nothing to report") + asserts.equals(env, None, error([_tag(toolchain = _RULES_RUST), _tag(lock = "//a:uv.lock", toolchain = _RULES_RS)]), "the module and one lock are two scopes") return unittest.end(env) -package_toolchains_errors_test = unittest.make(_package_toolchains_errors_test_impl) +rust_toolchain_errors_test = unittest.make(_rust_toolchain_errors_test_impl) def defs_test_suite(): unittest.suite( @@ -299,9 +264,9 @@ def defs_test_suite(): dedupe_shared_installs_test, ) unittest.suite( - "package_toolchains_tests", - package_toolchains_scope_test, - package_toolchains_errors_test, + "rust_toolchain_tests", + rust_toolchain_scope_test, + rust_toolchain_errors_test, ) unittest.suite( "map_scc_installs_tests", diff --git a/uv/private/pep517_whl/cargo_lock.bzl b/uv/private/pep517_whl/cargo_lock.bzl index 5b5f5f402..f440a2511 100644 --- a/uv/private/pep517_whl/cargo_lock.bzl +++ b/uv/private/pep517_whl/cargo_lock.bzl @@ -145,7 +145,7 @@ path, relative to the workspace root.""", "rust_toolchain": attr.label( mandatory = True, providers = [platform_common.ToolchainInfo], - doc = "A ruleset `rust_toolchain` exposing `cargo` and `rustc`; the project's `uv.package_toolchains(rust_toolchain = ...)`.", + doc = "A ruleset `rust_toolchain` exposing `cargo` and `rustc`; the project's `uv.rust_toolchain()`.", ), "output": attr.string( default = "", diff --git a/uv/private/sdist_build/repository.bzl b/uv/private/sdist_build/repository.bzl index 5a047c68e..7e4427372 100644 --- a/uv/private/sdist_build/repository.bzl +++ b/uv/private/sdist_build/repository.bzl @@ -285,7 +285,7 @@ def _missing_rust_toolchain(repo_name, rust_toolchain, inspection, toolchains): else: reason = "setuptools-rust is among its declared build requirements" return ("sdist_build for '{}': this sdist builds Rust ({}) but the project declares no Rust toolchain. " + - "Declare `uv.package_toolchains(rust_toolchain = \"@rules_rust//rust/toolchain:current_rust_toolchain\")`, " + + "Declare `uv.rust_toolchain(toolchain = \"@rules_rust//rust/toolchain:current_rust_toolchain\")`, " + "or wire one by hand with `uv.override_package(toolchains = [...])`.").format(repo_name, reason) def _lock_output(cargo_lock): @@ -310,7 +310,7 @@ def _rust_wiring(rust_toolchain, inspection, toolchains, src = "", lock_output = that `bazel run` uses to write the sdist's Cargo.lock into the workspace. Args: - rust_toolchain: The `uv.package_toolchains(rust_toolchain = ...)` that applies to the project, rendered as a label string, or "". + rust_toolchain: The `uv.rust_toolchain()` that applies to the project, rendered as a label string, or "". inspection: The configure tool's JSON, or None. toolchains: Extra toolchain labels from `uv.override_package`. src: The sdist label string, for the `:cargo_lock` target. diff --git a/uv/private/sdist_build/tests/repository_test.bzl b/uv/private/sdist_build/tests/repository_test.bzl index d5024b7f6..5d499c41d 100644 --- a/uv/private/sdist_build/tests/repository_test.bzl +++ b/uv/private/sdist_build/tests/repository_test.bzl @@ -186,7 +186,7 @@ def _missing_rust_toolchain_test_impl(ctx): ) msg = missing("sdist_build__x__pkg__1_0", "", maturin, []) - asserts.true(env, msg != None and "its build backend is maturin" in msg and "uv.package_toolchains(rust_toolchain" in msg, "got: {}".format(msg)) + asserts.true(env, msg != None and "its build backend is maturin" in msg and "uv.rust_toolchain(toolchain" in msg, "got: {}".format(msg)) msg = missing("r", "", st_rust, []) asserts.true(env, msg != None and "setuptools-rust is among its declared build requirements" in msg, "got: {}".format(msg)) return unittest.end(env) From 5793d658c185fa17231cd3fd4c3eea06e45c00cf Mon Sep 17 00:00:00 2001 From: Cesar Abel Date: Tue, 15 Sep 2026 14:06:46 -0600 Subject: [PATCH 103/103] chore(gazelle): order the pep517_whl bzl_library targets --- uv/private/pep517_whl/BUILD.bazel | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uv/private/pep517_whl/BUILD.bazel b/uv/private/pep517_whl/BUILD.bazel index 10be7e7b0..e5a8d1787 100644 --- a/uv/private/pep517_whl/BUILD.bazel +++ b/uv/private/pep517_whl/BUILD.bazel @@ -53,11 +53,11 @@ bzl_library( ) bzl_library( - name = "rust_layer", - srcs = ["rust_layer.bzl"], + name = "cargo_lock", + srcs = ["cargo_lock.bzl"], ) bzl_library( - name = "cargo_lock", - srcs = ["cargo_lock.bzl"], + name = "rust_layer", + srcs = ["rust_layer.bzl"], )