git: f09187effdb3 - main - databases/mongodb90: build on aarch64

From: Ronald Klop <ronald_at_FreeBSD.org>
Date: Fri, 16 Oct 2026 07:50:01 UTC
The branch main has been updated by ronald:

URL: https://cgit.FreeBSD.org/ports/commit/?id=f09187effdb3db1d3e5097d0b79dec9ac85cc1fb

commit f09187effdb3db1d3e5097d0b79dec9ac85cc1fb
Author:     Ronald Klop <ronald@FreeBSD.org>
AuthorDate: 2026-10-14 14:49:44 +0000
Commit:     Ronald Klop <ronald@FreeBSD.org>
CommitDate: 2026-10-16 07:49:48 +0000

    databases/mongodb90: build on aarch64
    
    Use --batch just like mongodb80.
    Remove huge local bazel-cache distfile by downloading the original distfiles.
---
 databases/mongodb90/Makefile                       |  154 ++-
 databases/mongodb90/Makefile.bazel-cache           |  154 +--
 databases/mongodb90/Makefile.crates                |  671 ++++++++++
 databases/mongodb90/distinfo                       | 1402 +++++++++++++++++++-
 databases/mongodb90/files/bazel-cache-add.py       |   60 +
 databases/mongodb90/files/bazel-distfiles.py       |  250 ++++
 databases/mongodb90/files/patch-MODULE.bazel       |    9 +-
 .../files/patch-bazel_cargo__bindeps.lock          |   90 +-
 databases/mongodb90/files/patch-bazel_crates.lock  |  248 +++-
 ...h-bazel_rules__rust_freebsd__host__triple.patch |   44 +-
 ...zel_rules__rust_freebsd__local__toolchain.patch |  102 ++
 ...lchains_cc_mongo__wasm_toolchain_wasi__repo.bzl |   39 +-
 12 files changed, 3021 insertions(+), 202 deletions(-)

diff --git a/databases/mongodb90/Makefile b/databases/mongodb90/Makefile
index d71212a8f531..a9959ddb50eb 100644
--- a/databases/mongodb90/Makefile
+++ b/databases/mongodb90/Makefile
@@ -1,18 +1,71 @@
 PORTNAME=	mongodb
 DISTVERSIONPREFIX=	r
 DISTVERSION=	9.0.0-alpha1
-PORTREVISION=			1
+PORTREVISION=	2
 CATEGORIES=	databases net
-MASTER_SITES+=	LOCAL/ronald:mongodb_bazel \
+MASTER_SITES+=	https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VERSION:R}/:wasi_sdk \
 		https://codeload.github.com/bazelbuild/bazel-central-registry/tar.gz/${BAZEL_REGISTRY_COMMIT}?dummy=/:bazel_registry \
 		https://codeload.github.com/mongodb-forks/rules_poetry/tar.gz/${RULES_POETRY_COMMIT}?dummy=/:rules_poetry
 PKGNAMESUFFIX=	${DISTVERSION:R:S/.//}
-BAZEL_CACHE_DISTFILE=	${PORTNAME}-${DISTVERSIONFULL}-bazel-repository-cache.tar.gz
 BAZEL_REGISTRY_DISTFILE=	bazelbuild-bazel-central-registry-${BAZEL_REGISTRY_COMMIT}_GH0.tar.gz
 RULES_POETRY_DISTFILE=	mongodb-forks-rules_poetry-${RULES_POETRY_COMMIT}_GH0.tar.gz
-DISTFILES+=	${BAZEL_CACHE_DISTFILE}:mongodb_bazel \
-		${BAZEL_REGISTRY_DISTFILE}:bazel_registry \
-		${RULES_POETRY_DISTFILE}:rules_poetry
+# The wasm32-wasip2 sysroot and compiler-rt builtins of wasi-sdk, see
+# post-extract and the wasi_repo.bzl patch. The version comes from
+# ${WRKSRC}/bazel/toolchains/cc/mongo_wasm/toolchain/wasi_repo.bzl.
+WASI_SDK_VERSION=	33.0
+WASI_SYSROOT_DISTFILE=	wasi-sysroot-${WASI_SDK_VERSION}+m.tar.gz
+WASI_LIBCLANG_RT_DISTFILE=	libclang_rt-${WASI_SDK_VERSION}+m.tar.gz
+DISTFILES+=	${BAZEL_REGISTRY_DISTFILE}:bazel_registry \
+		${RULES_POETRY_DISTFILE}:rules_poetry \
+		${WASI_SYSROOT_DISTFILE}:wasi_sdk \
+		${WASI_LIBCLANG_RT_DISTFILE}:wasi_sdk
+
+# Archives downloaded by Bazel as "group site distfile". They are added to the
+# Bazel repository cache in post-extract instead of being extracted. Most are
+# Bazel modules: the bazel-central-registry has their URLs in
+# modules/<name>/<version>/source.json. To find the full list after an update,
+# build once with an empty repository cache without --repository_disable_download.
+BAZEL_DISTFILES=	\
+	apple_support https://github.com/bazelbuild/apple_support/releases/download/1.24.1/ apple_support.1.24.1.tar.gz \
+	aspect_bazel_lib https://github.com/bazel-contrib/bazel-lib/releases/download/v2.13.0/ bazel-lib-v2.13.0.tar.gz \
+	aspect_rules_js https://github.com/aspect-build/rules_js/releases/download/v2.1.3/ rules_js-v2.1.3.tar.gz \
+	bats_core https://github.com/bats-core/bats-core/archive/v1.10.0.tar.gz?dummy=/ bats-core-1.10.0.tar.gz \
+	bazel_clang_tidy https://github.com/mongodb-forks/bazel_clang_tidy/archive/refs/tags/v1.7.tar.gz?dummy=/ bazel_clang_tidy-1.7.tar.gz \
+	bazel_features https://github.com/bazel-contrib/bazel_features/releases/download/v1.37.0/ bazel_features-v1.37.0.tar.gz \
+	bazel_skylib https://github.com/bazelbuild/bazel-skylib/releases/download/1.9.0/ bazel-skylib-1.9.0.tar.gz \
+	buildifier_prebuilt https://github.com/keith/buildifier-prebuilt/archive/refs/tags/6.4.0.tar.gz?dummy=/ buildifier-prebuilt-6.4.0.tar.gz \
+	platforms https://github.com/bazelbuild/platforms/releases/download/0.0.11/ platforms-0.0.11.tar.gz \
+	rules_cc https://github.com/bazelbuild/rules_cc/releases/download/0.2.10/ rules_cc-0.2.10.tar.gz \
+	rules_foreign_cc https://github.com/bazel-contrib/rules_foreign_cc/releases/download/0.15.1/ rules_foreign_cc-0.15.1.tar.gz \
+	rules_go https://github.com/bazelbuild/rules_go/releases/download/v0.50.1/ rules_go-v0.50.1.zip \
+	rules_java https://github.com/bazelbuild/rules_java/releases/download/8.6.1/ rules_java-8.6.1.tar.gz \
+	rules_kotlin https://github.com/bazelbuild/rules_kotlin/releases/download/v1.9.6/ rules_kotlin-v1.9.6.tar.gz \
+	rules_license https://github.com/bazelbuild/rules_license/releases/download/1.0.0/ rules_license-1.0.0.tar.gz \
+	rules_multitool https://github.com/theoremlp/rules_multitool/releases/download/v0.4.0/ rules_multitool-0.4.0.tar.gz \
+	rules_nodejs https://github.com/bazel-contrib/rules_nodejs/releases/download/v6.3.0/ rules_nodejs-v6.3.0.tar.gz \
+	rules_perl https://github.com/bazel-contrib/rules_perl/archive/refs/tags/0.2.4.tar.gz?dummy=/ rules_perl-0.2.4.tar.gz \
+	rules_pkg https://github.com/bazelbuild/rules_pkg/releases/download/1.2.0/ rules_pkg-1.2.0.tar.gz \
+	rules_proto https://github.com/bazelbuild/rules_proto/releases/download/7.1.0/ rules_proto-7.1.0.tar.gz \
+	rules_python https://github.com/bazel-contrib/rules_python/releases/download/1.8.5/ rules_python-1.8.5.tar.gz \
+	rules_rust https://github.com/bazelbuild/rules_rust/releases/download/0.69.0/ rules_rust-0.69.0.tar.gz \
+	rules_shell https://github.com/bazelbuild/rules_shell/releases/download/v0.6.1/ rules_shell-v0.6.1.tar.gz \
+	spidermonkey_wasi https://mdb-build-public.s3.amazonaws.com/spidermonkey-wasm/FIREFOX_140_12_0esr_RELEASE/spidermonkey-wasip2-release.tar.gz?dummy=/ spidermonkey-wasip2-release-FIREFOX_140_12_0esr_RELEASE.tar.gz
+# npm packages downloaded by rules_js, see ${WRKSRC}/pnpm-lock.yaml.
+BAZEL_NPM_DISTFILES=	\
+	npm_eslint https://registry.npmjs.org/eslint/-/ eslint-9.19.0.tgz \
+	npm_prettier https://registry.npmjs.org/prettier/-/ prettier-3.4.2.tgz
+
+.for group site distfile in ${BAZEL_DISTFILES} ${BAZEL_NPM_DISTFILES}
+MASTER_SITES+=	${site}:${group}
+DISTFILES+=	${distfile}:${group}
+_BAZEL_NOEXTRACT+=	N${distfile}
+.endfor
+.for group site distfile in ${BAZEL_DISTFILES}
+_BAZEL_CACHE_ARGS+=	${_DISTDIR}/${distfile}
+.endfor
+.for group site distfile in ${BAZEL_NPM_DISTFILES}
+_BAZEL_CACHE_ARGS+=	--npm ${_DISTDIR}/${distfile} ${site}${distfile}
+.endfor
 
 MAINTAINER=	ronald@FreeBSD.org
 COMMENT=	MongoDB Community Edition (9.0.x Branch)
@@ -52,7 +105,8 @@ FLAVORS=	default armv80a
 armv80a_PKGNAMESUFFIX=	${DISTVERSION:R:S/.//}-armv80a
 
 # gmake is used while running ${WRKSRC}/src/third_party/mozjs/scripts/gen-config.sh
-USES=		compiler:c++20-lang cpe gmake java:build pkgconfig python:build shebangfix ssl
+USES=		cargo compiler:c++20-lang cpe gmake pkgconfig python:build \
+		shebangfix ssl
 CPE_PRODUCT=	mongodb
 
 # mozjs tag comes from ${WRKSRC}/src/third_party/mozjs/scripts/import.sh
@@ -64,7 +118,6 @@ USE_GITHUB=	yes
 GH_ACCOUNT=	mongodb mongodb-forks:mozjs
 GH_PROJECT=	mongo spidermonkey:mozjs
 GH_TAGNAME=	${MOZJS_TAG}:mozjs
-JAVA_VERSION=	21
 USE_RC_SUBR=	mongod
 
 SHEBANG_FILES=	src/third_party/mozjs/scripts/gen-config.sh
@@ -75,6 +128,19 @@ CONFIGURE_ARGS=		${MOZJS_ARCH} \
 			freebsd
 CONFIGURE_ENV+=		PYTHON3="${PYTHON_CMD}"
 
+# The crates in Makefile.crates are used by rules_rust from the Bazel
+# repository cache and by cargo while bootstrapping cargo-bazel, see
+# post-extract. rules_rust uses lang/rust instead of downloading a Rust
+# toolchain, see the freebsd_local_toolchain.patch.
+CARGO_BUILD=		no
+CARGO_CONFIGURE=	no
+CARGO_INSTALL=		no
+CARGO_TEST=		no
+CARGO_CARGOLOCK=	${WRKSRC}/bazel/crates.toml
+CARGO_VENDOR_DIR=	${WRKDIR}/cargo-crates
+RULES_RUST_VERSION=	0.69.0
+RULES_RUST_WRKSRC=	${WRKDIR}/rules_rust-${RULES_RUST_VERSION}
+
 BAZEL=			${LOCALBASE}/bin/bazel
 BAZEL_OUTPUT_USER_ROOT=	${WRKDIR}/bazel
 BAZEL_REPOSITORY_CACHE=${WRKDIR}/bazel-repository-cache
@@ -85,7 +151,6 @@ BAZEL_ENV=		BAZEL_SH=${LOCALBASE}/bin/bash \
 			CC="${CC}" \
 			CXX="${CXX}" \
 			HOME=${WRKDIR} \
-			JAVA_HOME=${JAVA_HOME} \
 			MONGO_USE_SYSTEM_PYTHON=1 \
 			PYTHON_CMD=${PYTHON_CMD} \
 			TMPDIR=${WRKDIR}
@@ -102,12 +167,15 @@ BAZEL_ARGS=		--repository_cache=${BAZEL_REPOSITORY_CACHE} \
 			--action_env=AR=llvm-ar \
 			--action_env=CC=${CC} \
 			--action_env=CXX=${CXX} \
+			--repo_env=BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=0 \
+			--repo_env=CARGO_BAZEL_SKIP_DIGEST_CHECK=1 \
 			--repo_env=CC=${CC} \
 			--repo_env=CXX=${CXX} \
-			--repo_env=JAVA_HOME=${JAVA_HOME} \
 			--repo_env=LOCALBASE=${LOCALBASE} \
 			--repo_env=MONGO_USE_SYSTEM_PYTHON=1 \
 			--repo_env=PYTHON_CMD=${PYTHON_CMD} \
+			--repo_env=RULES_RUST_LOCAL_TOOLCHAIN=${LOCALBASE} \
+			--repo_env=WASI_SDK_DIR=${WASI_SDK_WRKSRC} \
 			--build_enterprise=False \
 			--enterprise_feature_all=False \
 			--allocator=system \
@@ -141,6 +209,7 @@ CONFLICTS_INSTALL=	mongodb[0-9][0-9]
 
 BINARY_ALIAS=	python3=${PYTHON_CMD}
 EXTRACT_AFTER_ARGS=	--no-same-owner --no-same-permissions
+EXTRACT_ONLY=	${_DISTFILES:N${WASI_SYSROOT_DISTFILE}:N${WASI_LIBCLANG_RT_DISTFILE}:${_BAZEL_NOEXTRACT:ts:}}
 
 # This ports is only following the Major Release.
 # https://docs.mongodb.com/manual/reference/versioning/
@@ -168,6 +237,7 @@ LTO_VARS=	BAZEL_ARGS+=--thin_lto=True
 NOAVX_EXTRA_PATCHES=	${FILESDIR}/extrapatch-src_third__party_mozjs_extract_mozglue_misc_SIMD.cpp
 
 MOZJS_WRKSRC=	${WRKSRC}/src/third_party/mozjs
+WASI_SDK_WRKSRC=	${WRKDIR}/wasi-sdk
 BAZEL_REGISTRY_WRKSRC=	${WRKDIR}/bazel-central-registry-${BAZEL_REGISTRY_COMMIT}
 RULES_POETRY_WRKSRC=	${WRKDIR}/rules_poetry-${RULES_POETRY_COMMIT}
 BAZEL_INSTALL_WRKSRC=	${WRKSRC}/bazel-bin/${ALL_TARGET}
@@ -203,15 +273,40 @@ post-extract:
 # Verify we downloaded the proper mozjs git tag.
 	${SH} -xc "test \"X`grep -E '^LIB_GIT_REVISION=' ${MOZJS_WRKSRC}/scripts/import.sh`\" = \"XLIB_GIT_REVISION=${MOZJS_TAG}\""
 
+post-patch:
+	${PATCH} -d ${RULES_POETRY_WRKSRC} -p0 < ${WRKSRC}/bazel/rules_poetry/rules_poetry.patch
+
 pre-configure:
 # Replacement of ${WRKSRC}/src/third_party/mozjs/scripts/import.sh
 	${LN} -sF ${WRKDIR}/spidermonkey-${MOZJS_TAG} ${MOZJS_WRKSRC}/mozilla-release
 	${PYTHON_CMD} ${WRKSRC}/bazel/resmoke/derive_suite_selectors.py
 	cd ${WRKSRC} && ${PYTHON_CMD} -c 'from pathlib import Path; from bazel.auto_header.gen_all_headers import spawn_all_headers_thread; th, state = spawn_all_headers_thread(Path(".")); th.join(); assert state["ok"], state["err"]; print("Generated all_headers (%s)" % ("wrote" if state["wrote"] else "unchanged"))'
 	cd ${WRKSRC} && ${SETENV} RG_PATH=${LOCALBASE}/bin/rg ${PYTHON_CMD} -c 'from pathlib import Path; from bazel.auto_header.auto_header import gen_auto_headers; state = gen_auto_headers(Path(".")); assert state["ok"], state["err"]; print("Generated auto_headers (%s wrote, %s skipped)" % (state["wrote"], state["skipped"]))'
-
-post-patch:
-	${PATCH} -d ${RULES_POETRY_WRKSRC} -p0 < ${WRKSRC}/bazel/rules_poetry/rules_poetry.patch
+# Bazel finds the files it downloads in its repository cache by sha256, which
+# is also the checksum of a crate in Cargo.lock and of a module in its
+# source.json. BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=0 makes Bazel
+# find them without the id- files of the download URLs. With downloads
+# disabled, Bazel also reads the files of the file:// registry from the cache.
+	${PYTHON_CMD} ${FILESDIR}/bazel-cache-add.py ${BAZEL_REPOSITORY_CACHE} \
+		${CARGO_CRATES:S|^|${_DISTDIR}/${CARGO_DIST_SUBDIR}/|:S|$|${CARGO_CRATE_EXT}|} \
+		${BAZEL_REGISTRY_WRKSRC} ${_BAZEL_CACHE_ARGS}
+# Assemble the parts of the wasi-sdk used with the native clang22: the
+# wasm32-wasip2 sysroot with exceptions, the compiler-rt builtins and the clang
+# resource headers.
+	${MKDIR} ${WASI_SDK_WRKSRC}/share/wasi-sysroot ${WASI_SDK_WRKSRC}/lib/clang/22/lib
+	${TAR} -xf ${_DISTDIR}/${WASI_SYSROOT_DISTFILE} -C ${WASI_SDK_WRKSRC}/share/wasi-sysroot \
+		--strip-components 1 --exclude llvm-lto --exclude noeh \
+		${WASI_SYSROOT_DISTFILE:S/.tar.gz$//:S|$|/include/c++|} \
+		${WASI_SYSROOT_DISTFILE:S/.tar.gz$//:S|$|/include/wasm32-wasip2|} \
+		${WASI_SYSROOT_DISTFILE:S/.tar.gz$//:S|$|/lib/wasm32-wasip2|} \
+		${WASI_SYSROOT_DISTFILE:S/.tar.gz$//:S|$|/share|}
+	${TAR} -xf ${_DISTDIR}/${WASI_LIBCLANG_RT_DISTFILE} -C ${WASI_SDK_WRKSRC}/lib/clang/22/lib \
+		--strip-components 1 ${WASI_LIBCLANG_RT_DISTFILE:S/.tar.gz$//:S|$|/wasm32-unknown-wasip2|}
+	${LN} -s ${LOCALBASE}/llvm22/lib/clang/22/include ${WASI_SDK_WRKSRC}/lib/clang/22/include
+# cargo-bazel is bootstrapped with cargo using HOME=${WRKDIR}.
+	${MKDIR} ${WRKDIR}/.cargo
+	${PRINTF} "[source.cargo]\ndirectory = '%s'\n[source.crates-io]\nreplace-with = 'cargo'\n" \
+		${CARGO_VENDOR_DIR} > ${WRKDIR}/.cargo/config.toml
 
 do-build:
 	${MKDIR} ${BAZEL_REPOSITORY_CACHE}
@@ -234,4 +329,37 @@ do-install:
 do-test:
 	${SH} ${FILESDIR}/make.test.sh "${STAGEDIR}${PREFIX}/bin"
 
+# The FreeBSD entries in files/patch-bazel_crates.lock and
+# files/patch-bazel_cargo__bindeps.lock come from a repin: run bazel cquery
+# with --repo_env=CARGO_BAZEL_REPIN=1, CARGO_BAZEL_REPIN_ONLY=crates (or
+# cargo_bindeps) and CARGO_NET_OFFLINE=false, after cargo-bazel has been
+# bootstrapped and with ${WRKDIR}/.cargo/config.toml moved away. The
+# cargo_bindeps repin needs a cargo that reports a -nightly version (a wrapper
+# script setting RUSTC_BOOTSTRAP=1) in RULES_RUST_LOCAL_TOOLCHAIN.
+
+# Regenerate Makefile.crates with the crates used by mongodb (its Cargo.lock
+# files) and by rules_rust: the cargo-bazel bootstrap (its Cargo.lock), the
+# cargo tools (3rdparty/crates/defs.bzl) and tinyjson.
+# Run "make makesum" afterwards.
+make-crates: extract
+	${MKDIR} ${RULES_RUST_WRKSRC}
+	${TAR} -xf ${BAZEL_REPOSITORY_CACHE}/content_addressable/sha256/$$(${SED} -n \
+		's/.*"integrity": "sha256-\(.*\)",/\1/p' \
+		${BAZEL_REGISTRY_WRKSRC}/modules/rules_rust/${RULES_RUST_VERSION}/source.json | \
+		b64decode -r | od -An -tx1 | ${TR} -d ' \n')/file \
+		-C ${RULES_RUST_WRKSRC} cargo/3rdparty/crates/defs.bzl \
+		crate_universe/Cargo.lock rust/private/repository_utils.bzl
+	{ for f in ${WRKSRC}/bazel/crates.toml ${WRKSRC}/bazel/cargo_bindeps.toml \
+		${RULES_RUST_WRKSRC}/crate_universe/Cargo.lock; do \
+		${_CARGO_AWK} ${SCRIPTSDIR}/cargo-crates.awk $$f; \
+	done; \
+	${SED} -n 's|.*"https://static.crates.io/crates/\([^/]*\)/\([^/]*\)/download".*|\1-\2|p' \
+		${RULES_RUST_WRKSRC}/cargo/3rdparty/crates/defs.bzl; \
+	${SED} -n 's|.*static.crates.io/crates/tinyjson/\(tinyjson-.*\)\.crate.*|\1|p' \
+		${RULES_RUST_WRKSRC}/rust/private/repository_utils.bzl; } | \
+		${SED} -e 's/^CARGO_CRATES=//' -e 's/[[:space:]\\]//g' | ${GREP} -v '^$$' | ${SORT} -u | \
+		${AWK} '{ c[n++] = $$0 } END { s = "CARGO_CRATES="; \
+			for (i = 0; i < n; i++) { printf "%s\t%s%s\n", s, c[i], (i < n - 1 ? " \\" : ""); s = "\t" } }' \
+		> ${MASTERDIR}/Makefile.crates
+
 .include <bsd.port.post.mk>
diff --git a/databases/mongodb90/Makefile.bazel-cache b/databases/mongodb90/Makefile.bazel-cache
index 1fd239863c22..a536a1b594fd 100644
--- a/databases/mongodb90/Makefile.bazel-cache
+++ b/databases/mongodb90/Makefile.bazel-cache
@@ -1,15 +1,19 @@
-# Helper for generating the offline Bazel repository cache distfile.
+# Helper for regenerating BAZEL_DISTFILES and BAZEL_NPM_DISTFILES in the port
+# Makefile after an update.
 #
 # Usage:
 #   make -f Makefile.bazel-cache
 #
+# This configures the port without the Bazel distfiles, lets Bazel analyse
+# ${ALL_TARGET} with an empty repository cache and downloads enabled and prints
+# the archives Bazel downloaded as BAZEL_DISTFILES and BAZEL_NPM_DISTFILES
+# (also saved in ${BAZEL_DISTFILES_MK}). Replace them in the Makefile and run
+# "make makesum". Run "make make-crates" first when the Cargo.lock files
+# changed, crates are not part of these lists.
+#
 # WRKDIRPREFIX and DISTDIR are intentionally not set here.  The sub-make that
 # reads the real port Makefile will pick them up from /etc/make.conf or from the
 # command line, the same as any other port build.
-#
-# This intentionally excludes ${BAZEL_CACHE_DISTFILE} while preparing the source
-# tree, otherwise generating a new cache would require the cache to already
-# exist.
 
 PORTDIR?=	${.CURDIR}
 BATCH?=		yes
@@ -17,105 +21,41 @@ BATCH?=		yes
 PORT_MAKE=	${MAKE} -C ${PORTDIR} \
 		BATCH=${BATCH}
 
-BAZEL!=			${PORT_MAKE} -V BAZEL
-BAZEL_ARGS!=		${PORT_MAKE} -V BAZEL_ARGS
-BAZEL_CACHE_DISTFILE!=	${PORT_MAKE} -V BAZEL_CACHE_DISTFILE
-BAZEL_ENV!=		${PORT_MAKE} -V BAZEL_ENV
-BAZEL_REPOSITORY_CACHE!=	${PORT_MAKE} -V BAZEL_REPOSITORY_CACHE
-BAZEL_STARTUP_ARGS!=	${PORT_MAKE} -V BAZEL_STARTUP_ARGS
-ALL_TARGET!=		${PORT_MAKE} -V ALL_TARGET
-DISTFILES!=		${PORT_MAKE} -V DISTFILES
-CACHE_DISTDIR!=		${PORT_MAKE} -V DISTDIR
-ECHO_MSG!=		${PORT_MAKE} -V ECHO_MSG
-FIND!=			${PORT_MAKE} -V FIND
-GZIP_CMD!=		${PORT_MAKE} -V GZIP_CMD
-LOCALBASE!=		${PORT_MAKE} -V LOCALBASE
-LS!=			${PORT_MAKE} -V LS
-MKDIR!=			${PORT_MAKE} -V MKDIR
-MV!=			${PORT_MAKE} -V MV
-RM!=			${PORT_MAKE} -V RM
-SETENV!=		${PORT_MAKE} -V SETENV
-SHA256!=		${PORT_MAKE} -V SHA256
-SORT!=			${PORT_MAKE} -V SORT
-TAR!=			${PORT_MAKE} -V TAR
-WRKDIR!=		${PORT_MAKE} -V WRKDIR
-WRKSRC!=		${PORT_MAKE} -V WRKSRC
-
-.if !defined(BAZEL_CACHE_EPOCH)
-BAZEL_CACHE_EPOCH!=	if [ -n "$${SOURCE_DATE_EPOCH}" ]; then \
-				echo "$${SOURCE_DATE_EPOCH}"; \
-			elif command -v git >/dev/null 2>&1 && git -C ${PORTDIR} rev-parse --show-toplevel >/dev/null 2>&1; then \
-				epoch=`git -C ${PORTDIR} log -1 --format=%ct -- .`; \
-				if [ -n "$${epoch}" ]; then echo "$${epoch}"; else date -u +%s; fi; \
-			else \
-				date -u +%s; \
-			fi
-.endif
-
-JAVA_HOME?=		${LOCALBASE}/openjdk21
-BAZEL_CACHE_ENV=	JAVA_HOME=${JAVA_HOME} ${BAZEL_ENV}
-BAZEL_CACHE_ARGS=	${BAZEL_ARGS:N--repository_disable_download}
-BAZEL_CACHE_ARGS+=	--repo_env=JAVA_HOME=${JAVA_HOME}
-BAZEL_CACHE_DISTFILE_PATH=	${CACHE_DISTDIR}/${BAZEL_CACHE_DISTFILE}
-BAZEL_CACHE_MANIFEST=	${WRKDIR}/bazel-cache-manifest
-BAZEL_CACHE_OUTPUT_USER_ROOT=	${WRKDIR}/bazel-cache-output
-BAZEL_CACHE_STARTUP_ARGS=	--output_user_root=${BAZEL_CACHE_OUTPUT_USER_ROOT}
-BAZEL_CACHE_CHECK_ROOT=	${WRKDIR}/bazel-cache-check
-BAZEL_CACHE_CHECK_HOME=	${BAZEL_CACHE_CHECK_ROOT}/home
-BAZEL_CACHE_CHECK_REPOSITORY_CACHE=	${BAZEL_CACHE_CHECK_ROOT}/bazel-repository-cache
-BAZEL_CACHE_CHECK_OUTPUT_USER_ROOT=	${BAZEL_CACHE_CHECK_ROOT}/bazel-output
-BAZEL_CACHE_CHECK_STARTUP_ARGS=	--output_user_root=${BAZEL_CACHE_CHECK_OUTPUT_USER_ROOT}
-BAZEL_CACHE_CHECK_ARGS=	${BAZEL_ARGS:N--repository_cache=*}
-BAZEL_CACHE_CHECK_ARGS+=	--repository_cache=${BAZEL_CACHE_CHECK_REPOSITORY_CACHE}
-BAZEL_CACHE_CHECK_ARGS+=	--repo_env=JAVA_HOME=${JAVA_HOME}
-BAZEL_CACHE_CHECK_ENV=	JAVA_HOME=${JAVA_HOME} ${BAZEL_ENV:NHOME=*} \
-			HOME=${BAZEL_CACHE_CHECK_HOME}
-SOURCE_DISTFILES=	${DISTFILES:N*${BAZEL_CACHE_DISTFILE}*}
-
-.PHONY: all bazel-cache-distfile package-bazel-cache-distfile check-bazel-cache-distfile clean-bazel-cache print-bazel-cache-vars
-
-all: bazel-cache-distfile
-
-bazel-cache-distfile:
-	${PORT_MAKE} DISTFILES="${SOURCE_DISTFILES}" configure
-	${RM} -r ${BAZEL_REPOSITORY_CACHE}
-	${RM} -r ${BAZEL_CACHE_OUTPUT_USER_ROOT}
-	${MKDIR} ${BAZEL_REPOSITORY_CACHE}
-	cd ${WRKSRC} && ${SETENV} ${BAZEL_CACHE_ENV} ${BAZEL} ${BAZEL_CACHE_STARTUP_ARGS} build --nobuild ${BAZEL_CACHE_ARGS} ${ALL_TARGET}
-	${MAKE} -f ${.CURDIR}/Makefile.bazel-cache package-bazel-cache-distfile
-
-package-bazel-cache-distfile:
-	${MKDIR} ${CACHE_DISTDIR}
-	${RM} ${BAZEL_CACHE_DISTFILE_PATH}
-	cd ${WRKDIR} && ${FIND} ${BAZEL_REPOSITORY_CACHE:T} .cargo/registry -print | LC_ALL=C ${SORT} > ${BAZEL_CACHE_MANIFEST}
-	cd ${WRKDIR} && ${TAR} --no-recursion --format=pax --uid 0 --gid 0 --uname root --gname wheel --mtime @${BAZEL_CACHE_EPOCH} -cf - -T ${BAZEL_CACHE_MANIFEST} | ${GZIP_CMD} -c > ${BAZEL_CACHE_DISTFILE_PATH}
-	${SHA256} ${BAZEL_CACHE_DISTFILE_PATH}
-	${LS} -lh ${BAZEL_CACHE_DISTFILE_PATH}
-
-check-bazel-cache-distfile:
-	${RM} -r ${BAZEL_CACHE_CHECK_ROOT}
-	${MKDIR} ${BAZEL_CACHE_CHECK_ROOT}
-	cd ${BAZEL_CACHE_CHECK_ROOT} && ${TAR} -xzf ${BAZEL_CACHE_DISTFILE_PATH}
-	${MKDIR} ${BAZEL_CACHE_CHECK_HOME}
-	${MV} ${BAZEL_CACHE_CHECK_ROOT}/.cargo ${BAZEL_CACHE_CHECK_HOME}/.cargo
-	cd ${WRKSRC} && ${SETENV} ${BAZEL_CACHE_CHECK_ENV} ${BAZEL} ${BAZEL_CACHE_CHECK_STARTUP_ARGS} build --nobuild ${BAZEL_CACHE_CHECK_ARGS} ${ALL_TARGET}
-
-clean-bazel-cache:
-	${RM} -r ${BAZEL_REPOSITORY_CACHE}
-	${RM} ${BAZEL_CACHE_DISTFILE_PATH}
-	${RM} ${BAZEL_CACHE_MANIFEST}
-	${RM} -r ${BAZEL_CACHE_OUTPUT_USER_ROOT}
-	${RM} -r ${BAZEL_CACHE_CHECK_ROOT}
-
-print-bazel-cache-vars:
-	@${ECHO_MSG} "DISTDIR=${CACHE_DISTDIR}"
-	@${ECHO_MSG} "WRKDIR=${WRKDIR}"
-	@${ECHO_MSG} "WRKSRC=${WRKSRC}"
-	@${ECHO_MSG} "BAZEL_CACHE_EPOCH=${BAZEL_CACHE_EPOCH}"
-	@${ECHO_MSG} "JAVA_HOME=${JAVA_HOME}"
-	@${ECHO_MSG} "BAZEL_REPOSITORY_CACHE=${BAZEL_REPOSITORY_CACHE}"
-	@${ECHO_MSG} "BAZEL_CACHE_OUTPUT_USER_ROOT=${BAZEL_CACHE_OUTPUT_USER_ROOT}"
-	@${ECHO_MSG} "BAZEL_CACHE_CHECK_HOME=${BAZEL_CACHE_CHECK_HOME}"
-	@${ECHO_MSG} "BAZEL_CACHE_CHECK_REPOSITORY_CACHE=${BAZEL_CACHE_CHECK_REPOSITORY_CACHE}"
-	@${ECHO_MSG} "BAZEL_CACHE_DISTFILE=${BAZEL_CACHE_DISTFILE}"
-	@${ECHO_MSG} "SOURCE_DISTFILES=${SOURCE_DISTFILES}"
+.for var in ALL_TARGET BAZEL BAZEL_ARGS BAZEL_DISTFILES BAZEL_ENV \
+	BAZEL_NPM_DISTFILES BAZEL_REGISTRY_WRKSRC BAZEL_STARTUP_ARGS \
+	DISTINFO_FILE FILESDIR MKDIR PYTHON_CMD RM SETENV WRKDIR WRKSRC
+${var}!=	${PORT_MAKE} -V ${var}
+.endfor
+
+BAZEL_DISTFILES_ROOT=	${WRKDIR}/bazel-distfiles
+BAZEL_DISTFILES_CACHE=	${BAZEL_DISTFILES_ROOT}/repository-cache
+BAZEL_DISTFILES_OUTPUT=	${BAZEL_DISTFILES_ROOT}/output
+BAZEL_DISTFILES_MK=	${BAZEL_DISTFILES_ROOT}/bazel-distfiles.mk
+BAZEL_DISTFILES_STARTUP_ARGS=	${BAZEL_STARTUP_ARGS:N--output_user_root=*} \
+				--output_user_root=${BAZEL_DISTFILES_OUTPUT}
+# Without the canonical ids Bazel stores no id- files, which bazel-distfiles.py
+# uses to recognise download URLs.
+BAZEL_DISTFILES_ARGS=	${BAZEL_ARGS:N--repository_disable_download:N--repository_cache=*:N--repo_env=BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=*} \
+			--repository_cache=${BAZEL_DISTFILES_CACHE}
+
+.PHONY: all bazel-distfiles print-bazel-distfiles clean-bazel-distfiles
+
+all: bazel-distfiles
+
+bazel-distfiles:
+	${PORT_MAKE} BAZEL_DISTFILES= BAZEL_NPM_DISTFILES= configure
+	${RM} -r ${BAZEL_DISTFILES_ROOT}
+	${MKDIR} ${BAZEL_DISTFILES_CACHE}
+	cd ${WRKSRC} && ${SETENV} ${BAZEL_ENV} ${BAZEL} ${BAZEL_DISTFILES_STARTUP_ARGS} \
+		build --nobuild ${BAZEL_DISTFILES_ARGS} ${ALL_TARGET}
+	${MAKE} -f ${.CURDIR}/Makefile.bazel-cache print-bazel-distfiles
+
+print-bazel-distfiles:
+	${PYTHON_CMD} ${FILESDIR}/bazel-distfiles.py ${BAZEL_DISTFILES_CACHE} \
+		${BAZEL_REGISTRY_WRKSRC} ${DISTINFO_FILE} \
+		${WRKSRC} ${BAZEL_DISTFILES_OUTPUT} \
+		-- "${BAZEL_DISTFILES}" "${BAZEL_NPM_DISTFILES}" > ${BAZEL_DISTFILES_MK}
+	@cat ${BAZEL_DISTFILES_MK}
+
+clean-bazel-distfiles:
+	${RM} -r ${BAZEL_DISTFILES_ROOT}
diff --git a/databases/mongodb90/Makefile.crates b/databases/mongodb90/Makefile.crates
new file mode 100644
index 000000000000..9d74d9608b1a
--- /dev/null
+++ b/databases/mongodb90/Makefile.crates
@@ -0,0 +1,671 @@
+CARGO_CRATES=	addr2line-0.26.1 \
+		adler2-2.0.0 \
+		ahash-0.8.11 \
+		aho-corasick-1.0.2 \
+		aho-corasick-1.1.4 \
+		allocator-api2-0.2.18 \
+		allocator-api2-0.2.21 \
+		ambient-authority-0.0.2 \
+		android_system_properties-0.1.5 \
+		anstream-0.6.18 \
+		anstream-1.0.0 \
+		anstyle-1.0.10 \
+		anstyle-1.0.14 \
+		anstyle-parse-0.2.1 \
+		anstyle-parse-1.0.0 \
+		anstyle-query-1.0.0 \
+		anstyle-query-1.1.5 \
+		anstyle-wincon-3.0.11 \
+		anstyle-wincon-3.0.6 \
+		anyhow-1.0.102 \
+		anyhow-1.0.98 \
+		arbitrary-1.4.2 \
+		arc-swap-1.6.0 \
+		arrayvec-0.7.4 \
+		async-trait-0.1.89 \
+		atomic-waker-1.1.2 \
+		autocfg-1.1.0 \
+		autocfg-1.5.0 \
+		base64-0.22.1 \
+		beef-0.5.2 \
+		bitflags-1.3.2 \
+		bitflags-2.11.0 \
+		bitflags-2.4.1 \
+		bitmaps-2.1.0 \
+		block-buffer-0.10.4 \
+		borsh-1.5.3 \
+		bstr-1.6.0 \
+		bumpalo-3.20.2 \
+		bytes-1.11.1 \
+		camino-1.1.9 \
+		cap-fs-ext-3.4.5 \
+		cap-net-ext-3.4.5 \
+		cap-primitives-3.4.5 \
+		cap-rand-3.4.5 \
+		cap-std-3.4.5 \
+		cap-time-ext-3.4.5 \
+		cargo-lock-10.1.0 \
+		cargo-platform-0.1.9 \
+		cargo-util-schemas-0.3.1 \
+		cargo_metadata-0.19.2 \
+		cargo_toml-0.20.5 \
+		cargo_toml-0.22.1 \
+		cc-1.2.59 \
+		cfg-expr-0.18.0 \
+		cfg-if-1.0.0 \
+		cfg-if-1.0.4 \
+		cfg_aliases-0.2.1 \
+		clap-4.5.37 \
+		clap-4.6.0 \
+		clap_builder-4.5.37 \
+		clap_builder-4.6.0 \
+		clap_complete-4.6.0 \
+		clap_derive-4.5.32 \
+		clap_derive-4.6.0 \
+		clap_lex-0.7.4 \
+		clap_lex-1.1.0 \
+		clru-0.6.1 \
+		cobs-0.3.0 \
+		colorchoice-1.0.0 \
+		colorchoice-1.0.5 \
+		core-foundation-sys-0.8.7 \
+		cpp_demangle-0.4.5 \
+		cpufeatures-0.2.17 \
+		cpufeatures-0.2.9 \
+		cranelift-assembler-x64-0.131.1 \
+		cranelift-assembler-x64-meta-0.131.1 \
+		cranelift-bforest-0.131.1 \
+		cranelift-bitset-0.131.1 \
+		cranelift-codegen-0.131.1 \
+		cranelift-codegen-meta-0.131.1 \
+		cranelift-codegen-shared-0.131.1 \
+		cranelift-control-0.131.1 \
+		cranelift-entity-0.131.1 \
+		cranelift-frontend-0.131.1 \
+		cranelift-isle-0.131.1 \
+		cranelift-native-0.131.1 \
+		cranelift-srcgen-0.131.1 \
+		crates-index-3.7.0 \
+		crc32fast-1.3.2 \
+		crc32fast-1.5.0 \
+		crossbeam-channel-0.5.8 \
+		crossbeam-deque-0.8.6 \
+		crossbeam-epoch-0.9.18 \
+		crossbeam-utils-0.8.16 \
+		crossbeam-utils-0.8.21 \
+		crypto-common-0.1.6 \
+		crypto-common-0.1.7 \
+		debugid-0.8.0 \
+		digest-0.10.7 \
+		directories-next-2.0.0 \
+		dirs-sys-next-0.1.2 \
+		displaydoc-0.2.5 \
+		dunce-1.0.4 \
+		either-1.15.0 \
+		either-1.9.0 \
+		embedded-io-0.4.0 \
+		embedded-io-0.6.1 \
+		encoding_rs-0.8.33 \
+		encoding_rs-0.8.35 \
+		env_filter-1.0.1 \
+		env_logger-0.10.2 \
+		env_logger-0.11.10 \
+		equivalent-1.0.1 \
+		equivalent-1.0.2 \
+		erased-serde-0.4.5 \
+		errno-0.3.11 \
+		errno-0.3.14 \
+		escape8259-0.5.3 \
+		fallible-iterator-0.3.0 \
+		faster-hex-0.9.0 \
+		fastrand-2.1.1 \
+		fastrand-2.3.0 \
+		fd-lock-4.0.4 \
+		file-per-thread-logger-0.2.0 \
+		filetime-0.2.22 \
+		find-msvc-tools-0.1.9 \
+		fixedbitset-0.4.2 \
+		flate2-1.0.35 \
+		fnv-1.0.7 \
+		foldhash-0.1.5 \
+		foldhash-0.2.0 \
+		form_urlencoded-1.2.1 \
+		form_urlencoded-1.2.2 \
+		fs-set-times-0.20.3 \
+		futures-0.3.32 \
+		futures-channel-0.3.32 \
+		futures-core-0.3.32 \
+		futures-io-0.3.32 \
+		futures-sink-0.3.32 \
+		futures-task-0.3.32 \
+		futures-util-0.3.32 \
+		fxprof-processed-profile-0.8.1 \
+		generic-array-0.14.7 \
+		getrandom-0.2.17 \
+		getrandom-0.3.2 \
+		getrandom-0.3.4 \
+		getrandom-0.4.2 \
+		gimli-0.31.1 \
+		gimli-0.33.0 \
+		gix-0.70.0 \
+		gix-actor-0.33.2 \
+		gix-attributes-0.24.0 \
+		gix-bitmap-0.2.14 \
+		gix-chunk-0.4.11 \
+		gix-command-0.4.1 \
+		gix-commitgraph-0.26.0 \
+		gix-config-0.43.0 \
+		gix-config-value-0.14.11 \
+		gix-credentials-0.27.0 \
+		gix-date-0.9.3 \
+		gix-diff-0.50.0 \
+		gix-discover-0.38.0 \
+		gix-features-0.40.0 \
+		gix-filter-0.17.0 \
+		gix-fs-0.13.0 \
+		gix-glob-0.18.0 \
+		gix-hash-0.16.0 \
+		gix-hashtable-0.7.0 \
+		gix-ignore-0.13.0 \
+		gix-index-0.38.0 \
+		gix-lock-16.0.0 \
+		gix-negotiate-0.18.0 \
+		gix-object-0.47.0 \
+		gix-odb-0.67.0 \
+		gix-pack-0.57.0 \
+		gix-packetline-0.18.3 \
+		gix-packetline-blocking-0.18.2 \
+		gix-path-0.10.14 \
+		gix-pathspec-0.9.0 \
+		gix-prompt-0.9.1 \
+		gix-protocol-0.48.0 \
+		gix-quote-0.4.15 \
+		gix-ref-0.50.0 \
+		gix-refspec-0.28.0 \
+		gix-revision-0.32.0 \
+		gix-revwalk-0.18.0 \
+		gix-sec-0.10.11 \
+		gix-shallow-0.2.0 \
+		gix-submodule-0.17.0 \
+		gix-tempfile-16.0.0 \
+		gix-trace-0.1.12 \
+		gix-transport-0.45.0 \
+		gix-traverse-0.44.0 \
+		gix-url-0.29.0 \
+		gix-utils-0.1.14 \
+		gix-validate-0.9.3 \
+		gix-worktree-0.39.0 \
+		glob-0.3.2 \
+		globset-0.4.11 \
+		globwalk-0.9.1 \
+		h2-0.4.13 \
+		hashbrown-0.14.3 \
+		hashbrown-0.15.0 \
+		hashbrown-0.15.2 \
+		hashbrown-0.15.5 \
+		hashbrown-0.16.1 \
+		hashbrown-0.17.0 \
+		heck-0.5.0 \
+		hermit-abi-0.5.2 \
+		hex-0.4.3 \
+		home-0.5.5 \
+		http-1.4.0 \
+		http-body-1.0.1 \
+		http-body-util-0.1.3 \
+		httparse-1.10.1 \
+		httpdate-1.0.3 \
+		humantime-2.3.0 \
+		hyper-1.9.0 \
+		iana-time-zone-0.1.65 \
+		iana-time-zone-haiku-0.1.2 \
+		icu_collections-1.5.0 \
+		icu_collections-2.2.0 \
+		icu_locale_core-2.2.0 \
+		icu_locid-1.5.0 \
+		icu_locid_transform-1.5.0 \
+		icu_locid_transform_data-1.5.0 \
+		icu_normalizer-1.5.0 \
+		icu_normalizer-2.2.0 \
+		icu_normalizer_data-1.5.0 \
+		icu_normalizer_data-2.2.0 \
+		icu_properties-1.5.1 \
+		icu_properties-2.2.0 \
+		icu_properties_data-1.5.0 \
+		icu_properties_data-2.2.0 \
+		icu_provider-1.5.0 \
+		icu_provider-2.2.0 \
+		icu_provider_macros-1.5.0 \
+		id-arena-2.3.0 \
+		idna-1.0.3 \
+		idna-1.1.0 \
+		idna_adapter-1.2.0 \
+		idna_adapter-1.2.1 \
+		ignore-0.4.18 \
+		im-rc-15.1.0 \
+		indexmap-2.13.1 \
+		indexmap-2.14.0 \
+		indexmap-2.6.0 \
+		indexmap-2.7.1 \
+		indoc-2.0.6 \
+		io-extras-0.18.4 \
+		io-lifetimes-2.0.4 \
+		ipnet-2.12.0 \
+		is-terminal-0.4.17 \
+		is_terminal_polyfill-1.70.1 \
+		is_terminal_polyfill-1.70.2 \
+		itertools-0.14.0 \
+		itoa-1.0.18 \
+		itoa-1.0.8 \
+		ittapi-0.4.0 \
+		ittapi-sys-0.4.0 \
+		jiff-0.1.13 \
+		jiff-0.2.23 \
+		jiff-static-0.2.23 \
+		jiff-tzdb-0.1.1 \
+		jiff-tzdb-platform-0.1.1 \
+		jobserver-0.1.34 \
+		js-sys-0.3.94 \
+		json-from-wast-0.246.2 \
+		kstring-2.0.2 \
+		lazy_static-1.4.0 \
+		lazy_static-1.5.0 \
+		leb128-0.2.5 \
+		leb128fmt-0.1.0 \
+		libc-0.2.172 \
+		libc-0.2.184 \
+		libloading-0.8.9 \
+		libm-0.2.16 \
+		libredox-0.1.15 \
+		libtest-mimic-0.8.2 \
+		linux-raw-sys-0.12.1 \
+		linux-raw-sys-0.4.14 \
+		linux-raw-sys-0.4.15 \
+		linux-raw-sys-0.9.4 \
+		listenfd-1.0.2 \
+		litemap-0.7.4 \
+		litemap-0.8.2 \
+		lock_api-0.4.11 \
+		log-0.4.19 \
+		log-0.4.29 \
+		logos-0.14.4 \
+		logos-codegen-0.14.4 \
+		logos-derive-0.14.4 \
+		mach2-0.4.3 \
+		maplit-1.0.2 \
+		matchers-0.2.0 \
+		maybe-async-0.2.7 \
+		maybe-owned-0.3.4 \
+		memchr-2.6.4 \
+		memchr-2.7.4 \
+		memchr-2.8.0 \
+		memfd-0.6.5 \
+		memmap2-0.9.5 \
+		miette-7.6.0 \
+		miette-derive-7.6.0 \
+		miniz_oxide-0.8.0 \
+		mio-1.2.0 \
+		normpath-1.3.0 \
+		nu-ansi-term-0.46.0 \
+		nu-ansi-term-0.50.3 \
+		num-traits-0.2.19 \
+		object-0.39.1 \
+		once_cell-1.21.3 \
+		once_cell-1.21.4 \
+		once_cell_polyfill-1.70.2 \
+		openvino-0.9.1 \
+		openvino-finder-0.9.1 \
+		openvino-sys-0.9.1 \
+		ordered-float-2.10.1 \
+		overload-0.1.1 \
+		parking_lot-0.12.1 \
+		parking_lot_core-0.9.9 \
+		pathdiff-0.1.0 \
+		pathdiff-0.2.3 \
+		percent-encoding-2.3.1 \
+		percent-encoding-2.3.2 \
+		pest-2.7.0 \
+		pest_derive-2.7.0 \
+		pest_generator-2.7.0 \
+		pest_meta-2.7.0 \
+		petgraph-0.6.5 \
+		pin-project-lite-0.2.13 \
+		pin-project-lite-0.2.17 \
+		pkg-config-0.3.32 \
+		portable-atomic-1.13.1 \
+		portable-atomic-util-0.2.6 \
+		postcard-1.1.3 \
+		potential_utf-0.1.5 \
+		ppv-lite86-0.2.21 \
+		prettyplease-0.2.37 \
+		proc-macro2-1.0.106 \
+		proc-macro2-1.0.92 \
+		proc-macro2-1.0.93 \
+		prodash-29.0.0 \
+		pulldown-cmark-0.9.6 \
+		pulley-interpreter-44.0.1 \
+		pulley-macros-44.0.1 \
+		quote-1.0.37 \
+		quote-1.0.38 \
+		quote-1.0.45 \
+		r-efi-5.2.0 \
+		r-efi-5.3.0 \
+		r-efi-6.0.0 \
+		rand-0.8.5 \
+		rand_chacha-0.3.1 \
+		rand_core-0.6.4 \
+		rand_xoshiro-0.6.0 \
+		rayon-1.11.0 \
+		rayon-core-1.13.0 \
+		redox_syscall-0.3.5 \
+		redox_syscall-0.4.1 \
+		redox_users-0.4.6 \
+		regalloc2-0.15.1 \
+		regex-1.11.1 \
+		regex-1.12.3 \
+		regex-automata-0.3.3 \
+		regex-automata-0.4.14 \
+		regex-automata-0.4.8 \
+		regex-syntax-0.8.10 \
+		regex-syntax-0.8.5 \
+		ring-0.17.14 \
+		rustc-demangle-0.1.27 \
+		rustc-hash-2.0.0 \
+		rustc-hash-2.1.2 \
+		rustc-stable-hash-0.1.1 \
+		rustix-0.38.41 \
+		rustix-0.38.44 \
+		rustix-1.0.5 \
+		rustix-1.1.4 \
+		rustix-linux-procfs-0.1.1 \
+		rustls-0.23.40 \
+		rustls-pki-types-1.14.0 \
+		rustls-webpki-0.103.13 \
+		rustversion-1.0.22 \
+		ryu-1.0.14 \
+		ryu-1.0.23 \
+		same-file-1.0.6 \
+		scopeguard-1.2.0 \
+		semver-1.0.25 \
+		semver-1.0.26 \
+		semver-1.0.27 \
+		semver-1.0.28 \
+		serde-1.0.217 \
+		serde-1.0.219 \
+		serde-1.0.228 \
+		serde-untagged-0.1.6 \
+		serde-value-0.7.0 \
+		serde_core-1.0.228 \
+		serde_derive-1.0.217 \
+		serde_derive-1.0.219 \
+		serde_derive-1.0.228 \
+		serde_json-1.0.140 \
+		serde_json-1.0.149 \
+		serde_spanned-0.6.8 \
+		serde_spanned-0.6.9 \
+		serde_spanned-1.1.1 \
+		serde_starlark-0.1.17 \
+		serde_yaml-0.9.34+deprecated \
+		sha1_smol-1.0.0 \
+		sha2-0.10.8 \
+		sha2-0.10.9 \
+		sharded-slab-0.1.7 \
+		shell-words-1.1.0 \
+		shlex-1.3.0 \
+		signal-hook-registry-1.4.8 \
+		sized-chunks-0.6.5 \
+		slab-0.4.12 \
+		smallvec-1.13.2 \
+		smallvec-1.15.0 \
+		smallvec-1.15.1 \
+		smawk-0.3.2 \
+		smol_str-0.3.2 \
+		socket2-0.6.3 \
+		spdx-0.10.8 \
+		spdx-0.10.9 \
+		stable_deref_trait-1.2.0 \
+		stable_deref_trait-1.2.1 \
+		static_assertions-1.1.0 \
+		strsim-0.11.1 \
+		subtle-2.6.1 \
+		syn-1.0.109 \
+		syn-2.0.117 \
+		syn-2.0.90 \
+		syn-2.0.98 \
+		synstructure-0.13.1 \
+		synstructure-0.13.2 \
+		system-interface-0.27.3 \
+		target-lexicon-0.13.5 \
+		tempfile-3.19.1 \
+		tempfile-3.27.0 \
+		tera-1.20.0 \
+		termcolor-1.4.1 \
+		terminal_size-0.4.4 \
+		textwrap-0.16.2 \
+		thiserror-1.0.50 \
+		thiserror-1.0.69 \
+		thiserror-2.0.18 \
+		thiserror-2.0.4 \
+		thiserror-impl-1.0.50 \
+		thiserror-impl-1.0.69 \
+		thiserror-impl-2.0.18 \
+		thiserror-impl-2.0.4 \
+		thread_local-1.1.4 \
+		thread_local-1.1.9 \
+		tinyjson-2.5.1 \
+		tinystr-0.7.6 \
+		tinystr-0.8.3 \
+		tinyvec-1.6.0 \
+		tinyvec_macros-0.1.1 \
+		tokio-1.51.0 \
+		tokio-macros-2.7.0 \
+		tokio-rustls-0.26.4 \
+		tokio-util-0.7.18 \
+		toml-0.8.20 \
+		toml-0.8.21 \
+		toml-0.8.23 \
+		toml-0.9.12+spec-1.1.0 \
+		toml_datetime-0.6.11 \
+		toml_datetime-0.6.8 \
+		toml_datetime-0.6.9 \
+		toml_datetime-0.7.5+spec-1.1.0 \
+		toml_edit-0.22.24 \
+		toml_edit-0.22.25 \
+		toml_edit-0.22.27 \
+		toml_parser-1.1.2+spec-1.1.0 \
+		toml_write-0.1.0 \
+		toml_write-0.1.2 \
+		toml_writer-1.1.1+spec-1.1.0 \
+		tracing-0.1.41 \
+		tracing-0.1.44 \
+		tracing-attributes-0.1.28 \
+		tracing-attributes-0.1.31 \
+		tracing-core-0.1.33 \
+		tracing-core-0.1.36 \
+		tracing-log-0.2.0 \
+		tracing-subscriber-0.3.19 \
+		tracing-subscriber-0.3.23 \
+		try-lock-0.2.5 \
+		typeid-1.0.2 \
+		typenum-1.16.0 \
+		typenum-1.19.0 \
+		ucd-trie-0.1.6 \
+		uluru-3.0.0 \
+		unic-char-property-0.9.0 \
+		unic-char-range-0.9.0 \
+		unic-common-0.9.0 \
+		unic-segment-0.9.0 \
+		unic-ucd-segment-0.9.0 \
+		unic-ucd-version-0.9.0 \
+		unicase-2.9.0 \
+		unicode-bom-2.0.3 \
+		unicode-ident-1.0.10 \
+		unicode-ident-1.0.16 \
+		unicode-ident-1.0.24 \
+		unicode-linebreak-0.1.5 \
+		unicode-normalization-0.1.22 \
+		unicode-width-0.1.14 \
+		unicode-width-0.2.0 \
+		unicode-width-0.2.2 \
+		unicode-xid-0.2.6 \
+		unsafe-libyaml-0.2.11 \
+		untrusted-0.9.0 \
+		url-2.5.4 \
+		url-2.5.8 \
+		utf16_iter-1.0.5 \
+		utf8_iter-1.0.4 \
+		utf8parse-0.2.1 \
+		utf8parse-0.2.2 \
+		uuid-1.23.0 \
+		valuable-0.1.0 \
+		valuable-0.1.1 \
+		version_check-0.9.4 \
+		version_check-0.9.5 \
+		wac-graph-0.6.1 \
+		wac-parser-0.6.1 \
+		wac-types-0.6.1 \
+		walkdir-2.5.0 \
+		want-0.3.1 \
+		wasi-0.11.1+wasi-snapshot-preview1 \
+		wasi-0.14.2+wasi-0.2.4 \
+		wasi-common-44.0.1 \
+		wasi-preview1-component-adapter-provider-37.0.3 \
+		wasip2-1.0.2+wasi-0.2.9 \
+		wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06 \
+		wasm-bindgen-0.2.117 \
+		wasm-bindgen-macro-0.2.117 \
+		wasm-bindgen-macro-support-0.2.117 \
*** 2689 LINES SKIPPED ***