From 54b2925541504dacfb0b849ea8a124f0753d1a4b Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Tue, 5 May 2026 22:55:48 +0000 Subject: [PATCH 01/19] build: prepare rusty_v8 147.4.0 artifacts Co-authored-by: Codex --- MODULE.bazel | 17 +++- MODULE.bazel.lock | 49 ++++++++---- codex-rs/Cargo.lock | 154 +++++++++++++++++++++---------------- codex-rs/Cargo.toml | 2 +- third_party/v8/BUILD.bazel | 90 +++++++++++++++++++++- third_party/v8/README.md | 4 +- 6 files changed, 223 insertions(+), 93 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index f6750387919c..6aa9925fc7b2 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -407,18 +407,18 @@ crate.annotation( inject_repo(crate, "alsa_lib") -bazel_dep(name = "v8", version = "14.6.202.9") +bazel_dep(name = "v8", version = "14.7.173.20") archive_override( module_name = "v8", - integrity = "sha256-JphDwLAzsd9KvgRZ7eQvNtPU6qGd3XjFt/a/1QITAJU=", + integrity = "sha256-v/x6I4X38a2wckzUIft3Dh0SUdkuOTokwxyF7lzW8Lc=", patch_strip = 3, patches = [ "//patches:v8_module_deps.patch", "//patches:v8_bazel_rules.patch", "//patches:v8_source_portability.patch", ], - strip_prefix = "v8-14.6.202.9", - urls = ["https://github.com/v8/v8/archive/refs/tags/14.6.202.9.tar.gz"], + strip_prefix = "v8-14.7.173.20", + urls = ["https://github.com/v8/v8/archive/refs/tags/14.7.173.20.tar.gz"], ) http_archive( @@ -430,6 +430,15 @@ http_archive( urls = ["https://static.crates.io/crates/v8/v8-146.4.0.crate"], ) +http_archive( + name = "v8_crate_147_4_0", + build_file = "//third_party/v8:v8_crate.BUILD.bazel", + sha256 = "2df8fffd507fb18ed000673a83d937f58e60fb07f3306b2274284125b15137cd", + strip_prefix = "v8-147.4.0", + type = "tar.gz", + urls = ["https://static.crates.io/crates/v8/v8-147.4.0.crate"], +) + http_file( name = "rusty_v8_146_4_0_aarch64_apple_darwin_archive", downloaded_file_path = "librusty_v8_release_aarch64-apple-darwin.a.gz", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 3174ce5ecd37..07dc8934a0bd 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -723,7 +723,7 @@ "cached_0.56.0": "{\"dependencies\":[{\"default_features\":false,\"name\":\"ahash\",\"optional\":true,\"req\":\"^0.8\"},{\"features\":[\"attributes\"],\"kind\":\"dev\",\"name\":\"async-std\",\"req\":\"^1.6\"},{\"name\":\"async-trait\",\"optional\":true,\"req\":\"^0.1\"},{\"name\":\"cached_proc_macro\",\"optional\":true,\"req\":\"^0.25.0\"},{\"name\":\"cached_proc_macro_types\",\"optional\":true,\"req\":\"^0.1.1\"},{\"kind\":\"dev\",\"name\":\"copy_dir\",\"req\":\"^0.1.3\"},{\"name\":\"directories\",\"optional\":true,\"req\":\"^6.0\"},{\"default_features\":false,\"name\":\"futures\",\"optional\":true,\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"googletest\",\"req\":\"^0.11.0\"},{\"default_features\":false,\"features\":[\"inline-more\"],\"name\":\"hashbrown\",\"req\":\"^0.15\"},{\"name\":\"once_cell\",\"req\":\"^1\"},{\"name\":\"r2d2\",\"optional\":true,\"req\":\"^0.8\"},{\"features\":[\"r2d2\"],\"name\":\"redis\",\"optional\":true,\"req\":\"^0.32\"},{\"name\":\"rmp-serde\",\"optional\":true,\"req\":\"^1.1\"},{\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serial_test\",\"req\":\"^3\"},{\"name\":\"sled\",\"optional\":true,\"req\":\"^0.34\"},{\"kind\":\"dev\",\"name\":\"smartstring\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.10.1\"},{\"name\":\"thiserror\",\"req\":\"^2\"},{\"features\":[\"macros\",\"time\",\"sync\",\"parking_lot\"],\"name\":\"tokio\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"web-time\",\"req\":\"^1.1.0\"}],\"features\":{\"ahash\":[\"dep:ahash\",\"hashbrown/default\"],\"async\":[\"futures\",\"tokio\",\"async-trait\"],\"async_tokio_rt_multi_thread\":[\"async\",\"tokio/rt-multi-thread\"],\"default\":[\"proc_macro\",\"ahash\"],\"disk_store\":[\"sled\",\"serde\",\"rmp-serde\",\"directories\"],\"proc_macro\":[\"cached_proc_macro\",\"cached_proc_macro_types\"],\"redis_ahash\":[\"redis_store\",\"redis/ahash\"],\"redis_async_std\":[\"redis_store\",\"async\",\"redis/aio\",\"redis/async-std-comp\",\"redis/tls\",\"redis/async-std-tls-comp\"],\"redis_connection_manager\":[\"redis_store\",\"redis/connection-manager\"],\"redis_store\":[\"redis\",\"r2d2\",\"serde\",\"serde_json\"],\"redis_tokio\":[\"redis_store\",\"async\",\"redis/aio\",\"redis/tokio-comp\",\"redis/tls\",\"redis/tokio-native-tls-comp\"],\"wasm\":[]}}", "cached_proc_macro_0.25.0": "{\"dependencies\":[{\"name\":\"darling\",\"req\":\"^0.20.8\"},{\"name\":\"proc-macro2\",\"req\":\"^1.0.49\"},{\"name\":\"quote\",\"req\":\"^1.0.6\"},{\"name\":\"syn\",\"req\":\"^2.0.52\"}],\"features\":{}}", "cached_proc_macro_types_0.1.1": "{\"dependencies\":[],\"features\":{}}", - "calendrical_calculations_0.2.3": "{\"dependencies\":[{\"default_features\":false,\"name\":\"core_maths\",\"req\":\"^0.1.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.17\"}],\"features\":{\"logging\":[\"dep:log\"]}}", + "calendrical_calculations_0.2.4": "{\"dependencies\":[{\"default_features\":false,\"name\":\"core_maths\",\"req\":\"^0.1.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.17\"}],\"features\":{\"logging\":[\"dep:log\"]}}", "camino_1.2.2": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1\"},{\"name\":\"proptest\",\"optional\":true,\"req\":\"^1.0.0\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.223\"},{\"kind\":\"dev\",\"name\":\"serde_bytes\",\"req\":\"^0.11.8\"},{\"name\":\"serde_core\",\"optional\":true,\"req\":\"^1\"}],\"features\":{\"proptest1\":[\"dep:proptest\"],\"serde1\":[\"dep:serde_core\"]}}", "cargo-platform_0.3.2": "{\"dependencies\":[{\"name\":\"serde\",\"req\":\"^1.0.228\",\"target\":\"cfg(any())\"},{\"name\":\"serde_core\",\"req\":\"^1.0.228\"}],\"features\":{}}", "cargo_metadata_0.23.1": "{\"dependencies\":[{\"features\":[\"serde1\"],\"name\":\"camino\",\"req\":\"^1.1.10\"},{\"name\":\"cargo-platform\",\"req\":\"^0.3.0\"},{\"name\":\"derive_builder\",\"optional\":true,\"req\":\"^0.20\"},{\"features\":[\"serde\"],\"name\":\"semver\",\"req\":\"^1.0.26\"},{\"features\":[\"derive\"],\"name\":\"serde\",\"req\":\"^1.0.219\"},{\"features\":[\"unbounded_depth\"],\"name\":\"serde_json\",\"req\":\"^1.0.142\"},{\"name\":\"thiserror\",\"req\":\"^2.0.12\"}],\"features\":{\"builder\":[\"derive_builder\"],\"default\":[],\"unstable\":[]}}", @@ -849,9 +849,9 @@ "difflib_0.4.0": "{\"dependencies\":[],\"features\":{}}", "diffy_0.4.2": "{\"dependencies\":[{\"name\":\"nu-ansi-term\",\"req\":\"^0.50\"}],\"features\":{}}", "digest_0.10.7": "{\"dependencies\":[{\"name\":\"blobby\",\"optional\":true,\"req\":\"^0.3\"},{\"name\":\"block-buffer\",\"optional\":true,\"req\":\"^0.10\"},{\"name\":\"const-oid\",\"optional\":true,\"req\":\"^0.9\"},{\"name\":\"crypto-common\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"name\":\"subtle\",\"optional\":true,\"req\":\"^2.4\"}],\"features\":{\"alloc\":[],\"core-api\":[\"block-buffer\"],\"default\":[\"core-api\"],\"dev\":[\"blobby\"],\"mac\":[\"subtle\"],\"oid\":[\"const-oid\"],\"rand_core\":[\"crypto-common/rand_core\"],\"std\":[\"alloc\",\"crypto-common/std\"]}}", - "diplomat-runtime_0.14.0": "{\"dependencies\":[{\"name\":\"jni\",\"optional\":true,\"req\":\"^0.21\"},{\"name\":\"log\",\"optional\":true,\"req\":\"^0.4\"}],\"features\":{\"jvm-callback-support\":[\"dep:jni\"],\"log\":[\"dep:log\"]}}", - "diplomat_0.14.0": "{\"dependencies\":[{\"default_features\":false,\"name\":\"diplomat_core\",\"req\":\"^0.14.0\"},{\"kind\":\"dev\",\"name\":\"insta\",\"req\":\"^1.7.1\"},{\"kind\":\"dev\",\"name\":\"prettyplease\",\"req\":\"^0.2.30\"},{\"name\":\"proc-macro2\",\"req\":\"^1.0.27\"},{\"name\":\"quote\",\"req\":\"^1.0\"},{\"features\":[\"full\",\"extra-traits\"],\"name\":\"syn\",\"req\":\"^2.0\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.2.0\"}],\"features\":{}}", - "diplomat_core_0.14.0": "{\"dependencies\":[{\"name\":\"displaydoc\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"either\",\"optional\":true,\"req\":\"^1.9.0\"},{\"features\":[\"yaml\"],\"kind\":\"dev\",\"name\":\"insta\",\"req\":\"^1.7.1\"},{\"name\":\"proc-macro2\",\"req\":\"^1.0.27\"},{\"name\":\"quote\",\"req\":\"^1.0\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"name\":\"serde\",\"req\":\"^1.0\"},{\"name\":\"smallvec\",\"req\":\"^1.9.0\"},{\"features\":[\"ident\"],\"name\":\"strck\",\"req\":\"^1.0\"},{\"features\":[\"full\",\"extra-traits\"],\"name\":\"syn\",\"req\":\"^2\"}],\"features\":{\"hir\":[\"either\"]}}", + "diplomat-runtime_0.15.1": "{\"dependencies\":[{\"name\":\"jni\",\"optional\":true,\"req\":\"^0.22\"},{\"name\":\"log\",\"optional\":true,\"req\":\"^0.4\"}],\"features\":{\"jvm-callback-support\":[\"dep:jni\"],\"log\":[\"dep:log\"]}}", + "diplomat_0.15.0": "{\"dependencies\":[{\"default_features\":false,\"name\":\"diplomat_core\",\"req\":\"^0.15.0\"},{\"kind\":\"dev\",\"name\":\"insta\",\"req\":\"^1.7.1\"},{\"kind\":\"dev\",\"name\":\"prettyplease\",\"req\":\"^0.2.30\"},{\"name\":\"proc-macro2\",\"req\":\"^1.0.27\"},{\"name\":\"quote\",\"req\":\"^1.0\"},{\"features\":[\"full\",\"extra-traits\"],\"name\":\"syn\",\"req\":\"^2.0\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.2.0\"}],\"features\":{}}", + "diplomat_core_0.15.0": "{\"dependencies\":[{\"name\":\"displaydoc\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"either\",\"optional\":true,\"req\":\"^1.9.0\"},{\"features\":[\"yaml\"],\"kind\":\"dev\",\"name\":\"insta\",\"req\":\"^1.7.1\"},{\"name\":\"proc-macro2\",\"req\":\"^1.0.27\"},{\"name\":\"quote\",\"req\":\"^1.0\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"name\":\"serde\",\"req\":\"^1.0\"},{\"name\":\"smallvec\",\"req\":\"^1.9.0\"},{\"features\":[\"ident\"],\"name\":\"strck\",\"req\":\"^1.0\"},{\"features\":[\"full\",\"extra-traits\"],\"name\":\"syn\",\"req\":\"^2\"}],\"features\":{\"hir\":[\"either\"]}}", "dirs-next_2.0.0": "{\"dependencies\":[{\"name\":\"cfg-if\",\"req\":\"^1.0.0\"},{\"name\":\"dirs-sys-next\",\"req\":\"^0.1\"}],\"features\":{}}", "dirs-sys-next_0.1.2": "{\"dependencies\":[{\"name\":\"libc\",\"req\":\"^0.2\",\"target\":\"cfg(unix)\"},{\"default_features\":false,\"name\":\"redox_users\",\"req\":\"^0.4.0\",\"target\":\"cfg(target_os = \\\"redox\\\")\"},{\"features\":[\"knownfolders\",\"objbase\",\"shlobj\",\"winbase\",\"winerror\"],\"name\":\"winapi\",\"req\":\"^0.3\",\"target\":\"cfg(windows)\"}],\"features\":{}}", "dirs-sys_0.5.0": "{\"dependencies\":[{\"name\":\"libc\",\"req\":\"^0.2\",\"target\":\"cfg(unix)\"},{\"name\":\"option-ext\",\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"redox_users\",\"req\":\"^0.5\",\"target\":\"cfg(target_os = \\\"redox\\\")\"},{\"features\":[\"Win32_UI_Shell\",\"Win32_Foundation\",\"Win32_Globalization\",\"Win32_System_Com\"],\"name\":\"windows-sys\",\"req\":\">=0.59.0\",\"target\":\"cfg(windows)\"}],\"features\":{}}", @@ -915,7 +915,7 @@ "find-crate_0.6.3": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"quote\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"semver\",\"req\":\"^0.11\"},{\"name\":\"toml\",\"req\":\"^0.5.2\"}],\"features\":{}}", "find-msvc-tools_0.1.9": "{\"dependencies\":[],\"features\":{}}", "findshlibs_0.10.2": "{\"dependencies\":[{\"kind\":\"build\",\"name\":\"cc\",\"req\":\"^1.0.67\"},{\"name\":\"lazy_static\",\"req\":\"^1.4\",\"target\":\"cfg(any(target_os = \\\"macos\\\", target_os = \\\"ios\\\"))\"},{\"name\":\"libc\",\"req\":\"^0.2.104\"},{\"features\":[\"psapi\",\"memoryapi\",\"libloaderapi\",\"processthreadsapi\"],\"name\":\"winapi\",\"req\":\"^0.3.9\",\"target\":\"cfg(target_os = \\\"windows\\\")\"}],\"features\":{}}", - "fixed_decimal_0.7.1": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"features\":[\"wasm_js\"],\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"rand_distr\",\"req\":\"^0.5\"},{\"kind\":\"dev\",\"name\":\"rand_pcg\",\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"small\"],\"name\":\"ryu\",\"optional\":true,\"req\":\"^1.0.5\"},{\"default_features\":false,\"name\":\"smallvec\",\"req\":\"^1.10.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"writeable\",\"req\":\"^0.6.0\"}],\"features\":{\"experimental\":[],\"ryu\":[\"dep:ryu\"]}}", + "fixed_decimal_0.7.2": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"features\":[\"wasm_js\"],\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"rand_distr\",\"req\":\"^0.5\"},{\"kind\":\"dev\",\"name\":\"rand_pcg\",\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"small\"],\"name\":\"ryu\",\"optional\":true,\"req\":\"^1.0.5\"},{\"default_features\":false,\"features\":[\"const_new\"],\"name\":\"smallvec\",\"req\":\"^1.10.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"writeable\",\"req\":\"^0.6.1\"}],\"features\":{\"ryu\":[\"dep:ryu\"]}}", "fixedbitset_0.4.2": "{\"dependencies\":[{\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"}],\"features\":{\"default\":[\"std\"],\"std\":[]}}", "fixedbitset_0.5.7": "{\"dependencies\":[{\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"}],\"features\":{\"default\":[\"std\"],\"std\":[]}}", "flate2_1.1.8": "{\"dependencies\":[{\"name\":\"cloudflare-zlib-sys\",\"optional\":true,\"req\":\"^0.3.6\"},{\"name\":\"crc32fast\",\"req\":\"^1.2.0\"},{\"name\":\"document-features\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"futures\",\"req\":\"^0.3\"},{\"name\":\"libz-ng-sys\",\"optional\":true,\"req\":\"^1.1.16\"},{\"default_features\":false,\"name\":\"libz-sys\",\"optional\":true,\"req\":\"^1.1.20\"},{\"default_features\":false,\"features\":[\"with-alloc\",\"simd\"],\"name\":\"miniz_oxide\",\"req\":\"^0.8.5\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", not(target_os = \\\"emscripten\\\")))\"},{\"default_features\":false,\"features\":[\"with-alloc\",\"simd\"],\"name\":\"miniz_oxide\",\"optional\":true,\"req\":\"^0.8.5\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"quickcheck\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"std\",\"rust-allocator\"],\"name\":\"zlib-rs\",\"optional\":true,\"req\":\"^0.5.5\"}],\"features\":{\"any_c_zlib\":[\"any_zlib\"],\"any_impl\":[],\"any_zlib\":[\"any_impl\"],\"cloudflare_zlib\":[\"any_c_zlib\",\"cloudflare-zlib-sys\"],\"default\":[\"rust_backend\"],\"miniz-sys\":[\"rust_backend\"],\"rust_backend\":[\"miniz_oxide\",\"any_impl\"],\"zlib\":[\"any_c_zlib\",\"libz-sys\"],\"zlib-default\":[\"any_c_zlib\",\"libz-sys/default\"],\"zlib-ng\":[\"any_c_zlib\",\"libz-ng-sys\"],\"zlib-ng-compat\":[\"zlib\",\"libz-sys/zlib-ng\"],\"zlib-rs\":[\"any_zlib\",\"dep:zlib-rs\"]}}", @@ -1080,19 +1080,28 @@ "i18n-embed_0.15.4": "{\"dependencies\":[{\"name\":\"arc-swap\",\"optional\":true,\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"doc-comment\",\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.11\"},{\"name\":\"fluent\",\"optional\":true,\"req\":\"^0.16\"},{\"name\":\"fluent-langneg\",\"req\":\"^0.13\"},{\"name\":\"fluent-syntax\",\"optional\":true,\"req\":\"^0.11\"},{\"name\":\"gettext\",\"optional\":true,\"req\":\"^0.4\"},{\"name\":\"i18n-embed-impl\",\"optional\":true,\"req\":\"^0.8.4\"},{\"name\":\"intl-memoizer\",\"req\":\"^0.5\"},{\"name\":\"locale_config\",\"optional\":true,\"req\":\"^0.3\"},{\"name\":\"log\",\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"maplit\",\"req\":\"^1.0\"},{\"name\":\"notify\",\"optional\":true,\"req\":\"^8.0.0\"},{\"name\":\"parking_lot\",\"optional\":true,\"req\":\"^0.12\"},{\"kind\":\"dev\",\"name\":\"pretty_assertions\",\"req\":\"^1.4\"},{\"name\":\"rust-embed\",\"optional\":true,\"req\":\"^8.0\"},{\"kind\":\"dev\",\"name\":\"serial_test\",\"req\":\"^3.0\"},{\"name\":\"thiserror\",\"req\":\"^1.0\"},{\"default_features\":false,\"name\":\"tr\",\"optional\":true,\"req\":\"^0.1\"},{\"name\":\"unic-langid\",\"req\":\"^0.9\"},{\"name\":\"walkdir\",\"optional\":true,\"req\":\"^2.4\"},{\"features\":[\"Window\",\"Navigator\"],\"name\":\"web-sys\",\"optional\":true,\"req\":\"^0.3\"}],\"features\":{\"autoreload\":[\"notify\"],\"default\":[\"rust-embed\"],\"desktop-requester\":[\"locale_config\"],\"filesystem-assets\":[\"walkdir\"],\"fluent-system\":[\"fluent\",\"fluent-syntax\",\"parking_lot\",\"i18n-embed-impl\",\"i18n-embed-impl/fluent-system\",\"arc-swap\"],\"gettext-system\":[\"tr\",\"tr/gettext\",\"dep:gettext\",\"parking_lot\",\"i18n-embed-impl\",\"i18n-embed-impl/gettext-system\"],\"web-sys-requester\":[\"web-sys\"]}}", "iana-time-zone-haiku_0.1.2": "{\"dependencies\":[{\"kind\":\"build\",\"name\":\"cc\",\"req\":\"^1.0.79\"}],\"features\":{}}", "iana-time-zone_0.1.65": "{\"dependencies\":[{\"name\":\"android_system_properties\",\"req\":\"^0.1.5\",\"target\":\"cfg(target_os = \\\"android\\\")\"},{\"kind\":\"dev\",\"name\":\"chrono-tz\",\"req\":\"^0.10.1\"},{\"name\":\"core-foundation-sys\",\"req\":\"^0.8.6\",\"target\":\"cfg(target_vendor = \\\"apple\\\")\"},{\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.2.1\"},{\"features\":[\"js\"],\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.2.1\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\"},{\"name\":\"iana-time-zone-haiku\",\"req\":\"^0.1.1\",\"target\":\"cfg(target_os = \\\"haiku\\\")\"},{\"name\":\"js-sys\",\"req\":\"^0.3.66\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\"},{\"name\":\"log\",\"req\":\"^0.4.14\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\"},{\"name\":\"wasm-bindgen\",\"req\":\"^0.2.89\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\"},{\"kind\":\"dev\",\"name\":\"wasm-bindgen-test\",\"req\":\"^0.3.46\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\"},{\"name\":\"windows-core\",\"req\":\">=0.56, <=0.62\",\"target\":\"cfg(target_os = \\\"windows\\\")\"}],\"features\":{\"fallback\":[]}}", - "icu_calendar_2.1.1": "{\"dependencies\":[{\"default_features\":false,\"name\":\"calendrical_calculations\",\"req\":\"^0.2.3\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"name\":\"icu_calendar_data\",\"optional\":true,\"req\":\"~2.1.1\"},{\"default_features\":false,\"name\":\"icu_locale\",\"optional\":true,\"req\":\"~2.1.1\"},{\"default_features\":false,\"name\":\"icu_locale_core\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"name\":\"icu_provider\",\"req\":\"^2.1.1\"},{\"kind\":\"dev\",\"name\":\"itertools\",\"req\":\"^0.14.0\"},{\"default_features\":false,\"name\":\"ixdtf\",\"optional\":true,\"req\":\"^0.6.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"kind\":\"dev\",\"name\":\"simple_logger\",\"req\":\"^5.0.0\"},{\"default_features\":false,\"features\":[\"zerovec\"],\"name\":\"tinystr\",\"req\":\"^0.8.0\"},{\"kind\":\"dev\",\"name\":\"ureq\",\"req\":\"^3.0.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"zerovec\",\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[\"icu_locale_core/alloc\",\"tinystr/alloc\",\"serde?/alloc\"],\"compiled_data\":[\"dep:icu_calendar_data\",\"dep:icu_locale\",\"icu_locale?/compiled_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"zerovec/databake\",\"tinystr/databake\",\"alloc\",\"icu_provider/export\"],\"default\":[\"compiled_data\",\"ixdtf\"],\"ixdtf\":[\"dep:ixdtf\"],\"logging\":[\"calendrical_calculations/logging\"],\"serde\":[\"dep:serde\",\"zerovec/serde\",\"tinystr/serde\",\"icu_provider/serde\"],\"unstable\":[]}}", - "icu_calendar_data_2.1.1": "{\"dependencies\":[],\"features\":{}}", + "icu_calendar_2.2.1": "{\"dependencies\":[{\"default_features\":false,\"name\":\"calendrical_calculations\",\"req\":\"^0.2.4\"},{\"default_features\":false,\"name\":\"chrono\",\"optional\":true,\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"name\":\"icu_calendar_data\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_locale\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_locale_core\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"name\":\"icu_provider\",\"req\":\"^2.2.0\"},{\"kind\":\"dev\",\"name\":\"insta\",\"req\":\"^1.38.0\"},{\"kind\":\"dev\",\"name\":\"itertools\",\"req\":\"^0.14.0\"},{\"default_features\":false,\"name\":\"ixdtf\",\"optional\":true,\"req\":\"^0.6.5\"},{\"default_features\":false,\"name\":\"jiff\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"kind\":\"dev\",\"name\":\"simple_logger\",\"req\":\"^5.0.0\"},{\"default_features\":false,\"name\":\"time\",\"optional\":true,\"req\":\"^0.3\"},{\"default_features\":false,\"features\":[\"large-dates\"],\"kind\":\"dev\",\"name\":\"time\",\"req\":\"^0.3\"},{\"default_features\":false,\"features\":[\"zerovec\"],\"name\":\"tinystr\",\"req\":\"^0.8.3\"},{\"kind\":\"dev\",\"name\":\"ureq\",\"req\":\"^3.0.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"zerovec\",\"req\":\"^0.11.6\"}],\"features\":{\"alloc\":[\"icu_locale_core/alloc\",\"tinystr/alloc\",\"serde?/alloc\"],\"compiled_data\":[\"dep:icu_calendar_data\",\"dep:icu_locale\",\"icu_locale?/compiled_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"zerovec/databake\",\"tinystr/databake\",\"alloc\",\"icu_provider/export\"],\"default\":[\"compiled_data\",\"ixdtf\"],\"ixdtf\":[\"dep:ixdtf\"],\"logging\":[\"calendrical_calculations/logging\"],\"serde\":[\"dep:serde\",\"zerovec/serde\",\"tinystr/serde\",\"icu_provider/serde\"],\"unstable\":[],\"unstable_chrono_0_4\":[\"dep:chrono\"],\"unstable_jiff_0_2\":[\"dep:jiff\"],\"unstable_time_0_3\":[\"dep:time\"]}}", + "icu_calendar_data_2.2.0": "{\"dependencies\":[],\"features\":{}}", "icu_collections_2.1.1": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"kind\":\"dev\",\"name\":\"iai\",\"req\":\"^0.1.1\"},{\"default_features\":false,\"features\":[\"alloc\"],\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"default_features\":false,\"features\":[\"zerovec\"],\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"features\":[\"parse\"],\"kind\":\"dev\",\"name\":\"toml\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"yoke\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"zerofrom\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"features\":[\"derive\",\"yoke\"],\"name\":\"zerovec\",\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[\"serde?/alloc\",\"zerovec/alloc\"],\"databake\":[\"dep:databake\",\"zerovec/databake\"],\"serde\":[\"dep:serde\",\"zerovec/serde\",\"potential_utf/serde\",\"alloc\"]}}", - "icu_decimal_2.1.1": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"fixed_decimal\",\"req\":\"^0.7.0\"},{\"features\":[\"wasm_js\"],\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"icu_decimal_data\",\"optional\":true,\"req\":\"~2.1.1\"},{\"default_features\":false,\"name\":\"icu_locale\",\"optional\":true,\"req\":\"~2.1.1\"},{\"default_features\":false,\"name\":\"icu_locale_core\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"name\":\"icu_provider\",\"req\":\"^2.1.1\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"rand_distr\",\"req\":\"^0.5\"},{\"kind\":\"dev\",\"name\":\"rand_pcg\",\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"writeable\",\"req\":\"^0.6.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"zerovec\",\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[\"serde?/alloc\",\"zerovec/alloc\"],\"compiled_data\":[\"dep:icu_decimal_data\",\"dep:icu_locale\",\"icu_locale?/compiled_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"zerovec/databake\",\"icu_provider/export\",\"alloc\"],\"default\":[\"compiled_data\"],\"ryu\":[\"fixed_decimal/ryu\"],\"serde\":[\"dep:serde\",\"icu_provider/serde\",\"zerovec/serde\"]}}", - "icu_decimal_data_2.1.1": "{\"dependencies\":[],\"features\":{}}", - "icu_locale_2.1.1": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"icu_collections\",\"req\":\"~2.1.1\"},{\"default_features\":false,\"features\":[\"alloc\",\"zerovec\"],\"name\":\"icu_locale_core\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"name\":\"icu_locale_data\",\"optional\":true,\"req\":\"~2.1.1\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"icu_provider\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"features\":[\"alloc\",\"zerovec\"],\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"features\":[\"alloc\",\"zerovec\"],\"name\":\"tinystr\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"features\":[\"alloc\",\"yoke\"],\"name\":\"zerovec\",\"req\":\"^0.11.3\"}],\"features\":{\"compiled_data\":[\"dep:icu_locale_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"zerovec/databake\",\"icu_locale_core/databake\",\"tinystr/databake\",\"icu_collections/databake\",\"icu_provider/export\"],\"default\":[\"compiled_data\"],\"serde\":[\"dep:serde\",\"icu_locale_core/serde\",\"tinystr/serde\",\"zerovec/serde\",\"icu_provider/serde\",\"potential_utf/serde\",\"icu_collections/serde\"]}}", + "icu_collections_2.2.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"kind\":\"dev\",\"name\":\"iai\",\"req\":\"^0.1.1\"},{\"default_features\":false,\"features\":[\"alloc\"],\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"default_features\":false,\"features\":[\"zerovec\"],\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"features\":[\"parse\"],\"kind\":\"dev\",\"name\":\"toml\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"name\":\"utf8_iter\",\"req\":\"^1.0.2\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"yoke\",\"req\":\"^0.8.2\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"zerofrom\",\"req\":\"^0.1.6\"},{\"default_features\":false,\"features\":[\"derive\",\"yoke\"],\"name\":\"zerovec\",\"req\":\"^0.11.6\"}],\"features\":{\"alloc\":[\"serde?/alloc\",\"zerovec/alloc\"],\"databake\":[\"dep:databake\",\"zerovec/databake\"],\"serde\":[\"dep:serde\",\"zerovec/serde\",\"potential_utf/serde\",\"alloc\"]}}", + "icu_decimal_2.2.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"name\":\"fixed_decimal\",\"req\":\"^0.7.2\"},{\"features\":[\"wasm_js\"],\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"icu_decimal_data\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_locale\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_locale_core\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"features\":[\"zerovec\"],\"name\":\"icu_pattern\",\"optional\":true,\"req\":\"^0.4.2\"},{\"default_features\":false,\"name\":\"icu_plurals\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_provider\",\"req\":\"^2.2.0\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"rand_distr\",\"req\":\"^0.5\"},{\"kind\":\"dev\",\"name\":\"rand_pcg\",\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"writeable\",\"req\":\"^0.6.1\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"zerovec\",\"req\":\"^0.11.6\"}],\"features\":{\"alloc\":[\"serde?/alloc\",\"zerovec/alloc\"],\"compiled_data\":[\"dep:icu_decimal_data\",\"dep:icu_locale\",\"icu_locale?/compiled_data\",\"icu_provider/baked\",\"icu_plurals?/compiled_data\"],\"datagen\":[\"serde\",\"dep:databake\",\"zerovec/databake\",\"icu_provider/export\",\"alloc\",\"icu_plurals?/datagen\"],\"default\":[\"compiled_data\"],\"ryu\":[\"fixed_decimal/ryu\"],\"serde\":[\"alloc\",\"dep:serde\",\"icu_provider/serde\",\"zerovec/serde\",\"icu_pattern?/serde\",\"icu_plurals?/serde\"],\"unstable\":[\"dep:icu_pattern\",\"dep:icu_plurals\"]}}", + "icu_decimal_data_2.2.0": "{\"dependencies\":[],\"features\":{}}", + "icu_locale_2.2.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"icu_collections\",\"req\":\"~2.2.0\"},{\"default_features\":false,\"features\":[\"alloc\",\"zerovec\"],\"name\":\"icu_locale_core\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"name\":\"icu_locale_data\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"icu_provider\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"features\":[\"alloc\",\"zerovec\"],\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"features\":[\"alloc\",\"zerovec\"],\"name\":\"tinystr\",\"req\":\"^0.8.3\"},{\"default_features\":false,\"features\":[\"alloc\",\"yoke\"],\"name\":\"zerovec\",\"req\":\"^0.11.6\"}],\"features\":{\"compiled_data\":[\"dep:icu_locale_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"zerovec/databake\",\"icu_locale_core/databake\",\"tinystr/databake\",\"icu_collections/databake\",\"icu_provider/export\"],\"default\":[\"compiled_data\"],\"serde\":[\"dep:serde\",\"icu_locale_core/serde\",\"tinystr/serde\",\"zerovec/serde\",\"icu_provider/serde\",\"potential_utf/serde\",\"icu_collections/serde\"]}}", "icu_locale_core_2.1.1": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"name\":\"litemap\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"tinystr\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"name\":\"writeable\",\"req\":\"^0.6.0\"},{\"default_features\":false,\"name\":\"zerovec\",\"optional\":true,\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[\"litemap/alloc\",\"tinystr/alloc\",\"writeable/alloc\",\"serde?/alloc\"],\"databake\":[\"dep:databake\",\"alloc\"],\"serde\":[\"dep:serde\",\"tinystr/serde\"],\"zerovec\":[\"dep:zerovec\",\"tinystr/zerovec\"]}}", - "icu_locale_data_2.1.2": "{\"dependencies\":[],\"features\":{}}", + "icu_locale_core_2.2.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"kind\":\"dev\",\"name\":\"iai\",\"req\":\"^0.1.1\"},{\"default_features\":false,\"name\":\"litemap\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"features\":[\"testing\"],\"kind\":\"dev\",\"name\":\"litemap\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"features\":[\"use-std\"],\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"name\":\"tinystr\",\"req\":\"^0.8.3\"},{\"default_features\":false,\"name\":\"writeable\",\"req\":\"^0.6.1\"},{\"default_features\":false,\"name\":\"zerovec\",\"optional\":true,\"req\":\"^0.11.6\"}],\"features\":{\"alloc\":[\"litemap/alloc\",\"tinystr/alloc\",\"writeable/alloc\",\"serde?/alloc\"],\"databake\":[\"dep:databake\",\"alloc\"],\"serde\":[\"dep:serde\",\"tinystr/serde\"],\"zerovec\":[\"dep:zerovec\",\"tinystr/zerovec\"]}}", + "icu_locale_data_2.2.0": "{\"dependencies\":[],\"features\":{}}", "icu_normalizer_2.1.1": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"arraystring\",\"req\":\"^0.3.0\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"arrayvec\",\"req\":\"^0.7.2\"},{\"kind\":\"dev\",\"name\":\"atoi\",\"req\":\"^2.0.0\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"kind\":\"dev\",\"name\":\"detone\",\"req\":\"^1.0.0\"},{\"default_features\":false,\"name\":\"icu_collections\",\"req\":\"~2.1.1\"},{\"default_features\":false,\"name\":\"icu_normalizer_data\",\"optional\":true,\"req\":\"~2.1.1\"},{\"default_features\":false,\"name\":\"icu_properties\",\"optional\":true,\"req\":\"~2.1.1\"},{\"default_features\":false,\"name\":\"icu_provider\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"smallvec\",\"req\":\"^1.10.0\"},{\"default_features\":false,\"name\":\"utf16_iter\",\"optional\":true,\"req\":\"^1.0.2\"},{\"default_features\":false,\"name\":\"utf8_iter\",\"optional\":true,\"req\":\"^1.0.2\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"write16\",\"optional\":true,\"req\":\"^1.0.0\"},{\"default_features\":false,\"features\":[\"arrayvec\",\"smallvec\"],\"kind\":\"dev\",\"name\":\"write16\",\"req\":\"^1.0.0\"},{\"default_features\":false,\"name\":\"zerovec\",\"req\":\"^0.11.3\"}],\"features\":{\"compiled_data\":[\"dep:icu_normalizer_data\",\"icu_properties?/compiled_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"icu_properties\",\"icu_collections/databake\",\"zerovec/databake\",\"icu_properties?/datagen\",\"icu_provider/export\"],\"default\":[\"compiled_data\",\"utf8_iter\",\"utf16_iter\"],\"experimental\":[],\"icu_properties\":[\"dep:icu_properties\"],\"serde\":[\"dep:serde\",\"icu_collections/serde\",\"zerovec/serde\",\"icu_properties?/serde\",\"icu_provider/serde\"],\"utf16_iter\":[\"dep:utf16_iter\",\"dep:write16\"],\"utf8_iter\":[\"dep:utf8_iter\"],\"write16\":[]}}", + "icu_normalizer_2.2.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"arraystring\",\"req\":\"^0.3.0\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"arrayvec\",\"req\":\"^0.7.2\"},{\"kind\":\"dev\",\"name\":\"atoi\",\"req\":\"^2.0.0\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"kind\":\"dev\",\"name\":\"detone\",\"req\":\"^1.0.0\"},{\"default_features\":false,\"name\":\"harfbuzz-traits\",\"optional\":true,\"req\":\"^0.6.0\"},{\"default_features\":false,\"name\":\"icu_collections\",\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_normalizer_data\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_properties\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_provider\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"smallvec\",\"req\":\"^1.10.0\"},{\"default_features\":false,\"name\":\"utf16_iter\",\"optional\":true,\"req\":\"^1.0.2\"},{\"default_features\":false,\"name\":\"utf8_iter\",\"optional\":true,\"req\":\"^1.0.2\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"write16\",\"optional\":true,\"req\":\"^1.0.0\"},{\"default_features\":false,\"features\":[\"arrayvec\",\"smallvec\"],\"kind\":\"dev\",\"name\":\"write16\",\"req\":\"^1.0.0\"},{\"default_features\":false,\"name\":\"zerovec\",\"req\":\"^0.11.6\"}],\"features\":{\"compiled_data\":[\"dep:icu_normalizer_data\",\"icu_properties?/compiled_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"icu_properties\",\"icu_collections/databake\",\"zerovec/databake\",\"icu_properties?/datagen\",\"icu_provider/export\"],\"default\":[\"compiled_data\",\"utf8_iter\",\"utf16_iter\"],\"harfbuzz_traits\":[\"dep:harfbuzz-traits\"],\"icu_properties\":[\"dep:icu_properties\"],\"serde\":[\"dep:serde\",\"icu_collections/serde\",\"zerovec/serde\",\"icu_properties?/serde\",\"icu_provider/serde\"],\"utf16_iter\":[\"dep:utf16_iter\",\"dep:write16\"],\"utf8_iter\":[\"dep:utf8_iter\"],\"write16\":[]}}", "icu_normalizer_data_2.1.1": "{\"dependencies\":[],\"features\":{}}", + "icu_normalizer_data_2.2.0": "{\"dependencies\":[],\"features\":{}}", + "icu_plurals_2.2.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"optional\":true,\"req\":\"^0.2.3\"},{\"default_features\":false,\"name\":\"fixed_decimal\",\"req\":\"^0.7.2\"},{\"default_features\":false,\"name\":\"icu_locale\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_plurals_data\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"icu_provider\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"default_features\":false,\"features\":[\"derive\",\"alloc\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"features\":[\"alloc\",\"yoke\"],\"name\":\"zerovec\",\"req\":\"^0.11.6\"}],\"features\":{\"compiled_data\":[\"dep:icu_plurals_data\",\"dep:icu_locale\",\"icu_locale?/compiled_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"zerovec/databake\",\"dep:databake\",\"icu_provider/export\"],\"default\":[\"compiled_data\"],\"icu_normalizer_data\":[],\"serde\":[\"dep:serde\",\"zerovec/serde\",\"icu_provider/serde\",\"dep:displaydoc\"],\"unstable\":[]}}", + "icu_plurals_data_2.2.0": "{\"dependencies\":[],\"features\":{}}", "icu_properties_2.1.2": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"icu_collections\",\"req\":\"~2.1.1\"},{\"default_features\":false,\"features\":[\"zerovec\"],\"name\":\"icu_locale_core\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"name\":\"icu_properties_data\",\"optional\":true,\"req\":\"~2.1.2\"},{\"default_features\":false,\"name\":\"icu_provider\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"unicode-bidi\",\"optional\":true,\"req\":\"^0.3.11\"},{\"default_features\":false,\"features\":[\"yoke\",\"zerofrom\"],\"name\":\"zerotrie\",\"req\":\"^0.2.0\"},{\"default_features\":false,\"features\":[\"derive\",\"yoke\"],\"name\":\"zerovec\",\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[\"zerovec/alloc\",\"icu_collections/alloc\",\"serde?/alloc\"],\"compiled_data\":[\"dep:icu_properties_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"zerovec/databake\",\"icu_collections/databake\",\"icu_locale_core/databake\",\"zerotrie/databake\",\"icu_provider/export\"],\"default\":[\"compiled_data\"],\"serde\":[\"dep:serde\",\"icu_locale_core/serde\",\"zerovec/serde\",\"icu_collections/serde\",\"icu_provider/serde\",\"zerotrie/serde\"],\"unicode_bidi\":[\"dep:unicode-bidi\"]}}", + "icu_properties_2.2.0": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"harfbuzz-traits\",\"optional\":true,\"req\":\"^0.6.0\"},{\"default_features\":false,\"name\":\"icu_collections\",\"req\":\"~2.2.0\"},{\"default_features\":false,\"features\":[\"zerovec\"],\"name\":\"icu_locale_core\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"name\":\"icu_properties_data\",\"optional\":true,\"req\":\"~2.2.0\"},{\"default_features\":false,\"name\":\"icu_provider\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"unicode-bidi\",\"optional\":true,\"req\":\"^0.3.11\"},{\"default_features\":false,\"features\":[\"yoke\",\"zerofrom\"],\"name\":\"zerotrie\",\"req\":\"^0.2.4\"},{\"default_features\":false,\"features\":[\"derive\",\"yoke\"],\"name\":\"zerovec\",\"req\":\"^0.11.6\"}],\"features\":{\"alloc\":[\"zerovec/alloc\",\"icu_collections/alloc\",\"serde?/alloc\"],\"compiled_data\":[\"dep:icu_properties_data\",\"icu_provider/baked\"],\"datagen\":[\"serde\",\"dep:databake\",\"zerovec/databake\",\"icu_collections/databake\",\"icu_locale_core/databake\",\"zerotrie/databake\",\"icu_provider/export\"],\"default\":[\"compiled_data\"],\"harfbuzz_traits\":[\"dep:harfbuzz-traits\"],\"serde\":[\"dep:serde\",\"icu_locale_core/serde\",\"zerovec/serde\",\"icu_collections/serde\",\"icu_provider/serde\",\"zerotrie/serde\"],\"unicode_bidi\":[\"dep:unicode-bidi\"]}}", "icu_properties_data_2.1.2": "{\"dependencies\":[],\"features\":{}}", + "icu_properties_data_2.2.0": "{\"dependencies\":[],\"features\":{}}", "icu_provider_2.1.1": "{\"dependencies\":[{\"name\":\"bincode\",\"optional\":true,\"req\":\"^1.3.1\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"name\":\"erased-serde\",\"optional\":true,\"req\":\"^0.4.0\"},{\"default_features\":false,\"name\":\"icu_locale_core\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.17\"},{\"default_features\":false,\"name\":\"postcard\",\"optional\":true,\"req\":\"^1.0.3\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0.45\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"name\":\"stable_deref_trait\",\"optional\":true,\"req\":\"^1.2.0\"},{\"default_features\":false,\"name\":\"writeable\",\"optional\":true,\"req\":\"^0.6.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"yoke\",\"req\":\"^0.8.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"zerofrom\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"name\":\"zerotrie\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"zerovec\",\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[\"icu_locale_core/alloc\",\"serde?/alloc\",\"yoke/alloc\",\"zerofrom/alloc\",\"zerovec/alloc\",\"zerotrie?/alloc\",\"dep:stable_deref_trait\",\"dep:writeable\"],\"baked\":[\"dep:zerotrie\",\"dep:writeable\"],\"deserialize_bincode_1\":[\"serde\",\"dep:bincode\",\"std\"],\"deserialize_json\":[\"serde\",\"dep:serde_json\"],\"deserialize_postcard_1\":[\"serde\",\"dep:postcard\"],\"export\":[\"serde\",\"dep:erased-serde\",\"dep:databake\",\"std\",\"sync\",\"dep:postcard\",\"zerovec/databake\"],\"logging\":[\"dep:log\"],\"serde\":[\"dep:serde\",\"yoke/serde\"],\"std\":[\"alloc\"],\"sync\":[],\"zerotrie\":[]}}", + "icu_provider_2.2.0": "{\"dependencies\":[{\"name\":\"bincode\",\"optional\":true,\"req\":\"^1.3.1\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"name\":\"erased-serde\",\"optional\":true,\"req\":\"^0.4.0\"},{\"default_features\":false,\"name\":\"icu_locale_core\",\"req\":\"^2.2.0\"},{\"default_features\":false,\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.17\"},{\"default_features\":false,\"name\":\"postcard\",\"optional\":true,\"req\":\"^1.0.3\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0.45\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"name\":\"stable_deref_trait\",\"optional\":true,\"req\":\"^1.2.0\"},{\"default_features\":false,\"name\":\"writeable\",\"optional\":true,\"req\":\"^0.6.1\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"yoke\",\"req\":\"^0.8.2\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"zerofrom\",\"req\":\"^0.1.6\"},{\"default_features\":false,\"name\":\"zerotrie\",\"optional\":true,\"req\":\"^0.2.4\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"zerovec\",\"req\":\"^0.11.6\"}],\"features\":{\"alloc\":[\"icu_locale_core/alloc\",\"serde?/alloc\",\"yoke/alloc\",\"zerofrom/alloc\",\"zerovec/alloc\",\"zerotrie?/alloc\",\"dep:stable_deref_trait\",\"dep:writeable\"],\"baked\":[\"dep:zerotrie\",\"dep:writeable\"],\"deserialize_bincode_1\":[\"serde\",\"dep:bincode\",\"std\"],\"deserialize_json\":[\"serde\",\"dep:serde_json\"],\"deserialize_postcard_1\":[\"serde\",\"dep:postcard\"],\"export\":[\"serde\",\"dep:erased-serde\",\"dep:databake\",\"std\",\"sync\",\"dep:postcard\",\"zerovec/databake\"],\"logging\":[\"dep:log\"],\"serde\":[\"dep:serde\",\"yoke/serde\"],\"std\":[\"alloc\"],\"sync\":[],\"zerotrie\":[]}}", "id-arena_2.3.0": "{\"dependencies\":[{\"name\":\"rayon\",\"optional\":true,\"req\":\"^1.0.3\"}],\"features\":{\"default\":[\"std\"],\"std\":[]}}", "ident_case_1.0.1": "{\"dependencies\":[],\"features\":{}}", "idna_1.1.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"assert_matches\",\"req\":\"^1.3\"},{\"kind\":\"dev\",\"name\":\"bencher\",\"req\":\"^0.1\"},{\"name\":\"idna_adapter\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"features\":[\"const_generics\"],\"name\":\"smallvec\",\"req\":\"^1.13.1\"},{\"kind\":\"dev\",\"name\":\"tester\",\"req\":\"^0.9\"},{\"name\":\"utf8_iter\",\"req\":\"^1.0.4\"}],\"features\":{\"alloc\":[],\"compiled_data\":[\"idna_adapter/compiled_data\"],\"default\":[\"std\",\"compiled_data\"],\"std\":[\"alloc\"]}}", @@ -1414,7 +1423,7 @@ "regex-syntax_0.8.8": "{\"dependencies\":[{\"features\":[\"derive\"],\"name\":\"arbitrary\",\"optional\":true,\"req\":\"^1.3.0\"}],\"features\":{\"arbitrary\":[\"dep:arbitrary\"],\"default\":[\"std\",\"unicode\"],\"std\":[],\"unicode\":[\"unicode-age\",\"unicode-bool\",\"unicode-case\",\"unicode-gencat\",\"unicode-perl\",\"unicode-script\",\"unicode-segment\"],\"unicode-age\":[],\"unicode-bool\":[],\"unicode-case\":[],\"unicode-gencat\":[],\"unicode-perl\":[],\"unicode-script\":[],\"unicode-segment\":[]}}", "regex_1.12.3": "{\"dependencies\":[{\"default_features\":false,\"name\":\"aho-corasick\",\"optional\":true,\"req\":\"^1.0.0\"},{\"kind\":\"dev\",\"name\":\"anyhow\",\"req\":\"^1.0.69\"},{\"kind\":\"dev\",\"name\":\"doc-comment\",\"req\":\"^0.3\"},{\"default_features\":false,\"features\":[\"atty\",\"humantime\",\"termcolor\"],\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.9.3\"},{\"default_features\":false,\"name\":\"memchr\",\"optional\":true,\"req\":\"^2.6.0\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"quickcheck\",\"req\":\"^1.0.3\"},{\"default_features\":false,\"features\":[\"alloc\",\"syntax\",\"meta\",\"nfa-pikevm\"],\"name\":\"regex-automata\",\"req\":\"^0.4.12\"},{\"default_features\":false,\"name\":\"regex-syntax\",\"req\":\"^0.8.5\"},{\"kind\":\"dev\",\"name\":\"regex-test\",\"req\":\"^0.1.0\"}],\"features\":{\"default\":[\"std\",\"perf\",\"unicode\",\"regex-syntax/default\"],\"logging\":[\"aho-corasick?/logging\",\"memchr?/logging\",\"regex-automata/logging\"],\"pattern\":[],\"perf\":[\"perf-cache\",\"perf-dfa\",\"perf-onepass\",\"perf-backtrack\",\"perf-inline\",\"perf-literal\"],\"perf-backtrack\":[\"regex-automata/nfa-backtrack\"],\"perf-cache\":[],\"perf-dfa\":[\"regex-automata/hybrid\"],\"perf-dfa-full\":[\"regex-automata/dfa-build\",\"regex-automata/dfa-search\"],\"perf-inline\":[\"regex-automata/perf-inline\"],\"perf-literal\":[\"dep:aho-corasick\",\"dep:memchr\",\"regex-automata/perf-literal\"],\"perf-onepass\":[\"regex-automata/dfa-onepass\"],\"std\":[\"aho-corasick?/std\",\"memchr?/std\",\"regex-automata/std\",\"regex-syntax/std\"],\"unicode\":[\"unicode-age\",\"unicode-bool\",\"unicode-case\",\"unicode-gencat\",\"unicode-perl\",\"unicode-script\",\"unicode-segment\",\"regex-automata/unicode\",\"regex-syntax/unicode\"],\"unicode-age\":[\"regex-automata/unicode-age\",\"regex-syntax/unicode-age\"],\"unicode-bool\":[\"regex-automata/unicode-bool\",\"regex-syntax/unicode-bool\"],\"unicode-case\":[\"regex-automata/unicode-case\",\"regex-syntax/unicode-case\"],\"unicode-gencat\":[\"regex-automata/unicode-gencat\",\"regex-syntax/unicode-gencat\"],\"unicode-perl\":[\"regex-automata/unicode-perl\",\"regex-automata/unicode-word-boundary\",\"regex-syntax/unicode-perl\"],\"unicode-script\":[\"regex-automata/unicode-script\",\"regex-syntax/unicode-script\"],\"unicode-segment\":[\"regex-automata/unicode-segment\",\"regex-syntax/unicode-segment\"],\"unstable\":[\"pattern\"],\"use_std\":[\"std\"]}}", "reqwest_0.12.28": "{\"dependencies\":[{\"name\":\"base64\",\"req\":\"^0.22\"},{\"kind\":\"dev\",\"name\":\"brotli_crate\",\"package\":\"brotli\",\"req\":\"^8\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"bytes\",\"req\":\"^1.2\"},{\"name\":\"cookie_crate\",\"optional\":true,\"package\":\"cookie\",\"req\":\"^0.18.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"cookie_store\",\"optional\":true,\"req\":\"^0.22.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"doc-comment\",\"req\":\"^0.3\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"encoding_rs\",\"optional\":true,\"req\":\"^0.8\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.10\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"flate2\",\"req\":\"^1.0.13\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"futures-channel\",\"optional\":true,\"req\":\"^0.3\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"name\":\"futures-core\",\"req\":\"^0.3.28\"},{\"default_features\":false,\"name\":\"futures-util\",\"optional\":true,\"req\":\"^0.3.28\"},{\"default_features\":false,\"features\":[\"std\",\"alloc\"],\"kind\":\"dev\",\"name\":\"futures-util\",\"req\":\"^0.3.28\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"h2\",\"optional\":true,\"req\":\"^0.4\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"h3\",\"optional\":true,\"req\":\"^0.0.8\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"h3-quinn\",\"optional\":true,\"req\":\"^0.0.10\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"tokio\"],\"name\":\"hickory-resolver\",\"optional\":true,\"req\":\"^0.25\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"http\",\"req\":\"^1.1\"},{\"name\":\"http-body\",\"req\":\"^1\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"http-body-util\",\"req\":\"^0.1.2\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"http1\",\"client\"],\"name\":\"hyper\",\"req\":\"^1.1\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"http1\",\"http2\",\"client\",\"server\"],\"kind\":\"dev\",\"name\":\"hyper\",\"req\":\"^1.1.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"http1\",\"tls12\"],\"name\":\"hyper-rustls\",\"optional\":true,\"req\":\"^0.27.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"hyper-tls\",\"optional\":true,\"req\":\"^0.6\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"http1\",\"client\",\"client-legacy\",\"client-proxy\",\"tokio\"],\"name\":\"hyper-util\",\"req\":\"^0.1.12\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"http1\",\"http2\",\"client\",\"client-legacy\",\"server-auto\",\"server-graceful\",\"tokio\"],\"kind\":\"dev\",\"name\":\"hyper-util\",\"req\":\"^0.1.12\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"js-sys\",\"req\":\"^0.3.77\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"kind\":\"dev\",\"name\":\"libc\",\"req\":\"^0\"},{\"name\":\"log\",\"req\":\"^0.4.17\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"mime\",\"optional\":true,\"req\":\"^0.3.16\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"name\":\"mime_guess\",\"optional\":true,\"req\":\"^2.0\"},{\"name\":\"native-tls-crate\",\"optional\":true,\"package\":\"native-tls\",\"req\":\"^0.2.10\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"num_cpus\",\"req\":\"^1.0\"},{\"name\":\"once_cell\",\"optional\":true,\"req\":\"^1.18\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"percent-encoding\",\"req\":\"^2.3\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"pin-project-lite\",\"req\":\"^0.2.11\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"rustls\",\"runtime-tokio\"],\"name\":\"quinn\",\"optional\":true,\"req\":\"^0.11.1\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"std\",\"tls12\"],\"name\":\"rustls\",\"optional\":true,\"req\":\"^0.23.4\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"rustls-native-certs\",\"optional\":true,\"req\":\"^0.8.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"std\"],\"name\":\"rustls-pki-types\",\"optional\":true,\"req\":\"^1.9.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"serde\",\"req\":\"^1.0\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"serde_json\",\"req\":\"^1.0\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0\"},{\"name\":\"serde_urlencoded\",\"req\":\"^0.7.1\"},{\"features\":[\"futures\"],\"name\":\"sync_wrapper\",\"req\":\"^1.0\"},{\"default_features\":false,\"features\":[\"net\",\"time\"],\"name\":\"tokio\",\"req\":\"^1.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"macros\",\"rt-multi-thread\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"tokio-native-tls\",\"optional\":true,\"req\":\"^0.3.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"tls12\"],\"name\":\"tokio-rustls\",\"optional\":true,\"req\":\"^0.26\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"io\"],\"name\":\"tokio-util\",\"optional\":true,\"req\":\"^0.7.9\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"retry\",\"timeout\",\"util\"],\"name\":\"tower\",\"req\":\"^0.5.2\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"limit\"],\"kind\":\"dev\",\"name\":\"tower\",\"req\":\"^0.5.2\"},{\"default_features\":false,\"features\":[\"follow-redirect\"],\"name\":\"tower-http\",\"req\":\"^0.6.8\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"tower-service\",\"req\":\"^0.3\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"url\",\"req\":\"^2.4\"},{\"name\":\"wasm-bindgen\",\"req\":\"^0.2.89\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"features\":[\"serde-serialize\"],\"kind\":\"dev\",\"name\":\"wasm-bindgen\",\"req\":\"^0.2.89\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"wasm-bindgen-futures\",\"req\":\"^0.4.18\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"kind\":\"dev\",\"name\":\"wasm-bindgen-test\",\"req\":\"^0.3\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"wasm-streams\",\"optional\":true,\"req\":\"^0.4\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"features\":[\"AbortController\",\"AbortSignal\",\"Headers\",\"Request\",\"RequestInit\",\"RequestMode\",\"Response\",\"Window\",\"FormData\",\"Blob\",\"BlobPropertyBag\",\"ServiceWorkerGlobalScope\",\"RequestCredentials\",\"File\",\"ReadableStream\",\"RequestCache\"],\"name\":\"web-sys\",\"req\":\"^0.3.28\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"webpki-roots\",\"optional\":true,\"req\":\"^1\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"zstd_crate\",\"package\":\"zstd\",\"req\":\"^0.13\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"}],\"features\":{\"__rustls\":[\"dep:hyper-rustls\",\"dep:tokio-rustls\",\"dep:rustls\",\"__tls\"],\"__rustls-ring\":[\"hyper-rustls?/ring\",\"tokio-rustls?/ring\",\"rustls?/ring\",\"quinn?/ring\"],\"__tls\":[\"dep:rustls-pki-types\",\"tokio/io-util\"],\"blocking\":[\"dep:futures-channel\",\"futures-channel?/sink\",\"dep:futures-util\",\"futures-util?/io\",\"futures-util?/sink\",\"tokio/sync\"],\"brotli\":[\"tower-http/decompression-br\"],\"charset\":[\"dep:encoding_rs\",\"dep:mime\"],\"cookies\":[\"dep:cookie_crate\",\"dep:cookie_store\"],\"default\":[\"default-tls\",\"charset\",\"http2\",\"system-proxy\"],\"default-tls\":[\"dep:hyper-tls\",\"dep:native-tls-crate\",\"__tls\",\"dep:tokio-native-tls\"],\"deflate\":[\"tower-http/decompression-deflate\"],\"gzip\":[\"tower-http/decompression-gzip\"],\"hickory-dns\":[\"dep:hickory-resolver\",\"dep:once_cell\"],\"http2\":[\"h2\",\"hyper/http2\",\"hyper-util/http2\",\"hyper-rustls?/http2\"],\"http3\":[\"rustls-tls-manual-roots\",\"dep:h3\",\"dep:h3-quinn\",\"dep:quinn\",\"tokio/macros\"],\"json\":[\"dep:serde_json\"],\"macos-system-configuration\":[\"system-proxy\"],\"multipart\":[\"dep:mime_guess\",\"dep:futures-util\"],\"native-tls\":[\"default-tls\"],\"native-tls-alpn\":[\"native-tls\",\"native-tls-crate?/alpn\",\"hyper-tls?/alpn\"],\"native-tls-vendored\":[\"native-tls\",\"native-tls-crate?/vendored\"],\"rustls-tls\":[\"rustls-tls-webpki-roots\"],\"rustls-tls-manual-roots\":[\"rustls-tls-manual-roots-no-provider\",\"__rustls-ring\"],\"rustls-tls-manual-roots-no-provider\":[\"__rustls\"],\"rustls-tls-native-roots\":[\"rustls-tls-native-roots-no-provider\",\"__rustls-ring\"],\"rustls-tls-native-roots-no-provider\":[\"dep:rustls-native-certs\",\"hyper-rustls?/native-tokio\",\"__rustls\"],\"rustls-tls-no-provider\":[\"rustls-tls-manual-roots-no-provider\"],\"rustls-tls-webpki-roots\":[\"rustls-tls-webpki-roots-no-provider\",\"__rustls-ring\"],\"rustls-tls-webpki-roots-no-provider\":[\"dep:webpki-roots\",\"hyper-rustls?/webpki-tokio\",\"__rustls\"],\"socks\":[],\"stream\":[\"tokio/fs\",\"dep:futures-util\",\"dep:tokio-util\",\"dep:wasm-streams\"],\"system-proxy\":[\"hyper-util/client-proxy-system\"],\"trust-dns\":[],\"zstd\":[\"tower-http/decompression-zstd\"]}}", - "resb_0.1.1": "{\"dependencies\":[{\"name\":\"indexmap\",\"optional\":true,\"req\":\"^2.0.0\"},{\"default_features\":false,\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.17\"},{\"name\":\"nom\",\"optional\":true,\"req\":\"^7.0.0\"},{\"default_features\":false,\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"serde_core\",\"req\":\"^1.0.220\"}],\"features\":{\"default\":[],\"logging\":[\"dep:log\"],\"serialize\":[\"std\"],\"std\":[],\"text\":[\"dep:indexmap\",\"dep:nom\",\"std\"]}}", + "resb_0.1.2": "{\"dependencies\":[{\"name\":\"indexmap\",\"optional\":true,\"req\":\"^2.0.0\"},{\"default_features\":false,\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.17\"},{\"name\":\"nom\",\"optional\":true,\"req\":\"^7.0.0\"},{\"default_features\":false,\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"serde_core\",\"req\":\"^1.0.220\"}],\"features\":{\"default\":[],\"logging\":[\"dep:log\"],\"serialize\":[\"std\"],\"std\":[],\"text\":[\"dep:indexmap\",\"dep:nom\",\"std\"]}}", "resolv-conf_0.7.6": "{\"dependencies\":[],\"features\":{\"system\":[]}}", "rfc6979_0.4.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.3\"},{\"default_features\":false,\"features\":[\"reset\"],\"name\":\"hmac\",\"req\":\"^0.12\"},{\"kind\":\"dev\",\"name\":\"sha2\",\"req\":\"^0.10\"},{\"default_features\":false,\"name\":\"subtle\",\"req\":\"^2\"}],\"features\":{}}", "ring_0.17.14": "{\"dependencies\":[{\"default_features\":false,\"kind\":\"build\",\"name\":\"cc\",\"req\":\"^1.2.8\"},{\"default_features\":false,\"name\":\"cfg-if\",\"req\":\"^1.0.0\"},{\"name\":\"getrandom\",\"req\":\"^0.2.10\"},{\"default_features\":false,\"name\":\"libc\",\"req\":\"^0.2.148\",\"target\":\"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\"},{\"default_features\":false,\"name\":\"libc\",\"req\":\"^0.2.155\",\"target\":\"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"libc\",\"req\":\"^0.2.148\",\"target\":\"cfg(any(unix, windows, target_os = \\\"wasi\\\"))\"},{\"name\":\"untrusted\",\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"std\"],\"kind\":\"dev\",\"name\":\"wasm-bindgen-test\",\"req\":\"^0.3.37\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\"},{\"features\":[\"Win32_Foundation\",\"Win32_System_Threading\"],\"name\":\"windows-sys\",\"req\":\"^0.52\",\"target\":\"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\"}],\"features\":{\"alloc\":[],\"default\":[\"alloc\",\"dev_urandom_fallback\"],\"dev_urandom_fallback\":[],\"less-safe-getrandom-custom-or-rdrand\":[],\"less-safe-getrandom-espidf\":[],\"slow_tests\":[],\"std\":[\"alloc\"],\"test_logging\":[],\"unstable-testing-arm-no-hw\":[],\"unstable-testing-arm-no-neon\":[],\"wasm32_unknown_unknown_js\":[\"getrandom/js\"]}}", @@ -1564,8 +1573,8 @@ "tar_0.4.45": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"astral-tokio-tar\",\"req\":\"^0.5\"},{\"name\":\"filetime\",\"req\":\"^0.2.8\"},{\"name\":\"libc\",\"req\":\"^0.2\",\"target\":\"cfg(unix)\"},{\"features\":[\"small_rng\"],\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3\"},{\"features\":[\"macros\",\"rt\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"tokio-stream\",\"req\":\"^0.1\"},{\"name\":\"xattr\",\"optional\":true,\"req\":\"^1.1.3\",\"target\":\"cfg(unix)\"}],\"features\":{\"default\":[\"xattr\"]}}", "target-lexicon_0.13.3": "{\"dependencies\":[{\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"}],\"features\":{\"arch_z80\":[],\"arch_zkasm\":[],\"default\":[],\"serde_support\":[\"serde\",\"std\"],\"std\":[]}}", "tempfile_3.27.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"doc-comment\",\"req\":\"^0.3\"},{\"name\":\"fastrand\",\"req\":\"^2.1.1\"},{\"default_features\":false,\"name\":\"getrandom\",\"optional\":true,\"req\":\">=0.3.0, <0.5\",\"target\":\"cfg(any(unix, windows, target_os = \\\"wasi\\\"))\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"once_cell\",\"req\":\"^1.19.0\"},{\"features\":[\"fs\"],\"name\":\"rustix\",\"req\":\"^1.1.4\",\"target\":\"cfg(any(unix, target_os = \\\"wasi\\\"))\"},{\"features\":[\"Win32_Storage_FileSystem\",\"Win32_Foundation\"],\"name\":\"windows-sys\",\"req\":\">=0.52, <0.62\",\"target\":\"cfg(windows)\"}],\"features\":{\"default\":[\"getrandom\"],\"nightly\":[]}}", - "temporal_capi_0.1.2": "{\"dependencies\":[{\"default_features\":false,\"name\":\"diplomat\",\"req\":\"^0.14.0\"},{\"default_features\":false,\"name\":\"diplomat-runtime\",\"req\":\"^0.14.0\"},{\"default_features\":false,\"features\":[\"unstable\"],\"name\":\"icu_calendar\",\"req\":\"^2.1.0\"},{\"name\":\"icu_locale\",\"req\":\"^2.1.0\"},{\"default_features\":false,\"name\":\"num-traits\",\"req\":\"^0.2.19\"},{\"default_features\":false,\"name\":\"temporal_rs\",\"req\":\"^0.1.2\"},{\"name\":\"timezone_provider\",\"req\":\"^0.1.2\"},{\"name\":\"writeable\",\"req\":\"^0.6.0\"},{\"name\":\"zoneinfo64\",\"optional\":true,\"req\":\"^0.2.0\"}],\"features\":{\"compiled_data\":[\"temporal_rs/compiled_data\"],\"zoneinfo64\":[\"dep:zoneinfo64\",\"timezone_provider/zoneinfo64\"]}}", - "temporal_rs_0.1.2": "{\"dependencies\":[{\"name\":\"core_maths\",\"req\":\"^0.1.1\"},{\"name\":\"iana-time-zone\",\"optional\":true,\"req\":\"^0.1.64\"},{\"default_features\":false,\"features\":[\"unstable\",\"compiled_data\"],\"name\":\"icu_calendar\",\"req\":\"^2.1.0\"},{\"name\":\"icu_locale\",\"req\":\"^2.1.0\"},{\"features\":[\"duration\"],\"name\":\"ixdtf\",\"req\":\"^0.6.4\"},{\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.28\"},{\"default_features\":false,\"name\":\"num-traits\",\"req\":\"^0.2.19\"},{\"name\":\"timezone_provider\",\"req\":\"^0.1.2\"},{\"name\":\"tinystr\",\"req\":\"^0.8.0\"},{\"name\":\"web-time\",\"optional\":true,\"req\":\"^1.1.0\"},{\"name\":\"writeable\",\"req\":\"^0.6.0\"}],\"features\":{\"compiled_data\":[\"tzdb\"],\"default\":[\"sys\"],\"float64_representable_durations\":[],\"log\":[\"dep:log\"],\"std\":[],\"sys\":[\"std\",\"compiled_data\",\"dep:web-time\",\"dep:iana-time-zone\"],\"tzdb\":[\"std\",\"timezone_provider/tzif\"]}}", + "temporal_capi_0.2.3": "{\"dependencies\":[{\"default_features\":false,\"name\":\"diplomat\",\"req\":\"^0.15.0\"},{\"default_features\":false,\"name\":\"diplomat-runtime\",\"req\":\"^0.15.0\"},{\"default_features\":false,\"name\":\"icu_calendar\",\"req\":\"^2.2.1\"},{\"name\":\"icu_locale_core\",\"req\":\"^2.1.0\"},{\"default_features\":false,\"name\":\"num-traits\",\"req\":\"^0.2.19\"},{\"default_features\":false,\"name\":\"temporal_rs\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"name\":\"timezone_provider\",\"req\":\"^0.2.3\"},{\"name\":\"writeable\",\"req\":\"^0.6.0\"},{\"name\":\"zoneinfo64\",\"optional\":true,\"req\":\"^0.3.0\"}],\"features\":{\"compiled_data\":[\"temporal_rs/compiled_data\"],\"zoneinfo64\":[\"dep:zoneinfo64\",\"timezone_provider/zoneinfo64\"]}}", + "temporal_rs_0.2.3": "{\"dependencies\":[{\"name\":\"calendrical_calculations\",\"req\":\"^0.2.4\"},{\"name\":\"core_maths\",\"req\":\"^0.1.1\"},{\"name\":\"iana-time-zone\",\"optional\":true,\"req\":\"^0.1.64\"},{\"default_features\":false,\"features\":[\"compiled_data\"],\"name\":\"icu_calendar\",\"req\":\"^2.2.1\"},{\"name\":\"icu_locale_core\",\"req\":\"^2.1.0\"},{\"features\":[\"duration\"],\"name\":\"ixdtf\",\"req\":\"^0.6.4\"},{\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.28\"},{\"default_features\":false,\"name\":\"num-traits\",\"req\":\"^0.2.19\"},{\"default_features\":false,\"name\":\"timezone_provider\",\"req\":\"^0.2.3\"},{\"name\":\"tinystr\",\"req\":\"^0.8.0\"},{\"name\":\"web-time\",\"optional\":true,\"req\":\"^1.1.0\"},{\"name\":\"writeable\",\"req\":\"^0.6.0\"}],\"features\":{\"compiled_data\":[\"tzdb\"],\"default\":[\"sys-local\"],\"float64_representable_durations\":[],\"log\":[\"dep:log\"],\"std\":[],\"sys\":[\"std\",\"compiled_data\",\"dep:web-time\"],\"sys-local\":[\"sys\",\"dep:iana-time-zone\"],\"tzdb\":[\"std\",\"timezone_provider/tzif\"]}}", "term_0.7.0": "{\"dependencies\":[{\"name\":\"dirs-next\",\"req\":\"^2\"},{\"name\":\"rustversion\",\"req\":\"^1\",\"target\":\"cfg(windows)\"},{\"features\":[\"consoleapi\",\"wincon\",\"handleapi\",\"fileapi\"],\"name\":\"winapi\",\"req\":\"^0.3\",\"target\":\"cfg(windows)\"}],\"features\":{\"default\":[]}}", "termcolor_1.4.1": "{\"dependencies\":[{\"name\":\"winapi-util\",\"req\":\"^0.1.3\",\"target\":\"cfg(windows)\"}],\"features\":{}}", "terminal_size_0.4.3": "{\"dependencies\":[{\"features\":[\"termios\"],\"name\":\"rustix\",\"req\":\"^1.0.1\",\"target\":\"cfg(unix)\"},{\"features\":[\"Win32_Foundation\",\"Win32_System_Console\"],\"name\":\"windows-sys\",\"req\":\"^0.60.0\",\"target\":\"cfg(windows)\"}],\"features\":{}}", @@ -1587,10 +1596,11 @@ "time-core_0.1.8": "{\"dependencies\":[],\"features\":{\"large-dates\":[]}}", "time-macros_0.2.27": "{\"dependencies\":[{\"name\":\"num-conv\",\"req\":\"^0.2.0\"},{\"name\":\"time-core\",\"req\":\"=0.1.8\"}],\"features\":{\"formatting\":[],\"large-dates\":[],\"parsing\":[],\"serde\":[]}}", "time_0.3.47": "{\"dependencies\":[{\"default_features\":false,\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.8.1\",\"target\":\"cfg(bench)\"},{\"features\":[\"powerfmt\"],\"name\":\"deranged\",\"req\":\"^0.5.2\"},{\"name\":\"itoa\",\"optional\":true,\"req\":\"^1.0.1\"},{\"name\":\"js-sys\",\"optional\":true,\"req\":\"^0.3.58\",\"target\":\"cfg(all(target_family = \\\"wasm\\\", not(any(target_os = \\\"emscripten\\\", target_os = \\\"wasi\\\"))))\"},{\"name\":\"libc\",\"optional\":true,\"req\":\"^0.2.98\",\"target\":\"cfg(target_family = \\\"unix\\\")\"},{\"name\":\"num-conv\",\"req\":\"^0.2.0\"},{\"kind\":\"dev\",\"name\":\"num-conv\",\"req\":\"^0.2.0\"},{\"name\":\"num_threads\",\"optional\":true,\"req\":\"^0.1.2\",\"target\":\"cfg(target_family = \\\"unix\\\")\"},{\"default_features\":false,\"name\":\"powerfmt\",\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"quickcheck\",\"optional\":true,\"req\":\"^1.0.3\"},{\"kind\":\"dev\",\"name\":\"quickcheck_macros\",\"req\":\"^1.0.0\"},{\"default_features\":false,\"name\":\"rand08\",\"optional\":true,\"package\":\"rand\",\"req\":\"^0.8.4\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"rand08\",\"package\":\"rand\",\"req\":\"^0.8.4\"},{\"default_features\":false,\"name\":\"rand09\",\"optional\":true,\"package\":\"rand\",\"req\":\"^0.9.2\"},{\"default_features\":false,\"features\":[\"small_rng\"],\"kind\":\"dev\",\"name\":\"rand09\",\"package\":\"rand\",\"req\":\"^0.9.2\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"rstest\",\"req\":\"^0.26.1\"},{\"kind\":\"dev\",\"name\":\"rstest_reuse\",\"req\":\"^0.7.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.184\"},{\"default_features\":false,\"name\":\"serde_core\",\"optional\":true,\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.68\"},{\"kind\":\"dev\",\"name\":\"serde_test\",\"req\":\"^1.0.126\"},{\"name\":\"time-core\",\"req\":\"=0.1.8\"},{\"name\":\"time-macros\",\"optional\":true,\"req\":\"=0.2.27\"},{\"kind\":\"dev\",\"name\":\"time-macros\",\"req\":\"=0.2.27\"},{\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1.0.102\",\"target\":\"cfg(__ui_tests)\"}],\"features\":{\"alloc\":[\"serde_core?/alloc\"],\"default\":[\"std\"],\"formatting\":[\"dep:itoa\",\"std\",\"time-macros?/formatting\"],\"large-dates\":[\"time-core/large-dates\",\"time-macros?/large-dates\"],\"local-offset\":[\"std\",\"dep:libc\",\"dep:num_threads\"],\"macros\":[\"dep:time-macros\"],\"parsing\":[\"time-macros?/parsing\"],\"quickcheck\":[\"dep:quickcheck\",\"alloc\",\"deranged/quickcheck\"],\"rand\":[\"rand08\",\"rand09\"],\"rand08\":[\"dep:rand08\",\"deranged/rand08\"],\"rand09\":[\"dep:rand09\",\"deranged/rand09\"],\"serde\":[\"dep:serde_core\",\"time-macros?/serde\",\"deranged/serde\"],\"serde-human-readable\":[\"serde\",\"formatting\",\"parsing\"],\"serde-well-known\":[\"serde\",\"formatting\",\"parsing\"],\"std\":[\"alloc\"],\"wasm-bindgen\":[\"dep:js-sys\"]}}", - "timezone_provider_0.1.2": "{\"dependencies\":[{\"name\":\"combine\",\"optional\":true,\"req\":\"^4.6.7\"},{\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"name\":\"jiff-tzdb\",\"optional\":true,\"req\":\"^0.1.4\"},{\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.225\"},{\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0.145\"},{\"features\":[\"zerovec\"],\"name\":\"tinystr\",\"req\":\"^0.8.0\"},{\"name\":\"tzif\",\"optional\":true,\"req\":\"^0.4.0\"},{\"features\":[\"derive\"],\"name\":\"yoke\",\"optional\":true,\"req\":\"^0.8.0\"},{\"name\":\"zerotrie\",\"req\":\"^0.2.0\"},{\"features\":[\"derive\",\"alloc\"],\"name\":\"zerovec\",\"req\":\"^0.11.0\"},{\"name\":\"zoneinfo64\",\"optional\":true,\"req\":\"^0.2.0\"},{\"features\":[\"std\"],\"name\":\"zoneinfo_rs\",\"optional\":true,\"req\":\"^0.0.18\"}],\"features\":{\"datagen\":[\"std\",\"dep:serde\",\"dep:databake\",\"dep:yoke\",\"dep:serde_json\",\"tinystr/serde\",\"tinystr/databake\",\"zerotrie/serde\",\"zerotrie/databake\",\"zerovec/serde\",\"zerovec/databake\",\"zerovec/derive\",\"dep:zoneinfo_rs\",\"experimental_tzif\"],\"default\":[],\"experimental_tzif\":[],\"std\":[],\"tzif\":[\"dep:tzif\",\"dep:jiff-tzdb\",\"dep:combine\",\"std\"],\"zoneinfo64\":[\"dep:zoneinfo64\"]}}", + "timezone_provider_0.2.3": "{\"dependencies\":[{\"name\":\"combine\",\"optional\":true,\"req\":\"^4.6.7\"},{\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"features\":[\"compiled_data\"],\"kind\":\"dev\",\"name\":\"icu_time\",\"req\":\"^2\"},{\"name\":\"jiff-tzdb\",\"optional\":true,\"req\":\"^0.1.4\"},{\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.225\"},{\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0.145\"},{\"features\":[\"zerovec\"],\"name\":\"tinystr\",\"req\":\"^0.8.0\"},{\"name\":\"tzif\",\"optional\":true,\"req\":\"^0.4.0\"},{\"features\":[\"derive\"],\"name\":\"yoke\",\"optional\":true,\"req\":\"^0.8.0\"},{\"name\":\"zerofrom\",\"optional\":true,\"req\":\"^0.1.6\"},{\"name\":\"zerotrie\",\"req\":\"^0.2.0\"},{\"features\":[\"derive\",\"alloc\"],\"name\":\"zerovec\",\"req\":\"^0.11.0\"},{\"name\":\"zoneinfo64\",\"optional\":true,\"req\":\"^0.3.0\"},{\"default_features\":false,\"features\":[\"std\",\"unstable\"],\"name\":\"zoneinfo_rs\",\"optional\":true,\"req\":\"^0.1.0\"}],\"features\":{\"datagen\":[\"std\",\"dep:serde\",\"dep:databake\",\"dep:yoke\",\"dep:serde_json\",\"tinystr/serde\",\"tinystr/databake\",\"zerotrie/serde\",\"zerotrie/databake\",\"zerovec/serde\",\"zerovec/databake\",\"zerovec/derive\",\"dep:zoneinfo_rs\",\"experimental_tzif\"],\"default\":[],\"experimental_tzif\":[\"dep:zerofrom\",\"zerofrom/derive\"],\"std\":[],\"tzif\":[\"dep:tzif\",\"dep:jiff-tzdb\",\"dep:combine\",\"std\"],\"zoneinfo64\":[\"dep:zoneinfo64\"]}}", "tiny-keccak_2.0.2": "{\"dependencies\":[{\"name\":\"crunchy\",\"req\":\"^0.2.2\"}],\"features\":{\"cshake\":[],\"default\":[],\"fips202\":[\"keccak\",\"shake\",\"sha3\"],\"k12\":[],\"keccak\":[],\"kmac\":[\"cshake\"],\"parallel_hash\":[\"cshake\"],\"sha3\":[],\"shake\":[],\"sp800\":[\"cshake\",\"kmac\",\"tuple_hash\"],\"tuple_hash\":[\"cshake\"]}}", "tiny_http_0.12.0": "{\"dependencies\":[{\"name\":\"ascii\",\"req\":\"^1.0\"},{\"name\":\"chunked_transfer\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"fdlimit\",\"req\":\"^0.1\"},{\"name\":\"httpdate\",\"req\":\"^1.0.2\"},{\"name\":\"log\",\"req\":\"^0.4.4\"},{\"name\":\"openssl\",\"optional\":true,\"req\":\"^0.10\"},{\"kind\":\"dev\",\"name\":\"rustc-serialize\",\"req\":\"^0.3\"},{\"name\":\"rustls\",\"optional\":true,\"req\":\"^0.20\"},{\"name\":\"rustls-pemfile\",\"optional\":true,\"req\":\"^0.2.1\"},{\"kind\":\"dev\",\"name\":\"sha1\",\"req\":\"^0.6.0\"},{\"name\":\"zeroize\",\"optional\":true,\"req\":\"^1\"}],\"features\":{\"default\":[],\"ssl\":[\"ssl-openssl\"],\"ssl-openssl\":[\"openssl\",\"zeroize\"],\"ssl-rustls\":[\"rustls\",\"rustls-pemfile\",\"zeroize\"]}}", "tinystr_0.8.2": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.1\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"features\":[\"use-std\"],\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"features\":[\"small_rng\"],\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"default_features\":false,\"name\":\"serde_core\",\"optional\":true,\"req\":\"^1.0.220\"},{\"features\":[\"alloc\"],\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"name\":\"zerovec\",\"optional\":true,\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[\"serde_core?/alloc\",\"zerovec?/alloc\"],\"databake\":[\"dep:databake\"],\"default\":[\"alloc\"],\"serde\":[\"dep:serde_core\"],\"std\":[],\"zerovec\":[\"dep:zerovec\"]}}", + "tinystr_0.8.3": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.1\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"features\":[\"use-std\"],\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"features\":[\"small_rng\"],\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"default_features\":false,\"name\":\"serde_core\",\"optional\":true,\"req\":\"^1.0.220\"},{\"features\":[\"alloc\"],\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"name\":\"zerovec\",\"optional\":true,\"req\":\"^0.11.6\"}],\"features\":{\"alloc\":[\"serde_core?/alloc\",\"zerovec?/alloc\"],\"databake\":[\"dep:databake\"],\"default\":[\"alloc\"],\"serde\":[\"dep:serde_core\"],\"std\":[],\"zerovec\":[\"dep:zerovec\"]}}", "tinyvec_1.10.0": "{\"dependencies\":[{\"name\":\"arbitrary\",\"optional\":true,\"req\":\"^1\"},{\"default_features\":false,\"name\":\"borsh\",\"optional\":true,\"req\":\"^1.2.0\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.3.0\"},{\"kind\":\"dev\",\"name\":\"debugger_test\",\"req\":\"^0.1\"},{\"kind\":\"dev\",\"name\":\"debugger_test_parser\",\"req\":\"^0.1\"},{\"default_features\":false,\"name\":\"generic-array\",\"optional\":true,\"req\":\"^1.1.1\"},{\"default_features\":false,\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serde_test\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"smallvec\",\"req\":\"^1\"},{\"name\":\"tinyvec_macros\",\"optional\":true,\"req\":\"^0.1\"}],\"features\":{\"alloc\":[\"tinyvec_macros\"],\"debugger_visualizer\":[],\"default\":[],\"experimental_write_impl\":[],\"grab_spare_slice\":[],\"latest_stable_rust\":[\"rustc_1_61\"],\"nightly_slice_partition_dedup\":[],\"real_blackbox\":[\"criterion/real_blackbox\"],\"rustc_1_40\":[],\"rustc_1_55\":[],\"rustc_1_57\":[],\"rustc_1_61\":[\"rustc_1_57\"],\"std\":[\"alloc\"]}}", "tinyvec_macros_0.1.1": "{\"dependencies\":[],\"features\":{}}", "tokio-graceful_0.2.2": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bytes\",\"req\":\"^1\",\"target\":\"cfg(not(loom))\"},{\"kind\":\"dev\",\"name\":\"http-body-util\",\"req\":\"^0.1\",\"target\":\"cfg(not(loom))\"},{\"features\":[\"server\",\"http1\",\"http2\"],\"kind\":\"dev\",\"name\":\"hyper\",\"req\":\"^1.0.1\",\"target\":\"cfg(not(loom))\"},{\"features\":[\"server\",\"server-auto\",\"http1\",\"http2\",\"tokio\"],\"kind\":\"dev\",\"name\":\"hyper-util\",\"req\":\"^0.1.1\",\"target\":\"cfg(not(loom))\"},{\"features\":[\"futures\",\"checkpoint\"],\"name\":\"loom\",\"req\":\"^0.7\",\"target\":\"cfg(loom)\"},{\"name\":\"pin-project-lite\",\"req\":\"^0.2\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8\"},{\"name\":\"slab\",\"req\":\"^0.4\"},{\"features\":[\"rt\",\"signal\",\"sync\",\"macros\",\"time\"],\"name\":\"tokio\",\"req\":\"^1\"},{\"features\":[\"net\",\"rt-multi-thread\",\"io-util\",\"test-util\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1\"},{\"name\":\"tracing\",\"req\":\"^0.1\"},{\"features\":[\"env-filter\"],\"kind\":\"dev\",\"name\":\"tracing-subscriber\",\"req\":\"^0.3\"}],\"features\":{}}", @@ -1677,7 +1687,7 @@ "utf8_iter_1.0.4": "{\"dependencies\":[],\"features\":{}}", "utf8parse_0.2.2": "{\"dependencies\":[],\"features\":{\"default\":[],\"nightly\":[]}}", "uuid_1.20.0": "{\"dependencies\":[{\"name\":\"arbitrary\",\"optional\":true,\"req\":\"^1.1.3\"},{\"default_features\":false,\"name\":\"atomic\",\"optional\":true,\"req\":\"^0.6\"},{\"default_features\":false,\"name\":\"borsh\",\"optional\":true,\"req\":\"^1\"},{\"default_features\":false,\"name\":\"borsh-derive\",\"optional\":true,\"req\":\"^1\"},{\"features\":[\"derive\"],\"name\":\"bytemuck\",\"optional\":true,\"req\":\"^1.20.0\"},{\"name\":\"getrandom\",\"optional\":true,\"req\":\"^0.3\",\"target\":\"cfg(not(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\"))))\"},{\"default_features\":false,\"name\":\"js-sys\",\"optional\":true,\"req\":\"^0.3\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\"), target_feature = \\\"atomics\\\"))\"},{\"default_features\":false,\"name\":\"md-5\",\"optional\":true,\"req\":\"^0.10\"},{\"name\":\"rand\",\"optional\":true,\"req\":\"^0.9\",\"target\":\"cfg(not(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\"))))\"},{\"kind\":\"dev\",\"name\":\"rustversion\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.221\"},{\"default_features\":false,\"name\":\"serde_core\",\"optional\":true,\"req\":\"^1.0.221\"},{\"kind\":\"dev\",\"name\":\"serde_derive\",\"req\":\"^1.0.221\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serde_test\",\"req\":\"^1.0.56\"},{\"default_features\":false,\"name\":\"sha1_smol\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"slog\",\"optional\":true,\"req\":\"^2\"},{\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1.0.52\"},{\"name\":\"uuid-rng-internal-lib\",\"optional\":true,\"package\":\"uuid-rng-internal\",\"req\":\"^1.20.0\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\")))\"},{\"default_features\":false,\"features\":[\"msrv\"],\"name\":\"wasm-bindgen\",\"optional\":true,\"req\":\"^0.2\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\")))\"},{\"kind\":\"dev\",\"name\":\"wasm-bindgen\",\"req\":\"^0.2\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\")))\"},{\"kind\":\"dev\",\"name\":\"wasm-bindgen-test\",\"req\":\"^0.3\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", any(target_os = \\\"unknown\\\", target_os = \\\"none\\\")))\"},{\"features\":[\"derive\"],\"name\":\"zerocopy\",\"optional\":true,\"req\":\"^0.8\"}],\"features\":{\"atomic\":[\"dep:atomic\"],\"borsh\":[\"dep:borsh\",\"dep:borsh-derive\"],\"default\":[\"std\"],\"fast-rng\":[\"rng\",\"dep:rand\"],\"js\":[\"dep:wasm-bindgen\",\"dep:js-sys\"],\"macro-diagnostics\":[],\"md5\":[\"dep:md-5\"],\"rng\":[\"dep:getrandom\"],\"rng-getrandom\":[\"rng\",\"dep:getrandom\",\"uuid-rng-internal-lib\",\"uuid-rng-internal-lib/getrandom\"],\"rng-rand\":[\"rng\",\"dep:rand\",\"uuid-rng-internal-lib\",\"uuid-rng-internal-lib/rand\"],\"serde\":[\"dep:serde_core\"],\"sha1\":[\"dep:sha1_smol\"],\"std\":[\"wasm-bindgen?/std\",\"js-sys?/std\"],\"v1\":[\"atomic\"],\"v3\":[\"md5\"],\"v4\":[\"rng\"],\"v5\":[\"sha1\"],\"v6\":[\"atomic\"],\"v7\":[\"rng\"],\"v8\":[]}}", - "v8_146.4.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"align-data\",\"req\":\"^0.1.0\"},{\"kind\":\"build\",\"name\":\"bindgen\",\"req\":\"^0.72\"},{\"kind\":\"dev\",\"name\":\"bindgen\",\"req\":\"^0.72\"},{\"name\":\"bitflags\",\"req\":\"^2.5\"},{\"kind\":\"dev\",\"name\":\"bytes\",\"req\":\"^1\"},{\"kind\":\"build\",\"name\":\"fslock\",\"req\":\"^0.2\"},{\"kind\":\"dev\",\"name\":\"fslock\",\"req\":\"^0.2\"},{\"kind\":\"build\",\"name\":\"gzip-header\",\"req\":\"^1.0.0\"},{\"kind\":\"dev\",\"name\":\"gzip-header\",\"req\":\"^1.0.0\"},{\"kind\":\"build\",\"name\":\"home\",\"req\":\"^0\"},{\"kind\":\"dev\",\"name\":\"home\",\"req\":\"^0\"},{\"kind\":\"build\",\"name\":\"miniz_oxide\",\"req\":\"^0.8.8\"},{\"kind\":\"dev\",\"name\":\"miniz_oxide\",\"req\":\"^0.8.8\"},{\"name\":\"paste\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"rustversion\",\"req\":\"^1\"},{\"features\":[\"zoneinfo64\"],\"name\":\"temporal_capi\",\"req\":\"^0.1.2\"},{\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1.0.96\"},{\"kind\":\"build\",\"name\":\"which\",\"req\":\"^6\"},{\"kind\":\"dev\",\"name\":\"which\",\"req\":\"^6\"}],\"features\":{\"default\":[\"use_custom_libcxx\"],\"use_custom_libcxx\":[],\"v8_enable_pointer_compression\":[],\"v8_enable_sandbox\":[\"v8_enable_pointer_compression\"],\"v8_enable_v8_checks\":[]}}", + "v8_147.4.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"align-data\",\"req\":\"^0.1.0\"},{\"kind\":\"build\",\"name\":\"bindgen\",\"req\":\"^0.72\"},{\"kind\":\"dev\",\"name\":\"bindgen\",\"req\":\"^0.72\"},{\"name\":\"bitflags\",\"req\":\"^2.5\"},{\"kind\":\"dev\",\"name\":\"bytes\",\"req\":\"^1\"},{\"kind\":\"build\",\"name\":\"fslock\",\"req\":\"^0.2\"},{\"kind\":\"dev\",\"name\":\"fslock\",\"req\":\"^0.2\"},{\"kind\":\"build\",\"name\":\"gzip-header\",\"req\":\"^1.0.0\"},{\"kind\":\"dev\",\"name\":\"gzip-header\",\"req\":\"^1.0.0\"},{\"kind\":\"build\",\"name\":\"home\",\"req\":\"^0\"},{\"kind\":\"dev\",\"name\":\"home\",\"req\":\"^0\"},{\"kind\":\"build\",\"name\":\"miniz_oxide\",\"req\":\"^0.8.8\"},{\"kind\":\"dev\",\"name\":\"miniz_oxide\",\"req\":\"^0.8.8\"},{\"name\":\"paste\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"rustversion\",\"req\":\"^1\"},{\"features\":[\"zoneinfo64\"],\"name\":\"temporal_capi\",\"req\":\"^0.2.3\"},{\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1.0.96\"},{\"kind\":\"build\",\"name\":\"which\",\"req\":\"^6\"},{\"kind\":\"dev\",\"name\":\"which\",\"req\":\"^6\"}],\"features\":{\"default\":[\"use_custom_libcxx\"],\"simdutf\":[],\"use_custom_libcxx\":[],\"v8_enable_pointer_compression\":[],\"v8_enable_sandbox\":[\"v8_enable_pointer_compression\"],\"v8_enable_v8_checks\":[]}}", "valuable_0.1.1": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.3\"},{\"name\":\"valuable-derive\",\"optional\":true,\"req\":\"=0.1.1\"}],\"features\":{\"alloc\":[],\"default\":[\"std\"],\"derive\":[\"valuable-derive\"],\"std\":[\"alloc\"]}}", "vcpkg_0.2.15": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"lazy_static\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"tempdir\",\"req\":\"^0.3.7\"}],\"features\":{}}", "version-compare_0.2.1": "{\"dependencies\":[],\"features\":{}}", @@ -1813,7 +1823,9 @@ "yansi_1.0.1": "{\"dependencies\":[{\"name\":\"is-terminal\",\"optional\":true,\"req\":\"^0.4.11\"}],\"features\":{\"_nightly\":[],\"alloc\":[],\"default\":[\"std\"],\"detect-env\":[\"std\"],\"detect-tty\":[\"is-terminal\",\"std\"],\"hyperlink\":[\"std\"],\"std\":[\"alloc\"]}}", "yasna_0.5.2": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"std\"],\"name\":\"bit-vec\",\"optional\":true,\"req\":\"^0.6.1\"},{\"name\":\"num-bigint\",\"optional\":true,\"req\":\"^0.4\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"num-traits\",\"req\":\"^0.2\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"time\",\"optional\":true,\"req\":\"^0.3.1\"}],\"features\":{\"default\":[],\"std\":[]}}", "yoke-derive_0.8.1": "{\"dependencies\":[{\"name\":\"proc-macro2\",\"req\":\"^1.0.61\"},{\"name\":\"quote\",\"req\":\"^1.0.28\"},{\"features\":[\"fold\"],\"name\":\"syn\",\"req\":\"^2.0.21\"},{\"name\":\"synstructure\",\"req\":\"^0.13.0\"}],\"features\":{}}", + "yoke-derive_0.8.2": "{\"dependencies\":[{\"name\":\"proc-macro2\",\"req\":\"^1.0.61\"},{\"name\":\"quote\",\"req\":\"^1.0.44\"},{\"features\":[\"fold\"],\"name\":\"syn\",\"req\":\"^2.0.21\"},{\"name\":\"synstructure\",\"req\":\"^0.13.0\"}],\"features\":{}}", "yoke_0.8.1": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.1\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"stable_deref_trait\",\"req\":\"^1.2.0\"},{\"default_features\":false,\"name\":\"yoke-derive\",\"optional\":true,\"req\":\"^0.8.0\"},{\"default_features\":false,\"name\":\"zerofrom\",\"optional\":true,\"req\":\"^0.1.3\"}],\"features\":{\"alloc\":[\"stable_deref_trait/alloc\",\"zerofrom/alloc\"],\"default\":[\"alloc\",\"zerofrom\"],\"derive\":[\"dep:yoke-derive\",\"zerofrom/derive\"],\"serde\":[],\"zerofrom\":[\"dep:zerofrom\"]}}", + "yoke_0.8.2": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.1\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"stable_deref_trait\",\"req\":\"^1.2.0\"},{\"default_features\":false,\"name\":\"yoke-derive\",\"optional\":true,\"req\":\"^0.8.2\"},{\"default_features\":false,\"name\":\"zerofrom\",\"optional\":true,\"req\":\"^0.1.6\"}],\"features\":{\"alloc\":[\"stable_deref_trait/alloc\",\"zerofrom/alloc\"],\"default\":[\"alloc\",\"zerofrom\"],\"derive\":[\"dep:yoke-derive\",\"zerofrom/derive\"],\"serde\":[],\"zerofrom\":[\"dep:zerofrom\"]}}", "zbus_4.4.0": "{\"dependencies\":[{\"name\":\"async-broadcast\",\"req\":\"^0.7.0\"},{\"name\":\"async-executor\",\"optional\":true,\"req\":\"^1.11.0\"},{\"name\":\"async-fs\",\"optional\":true,\"req\":\"^2.1.2\"},{\"name\":\"async-io\",\"optional\":true,\"req\":\"^2.3.2\"},{\"name\":\"async-lock\",\"optional\":true,\"req\":\"^3.3.0\"},{\"name\":\"async-process\",\"req\":\"^2.2.2\",\"target\":\"cfg(target_os = \\\"macos\\\")\"},{\"name\":\"async-recursion\",\"req\":\"^1.1.1\",\"target\":\"cfg(any(target_os = \\\"macos\\\", windows))\"},{\"name\":\"async-task\",\"optional\":true,\"req\":\"^4.7.1\"},{\"name\":\"async-trait\",\"req\":\"^0.1.80\"},{\"name\":\"blocking\",\"optional\":true,\"req\":\"^1.6.0\"},{\"kind\":\"dev\",\"name\":\"doc-comment\",\"req\":\"^0.3.3\"},{\"features\":[\"serde\"],\"name\":\"enumflags2\",\"req\":\"^0.7.9\"},{\"name\":\"event-listener\",\"req\":\"^5.3.0\"},{\"name\":\"futures-core\",\"req\":\"^0.3.30\"},{\"name\":\"futures-sink\",\"req\":\"^0.3.30\"},{\"default_features\":false,\"features\":[\"sink\",\"std\"],\"name\":\"futures-util\",\"req\":\"^0.3.30\"},{\"kind\":\"dev\",\"name\":\"futures-util\",\"req\":\"^0.3.30\"},{\"name\":\"hex\",\"req\":\"^0.4.3\"},{\"default_features\":false,\"features\":[\"socket\",\"uio\",\"user\"],\"name\":\"nix\",\"req\":\"^0.29\",\"target\":\"cfg(unix)\"},{\"kind\":\"dev\",\"name\":\"ntest\",\"req\":\"^0.9.2\"},{\"name\":\"ordered-stream\",\"req\":\"^0.2\"},{\"name\":\"rand\",\"req\":\"^0.8.5\"},{\"features\":[\"derive\"],\"name\":\"serde\",\"req\":\"^1.0.200\"},{\"name\":\"serde_repr\",\"req\":\"^0.1.19\"},{\"features\":[\"std\"],\"name\":\"sha1\",\"req\":\"^0.10.6\"},{\"name\":\"static_assertions\",\"req\":\"^1.1.0\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.10.1\"},{\"default_features\":false,\"features\":[\"trace\"],\"kind\":\"dev\",\"name\":\"test-log\",\"req\":\"^0.2.16\"},{\"features\":[\"rt\",\"net\",\"time\",\"fs\",\"io-util\",\"process\",\"sync\",\"tracing\"],\"name\":\"tokio\",\"optional\":true,\"req\":\"^1.37.0\"},{\"features\":[\"macros\",\"rt-multi-thread\",\"fs\",\"io-util\",\"net\",\"sync\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1.37.0\"},{\"name\":\"tokio-vsock\",\"optional\":true,\"req\":\"^0.4\"},{\"name\":\"tracing\",\"req\":\"^0.1.40\"},{\"default_features\":false,\"features\":[\"env-filter\",\"fmt\",\"ansi\"],\"kind\":\"dev\",\"name\":\"tracing-subscriber\",\"req\":\"^0.3.18\"},{\"name\":\"uds_windows\",\"req\":\"^1.1.0\",\"target\":\"cfg(windows)\"},{\"name\":\"vsock\",\"optional\":true,\"req\":\"^0.5.0\"},{\"features\":[\"Win32_Foundation\",\"Win32_Security_Authorization\",\"Win32_System_Memory\",\"Win32_Networking\",\"Win32_Networking_WinSock\",\"Win32_NetworkManagement\",\"Win32_NetworkManagement_IpHelper\",\"Win32_System_Threading\"],\"name\":\"windows-sys\",\"req\":\"^0.52\",\"target\":\"cfg(windows)\"},{\"name\":\"xdg-home\",\"req\":\"^1.1.0\"},{\"name\":\"zbus_macros\",\"req\":\"=4.4.0\"},{\"name\":\"zbus_names\",\"req\":\"^3.0\"},{\"kind\":\"dev\",\"name\":\"zbus_xml\",\"req\":\"^4.0.0\"},{\"default_features\":false,\"features\":[\"enumflags2\"],\"name\":\"zvariant\",\"req\":\"^4.2.0\"}],\"features\":{\"async-io\":[\"dep:async-io\",\"async-executor\",\"async-task\",\"async-lock\",\"async-fs\",\"blocking\",\"futures-util/io\"],\"bus-impl\":[\"p2p\"],\"chrono\":[\"zvariant/chrono\"],\"default\":[\"async-io\"],\"heapless\":[\"zvariant/heapless\"],\"option-as-array\":[\"zvariant/option-as-array\"],\"p2p\":[],\"time\":[\"zvariant/time\"],\"tokio\":[\"dep:tokio\"],\"tokio-vsock\":[\"dep:tokio-vsock\",\"tokio\"],\"url\":[\"zvariant/url\"],\"uuid\":[\"zvariant/uuid\"],\"vsock\":[\"dep:vsock\",\"dep:async-io\"]}}", "zbus_macros_4.4.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"async-io\",\"req\":\"^2.3.2\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"futures-util\",\"req\":\"^0.3.30\"},{\"name\":\"proc-macro-crate\",\"req\":\"^3.1.0\"},{\"name\":\"proc-macro2\",\"req\":\"^1.0.81\"},{\"name\":\"quote\",\"req\":\"^1.0.36\"},{\"kind\":\"dev\",\"name\":\"rustversion\",\"req\":\"^1.0.15\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.200\"},{\"features\":[\"extra-traits\",\"fold\",\"full\"],\"name\":\"syn\",\"req\":\"^2.0.64\"},{\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1.0.93\"},{\"name\":\"zvariant_utils\",\"req\":\"=2.1.0\"}],\"features\":{}}", "zbus_names_3.0.0": "{\"dependencies\":[{\"features\":[\"derive\"],\"name\":\"serde\",\"req\":\"^1.0\"},{\"name\":\"static_assertions\",\"req\":\"^1.1.0\"},{\"default_features\":false,\"features\":[\"enumflags2\"],\"name\":\"zvariant\",\"req\":\"^4.0.0\"}],\"features\":{}}", @@ -1826,14 +1838,17 @@ "zeroize_1.8.2": "{\"dependencies\":[{\"default_features\":false,\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"name\":\"zeroize_derive\",\"optional\":true,\"req\":\"^1.3\"}],\"features\":{\"aarch64\":[],\"alloc\":[],\"default\":[\"alloc\"],\"derive\":[\"zeroize_derive\"],\"simd\":[],\"std\":[\"alloc\"]}}", "zeroize_derive_1.4.3": "{\"dependencies\":[{\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"name\":\"quote\",\"req\":\"^1\"},{\"features\":[\"full\",\"extra-traits\",\"visit\"],\"name\":\"syn\",\"req\":\"^2\"}],\"features\":{}}", "zerotrie_0.2.3": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"litemap\",\"optional\":true,\"req\":\"^0.8.0\"},{\"default_features\":false,\"name\":\"serde_core\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"yoke\",\"optional\":true,\"req\":\"^0.8.0\"},{\"default_features\":false,\"name\":\"zerofrom\",\"optional\":true,\"req\":\"^0.1.3\"},{\"default_features\":false,\"name\":\"zerovec\",\"optional\":true,\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[],\"databake\":[\"dep:databake\",\"zerovec?/databake\"],\"default\":[],\"litemap\":[\"dep:litemap\",\"alloc\"],\"serde\":[\"dep:serde_core\",\"dep:litemap\",\"alloc\",\"litemap/serde\",\"zerovec?/serde\"],\"yoke\":[\"dep:yoke\"],\"zerofrom\":[\"dep:zerofrom\"]}}", + "zerotrie_0.2.4": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.1\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2.3\"},{\"default_features\":false,\"features\":[\"alloc\"],\"kind\":\"dev\",\"name\":\"icu_locale_core\",\"req\":\"^2.2.0\"},{\"kind\":\"dev\",\"name\":\"itertools\",\"req\":\"^0.14.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"litemap\",\"optional\":true,\"req\":\"^0.8.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"rand_pcg\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"rmp-serde\",\"req\":\"^1.2.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"default_features\":false,\"name\":\"serde_core\",\"optional\":true,\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"yoke\",\"optional\":true,\"req\":\"^0.8.2\"},{\"default_features\":false,\"name\":\"zerofrom\",\"optional\":true,\"req\":\"^0.1.6\"},{\"default_features\":false,\"name\":\"zerovec\",\"optional\":true,\"req\":\"^0.11.6\"}],\"features\":{\"alloc\":[\"zerovec?/alloc\"],\"databake\":[\"dep:databake\",\"zerovec?/databake\"],\"default\":[],\"dense\":[\"dep:zerovec\"],\"litemap\":[\"dep:litemap\",\"alloc\"],\"serde\":[\"dep:serde_core\",\"dep:litemap\",\"alloc\",\"litemap/serde\",\"zerovec?/serde\"],\"yoke\":[\"dep:yoke\"],\"zerofrom\":[\"dep:zerofrom\"],\"zerovec\":[\"dep:zerovec\"]}}", "zerovec-derive_0.11.2": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.1\"},{\"name\":\"proc-macro2\",\"req\":\"^1.0.61\"},{\"name\":\"quote\",\"req\":\"^1.0.28\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"features\":[\"extra-traits\"],\"name\":\"syn\",\"req\":\"^2.0.21\"}],\"features\":{}}", + "zerovec-derive_0.11.3": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.1\"},{\"name\":\"proc-macro2\",\"req\":\"^1.0.61\"},{\"name\":\"quote\",\"req\":\"^1.0.44\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"features\":[\"extra-traits\"],\"name\":\"syn\",\"req\":\"^2.0.21\"}],\"features\":{}}", "zerovec_0.11.5": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"xxhash64\"],\"name\":\"twox-hash\",\"optional\":true,\"req\":\"^2.0.0\"},{\"default_features\":false,\"name\":\"yoke\",\"optional\":true,\"req\":\"^0.8.0\"},{\"default_features\":false,\"name\":\"zerofrom\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"name\":\"zerovec-derive\",\"optional\":true,\"req\":\"^0.11.1\"}],\"features\":{\"alloc\":[\"serde?/alloc\"],\"databake\":[\"dep:databake\"],\"derive\":[\"dep:zerovec-derive\"],\"hashmap\":[\"dep:twox-hash\",\"alloc\"],\"serde\":[\"dep:serde\"],\"std\":[],\"yoke\":[\"dep:yoke\"]}}", + "zerovec_0.11.6": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.1\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"databake\",\"optional\":true,\"req\":\"^0.2.0\"},{\"features\":[\"wasm_js\"],\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"iai\",\"req\":\"^0.1.1\"},{\"features\":[\"json\"],\"kind\":\"dev\",\"name\":\"insta\",\"req\":\"^1.43.2\"},{\"default_features\":false,\"features\":[\"use-std\"],\"kind\":\"dev\",\"name\":\"postcard\",\"req\":\"^1.0.3\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"rand_distr\",\"req\":\"^0.5\"},{\"kind\":\"dev\",\"name\":\"rand_pcg\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"rmp-serde\",\"req\":\"^1.2.0\"},{\"default_features\":false,\"name\":\"schemars\",\"optional\":true,\"req\":\"^1.0.4\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.220\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.220\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.45\"},{\"default_features\":false,\"features\":[\"xxhash64\"],\"name\":\"twox-hash\",\"optional\":true,\"req\":\"^2.0.0\"},{\"default_features\":false,\"name\":\"yoke\",\"optional\":true,\"req\":\"^0.8.2\"},{\"default_features\":false,\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"yoke\",\"req\":\"^0.8.2\"},{\"default_features\":false,\"name\":\"zerofrom\",\"req\":\"^0.1.6\"},{\"default_features\":false,\"name\":\"zerovec-derive\",\"optional\":true,\"req\":\"^0.11.3\"}],\"features\":{\"alloc\":[\"serde?/alloc\"],\"databake\":[\"dep:databake\"],\"derive\":[\"dep:zerovec-derive\"],\"hashmap\":[\"dep:twox-hash\",\"alloc\"],\"schemars\":[\"dep:schemars\",\"alloc\"],\"serde\":[\"dep:serde\"],\"std\":[],\"yoke\":[\"dep:yoke\"]}}", "zip_0.6.6": "{\"dependencies\":[{\"name\":\"aes\",\"optional\":true,\"req\":\"^0.8.2\"},{\"kind\":\"dev\",\"name\":\"bencher\",\"req\":\"^0.1.5\"},{\"name\":\"byteorder\",\"req\":\"^1.4.3\"},{\"name\":\"bzip2\",\"optional\":true,\"req\":\"^0.4.3\"},{\"name\":\"constant_time_eq\",\"optional\":true,\"req\":\"^0.1.5\"},{\"name\":\"crc32fast\",\"req\":\"^1.3.2\"},{\"name\":\"crossbeam-utils\",\"req\":\"^0.8.8\",\"target\":\"cfg(any(all(target_arch = \\\"arm\\\", target_pointer_width = \\\"32\\\"), target_arch = \\\"mips\\\", target_arch = \\\"powerpc\\\"))\"},{\"default_features\":false,\"name\":\"flate2\",\"optional\":true,\"req\":\"^1.0.23\"},{\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.2.5\"},{\"features\":[\"reset\"],\"name\":\"hmac\",\"optional\":true,\"req\":\"^0.12.1\"},{\"name\":\"pbkdf2\",\"optional\":true,\"req\":\"^0.11.0\"},{\"name\":\"sha1\",\"optional\":true,\"req\":\"^0.10.1\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"time\",\"optional\":true,\"req\":\"^0.3.7\"},{\"features\":[\"formatting\",\"macros\"],\"kind\":\"dev\",\"name\":\"time\",\"req\":\"^0.3.7\"},{\"kind\":\"dev\",\"name\":\"walkdir\",\"req\":\"^2.3.2\"},{\"name\":\"zstd\",\"optional\":true,\"req\":\"^0.11.2\"}],\"features\":{\"aes-crypto\":[\"aes\",\"constant_time_eq\",\"hmac\",\"pbkdf2\",\"sha1\"],\"default\":[\"aes-crypto\",\"bzip2\",\"deflate\",\"time\",\"zstd\"],\"deflate\":[\"flate2/rust_backend\"],\"deflate-miniz\":[\"flate2/default\"],\"deflate-zlib\":[\"flate2/zlib\"],\"unreserved\":[]}}", "zip_2.4.2": "{\"dependencies\":[{\"name\":\"aes\",\"optional\":true,\"req\":\"^0.8\"},{\"kind\":\"dev\",\"name\":\"anyhow\",\"req\":\"^1.0.95\"},{\"features\":[\"derive\"],\"name\":\"arbitrary\",\"req\":\"^1.4.1\",\"target\":\"cfg(fuzzing)\"},{\"kind\":\"dev\",\"name\":\"bencher\",\"req\":\"^0.1.5\"},{\"name\":\"bzip2\",\"optional\":true,\"req\":\"^0.5.0\"},{\"name\":\"chrono\",\"optional\":true,\"req\":\"^0.4\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"clap\",\"req\":\"=4.4.18\"},{\"name\":\"constant_time_eq\",\"optional\":true,\"req\":\"^0.3\"},{\"name\":\"crc32fast\",\"req\":\"^1.4\"},{\"name\":\"crossbeam-utils\",\"req\":\"^0.8.21\",\"target\":\"cfg(any(all(target_arch = \\\"arm\\\", target_pointer_width = \\\"32\\\"), target_arch = \\\"mips\\\", target_arch = \\\"powerpc\\\"))\"},{\"name\":\"deflate64\",\"optional\":true,\"req\":\"^0.1.9\"},{\"default_features\":false,\"name\":\"displaydoc\",\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"flate2\",\"optional\":true,\"req\":\"^1.0\"},{\"features\":[\"wasm_js\",\"std\"],\"name\":\"getrandom\",\"optional\":true,\"req\":\"^0.3.1\"},{\"features\":[\"wasm_js\",\"std\"],\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.3.1\"},{\"features\":[\"reset\"],\"name\":\"hmac\",\"optional\":true,\"req\":\"^0.12\"},{\"name\":\"indexmap\",\"req\":\"^2\"},{\"default_features\":false,\"name\":\"lzma-rs\",\"optional\":true,\"req\":\"^0.3\"},{\"name\":\"memchr\",\"req\":\"^2.7\"},{\"default_features\":false,\"name\":\"nt-time\",\"optional\":true,\"req\":\"^0.10.6\"},{\"name\":\"pbkdf2\",\"optional\":true,\"req\":\"^0.12\"},{\"name\":\"sha1\",\"optional\":true,\"req\":\"^0.10\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.15\"},{\"name\":\"thiserror\",\"req\":\"^2\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"time\",\"optional\":true,\"req\":\"^0.3.37\"},{\"default_features\":false,\"features\":[\"formatting\",\"macros\"],\"kind\":\"dev\",\"name\":\"time\",\"req\":\"^0.3.37\"},{\"kind\":\"dev\",\"name\":\"walkdir\",\"req\":\"^2.5\"},{\"name\":\"xz2\",\"optional\":true,\"req\":\"^0.1.7\"},{\"features\":[\"zeroize_derive\"],\"name\":\"zeroize\",\"optional\":true,\"req\":\"^1.8\"},{\"name\":\"zopfli\",\"optional\":true,\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"zstd\",\"optional\":true,\"req\":\"^0.13\"}],\"features\":{\"_all-features\":[],\"_deflate-any\":[],\"aes-crypto\":[\"aes\",\"constant_time_eq\",\"hmac\",\"pbkdf2\",\"sha1\",\"getrandom\",\"zeroize\"],\"chrono\":[\"chrono/default\"],\"default\":[\"aes-crypto\",\"bzip2\",\"deflate64\",\"deflate\",\"lzma\",\"time\",\"zstd\",\"xz\"],\"deflate\":[\"flate2/rust_backend\",\"deflate-zopfli\",\"deflate-flate2\"],\"deflate-flate2\":[\"_deflate-any\"],\"deflate-miniz\":[\"deflate\",\"deflate-flate2\"],\"deflate-zlib\":[\"flate2/zlib\",\"deflate-flate2\"],\"deflate-zlib-ng\":[\"flate2/zlib-ng\",\"deflate-flate2\"],\"deflate-zopfli\":[\"zopfli\",\"_deflate-any\"],\"lzma\":[\"lzma-rs/stream\"],\"nt-time\":[\"dep:nt-time\"],\"unreserved\":[],\"xz\":[\"dep:xz2\"]}}", "zlib-rs_0.6.3": "{\"dependencies\":[{\"features\":[\"derive\"],\"name\":\"arbitrary\",\"optional\":true,\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"crc32fast\",\"req\":\"^1.3.2\"},{\"kind\":\"dev\",\"name\":\"memoffset\",\"req\":\"^0.9.1\"},{\"default_features\":false,\"name\":\"quickcheck\",\"optional\":true,\"req\":\"^1.0.3\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"quickcheck\",\"req\":\"^1.0.3\"}],\"features\":{\"ZLIB_DEBUG\":[],\"__internal-api\":[],\"__internal-fuzz\":[\"arbitrary\"],\"__internal-fuzz-disable-checksum\":[],\"__internal-test\":[\"quickcheck\"],\"avx512\":[\"vpclmulqdq\"],\"c-allocator\":[],\"default\":[\"std\",\"c-allocator\"],\"rust-allocator\":[],\"std\":[\"rust-allocator\"],\"vpclmulqdq\":[]}}", "zmij_1.0.19": "{\"dependencies\":[{\"default_features\":false,\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.8\",\"target\":\"cfg(not(miri))\"},{\"name\":\"no-panic\",\"optional\":true,\"req\":\"^0.1.36\"},{\"kind\":\"dev\",\"name\":\"num-bigint\",\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"num-integer\",\"req\":\"^0.1\"},{\"kind\":\"dev\",\"name\":\"num_cpus\",\"req\":\"^1.8\"},{\"kind\":\"dev\",\"name\":\"opt-level\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.9\"},{\"kind\":\"dev\",\"name\":\"ryu\",\"req\":\"^1\"}],\"features\":{}}", "zmij_1.0.21": "{\"dependencies\":[{\"default_features\":false,\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.8\",\"target\":\"cfg(not(miri))\"},{\"name\":\"no-panic\",\"optional\":true,\"req\":\"^0.1.36\"},{\"kind\":\"dev\",\"name\":\"num-bigint\",\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"num-integer\",\"req\":\"^0.1\"},{\"kind\":\"dev\",\"name\":\"num_cpus\",\"req\":\"^1.8\"},{\"kind\":\"dev\",\"name\":\"opt-level\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.10\"},{\"kind\":\"dev\",\"name\":\"ryu\",\"req\":\"^1\"}],\"features\":{}}", - "zoneinfo64_0.2.1": "{\"dependencies\":[{\"default_features\":false,\"name\":\"calendrical_calculations\",\"req\":\"^0.2.3\"},{\"name\":\"chrono\",\"optional\":true,\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"chrono-tz\",\"req\":\"^0.10.4\"},{\"default_features\":false,\"name\":\"icu_locale_core\",\"req\":\"^2.1.0\"},{\"kind\":\"dev\",\"name\":\"itertools\",\"req\":\"^0.14.0\"},{\"default_features\":false,\"features\":[\"tzdb-bundle-always\",\"std\"],\"kind\":\"dev\",\"name\":\"jiff\",\"req\":\"^0.2.15\"},{\"default_features\":false,\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"name\":\"resb\",\"req\":\"^0.1.0\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"req\":\"^1.0.220\"}],\"features\":{\"chrono\":[\"dep:chrono\"]}}", + "zoneinfo64_0.3.0": "{\"dependencies\":[{\"default_features\":false,\"name\":\"calendrical_calculations\",\"req\":\"^0.2.4\"},{\"name\":\"chrono\",\"optional\":true,\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"chrono-tz\",\"req\":\"^0.10.4\"},{\"default_features\":false,\"name\":\"icu_locale_core\",\"req\":\"^2.2.0\"},{\"kind\":\"dev\",\"name\":\"itertools\",\"req\":\"^0.14.0\"},{\"default_features\":false,\"features\":[\"tzdb-bundle-always\",\"std\"],\"kind\":\"dev\",\"name\":\"jiff\",\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"name\":\"resb\",\"req\":\"^0.1.2\"},{\"default_features\":false,\"features\":[\"derive\"],\"name\":\"serde\",\"req\":\"^1.0.220\"}],\"features\":{\"chrono\":[\"dep:chrono\"]}}", "zopfli_0.8.3": "{\"dependencies\":[{\"name\":\"bumpalo\",\"req\":\"^3.19.0\"},{\"default_features\":false,\"name\":\"crc32fast\",\"optional\":true,\"req\":\"^1.5.0\"},{\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.28\"},{\"kind\":\"dev\",\"name\":\"miniz_oxide\",\"req\":\"^0.8.9\"},{\"kind\":\"dev\",\"name\":\"proptest\",\"req\":\"^1.7.0\"},{\"kind\":\"dev\",\"name\":\"proptest-derive\",\"req\":\"^0.6.0\"},{\"default_features\":false,\"name\":\"simd-adler32\",\"optional\":true,\"req\":\"^0.3.7\"}],\"features\":{\"default\":[\"gzip\",\"std\",\"zlib\"],\"gzip\":[\"dep:crc32fast\"],\"nightly\":[\"crc32fast?/nightly\"],\"std\":[\"crc32fast?/std\",\"dep:log\",\"simd-adler32?/std\"],\"zlib\":[\"dep:simd-adler32\"]}}", "zstd-safe_5.0.2+zstd.1.5.2": "{\"dependencies\":[{\"name\":\"libc\",\"req\":\"^0.2.21\"},{\"default_features\":false,\"name\":\"zstd-sys\",\"req\":\"^2.0.1\"}],\"features\":{\"arrays\":[],\"bindgen\":[\"zstd-sys/bindgen\"],\"debug\":[\"zstd-sys/debug\"],\"default\":[\"legacy\",\"arrays\",\"zdict_builder\"],\"doc-cfg\":[],\"experimental\":[\"zstd-sys/experimental\"],\"legacy\":[\"zstd-sys/legacy\"],\"no_asm\":[\"zstd-sys/no_asm\"],\"pkg-config\":[\"zstd-sys/pkg-config\"],\"std\":[\"zstd-sys/std\"],\"thin\":[\"zstd-sys/thin\"],\"zdict_builder\":[\"zstd-sys/zdict_builder\"],\"zstdmt\":[\"zstd-sys/zstdmt\"]}}", "zstd-safe_7.2.4": "{\"dependencies\":[{\"default_features\":false,\"name\":\"zstd-sys\",\"req\":\"^2.0.15\"}],\"features\":{\"arrays\":[],\"bindgen\":[\"zstd-sys/bindgen\"],\"debug\":[\"zstd-sys/debug\"],\"default\":[\"legacy\",\"arrays\",\"zdict_builder\"],\"doc-cfg\":[],\"experimental\":[\"zstd-sys/experimental\"],\"fat-lto\":[\"zstd-sys/fat-lto\"],\"legacy\":[\"zstd-sys/legacy\"],\"no_asm\":[\"zstd-sys/no_asm\"],\"pkg-config\":[\"zstd-sys/pkg-config\"],\"seekable\":[\"zstd-sys/seekable\"],\"std\":[\"zstd-sys/std\"],\"thin\":[\"zstd-sys/thin\"],\"thin-lto\":[\"zstd-sys/thin-lto\"],\"zdict_builder\":[\"zstd-sys/zdict_builder\"],\"zstdmt\":[\"zstd-sys/zstdmt\"]}}", diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index bbb61f8337f6..b4595f262c8b 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -1518,9 +1518,9 @@ checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" [[package]] name = "calendrical_calculations" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a0b39595c6ee54a8d0900204ba4c401d0ab4eb45adaf07178e8d017541529e7" +checksum = "5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26" dependencies = [ "core_maths", "displaydoc", @@ -5039,9 +5039,9 @@ dependencies = [ [[package]] name = "diplomat" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9adb46b05e2f53dcf6a7dfc242e4ce9eb60c369b6b6eb10826a01e93167f59c6" +checksum = "7935649d00000f5c5d735448ad3dc07b9738160727017914cf42138b8e8e6611" dependencies = [ "diplomat_core", "proc-macro2", @@ -5051,15 +5051,15 @@ dependencies = [ [[package]] name = "diplomat-runtime" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0569bd3caaf13829da7ee4e83dbf9197a0e1ecd72772da6d08f0b4c9285c8d29" +checksum = "970ac38ad677632efcee6d517e783958da9bc78ec206d8d5e35b459ffc5e4864" [[package]] name = "diplomat_core" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51731530ed7f2d4495019abc7df3744f53338e69e2863a6a64ae91821c763df1" +checksum = "9cf41b94101a4bce993febaf0098092b0bb31deaf0ecaf6e0a2562465f61b383" dependencies = [ "proc-macro2", "quote", @@ -5609,9 +5609,9 @@ dependencies = [ [[package]] name = "fixed_decimal" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35eabf480f94d69182677e37571d3be065822acfafd12f2f085db44fbbcc8e57" +checksum = "79c3c892f121fff406e5dd6b28c1b30096b95111c30701a899d4f2b18da6d1bd" dependencies = [ "displaydoc", "smallvec", @@ -7454,9 +7454,9 @@ dependencies = [ [[package]] name = "icu_calendar" -version = "2.1.1" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f0e52e009b6b16ba9c0693578796f2dd4aaa59a7f8f920423706714a89ac4e" +checksum = "a2b2acc6263f494f1df50685b53ff8e57869e47d5c6fe39c23d518ae9a4f3e45" dependencies = [ "calendrical_calculations", "displaydoc", @@ -7470,18 +7470,19 @@ dependencies = [ [[package]] name = "icu_calendar_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527f04223b17edfe0bd43baf14a0cb1b017830db65f3950dc00224860a9a446d" +checksum = "118577bcf3a0fa7c6ac0a7d6e951814da84ee56b9b1f68fb4d8d10b08cefaf4d" [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -7489,14 +7490,16 @@ dependencies = [ [[package]] name = "icu_decimal" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38c52231bc348f9b982c1868a2af3195199623007ba2c7650f432038f5b3e8e" +checksum = "288247df2e32aa776ac54fdd64de552149ac43cb840f2761811f0e8d09719dd4" dependencies = [ + "displaydoc", "fixed_decimal", "icu_decimal_data", "icu_locale", "icu_locale_core", + "icu_plurals", "icu_provider", "writeable", "zerovec", @@ -7504,15 +7507,15 @@ dependencies = [ [[package]] name = "icu_decimal_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2905b4044eab2dd848fe84199f9195567b63ab3a93094711501363f63546fef7" +checksum = "6f14a5ca9e8af29eef62064f269078424283d90dbaffeac5225addf62aaabc22" [[package]] name = "icu_locale" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532b11722e350ab6bf916ba6eb0efe3ee54b932666afec989465f9243fe6dd60" +checksum = "d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26" dependencies = [ "icu_collections", "icu_locale_core", @@ -7525,9 +7528,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -7539,15 +7542,15 @@ dependencies = [ [[package]] name = "icu_locale_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c5f1d16b4c3a2642d3a719f18f6b06070ab0aef246a6418130c955ae08aa831" +checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -7559,15 +7562,34 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_plurals" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a50023f1d49ad5c4333380328a0d4a19e4b9d6d842ec06639affd5ba47c8103" +dependencies = [ + "fixed_decimal", + "icu_locale", + "icu_plurals_data", + "icu_provider", + "zerovec", +] + +[[package]] +name = "icu_plurals_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "8485497155dc865f901decb93ecc20d3e467df67bfeceb91e3ba34e2b11e8e1d" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -7579,15 +7601,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -8969,7 +8991,7 @@ version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "chrono", "getrandom 0.2.17", "http 1.4.0", @@ -9437,7 +9459,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.45.0", + "windows-sys 0.61.2", ] [[package]] @@ -10842,9 +10864,9 @@ dependencies = [ [[package]] name = "resb" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a067ab3b5ca3b4dc307d0de9cf75f9f5e6ca9717b192b2f28a36c83e5de9e76" +checksum = "22d392791f3c6802a1905a509e9d1a6039cbbcb5e9e00e5a6d3661f7c874f390" dependencies = [ "potential_utf", "serde_core", @@ -12561,14 +12583,14 @@ dependencies = [ [[package]] name = "temporal_capi" -version = "0.1.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a151e402c2bdb6a3a2a2f3f225eddaead2e7ce7dd5d3fa2090deb11b17aa4ed8" +checksum = "8a2a1f001e756a9f5f2d175a9965c4c0b3a054f09f30de3a75ab49765f2deb36" dependencies = [ "diplomat", "diplomat-runtime", "icu_calendar", - "icu_locale", + "icu_locale_core", "num-traits", "temporal_rs", "timezone_provider", @@ -12578,13 +12600,14 @@ dependencies = [ [[package]] name = "temporal_rs" -version = "0.1.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88afde3bd75d2fc68d77a914bece426aa08aa7649ffd0cdd4a11c3d4d33474d1" +checksum = "9a902a45282e5175186b21d355efc92564601efe6e2d92818dc9e333d50bd4de" dependencies = [ + "calendrical_calculations", "core_maths", "icu_calendar", - "icu_locale", + "icu_locale_core", "ixdtf", "num-traits", "timezone_provider", @@ -12801,9 +12824,9 @@ dependencies = [ [[package]] name = "timezone_provider" -version = "0.1.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9ba0000e9e73862f3e7ca1ff159e2ddf915c9d8bb11e38a7874760f445d993" +checksum = "c48f9b04628a2b813051e4dfe97c65281e49625eabd09ec343190e31e399a8c2" dependencies = [ "tinystr", "zerotrie", @@ -12834,9 +12857,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "serde_core", @@ -13650,9 +13673,9 @@ dependencies = [ [[package]] name = "v8" -version = "146.4.0" +version = "147.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97bcac5cdc5a195a4813f1855a6bc658f240452aac36caa12fd6c6f16026ab1" +checksum = "2df8fffd507fb18ed000673a83d937f58e60fb07f3306b2274284125b15137cd" dependencies = [ "bindgen", "bitflags 2.10.0", @@ -14081,7 +14104,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -14802,9 +14825,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -14813,9 +14836,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -14948,20 +14971,21 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", "zerofrom", + "zerovec", ] [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "serde", "yoke", @@ -14971,9 +14995,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", @@ -15044,9 +15068,9 @@ checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" [[package]] name = "zoneinfo64" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2e5597efbe7c421da8a7fd396b20b571704e787c21a272eecf35dfe9d386f0" +checksum = "ed6eb2607e906160c457fd573e9297e65029669906b9ac8fb1b5cd5e055f0705" dependencies = [ "calendrical_calculations", "icu_locale_core", diff --git a/codex-rs/Cargo.toml b/codex-rs/Cargo.toml index 7e5c6474216a..dffdadc8e671 100644 --- a/codex-rs/Cargo.toml +++ b/codex-rs/Cargo.toml @@ -411,7 +411,7 @@ unicode-width = "0.2" url = "2" urlencoding = "2.1" uuid = "1" -v8 = "=146.4.0" +v8 = "=147.4.0" vt100 = "0.16.2" walkdir = "2.5.0" webbrowser = "1.0" diff --git a/third_party/v8/BUILD.bazel b/third_party/v8/BUILD.bazel index 94bb3b32c6a5..d6aa4c2cc9c9 100644 --- a/third_party/v8/BUILD.bazel +++ b/third_party/v8/BUILD.bazel @@ -210,6 +210,42 @@ cc_library( ], ) +genrule( + name = "binding_cc_147_4_0", + srcs = ["@v8_crate_147_4_0//:binding_cc"], + outs = ["binding_147_4_0.cc"], + cmd = " ".join([ + "sed", + "-e '/#include \"v8\\/src\\/flags\\/flags.h\"/d'", + "-e 's|\"v8/src/libplatform/default-platform.h\"|\"src/libplatform/default-platform.h\"|'", + "-e 's|#include \"support.h\"|#include \"support_147_4_0.h\"|'", + "-e 's| namespace i = v8::internal;| (void)usage;|'", + "-e '/using HelpOptions = i::FlagList::HelpOptions;/d'", + "-e '/HelpOptions help_options = HelpOptions(HelpOptions::kExit, usage);/d'", + "-e 's| i::FlagList::SetFlagsFromCommandLine(argc, argv, true, help_options);| v8::V8::SetFlagsFromCommandLine(argc, argv, true);|'", + "$(location @v8_crate_147_4_0//:binding_cc)", + ">", + '"$@"', + ]), +) + +copy_file( + name = "support_h_147_4_0", + src = "@v8_crate_147_4_0//:support_h", + out = "support_147_4_0.h", +) + +cc_library( + name = "v8_147_4_0_binding", + srcs = [":binding_cc_147_4_0"], + hdrs = [":support_h_147_4_0"], + copts = V8_COPTS, + deps = [ + "@v8//:core_lib_icu", + "@v8//:rusty_v8_internal_headers", + ], +) + cc_static_library( name = "v8_146_4_0_aarch64_apple_darwin_bazel", deps = [":v8_146_4_0_binding"], @@ -292,6 +328,52 @@ filegroup( srcs = ["@v8_crate_146_4_0//:src_binding_release_x86_64_unknown_linux_gnu"], ) +cc_static_library( + name = "v8_147_4_0_aarch64_unknown_linux_musl_release_base", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + +genrule( + name = "v8_147_4_0_aarch64_unknown_linux_musl_release", + srcs = [ + ":v8_147_4_0_aarch64_unknown_linux_musl_release_base", + "@llvm//runtimes/compiler-rt:clang_rt.builtins.static", + ], + tools = [ + "@llvm//tools:llvm-ar", + "@llvm//tools:llvm-ranlib", + ], + outs = ["libv8_147_4_0_aarch64_unknown_linux_musl.a"], + cmd = """ + cat > "$(@D)/merge.mri" <<'EOF' +create $@ +addlib $(location :v8_147_4_0_aarch64_unknown_linux_musl_release_base) +addlib $(location @llvm//runtimes/compiler-rt:clang_rt.builtins.static) +save +end +EOF + $(location @llvm//tools:llvm-ar) -M < "$(@D)/merge.mri" + $(location @llvm//tools:llvm-ranlib) "$@" + """, +) + +cc_static_library( + name = "v8_147_4_0_x86_64_unknown_linux_musl_release", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + +filegroup( + name = "src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", + srcs = ["@v8_crate_147_4_0//:src_binding_release_aarch64_unknown_linux_gnu"], +) + +filegroup( + name = "src_binding_release_x86_64_unknown_linux_musl_147_4_0_release", + srcs = ["@v8_crate_147_4_0//:src_binding_release_x86_64_unknown_linux_gnu"], +) + filegroup( name = "rusty_v8_release_pair_x86_64_apple_darwin", srcs = [ @@ -327,16 +409,16 @@ filegroup( filegroup( name = "rusty_v8_release_pair_x86_64_unknown_linux_musl", srcs = [ - ":v8_146_4_0_x86_64_unknown_linux_musl_release", - ":src_binding_release_x86_64_unknown_linux_musl_release", + ":v8_147_4_0_x86_64_unknown_linux_musl_release", + ":src_binding_release_x86_64_unknown_linux_musl_147_4_0_release", ], ) filegroup( name = "rusty_v8_release_pair_aarch64_unknown_linux_musl", srcs = [ - ":v8_146_4_0_aarch64_unknown_linux_musl_release", - ":src_binding_release_aarch64_unknown_linux_musl_release", + ":v8_147_4_0_aarch64_unknown_linux_musl_release", + ":src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", ], ) diff --git a/third_party/v8/README.md b/third_party/v8/README.md index f0961df1d071..bd4e10875422 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -20,8 +20,8 @@ artifact contract. Current pinned versions: -- Rust crate: `v8 = =146.4.0` -- Embedded upstream V8 source for musl release builds: `14.6.202.9` +- Rust crate: `v8 = =147.4.0` +- Embedded upstream V8 source for musl release builds: `14.7.173.20` When bumping the Rust crate version, keep the checked-in checksum manifest and `MODULE.bazel` in sync: From 15356f986f829615f19e24bf72e905fd704e3cae Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Wed, 6 May 2026 00:03:47 +0000 Subject: [PATCH 02/19] ci: make rusty_v8 staging select host llvm tools Co-authored-by: Codex --- .github/scripts/rusty_v8_bazel.py | 41 +++++++++++++++++++- .github/scripts/test_rusty_v8_bazel.py | 53 ++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index 5ad6d3c40806..712c2e300476 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -202,14 +202,51 @@ def single_bazel_output_file( return outputs[0] +def host_runnable_bazel_output_file( + platform: str, + label: str, + compilation_mode: str = "fastbuild", + bazel_configs: list[str] | None = None, +) -> Path: + outputs = ensure_bazel_output_files(platform, [label], compilation_mode, bazel_configs) + if len(outputs) == 1: + return outputs[0] + + runnable_outputs = [] + for output in outputs: + try: + result = subprocess.run( + [str(output), "--version"], + cwd=ROOT, + capture_output=True, + text=True, + ) + except OSError: + continue + if result.returncode == 0: + runnable_outputs.append(output) + + if len(runnable_outputs) != 1: + raise SystemExit( + f"expected exactly one host-runnable output for {label}, " + f"found {runnable_outputs} from {outputs}" + ) + return runnable_outputs[0] + + def merged_musl_archive( platform: str, lib_path: Path, compilation_mode: str = "fastbuild", bazel_configs: list[str] | None = None, ) -> Path: - llvm_ar = single_bazel_output_file(platform, LLVM_AR_LABEL, compilation_mode, bazel_configs) - llvm_ranlib = single_bazel_output_file( + llvm_ar = host_runnable_bazel_output_file( + platform, + LLVM_AR_LABEL, + compilation_mode, + bazel_configs, + ) + llvm_ranlib = host_runnable_bazel_output_file( platform, LLVM_RANLIB_LABEL, compilation_mode, diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index e86e82e8b24e..95c3eac157e2 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -4,11 +4,64 @@ import textwrap import unittest +from pathlib import Path +from unittest.mock import Mock +from unittest.mock import patch +import rusty_v8_bazel import rusty_v8_module_bazel class RustyV8BazelTest(unittest.TestCase): + @patch("rusty_v8_bazel.ensure_bazel_output_files") + @patch("rusty_v8_bazel.subprocess.run") + def test_host_runnable_bazel_output_file_selects_runnable_candidate( + self, + run: Mock, + ensure_outputs: Mock, + ) -> None: + amd64_tool = Path("/tmp/llvm-amd64/bin/llvm-ar") + arm64_tool = Path("/tmp/llvm-arm64/bin/llvm-ar") + ensure_outputs.return_value = [amd64_tool, arm64_tool] + run.side_effect = [ + OSError("Exec format error"), + Mock(returncode=0), + ] + + self.assertEqual( + arm64_tool, + rusty_v8_bazel.host_runnable_bazel_output_file( + "linux_arm64_musl", + "@llvm//tools:llvm-ar", + "opt", + ), + ) + + @patch("rusty_v8_bazel.ensure_bazel_output_files") + @patch("rusty_v8_bazel.subprocess.run") + def test_host_runnable_bazel_output_file_rejects_ambiguous_candidates( + self, + run: Mock, + ensure_outputs: Mock, + ) -> None: + amd64_tool = Path("/tmp/llvm-amd64/bin/llvm-ar") + arm64_tool = Path("/tmp/llvm-arm64/bin/llvm-ar") + ensure_outputs.return_value = [amd64_tool, arm64_tool] + run.side_effect = [ + Mock(returncode=0), + Mock(returncode=0), + ] + + with self.assertRaisesRegex( + SystemExit, + "expected exactly one host-runnable output", + ): + rusty_v8_bazel.host_runnable_bazel_output_file( + "linux_arm64_musl", + "@llvm//tools:llvm-ar", + "opt", + ) + def test_update_module_bazel_replaces_and_inserts_sha256(self) -> None: module_bazel = textwrap.dedent( """\ From d3dd2d93314f4973f8cedc6ec635d0ce7b37517b Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Wed, 6 May 2026 01:33:28 +0000 Subject: [PATCH 03/19] build: add sandbox rusty_v8 artifact lane Produce explicitly named sandbox release pairs alongside the current compatibility artifacts, and validate staged sandbox outputs before publication across the supported artifact targets. Co-authored-by: Codex --- .github/scripts/rusty_v8_bazel.py | 33 +++-- .github/scripts/test_rusty_v8_bazel.py | 40 ++++++ .github/workflows/rusty-v8-release.yml | 163 +++++++++++++++++++++++-- .github/workflows/v8-canary.yml | 43 +++++-- third_party/v8/BUILD.bazel | 54 ++++++++ third_party/v8/README.md | 25 +++- 6 files changed, 328 insertions(+), 30 deletions(-) diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index 712c2e300476..f2712d4a3120 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -29,6 +29,8 @@ ] LLVM_AR_LABEL = "@llvm//tools:llvm-ar" LLVM_RANLIB_LABEL = "@llvm//tools:llvm-ranlib" +RELEASE_ARTIFACT_PROFILE = "release" +SANDBOX_ARTIFACT_PROFILE = "ptrcomp_sandbox_release" def bazel_execroot() -> Path: @@ -126,9 +128,10 @@ def ensure_bazel_output_files( return outputs -def release_pair_label(target: str) -> str: +def release_pair_label(target: str, sandbox: bool = False) -> str: target_suffix = target.replace("-", "_") - return f"//third_party/v8:rusty_v8_release_pair_{target_suffix}" + pair_kind = "sandbox_release_pair" if sandbox else "release_pair" + return f"//third_party/v8:rusty_v8_{pair_kind}_{target_suffix}" def resolved_v8_crate_version() -> str: @@ -180,10 +183,18 @@ def command_manifest_path(manifest: Path | None, version: str) -> Path: return ROOT / manifest -def staged_archive_name(target: str, source_path: Path) -> str: +def staged_archive_name(target: str, source_path: Path, artifact_profile: str) -> str: if source_path.suffix == ".lib": - return f"rusty_v8_release_{target}.lib.gz" - return f"librusty_v8_release_{target}.a.gz" + return f"rusty_v8_{artifact_profile}_{target}.lib.gz" + return f"librusty_v8_{artifact_profile}_{target}.a.gz" + + +def staged_binding_name(target: str, artifact_profile: str) -> str: + return f"src_binding_{artifact_profile}_{target}.rs" + + +def staged_checksums_name(target: str, artifact_profile: str) -> str: + return f"rusty_v8_{artifact_profile}_{target}.sha256" def is_musl_archive_target(target: str, source_path: Path) -> bool: @@ -285,10 +296,11 @@ def stage_release_pair( output_dir: Path, compilation_mode: str = "fastbuild", bazel_configs: list[str] | None = None, + sandbox: bool = False, ) -> None: outputs = ensure_bazel_output_files( platform, - [release_pair_label(target)], + [release_pair_label(target, sandbox)], compilation_mode, bazel_configs, ) @@ -304,8 +316,9 @@ def stage_release_pair( raise SystemExit(f"missing Rust binding output for {target}") from exc output_dir.mkdir(parents=True, exist_ok=True) - staged_library = output_dir / staged_archive_name(target, lib_path) - staged_binding = output_dir / f"src_binding_release_{target}.rs" + artifact_profile = SANDBOX_ARTIFACT_PROFILE if sandbox else RELEASE_ARTIFACT_PROFILE + staged_library = output_dir / staged_archive_name(target, lib_path, artifact_profile) + staged_binding = output_dir / staged_binding_name(target, artifact_profile) source_archive = ( merged_musl_archive(platform, lib_path, compilation_mode, bazel_configs) if is_musl_archive_target(target, lib_path) @@ -324,7 +337,7 @@ def stage_release_pair( shutil.copyfile(binding_path, staged_binding) - staged_checksums = output_dir / f"rusty_v8_release_{target}.sha256" + staged_checksums = output_dir / staged_checksums_name(target, artifact_profile) with staged_checksums.open("w", encoding="utf-8") as checksums: for path in [staged_library, staged_binding]: digest = hashlib.sha256() @@ -346,6 +359,7 @@ def parse_args() -> argparse.Namespace: stage_release_pair_parser.add_argument("--platform", required=True) stage_release_pair_parser.add_argument("--target", required=True) stage_release_pair_parser.add_argument("--output-dir", required=True) + stage_release_pair_parser.add_argument("--sandbox", action="store_true") stage_release_pair_parser.add_argument( "--bazel-config", action="append", @@ -390,6 +404,7 @@ def main() -> int: output_dir=Path(args.output_dir), compilation_mode=args.compilation_mode, bazel_configs=args.bazel_configs, + sandbox=args.sandbox, ) return 0 if args.command == "resolved-v8-crate-version": diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index 95c3eac157e2..c013eb7ca8e7 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -13,6 +13,46 @@ class RustyV8BazelTest(unittest.TestCase): + def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self) -> None: + self.assertEqual( + "//third_party/v8:rusty_v8_release_pair_x86_64_unknown_linux_musl", + rusty_v8_bazel.release_pair_label("x86_64-unknown-linux-musl"), + ) + self.assertEqual( + "//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_unknown_linux_musl", + rusty_v8_bazel.release_pair_label("x86_64-unknown-linux-musl", sandbox=True), + ) + self.assertEqual( + "librusty_v8_release_x86_64-unknown-linux-musl.a.gz", + rusty_v8_bazel.staged_archive_name( + "x86_64-unknown-linux-musl", + Path("libv8.a"), + rusty_v8_bazel.RELEASE_ARTIFACT_PROFILE, + ), + ) + self.assertEqual( + "rusty_v8_ptrcomp_sandbox_release_x86_64-pc-windows-msvc.lib.gz", + rusty_v8_bazel.staged_archive_name( + "x86_64-pc-windows-msvc", + Path("v8.lib"), + rusty_v8_bazel.SANDBOX_ARTIFACT_PROFILE, + ), + ) + self.assertEqual( + "src_binding_ptrcomp_sandbox_release_x86_64-unknown-linux-musl.rs", + rusty_v8_bazel.staged_binding_name( + "x86_64-unknown-linux-musl", + rusty_v8_bazel.SANDBOX_ARTIFACT_PROFILE, + ), + ) + self.assertEqual( + "rusty_v8_ptrcomp_sandbox_release_x86_64-unknown-linux-musl.sha256", + rusty_v8_bazel.staged_checksums_name( + "x86_64-unknown-linux-musl", + rusty_v8_bazel.SANDBOX_ARTIFACT_PROFILE, + ), + ) + @patch("rusty_v8_bazel.ensure_bazel_output_files") @patch("rusty_v8_bazel.subprocess.run") def test_host_runnable_bazel_output_file_selects_runnable_candidate( diff --git a/.github/workflows/rusty-v8-release.yml b/.github/workflows/rusty-v8-release.yml index 5a436722bbe3..2b5962888594 100644 --- a/.github/workflows/rusty-v8-release.yml +++ b/.github/workflows/rusty-v8-release.yml @@ -46,14 +46,14 @@ jobs: expected_release_tag="rusty-v8-v${V8_VERSION}" release_tag="${GITHUB_REF_NAME}" if [[ "${release_tag}" != "${expected_release_tag}" ]]; then - echo "Tag ${release_tag} does not match resolved v8 crate version ${V8_VERSION}." >&2 + echo "Tag ${release_tag} does not match expected release tag ${expected_release_tag}." >&2 exit 1 fi echo "release_tag=${release_tag}" >> "$GITHUB_OUTPUT" build: - name: Build ${{ matrix.target }} + name: Build ${{ matrix.variant }} ${{ matrix.target }} needs: metadata runs-on: ${{ matrix.runner }} permissions: @@ -65,10 +65,34 @@ jobs: include: - runner: ubuntu-24.04 platform: linux_amd64_musl + sandbox: false target: x86_64-unknown-linux-musl + variant: release - runner: ubuntu-24.04-arm platform: linux_arm64_musl + sandbox: false target: aarch64-unknown-linux-musl + variant: release + - runner: ubuntu-24.04 + platform: linux_amd64_musl + sandbox: true + target: x86_64-unknown-linux-musl + variant: ptrcomp-sandbox + - runner: ubuntu-24.04-arm + platform: linux_arm64_musl + sandbox: true + target: aarch64-unknown-linux-musl + variant: ptrcomp-sandbox + - runner: ubuntu-24.04 + platform: windows_amd64 + sandbox: true + target: x86_64-pc-windows-msvc + variant: ptrcomp-sandbox + - runner: ubuntu-24.04-arm + platform: windows_arm64 + sandbox: true + target: aarch64-pc-windows-msvc + variant: ptrcomp-sandbox steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -89,13 +113,20 @@ jobs: env: BUILDBUDDY_API_KEY: ${{ secrets.BUILDBUDDY_API_KEY }} PLATFORM: ${{ matrix.platform }} + SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} shell: bash run: | set -euo pipefail target_suffix="${TARGET//-/_}" - pair_target="//third_party/v8:rusty_v8_release_pair_${target_suffix}" + pair_kind="release_pair" + bazel_config_args=(--config=v8-release-compat) + if [[ "${SANDBOX}" == "true" ]]; then + pair_kind="sandbox_release_pair" + bazel_config_args=() + fi + pair_target="//third_party/v8:rusty_v8_${pair_kind}_${target_suffix}" extra_targets=() if [[ "${TARGET}" == *-unknown-linux-musl ]]; then extra_targets=( @@ -109,7 +140,7 @@ jobs: -c opt "--platforms=@llvm//platforms:${PLATFORM}" - --config=v8-release-compat + "${bazel_config_args[@]}" "${pair_target}" "${extra_targets[@]}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) @@ -124,28 +155,138 @@ jobs: - name: Stage release pair env: PLATFORM: ${{ matrix.platform }} + SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} shell: bash run: | set -euo pipefail - python3 .github/scripts/rusty_v8_bazel.py stage-release-pair \ - --platform "${PLATFORM}" \ - --target "${TARGET}" \ - --compilation-mode opt \ - --bazel-config v8-release-compat \ + stage_args=( + --platform "${PLATFORM}" + --target "${TARGET}" + --compilation-mode opt --output-dir "dist/${TARGET}" + ) + if [[ "${SANDBOX}" == "true" ]]; then + stage_args+=(--sandbox) + else + stage_args+=(--bazel-config v8-release-compat) + fi + + python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" - - name: Upload staged musl artifacts + - name: Upload staged artifacts uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: - name: rusty-v8-${{ needs.metadata.outputs.v8_version }}-${{ matrix.target }} + name: rusty-v8-${{ needs.metadata.outputs.v8_version }}-${{ matrix.variant }}-${{ matrix.target }} path: dist/${{ matrix.target }}/* + validate-sandbox: + name: Validate sandbox artifacts - ${{ matrix.target }} + needs: + - metadata + - build + runs-on: ${{ matrix.runs_on }} + defaults: + run: + working-directory: codex-rs + strategy: + fail-fast: false + matrix: + include: + - target: x86_64-unknown-linux-musl + exe_suffix: "" + runs_on: + group: codex-runners + labels: codex-linux-x64 + - target: aarch64-unknown-linux-musl + exe_suffix: "" + runs_on: + group: codex-runners + labels: codex-linux-arm64 + - target: x86_64-pc-windows-msvc + exe_suffix: ".exe" + runs_on: + group: codex-runners + labels: codex-windows-x64 + - target: aarch64-pc-windows-msvc + exe_suffix: ".exe" + runs_on: + group: codex-runners + labels: codex-windows-arm64 + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + + - if: ${{ runner.os == 'Linux' }} + name: Install Linux build dependencies + shell: bash + run: | + set -euo pipefail + sudo apt-get update -y + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + pkg-config \ + libcap-dev + + - uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 + with: + targets: ${{ matrix.target }} + + - name: Download staged sandbox artifacts + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 + with: + name: rusty-v8-${{ needs.metadata.outputs.v8_version }}-ptrcomp-sandbox-${{ matrix.target }} + path: ${{ runner.temp }}/rusty_v8_sandbox + + - name: Configure sandboxed rusty_v8 artifact overrides + env: + ARTIFACT_DIR: ${{ runner.temp }}/rusty_v8_sandbox + TARGET: ${{ matrix.target }} + shell: bash + run: | + set -euo pipefail + + artifact_profile="ptrcomp_sandbox_release" + binding_path="${ARTIFACT_DIR}/src_binding_${artifact_profile}_${TARGET}.rs" + checksums_path="${ARTIFACT_DIR}/rusty_v8_${artifact_profile}_${TARGET}.sha256" + + if [[ "${TARGET}" == *-pc-windows-msvc ]]; then + archive_name="rusty_v8_${artifact_profile}_${TARGET}.lib.gz" + else + archive_name="librusty_v8_${artifact_profile}_${TARGET}.a.gz" + fi + archive_path="${ARTIFACT_DIR}/${archive_name}" + + if [[ "$(wc -l < "${checksums_path}")" -ne 2 ]]; then + echo "Expected exactly two checksums for ${TARGET} in ${checksums_path}" >&2 + exit 1 + fi + + (cd "${ARTIFACT_DIR}" && sha256sum -c "${checksums_path}") + echo "RUSTY_V8_ARCHIVE=${archive_path}" >> "${GITHUB_ENV}" + echo "RUSTY_V8_SRC_BINDING_PATH=${binding_path}" >> "${GITHUB_ENV}" + + - name: Run sandboxed V8 probe tests + shell: bash + run: cargo test -p codex-v8-poc --target "${{ matrix.target }}" --features sandbox + + - name: Run sandboxed code-mode tests + shell: bash + run: cargo test -p codex-code-mode --target "${{ matrix.target }}" --features sandbox + + - name: Build release binary against sandboxed artifacts + shell: bash + run: cargo build --target "${{ matrix.target }}" --release --bin codex + + - name: Smoke release binary + shell: bash + run: "target/${{ matrix.target }}/release/codex${{ matrix.exe_suffix }} --version" + publish-release: needs: - metadata - build + - validate-sandbox runs-on: ubuntu-latest permissions: contents: write diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index 6e71367d1fe7..32e529b73145 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -71,10 +71,24 @@ jobs: include: - runner: ubuntu-24.04 platform: linux_amd64_musl + sandbox: false target: x86_64-unknown-linux-musl + variant: release + - runner: ubuntu-24.04 + platform: linux_amd64_musl + sandbox: true + target: x86_64-unknown-linux-musl + variant: ptrcomp-sandbox + - runner: ubuntu-24.04-arm + platform: linux_arm64_musl + sandbox: false + target: aarch64-unknown-linux-musl + variant: release - runner: ubuntu-24.04-arm platform: linux_arm64_musl + sandbox: true target: aarch64-unknown-linux-musl + variant: ptrcomp-sandbox steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -96,13 +110,20 @@ jobs: env: BUILDBUDDY_API_KEY: ${{ secrets.BUILDBUDDY_API_KEY }} PLATFORM: ${{ matrix.platform }} + SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} shell: bash run: | set -euo pipefail target_suffix="${TARGET//-/_}" - pair_target="//third_party/v8:rusty_v8_release_pair_${target_suffix}" + pair_kind="release_pair" + bazel_config_args=(--config=v8-release-compat) + if [[ "${SANDBOX}" == "true" ]]; then + pair_kind="sandbox_release_pair" + bazel_config_args=() + fi + pair_target="//third_party/v8:rusty_v8_${pair_kind}_${target_suffix}" extra_targets=( "@llvm//runtimes/libcxx:libcxx.static" "@llvm//runtimes/libcxx:libcxxabi.static" @@ -111,7 +132,7 @@ jobs: bazel_args=( build "--platforms=@llvm//platforms:${PLATFORM}" - --config=v8-release-compat + "${bazel_config_args[@]}" "${pair_target}" "${extra_targets[@]}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) @@ -126,19 +147,27 @@ jobs: - name: Stage release pair env: PLATFORM: ${{ matrix.platform }} + SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} shell: bash run: | set -euo pipefail - python3 .github/scripts/rusty_v8_bazel.py stage-release-pair \ - --platform "${PLATFORM}" \ - --target "${TARGET}" \ - --bazel-config v8-release-compat \ + stage_args=( + --platform "${PLATFORM}" + --target "${TARGET}" --output-dir "dist/${TARGET}" + ) + if [[ "${SANDBOX}" == "true" ]]; then + stage_args+=(--sandbox) + else + stage_args+=(--bazel-config v8-release-compat) + fi + + python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" - name: Upload staged musl artifacts uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: - name: v8-canary-${{ needs.metadata.outputs.v8_version }}-${{ matrix.target }} + name: v8-canary-${{ needs.metadata.outputs.v8_version }}-${{ matrix.variant }}-${{ matrix.target }} path: dist/${{ matrix.target }}/* diff --git a/third_party/v8/BUILD.bazel b/third_party/v8/BUILD.bazel index d6aa4c2cc9c9..e2f1a19c9fef 100644 --- a/third_party/v8/BUILD.bazel +++ b/third_party/v8/BUILD.bazel @@ -364,6 +364,18 @@ cc_static_library( features = V8_STATIC_LIBRARY_FEATURES, ) +cc_static_library( + name = "v8_147_4_0_aarch64_pc_windows_msvc_bazel", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + +cc_static_library( + name = "v8_147_4_0_x86_64_pc_windows_msvc_bazel", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + filegroup( name = "src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", srcs = ["@v8_crate_147_4_0//:src_binding_release_aarch64_unknown_linux_gnu"], @@ -374,6 +386,16 @@ filegroup( srcs = ["@v8_crate_147_4_0//:src_binding_release_x86_64_unknown_linux_gnu"], ) +filegroup( + name = "src_binding_release_aarch64_pc_windows_msvc_147_4_0_release", + srcs = ["@v8_crate_147_4_0//:src_binding_release_aarch64_pc_windows_msvc"], +) + +filegroup( + name = "src_binding_release_x86_64_pc_windows_msvc_147_4_0_release", + srcs = ["@v8_crate_147_4_0//:src_binding_release_x86_64_pc_windows_msvc"], +) + filegroup( name = "rusty_v8_release_pair_x86_64_apple_darwin", srcs = [ @@ -437,3 +459,35 @@ filegroup( ":src_binding_release_aarch64_pc_windows_msvc", ], ) + +filegroup( + name = "rusty_v8_sandbox_release_pair_x86_64_unknown_linux_musl", + srcs = [ + ":v8_147_4_0_x86_64_unknown_linux_musl_release", + ":src_binding_release_x86_64_unknown_linux_musl_147_4_0_release", + ], +) + +filegroup( + name = "rusty_v8_sandbox_release_pair_aarch64_unknown_linux_musl", + srcs = [ + ":v8_147_4_0_aarch64_unknown_linux_musl_release", + ":src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", + ], +) + +filegroup( + name = "rusty_v8_sandbox_release_pair_x86_64_pc_windows_msvc", + srcs = [ + ":v8_147_4_0_x86_64_pc_windows_msvc_bazel", + ":src_binding_release_x86_64_pc_windows_msvc_147_4_0_release", + ], +) + +filegroup( + name = "rusty_v8_sandbox_release_pair_aarch64_pc_windows_msvc", + srcs = [ + ":v8_147_4_0_aarch64_pc_windows_msvc_bazel", + ":src_binding_release_aarch64_pc_windows_msvc_147_4_0_release", + ], +) diff --git a/third_party/v8/README.md b/third_party/v8/README.md index bd4e10875422..96be904ff28d 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -40,7 +40,7 @@ The consumer-facing selectors are: - `//third_party/v8:rusty_v8_archive_for_target` - `//third_party/v8:rusty_v8_binding_for_target` -Musl release assets are expected at the tag: +Current musl release assets are expected at the tag: - `rusty-v8-v` @@ -49,13 +49,32 @@ with these raw asset names: - `librusty_v8_release_.a.gz` - `src_binding_release_.rs` +During the sandbox rollout, sandbox-enabled assets are published alongside those +current assets on the same tag, with the Rust crate's sandbox feature suffix in +their raw names: + +- `librusty_v8_ptrcomp_sandbox_release_.a.gz` +- `rusty_v8_ptrcomp_sandbox_release_.lib.gz` +- `src_binding_ptrcomp_sandbox_release_.rs` + The dedicated publishing workflow is `.github/workflows/rusty-v8-release.yml`. -It builds musl release pairs from source and keeps the release artifacts as the -statically linked form: +Every tagged run builds the current musl release pairs from source and keeps the +release artifacts as the statically linked form: - `//third_party/v8:rusty_v8_release_pair_x86_64_unknown_linux_musl` - `//third_party/v8:rusty_v8_release_pair_aarch64_unknown_linux_musl` +The same run also builds the matching sandbox pair targets: + +- `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_unknown_linux_musl` +- `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_unknown_linux_musl` +- `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_pc_windows_msvc` +- `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_pc_windows_msvc` + +The workflow validates the staged sandbox outputs before publication by checking +the emitted checksums, running the focused V8/code-mode sandbox tests, and smoke +starting a release `codex` binary on every supported artifact target. + Cargo musl builds use `RUSTY_V8_ARCHIVE` plus a downloaded `RUSTY_V8_SRC_BINDING_PATH` to point at those `openai/codex` release assets directly. We do not use `RUSTY_V8_MIRROR` for musl because the upstream `v8` From b156d79de7434c38ea564fa712415b68b2c9778f Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Wed, 6 May 2026 12:15:55 -0700 Subject: [PATCH 04/19] ci: allow rusty_v8 release amendments --- .github/workflows/rusty-v8-release.yml | 126 +++++-------------------- third_party/v8/README.md | 5 +- 2 files changed, 23 insertions(+), 108 deletions(-) diff --git a/.github/workflows/rusty-v8-release.yml b/.github/workflows/rusty-v8-release.yml index 2b5962888594..fbc3f7e2bcbf 100644 --- a/.github/workflows/rusty-v8-release.yml +++ b/.github/workflows/rusty-v8-release.yml @@ -181,119 +181,18 @@ jobs: name: rusty-v8-${{ needs.metadata.outputs.v8_version }}-${{ matrix.variant }}-${{ matrix.target }} path: dist/${{ matrix.target }}/* - validate-sandbox: - name: Validate sandbox artifacts - ${{ matrix.target }} - needs: - - metadata - - build - runs-on: ${{ matrix.runs_on }} - defaults: - run: - working-directory: codex-rs - strategy: - fail-fast: false - matrix: - include: - - target: x86_64-unknown-linux-musl - exe_suffix: "" - runs_on: - group: codex-runners - labels: codex-linux-x64 - - target: aarch64-unknown-linux-musl - exe_suffix: "" - runs_on: - group: codex-runners - labels: codex-linux-arm64 - - target: x86_64-pc-windows-msvc - exe_suffix: ".exe" - runs_on: - group: codex-runners - labels: codex-windows-x64 - - target: aarch64-pc-windows-msvc - exe_suffix: ".exe" - runs_on: - group: codex-runners - labels: codex-windows-arm64 - - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - - if: ${{ runner.os == 'Linux' }} - name: Install Linux build dependencies - shell: bash - run: | - set -euo pipefail - sudo apt-get update -y - sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - pkg-config \ - libcap-dev - - - uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 - with: - targets: ${{ matrix.target }} - - - name: Download staged sandbox artifacts - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 - with: - name: rusty-v8-${{ needs.metadata.outputs.v8_version }}-ptrcomp-sandbox-${{ matrix.target }} - path: ${{ runner.temp }}/rusty_v8_sandbox - - - name: Configure sandboxed rusty_v8 artifact overrides - env: - ARTIFACT_DIR: ${{ runner.temp }}/rusty_v8_sandbox - TARGET: ${{ matrix.target }} - shell: bash - run: | - set -euo pipefail - - artifact_profile="ptrcomp_sandbox_release" - binding_path="${ARTIFACT_DIR}/src_binding_${artifact_profile}_${TARGET}.rs" - checksums_path="${ARTIFACT_DIR}/rusty_v8_${artifact_profile}_${TARGET}.sha256" - - if [[ "${TARGET}" == *-pc-windows-msvc ]]; then - archive_name="rusty_v8_${artifact_profile}_${TARGET}.lib.gz" - else - archive_name="librusty_v8_${artifact_profile}_${TARGET}.a.gz" - fi - archive_path="${ARTIFACT_DIR}/${archive_name}" - - if [[ "$(wc -l < "${checksums_path}")" -ne 2 ]]; then - echo "Expected exactly two checksums for ${TARGET} in ${checksums_path}" >&2 - exit 1 - fi - - (cd "${ARTIFACT_DIR}" && sha256sum -c "${checksums_path}") - echo "RUSTY_V8_ARCHIVE=${archive_path}" >> "${GITHUB_ENV}" - echo "RUSTY_V8_SRC_BINDING_PATH=${binding_path}" >> "${GITHUB_ENV}" - - - name: Run sandboxed V8 probe tests - shell: bash - run: cargo test -p codex-v8-poc --target "${{ matrix.target }}" --features sandbox - - - name: Run sandboxed code-mode tests - shell: bash - run: cargo test -p codex-code-mode --target "${{ matrix.target }}" --features sandbox - - - name: Build release binary against sandboxed artifacts - shell: bash - run: cargo build --target "${{ matrix.target }}" --release --bin codex - - - name: Smoke release binary - shell: bash - run: "target/${{ matrix.target }}/release/codex${{ matrix.exe_suffix }} --version" - publish-release: needs: - metadata - build - - validate-sandbox runs-on: ubuntu-latest permissions: contents: write actions: read steps: - - name: Ensure release tag is new + - name: Check whether release already exists + id: release env: GH_TOKEN: ${{ github.token }} RELEASE_TAG: ${{ needs.metadata.outputs.release_tag }} @@ -302,8 +201,9 @@ jobs: set -euo pipefail if gh release view "${RELEASE_TAG}" --repo "${GITHUB_REPOSITORY}" > /dev/null 2>&1; then - echo "Release tag ${RELEASE_TAG} already exists; musl artifact tags are immutable." >&2 - exit 1 + echo "exists=true" >> "${GITHUB_OUTPUT}" + else + echo "exists=false" >> "${GITHUB_OUTPUT}" fi - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 @@ -311,6 +211,7 @@ jobs: path: dist - name: Create GitHub Release + if: ${{ steps.release.outputs.exists != 'true' }} uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 with: tag_name: ${{ needs.metadata.outputs.release_tag }} @@ -318,3 +219,18 @@ jobs: files: dist/** # Keep V8 artifact releases out of Codex's normal "latest release" channel. prerelease: true + + - name: Amend existing GitHub Release with sandbox artifacts + if: ${{ steps.release.outputs.exists == 'true' }} + uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 + with: + tag_name: ${{ needs.metadata.outputs.release_tag }} + name: ${{ needs.metadata.outputs.release_tag }} + files: | + dist/**/librusty_v8_ptrcomp_sandbox_release_*.a.gz + dist/**/rusty_v8_ptrcomp_sandbox_release_*.lib.gz + dist/**/src_binding_ptrcomp_sandbox_release_*.rs + dist/**/rusty_v8_ptrcomp_sandbox_release_*.sha256 + overwrite_files: true + # Keep V8 artifact releases out of Codex's normal "latest release" channel. + prerelease: true diff --git a/third_party/v8/README.md b/third_party/v8/README.md index 96be904ff28d..cc11f77a12c1 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -71,9 +71,8 @@ The same run also builds the matching sandbox pair targets: - `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_pc_windows_msvc` - `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_pc_windows_msvc` -The workflow validates the staged sandbox outputs before publication by checking -the emitted checksums, running the focused V8/code-mode sandbox tests, and smoke -starting a release `codex` binary on every supported artifact target. +If a tagged run targets an existing GitHub release, publication amends only the +sandbox-profile files and leaves the current release-profile assets unchanged. Cargo musl builds use `RUSTY_V8_ARCHIVE` plus a downloaded `RUSTY_V8_SRC_BINDING_PATH` to point at those `openai/codex` release assets From d36015ea06f89f56befda4703104114069988a02 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Wed, 6 May 2026 15:50:03 -0700 Subject: [PATCH 05/19] ci: add builds for all targets --- .github/scripts/test_rusty_v8_bazel.py | 4 ++ .github/workflows/rusty-v8-release.yml | 52 ++++++++++++++---- .github/workflows/v8-canary.yml | 47 +++++++++++++--- third_party/v8/BUILD.bazel | 76 ++++++++++++++++++++++++++ third_party/v8/README.md | 4 ++ 5 files changed, 162 insertions(+), 21 deletions(-) diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index c013eb7ca8e7..8c9d821ada89 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -22,6 +22,10 @@ def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self "//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_unknown_linux_musl", rusty_v8_bazel.release_pair_label("x86_64-unknown-linux-musl", sandbox=True), ) + self.assertEqual( + "//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_apple_darwin", + rusty_v8_bazel.release_pair_label("x86_64-apple-darwin", sandbox=True), + ) self.assertEqual( "librusty_v8_release_x86_64-unknown-linux-musl.a.gz", rusty_v8_bazel.staged_archive_name( diff --git a/.github/workflows/rusty-v8-release.yml b/.github/workflows/rusty-v8-release.yml index fbc3f7e2bcbf..7036c8752203 100644 --- a/.github/workflows/rusty-v8-release.yml +++ b/.github/workflows/rusty-v8-release.yml @@ -64,31 +64,61 @@ jobs: matrix: include: - runner: ubuntu-24.04 + bazel_config: ci-v8 + platform: linux_amd64 + sandbox: true + target: x86_64-unknown-linux-gnu + variant: ptrcomp-sandbox + - runner: ubuntu-24.04-arm + bazel_config: ci-v8 + platform: linux_arm64 + sandbox: true + target: aarch64-unknown-linux-gnu + variant: ptrcomp-sandbox + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_amd64 + sandbox: true + target: x86_64-apple-darwin + variant: ptrcomp-sandbox + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_arm64 + sandbox: true + target: aarch64-apple-darwin + variant: ptrcomp-sandbox + - runner: ubuntu-24.04 + bazel_config: ci-v8 platform: linux_amd64_musl sandbox: false target: x86_64-unknown-linux-musl variant: release - runner: ubuntu-24.04-arm + bazel_config: ci-v8 platform: linux_arm64_musl sandbox: false target: aarch64-unknown-linux-musl variant: release - runner: ubuntu-24.04 + bazel_config: ci-v8 platform: linux_amd64_musl sandbox: true target: x86_64-unknown-linux-musl variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm + bazel_config: ci-v8 platform: linux_arm64_musl sandbox: true target: aarch64-unknown-linux-musl variant: ptrcomp-sandbox - runner: ubuntu-24.04 + bazel_config: ci-v8 platform: windows_amd64 sandbox: true target: x86_64-pc-windows-msvc variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm + bazel_config: ci-v8 platform: windows_arm64 sandbox: true target: aarch64-pc-windows-msvc @@ -121,35 +151,33 @@ jobs: target_suffix="${TARGET//-/_}" pair_kind="release_pair" - bazel_config_args=(--config=v8-release-compat) if [[ "${SANDBOX}" == "true" ]]; then pair_kind="sandbox_release_pair" - bazel_config_args=() fi pair_target="//third_party/v8:rusty_v8_${pair_kind}_${target_suffix}" - extra_targets=() - if [[ "${TARGET}" == *-unknown-linux-musl ]]; then - extra_targets=( - "@llvm//runtimes/libcxx:libcxx.static" - "@llvm//runtimes/libcxx:libcxxabi.static" - ) - fi bazel_args=( build -c opt "--platforms=@llvm//platforms:${PLATFORM}" - "${bazel_config_args[@]}" "${pair_target}" - "${extra_targets[@]}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) ) + if [[ "${TARGET}" == *-unknown-linux-musl ]]; then + bazel_args+=( + "@llvm//runtimes/libcxx:libcxx.static" + "@llvm//runtimes/libcxx:libcxxabi.static" + ) + fi + if [[ "${SANDBOX}" != "true" ]]; then + bazel_args+=(--config=v8-release-compat) + fi bazel \ --noexperimental_remote_repo_contents_cache \ "${bazel_args[@]}" \ - --config=ci-v8 \ + "--config=${{ matrix.bazel_config }}" \ "--remote_header=x-buildbuddy-api-key=${BUILDBUDDY_API_KEY}" - name: Stage release pair diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index 32e529b73145..7c6e01becb83 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -70,21 +70,49 @@ jobs: matrix: include: - runner: ubuntu-24.04 + bazel_config: ci-v8 + platform: linux_amd64 + sandbox: true + target: x86_64-unknown-linux-gnu + variant: ptrcomp-sandbox + - runner: ubuntu-24.04-arm + bazel_config: ci-v8 + platform: linux_arm64 + sandbox: true + target: aarch64-unknown-linux-gnu + variant: ptrcomp-sandbox + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_amd64 + sandbox: true + target: x86_64-apple-darwin + variant: ptrcomp-sandbox + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_arm64 + sandbox: true + target: aarch64-apple-darwin + variant: ptrcomp-sandbox + - runner: ubuntu-24.04 + bazel_config: ci-v8 platform: linux_amd64_musl sandbox: false target: x86_64-unknown-linux-musl variant: release - runner: ubuntu-24.04 + bazel_config: ci-v8 platform: linux_amd64_musl sandbox: true target: x86_64-unknown-linux-musl variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm + bazel_config: ci-v8 platform: linux_arm64_musl sandbox: false target: aarch64-unknown-linux-musl variant: release - runner: ubuntu-24.04-arm + bazel_config: ci-v8 platform: linux_arm64_musl sandbox: true target: aarch64-unknown-linux-musl @@ -118,30 +146,31 @@ jobs: target_suffix="${TARGET//-/_}" pair_kind="release_pair" - bazel_config_args=(--config=v8-release-compat) if [[ "${SANDBOX}" == "true" ]]; then pair_kind="sandbox_release_pair" - bazel_config_args=() fi pair_target="//third_party/v8:rusty_v8_${pair_kind}_${target_suffix}" - extra_targets=( - "@llvm//runtimes/libcxx:libcxx.static" - "@llvm//runtimes/libcxx:libcxxabi.static" - ) bazel_args=( build "--platforms=@llvm//platforms:${PLATFORM}" - "${bazel_config_args[@]}" "${pair_target}" - "${extra_targets[@]}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) ) + if [[ "${TARGET}" == *-unknown-linux-musl ]]; then + bazel_args+=( + "@llvm//runtimes/libcxx:libcxx.static" + "@llvm//runtimes/libcxx:libcxxabi.static" + ) + fi + if [[ "${SANDBOX}" != "true" ]]; then + bazel_args+=(--config=v8-release-compat) + fi bazel \ --noexperimental_remote_repo_contents_cache \ "${bazel_args[@]}" \ - --config=ci-v8 \ + "--config=${{ matrix.bazel_config }}" \ "--remote_header=x-buildbuddy-api-key=${BUILDBUDDY_API_KEY}" - name: Stage release pair diff --git a/third_party/v8/BUILD.bazel b/third_party/v8/BUILD.bazel index e2f1a19c9fef..f122433f73ac 100644 --- a/third_party/v8/BUILD.bazel +++ b/third_party/v8/BUILD.bazel @@ -328,6 +328,18 @@ filegroup( srcs = ["@v8_crate_146_4_0//:src_binding_release_x86_64_unknown_linux_gnu"], ) +cc_static_library( + name = "v8_147_4_0_aarch64_apple_darwin_bazel", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + +cc_static_library( + name = "v8_147_4_0_aarch64_unknown_linux_gnu_bazel", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + cc_static_library( name = "v8_147_4_0_aarch64_unknown_linux_musl_release_base", deps = [":v8_147_4_0_binding"], @@ -358,6 +370,18 @@ EOF """, ) +cc_static_library( + name = "v8_147_4_0_x86_64_apple_darwin_bazel", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + +cc_static_library( + name = "v8_147_4_0_x86_64_unknown_linux_gnu_bazel", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + cc_static_library( name = "v8_147_4_0_x86_64_unknown_linux_musl_release", deps = [":v8_147_4_0_binding"], @@ -376,6 +400,26 @@ cc_static_library( features = V8_STATIC_LIBRARY_FEATURES, ) +filegroup( + name = "src_binding_release_aarch64_apple_darwin_147_4_0_release", + srcs = ["@v8_crate_147_4_0//:src_binding_release_aarch64_apple_darwin"], +) + +filegroup( + name = "src_binding_release_x86_64_apple_darwin_147_4_0_release", + srcs = ["@v8_crate_147_4_0//:src_binding_release_x86_64_apple_darwin"], +) + +filegroup( + name = "src_binding_release_aarch64_unknown_linux_gnu_147_4_0_release", + srcs = ["@v8_crate_147_4_0//:src_binding_release_aarch64_unknown_linux_gnu"], +) + +filegroup( + name = "src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", + srcs = ["@v8_crate_147_4_0//:src_binding_release_x86_64_unknown_linux_gnu"], +) + filegroup( name = "src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", srcs = ["@v8_crate_147_4_0//:src_binding_release_aarch64_unknown_linux_gnu"], @@ -460,6 +504,38 @@ filegroup( ], ) +filegroup( + name = "rusty_v8_sandbox_release_pair_x86_64_apple_darwin", + srcs = [ + ":v8_147_4_0_x86_64_apple_darwin_bazel", + ":src_binding_release_x86_64_apple_darwin_147_4_0_release", + ], +) + +filegroup( + name = "rusty_v8_sandbox_release_pair_aarch64_apple_darwin", + srcs = [ + ":v8_147_4_0_aarch64_apple_darwin_bazel", + ":src_binding_release_aarch64_apple_darwin_147_4_0_release", + ], +) + +filegroup( + name = "rusty_v8_sandbox_release_pair_x86_64_unknown_linux_gnu", + srcs = [ + ":v8_147_4_0_x86_64_unknown_linux_gnu_bazel", + ":src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", + ], +) + +filegroup( + name = "rusty_v8_sandbox_release_pair_aarch64_unknown_linux_gnu", + srcs = [ + ":v8_147_4_0_aarch64_unknown_linux_gnu_bazel", + ":src_binding_release_aarch64_unknown_linux_gnu_147_4_0_release", + ], +) + filegroup( name = "rusty_v8_sandbox_release_pair_x86_64_unknown_linux_musl", srcs = [ diff --git a/third_party/v8/README.md b/third_party/v8/README.md index cc11f77a12c1..b9f69aa945dd 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -66,6 +66,10 @@ release artifacts as the statically linked form: The same run also builds the matching sandbox pair targets: +- `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_apple_darwin` +- `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_apple_darwin` +- `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_unknown_linux_gnu` +- `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_unknown_linux_gnu` - `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_unknown_linux_musl` - `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_unknown_linux_musl` - `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_pc_windows_msvc` From 2c05f3337a4719b1635c76b76766c7d7414f408b Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Thu, 7 May 2026 01:02:08 +0000 Subject: [PATCH 06/19] ci: merge Unix runtime libs into rusty_v8 sandbox artifacts Co-authored-by: Codex --- .github/scripts/rusty_v8_bazel.py | 18 ++++++++++-------- .github/scripts/test_rusty_v8_bazel.py | 19 +++++++++++++++++-- .github/workflows/rusty-v8-release.yml | 3 +-- .github/workflows/v8-canary.yml | 2 +- third_party/v8/README.md | 4 +++- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index f2712d4a3120..e7ab4ab7fc70 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -23,7 +23,7 @@ ROOT = Path(__file__).resolve().parents[2] MODULE_BAZEL = ROOT / "MODULE.bazel" RUSTY_V8_CHECKSUMS_DIR = ROOT / "third_party" / "v8" -MUSL_RUNTIME_ARCHIVE_LABELS = [ +STATIC_RUNTIME_ARCHIVE_LABELS = [ "@llvm//runtimes/libcxx:libcxx.static", "@llvm//runtimes/libcxx:libcxxabi.static", ] @@ -197,8 +197,10 @@ def staged_checksums_name(target: str, artifact_profile: str) -> str: return f"rusty_v8_{artifact_profile}_{target}.sha256" -def is_musl_archive_target(target: str, source_path: Path) -> bool: - return target.endswith("-unknown-linux-musl") and source_path.suffix == ".a" +def needs_merged_runtime_archive(target: str, source_path: Path) -> bool: + return source_path.suffix == ".a" and target.endswith( + ("-apple-darwin", "-unknown-linux-gnu", "-unknown-linux-musl") + ) def single_bazel_output_file( @@ -245,7 +247,7 @@ def host_runnable_bazel_output_file( return runnable_outputs[0] -def merged_musl_archive( +def merged_runtime_archive( platform: str, lib_path: Path, compilation_mode: str = "fastbuild", @@ -265,10 +267,10 @@ def merged_musl_archive( ) runtime_archives = [ single_bazel_output_file(platform, label, compilation_mode, bazel_configs) - for label in MUSL_RUNTIME_ARCHIVE_LABELS + for label in STATIC_RUNTIME_ARCHIVE_LABELS ] - temp_dir = Path(tempfile.mkdtemp(prefix="rusty-v8-musl-stage-")) + temp_dir = Path(tempfile.mkdtemp(prefix="rusty-v8-runtime-stage-")) merged_archive = temp_dir / lib_path.name merge_commands = "\n".join( [ @@ -320,8 +322,8 @@ def stage_release_pair( staged_library = output_dir / staged_archive_name(target, lib_path, artifact_profile) staged_binding = output_dir / staged_binding_name(target, artifact_profile) source_archive = ( - merged_musl_archive(platform, lib_path, compilation_mode, bazel_configs) - if is_musl_archive_target(target, lib_path) + merged_runtime_archive(platform, lib_path, compilation_mode, bazel_configs) + if needs_merged_runtime_archive(target, lib_path) else lib_path ) diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index 8c9d821ada89..5fa15fbde7d6 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -35,10 +35,10 @@ def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self ), ) self.assertEqual( - "rusty_v8_ptrcomp_sandbox_release_x86_64-pc-windows-msvc.lib.gz", + "librusty_v8_ptrcomp_sandbox_release_x86_64-pc-windows-msvc.a.gz", rusty_v8_bazel.staged_archive_name( "x86_64-pc-windows-msvc", - Path("v8.lib"), + Path("v8.a"), rusty_v8_bazel.SANDBOX_ARTIFACT_PROFILE, ), ) @@ -57,6 +57,21 @@ def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self ), ) + def test_needs_merged_runtime_archive(self) -> None: + for target in [ + "x86_64-apple-darwin", + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl", + ]: + self.assertTrue(rusty_v8_bazel.needs_merged_runtime_archive(target, Path("v8.a"))) + + self.assertFalse( + rusty_v8_bazel.needs_merged_runtime_archive( + "x86_64-pc-windows-msvc", + Path("v8.a"), + ) + ) + @patch("rusty_v8_bazel.ensure_bazel_output_files") @patch("rusty_v8_bazel.subprocess.run") def test_host_runnable_bazel_output_file_selects_runnable_candidate( diff --git a/.github/workflows/rusty-v8-release.yml b/.github/workflows/rusty-v8-release.yml index 7036c8752203..4b3858f10734 100644 --- a/.github/workflows/rusty-v8-release.yml +++ b/.github/workflows/rusty-v8-release.yml @@ -164,7 +164,7 @@ jobs: "${pair_target}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) ) - if [[ "${TARGET}" == *-unknown-linux-musl ]]; then + if [[ "${TARGET}" != *-pc-windows-msvc ]]; then bazel_args+=( "@llvm//runtimes/libcxx:libcxx.static" "@llvm//runtimes/libcxx:libcxxabi.static" @@ -256,7 +256,6 @@ jobs: name: ${{ needs.metadata.outputs.release_tag }} files: | dist/**/librusty_v8_ptrcomp_sandbox_release_*.a.gz - dist/**/rusty_v8_ptrcomp_sandbox_release_*.lib.gz dist/**/src_binding_ptrcomp_sandbox_release_*.rs dist/**/rusty_v8_ptrcomp_sandbox_release_*.sha256 overwrite_files: true diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index 7c6e01becb83..c6cba8de1a86 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -157,7 +157,7 @@ jobs: "${pair_target}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) ) - if [[ "${TARGET}" == *-unknown-linux-musl ]]; then + if [[ "${TARGET}" != *-pc-windows-msvc ]]; then bazel_args+=( "@llvm//runtimes/libcxx:libcxx.static" "@llvm//runtimes/libcxx:libcxxabi.static" diff --git a/third_party/v8/README.md b/third_party/v8/README.md index b9f69aa945dd..461a6357bb77 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -54,7 +54,6 @@ current assets on the same tag, with the Rust crate's sandbox feature suffix in their raw names: - `librusty_v8_ptrcomp_sandbox_release_.a.gz` -- `rusty_v8_ptrcomp_sandbox_release_.lib.gz` - `src_binding_ptrcomp_sandbox_release_.rs` The dedicated publishing workflow is `.github/workflows/rusty-v8-release.yml`. @@ -77,6 +76,9 @@ The same run also builds the matching sandbox pair targets: If a tagged run targets an existing GitHub release, publication amends only the sandbox-profile files and leaves the current release-profile assets unchanged. +Unix sandbox archives are staged with the matching static libc++ and libc++abi +runtime libraries merged in so Cargo consumers can link them with the `v8` +crate's default `use_custom_libcxx` feature. Cargo musl builds use `RUSTY_V8_ARCHIVE` plus a downloaded `RUSTY_V8_SRC_BINDING_PATH` to point at those `openai/codex` release assets From 4ad4a6c7042ab146fb7946989553277895500654 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Thu, 7 May 2026 19:29:16 -0700 Subject: [PATCH 07/19] Fix Darwin rusty-v8 runtime staging --- .github/scripts/rusty_v8_bazel.py | 217 ++++++++++++++++++++++++- .github/scripts/test_rusty_v8_bazel.py | 55 +++++++ .github/workflows/rusty-v8-release.yml | 2 +- .github/workflows/v8-canary.yml | 2 +- third_party/v8/README.md | 9 +- 5 files changed, 272 insertions(+), 13 deletions(-) diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index e7ab4ab7fc70..41a733a9715e 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -11,6 +11,7 @@ import sys import tempfile import tomllib +import urllib.request from pathlib import Path from rusty_v8_module_bazel import ( @@ -27,6 +28,71 @@ "@llvm//runtimes/libcxx:libcxx.static", "@llvm//runtimes/libcxx:libcxxabi.static", ] +DARWIN_RUNTIME_ARCHIVE_MEMBERS = [ + "algorithm.o", + "any.o", + "atomic.o", + "barrier.o", + "bind.o", + "call_once.o", + "charconv.o", + "chrono.o", + "condition_variable.o", + "condition_variable_destructor.o", + "error_category.o", + "exception.o", + "directory_iterator.o", + "filesystem_error.o", + "operations.o", + "path.o", + "functional.o", + "future.o", + "hash.o", + "ios.o", + "ios.instantiations.o", + "iostream.o", + "locale.o", + "memory.o", + "mutex.o", + "mutex_destructor.o", + "new_handler.o", + "new_helpers.o", + "optional.o", + "random.o", + "random_shuffle.o", + "regex.o", + "d2fixed.o", + "d2s.o", + "f2s.o", + "shared_mutex.o", + "stdexcept.o", + "string.o", + "strstream.o", + "system_error.o", + "thread.o", + "typeinfo.o", + "valarray.o", + "variant.o", + "vector.o", + "verbose_abort.o", + "new.o", + "abort_message.o", + "cxa_aux_runtime.o", + "cxa_default_handlers.o", + "cxa_exception.o", + "cxa_exception_storage.o", + "cxa_handlers.o", + "cxa_personality.o", + "cxa_vector.o", + "cxa_virtual.o", + "fallback_malloc.o", + "private_typeinfo.o", + "stdlib_exception.o", + "stdlib_stdexcept.o", + "stdlib_typeinfo.o", + "cxa_guard.o", + "cxa_demangle.o", +] LLVM_AR_LABEL = "@llvm//tools:llvm-ar" LLVM_RANLIB_LABEL = "@llvm//tools:llvm-ranlib" RELEASE_ARTIFACT_PROFILE = "release" @@ -203,6 +269,17 @@ def needs_merged_runtime_archive(target: str, source_path: Path) -> bool: ) +def needs_built_runtime_archives(target: str) -> bool: + return target.endswith(("-unknown-linux-gnu", "-unknown-linux-musl")) + + +def upstream_rusty_v8_archive_url(target: str, version: str) -> str: + return ( + "https://github.com/denoland/rusty_v8/releases/download/" + f"v{version}/librusty_v8_release_{target}.a.gz" + ) + + def single_bazel_output_file( platform: str, label: str, @@ -247,9 +324,10 @@ def host_runnable_bazel_output_file( return runnable_outputs[0] -def merged_runtime_archive( +def merged_archive( platform: str, lib_path: Path, + extra_archives: list[Path], compilation_mode: str = "fastbuild", bazel_configs: list[str] | None = None, ) -> Path: @@ -265,18 +343,13 @@ def merged_runtime_archive( compilation_mode, bazel_configs, ) - runtime_archives = [ - single_bazel_output_file(platform, label, compilation_mode, bazel_configs) - for label in STATIC_RUNTIME_ARCHIVE_LABELS - ] - temp_dir = Path(tempfile.mkdtemp(prefix="rusty-v8-runtime-stage-")) merged_archive = temp_dir / lib_path.name merge_commands = "\n".join( [ f"create {merged_archive}", f"addlib {lib_path}", - *[f"addlib {archive}" for archive in runtime_archives], + *[f"addlib {archive}" for archive in extra_archives], "save", "end", ] @@ -292,6 +365,134 @@ def merged_runtime_archive( return merged_archive +def merged_built_runtime_archive( + platform: str, + lib_path: Path, + compilation_mode: str = "fastbuild", + bazel_configs: list[str] | None = None, +) -> Path: + runtime_archives = [ + single_bazel_output_file(platform, label, compilation_mode, bazel_configs) + for label in STATIC_RUNTIME_ARCHIVE_LABELS + ] + return merged_archive( + platform, + lib_path, + runtime_archives, + compilation_mode, + bazel_configs, + ) + + +def downloaded_darwin_runtime_archive( + target: str, + version: str, + llvm_ar: Path, +) -> Path: + temp_dir = Path(tempfile.mkdtemp(prefix="rusty-v8-darwin-runtime-")) + compressed_archive = temp_dir / f"librusty_v8_release_{target}.a.gz" + source_archive = temp_dir / f"librusty_v8_release_{target}.a" + runtime_archive = temp_dir / f"libcxx_runtime_{target}.a" + + with urllib.request.urlopen(upstream_rusty_v8_archive_url(target, version)) as src: + with compressed_archive.open("wb") as dst: + shutil.copyfileobj(src, dst) + with gzip.open(compressed_archive, "rb") as src: + with source_archive.open("wb") as dst: + shutil.copyfileobj(src, dst) + + listed_members = subprocess.run( + [str(llvm_ar), "t", str(source_archive)], + cwd=ROOT, + check=True, + capture_output=True, + text=True, + ).stdout.splitlines() + missing_members = [ + member for member in DARWIN_RUNTIME_ARCHIVE_MEMBERS if member not in listed_members + ] + if missing_members: + raise SystemExit( + f"missing Darwin runtime members in {source_archive}: {missing_members}" + ) + + subprocess.run( + [ + str(llvm_ar), + "x", + str(source_archive), + *DARWIN_RUNTIME_ARCHIVE_MEMBERS, + ], + cwd=temp_dir, + check=True, + ) + merge_commands = "\n".join( + [ + f"create {runtime_archive}", + *[f"addmod {temp_dir / member}" for member in DARWIN_RUNTIME_ARCHIVE_MEMBERS], + "save", + "end", + ] + ) + subprocess.run( + [str(llvm_ar), "-M"], + cwd=ROOT, + check=True, + input=merge_commands, + text=True, + ) + return runtime_archive + + +def merged_darwin_runtime_archive( + platform: str, + target: str, + lib_path: Path, + compilation_mode: str = "fastbuild", + bazel_configs: list[str] | None = None, +) -> Path: + llvm_ar = host_runnable_bazel_output_file( + platform, + LLVM_AR_LABEL, + compilation_mode, + bazel_configs, + ) + version = resolved_v8_crate_version() + runtime_archive = downloaded_darwin_runtime_archive(target, version, llvm_ar) + return merged_archive( + platform, + lib_path, + [runtime_archive], + compilation_mode, + bazel_configs, + ) + + +def runtime_merged_archive( + platform: str, + target: str, + lib_path: Path, + compilation_mode: str = "fastbuild", + bazel_configs: list[str] | None = None, +) -> Path: + if target.endswith("-apple-darwin"): + return merged_darwin_runtime_archive( + platform, + target, + lib_path, + compilation_mode, + bazel_configs, + ) + if not needs_built_runtime_archives(target): + raise SystemExit(f"unsupported runtime merge target: {target}") + return merged_built_runtime_archive( + platform, + lib_path, + compilation_mode, + bazel_configs, + ) + + def stage_release_pair( platform: str, target: str, @@ -322,7 +523,7 @@ def stage_release_pair( staged_library = output_dir / staged_archive_name(target, lib_path, artifact_profile) staged_binding = output_dir / staged_binding_name(target, artifact_profile) source_archive = ( - merged_runtime_archive(platform, lib_path, compilation_mode, bazel_configs) + runtime_merged_archive(platform, target, lib_path, compilation_mode, bazel_configs) if needs_merged_runtime_archive(target, lib_path) else lib_path ) diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index 5fa15fbde7d6..e2f7c17d1b7d 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -72,6 +72,61 @@ def test_needs_merged_runtime_archive(self) -> None: ) ) + def test_needs_built_runtime_archives(self) -> None: + for target in [ + "x86_64-unknown-linux-gnu", + "x86_64-unknown-linux-musl", + ]: + self.assertTrue(rusty_v8_bazel.needs_built_runtime_archives(target)) + + self.assertFalse(rusty_v8_bazel.needs_built_runtime_archives("x86_64-apple-darwin")) + self.assertFalse(rusty_v8_bazel.needs_built_runtime_archives("x86_64-pc-windows-msvc")) + + def test_upstream_rusty_v8_archive_url(self) -> None: + self.assertEqual( + ( + "https://github.com/denoland/rusty_v8/releases/download/" + "v147.4.0/librusty_v8_release_x86_64-apple-darwin.a.gz" + ), + rusty_v8_bazel.upstream_rusty_v8_archive_url( + "x86_64-apple-darwin", + "147.4.0", + ), + ) + + @patch("rusty_v8_bazel.merged_built_runtime_archive") + @patch("rusty_v8_bazel.merged_darwin_runtime_archive") + def test_runtime_merged_archive_dispatches_by_target( + self, + merged_darwin_runtime_archive: Mock, + merged_built_runtime_archive: Mock, + ) -> None: + merged_darwin_runtime_archive.return_value = Path("/tmp/darwin.a") + merged_built_runtime_archive.return_value = Path("/tmp/linux.a") + + self.assertEqual( + Path("/tmp/darwin.a"), + rusty_v8_bazel.runtime_merged_archive( + "macos_amd64", + "x86_64-apple-darwin", + Path("/tmp/v8.a"), + ), + ) + self.assertEqual( + Path("/tmp/linux.a"), + rusty_v8_bazel.runtime_merged_archive( + "linux_amd64", + "x86_64-unknown-linux-gnu", + Path("/tmp/v8.a"), + ), + ) + with self.assertRaisesRegex(SystemExit, "unsupported runtime merge target"): + rusty_v8_bazel.runtime_merged_archive( + "windows_amd64", + "x86_64-pc-windows-msvc", + Path("/tmp/v8.a"), + ) + @patch("rusty_v8_bazel.ensure_bazel_output_files") @patch("rusty_v8_bazel.subprocess.run") def test_host_runnable_bazel_output_file_selects_runnable_candidate( diff --git a/.github/workflows/rusty-v8-release.yml b/.github/workflows/rusty-v8-release.yml index 4b3858f10734..ff376f18b7bb 100644 --- a/.github/workflows/rusty-v8-release.yml +++ b/.github/workflows/rusty-v8-release.yml @@ -164,7 +164,7 @@ jobs: "${pair_target}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) ) - if [[ "${TARGET}" != *-pc-windows-msvc ]]; then + if [[ "${TARGET}" == *-unknown-linux-* ]]; then bazel_args+=( "@llvm//runtimes/libcxx:libcxx.static" "@llvm//runtimes/libcxx:libcxxabi.static" diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index c6cba8de1a86..42e98458211c 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -157,7 +157,7 @@ jobs: "${pair_target}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) ) - if [[ "${TARGET}" != *-pc-windows-msvc ]]; then + if [[ "${TARGET}" == *-unknown-linux-* ]]; then bazel_args+=( "@llvm//runtimes/libcxx:libcxx.static" "@llvm//runtimes/libcxx:libcxxabi.static" diff --git a/third_party/v8/README.md b/third_party/v8/README.md index 461a6357bb77..dae87f45d91c 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -76,9 +76,12 @@ The same run also builds the matching sandbox pair targets: If a tagged run targets an existing GitHub release, publication amends only the sandbox-profile files and leaves the current release-profile assets unchanged. -Unix sandbox archives are staged with the matching static libc++ and libc++abi -runtime libraries merged in so Cargo consumers can link them with the `v8` -crate's default `use_custom_libcxx` feature. +Unix sandbox archives are staged with matching static libc++ and libc++abi +runtime objects merged in so Cargo consumers can link them with the `v8` crate's +default `use_custom_libcxx` feature. Linux artifacts use the hermetic LLVM +runtime builds directly; Darwin artifacts reuse the matching runtime members +from the upstream `rusty_v8` archive because the upstream release already ships +those custom libc++ objects for Apple targets. Cargo musl builds use `RUSTY_V8_ARCHIVE` plus a downloaded `RUSTY_V8_SRC_BINDING_PATH` to point at those `openai/codex` release assets From 7b5a9e84d0dfeae7ab59f096f50b35e6da54a397 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Thu, 7 May 2026 20:43:36 -0700 Subject: [PATCH 08/19] ci: mirror upstream rusty_v8 artifact production --- .github/scripts/rusty_v8_bazel.py | 276 ++++++------------------- .github/scripts/test_rusty_v8_bazel.py | 103 +++++---- .github/workflows/rusty-v8-release.yml | 134 +++++++++--- .github/workflows/v8-canary.yml | 134 ++++++++++-- third_party/v8/README.md | 18 +- 5 files changed, 357 insertions(+), 308 deletions(-) diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index 41a733a9715e..33455b93a1b7 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -11,7 +11,6 @@ import sys import tempfile import tomllib -import urllib.request from pathlib import Path from rusty_v8_module_bazel import ( @@ -28,71 +27,6 @@ "@llvm//runtimes/libcxx:libcxx.static", "@llvm//runtimes/libcxx:libcxxabi.static", ] -DARWIN_RUNTIME_ARCHIVE_MEMBERS = [ - "algorithm.o", - "any.o", - "atomic.o", - "barrier.o", - "bind.o", - "call_once.o", - "charconv.o", - "chrono.o", - "condition_variable.o", - "condition_variable_destructor.o", - "error_category.o", - "exception.o", - "directory_iterator.o", - "filesystem_error.o", - "operations.o", - "path.o", - "functional.o", - "future.o", - "hash.o", - "ios.o", - "ios.instantiations.o", - "iostream.o", - "locale.o", - "memory.o", - "mutex.o", - "mutex_destructor.o", - "new_handler.o", - "new_helpers.o", - "optional.o", - "random.o", - "random_shuffle.o", - "regex.o", - "d2fixed.o", - "d2s.o", - "f2s.o", - "shared_mutex.o", - "stdexcept.o", - "string.o", - "strstream.o", - "system_error.o", - "thread.o", - "typeinfo.o", - "valarray.o", - "variant.o", - "vector.o", - "verbose_abort.o", - "new.o", - "abort_message.o", - "cxa_aux_runtime.o", - "cxa_default_handlers.o", - "cxa_exception.o", - "cxa_exception_storage.o", - "cxa_handlers.o", - "cxa_personality.o", - "cxa_vector.o", - "cxa_virtual.o", - "fallback_malloc.o", - "private_typeinfo.o", - "stdlib_exception.o", - "stdlib_stdexcept.o", - "stdlib_typeinfo.o", - "cxa_guard.o", - "cxa_demangle.o", -] LLVM_AR_LABEL = "@llvm//tools:llvm-ar" LLVM_RANLIB_LABEL = "@llvm//tools:llvm-ranlib" RELEASE_ARTIFACT_PROFILE = "release" @@ -265,18 +199,7 @@ def staged_checksums_name(target: str, artifact_profile: str) -> str: def needs_merged_runtime_archive(target: str, source_path: Path) -> bool: return source_path.suffix == ".a" and target.endswith( - ("-apple-darwin", "-unknown-linux-gnu", "-unknown-linux-musl") - ) - - -def needs_built_runtime_archives(target: str) -> bool: - return target.endswith(("-unknown-linux-gnu", "-unknown-linux-musl")) - - -def upstream_rusty_v8_archive_url(target: str, version: str) -> str: - return ( - "https://github.com/denoland/rusty_v8/releases/download/" - f"v{version}/librusty_v8_release_{target}.a.gz" + ("-unknown-linux-gnu", "-unknown-linux-musl") ) @@ -384,113 +307,62 @@ def merged_built_runtime_archive( ) -def downloaded_darwin_runtime_archive( - target: str, - version: str, - llvm_ar: Path, -) -> Path: - temp_dir = Path(tempfile.mkdtemp(prefix="rusty-v8-darwin-runtime-")) - compressed_archive = temp_dir / f"librusty_v8_release_{target}.a.gz" - source_archive = temp_dir / f"librusty_v8_release_{target}.a" - runtime_archive = temp_dir / f"libcxx_runtime_{target}.a" - - with urllib.request.urlopen(upstream_rusty_v8_archive_url(target, version)) as src: - with compressed_archive.open("wb") as dst: - shutil.copyfileobj(src, dst) - with gzip.open(compressed_archive, "rb") as src: - with source_archive.open("wb") as dst: - shutil.copyfileobj(src, dst) - - listed_members = subprocess.run( - [str(llvm_ar), "t", str(source_archive)], - cwd=ROOT, - check=True, - capture_output=True, - text=True, - ).stdout.splitlines() - missing_members = [ - member for member in DARWIN_RUNTIME_ARCHIVE_MEMBERS if member not in listed_members - ] - if missing_members: - raise SystemExit( - f"missing Darwin runtime members in {source_archive}: {missing_members}" - ) - - subprocess.run( - [ - str(llvm_ar), - "x", - str(source_archive), - *DARWIN_RUNTIME_ARCHIVE_MEMBERS, - ], - cwd=temp_dir, - check=True, - ) - merge_commands = "\n".join( - [ - f"create {runtime_archive}", - *[f"addmod {temp_dir / member}" for member in DARWIN_RUNTIME_ARCHIVE_MEMBERS], - "save", - "end", - ] - ) - subprocess.run( - [str(llvm_ar), "-M"], - cwd=ROOT, - check=True, - input=merge_commands, - text=True, - ) - return runtime_archive +def upstream_release_pair_paths(source_root: Path, target: str) -> tuple[Path, Path]: + lib_name = "rusty_v8.lib" if target.endswith("-pc-windows-msvc") else "librusty_v8.a" + gn_out = source_root / "target" / target / "release" / "gn_out" + return gn_out / "obj" / lib_name, gn_out / "src_binding.rs" -def merged_darwin_runtime_archive( - platform: str, +def stage_artifacts( target: str, lib_path: Path, - compilation_mode: str = "fastbuild", - bazel_configs: list[str] | None = None, -) -> Path: - llvm_ar = host_runnable_bazel_output_file( - platform, - LLVM_AR_LABEL, - compilation_mode, - bazel_configs, - ) - version = resolved_v8_crate_version() - runtime_archive = downloaded_darwin_runtime_archive(target, version, llvm_ar) - return merged_archive( - platform, - lib_path, - [runtime_archive], - compilation_mode, - bazel_configs, - ) + binding_path: Path, + output_dir: Path, + sandbox: bool, +) -> None: + missing_paths = [str(path) for path in [lib_path, binding_path] if not path.exists()] + if missing_paths: + raise SystemExit(f"missing release outputs for {target}: {missing_paths}") + output_dir.mkdir(parents=True, exist_ok=True) + artifact_profile = SANDBOX_ARTIFACT_PROFILE if sandbox else RELEASE_ARTIFACT_PROFILE + staged_library = output_dir / staged_archive_name(target, lib_path, artifact_profile) + staged_binding = output_dir / staged_binding_name(target, artifact_profile) -def runtime_merged_archive( - platform: str, + with lib_path.open("rb") as src, staged_library.open("wb") as dst: + with gzip.GzipFile( + filename="", + mode="wb", + fileobj=dst, + compresslevel=6, + mtime=0, + ) as gz: + shutil.copyfileobj(src, gz) + + shutil.copyfile(binding_path, staged_binding) + + staged_checksums = output_dir / staged_checksums_name(target, artifact_profile) + with staged_checksums.open("w", encoding="utf-8") as checksums: + for path in [staged_library, staged_binding]: + digest = hashlib.sha256() + with path.open("rb") as artifact: + for chunk in iter(lambda: artifact.read(1024 * 1024), b""): + digest.update(chunk) + checksums.write(f"{digest.hexdigest()} {path.name}\n") + + print(staged_library) + print(staged_binding) + print(staged_checksums) + + +def stage_upstream_release_pair( + source_root: Path, target: str, - lib_path: Path, - compilation_mode: str = "fastbuild", - bazel_configs: list[str] | None = None, -) -> Path: - if target.endswith("-apple-darwin"): - return merged_darwin_runtime_archive( - platform, - target, - lib_path, - compilation_mode, - bazel_configs, - ) - if not needs_built_runtime_archives(target): - raise SystemExit(f"unsupported runtime merge target: {target}") - return merged_built_runtime_archive( - platform, - lib_path, - compilation_mode, - bazel_configs, - ) + output_dir: Path, + sandbox: bool = False, +) -> None: + lib_path, binding_path = upstream_release_pair_paths(source_root, target) + stage_artifacts(target, lib_path, binding_path, output_dir, sandbox) def stage_release_pair( @@ -518,40 +390,12 @@ def stage_release_pair( except StopIteration as exc: raise SystemExit(f"missing Rust binding output for {target}") from exc - output_dir.mkdir(parents=True, exist_ok=True) - artifact_profile = SANDBOX_ARTIFACT_PROFILE if sandbox else RELEASE_ARTIFACT_PROFILE - staged_library = output_dir / staged_archive_name(target, lib_path, artifact_profile) - staged_binding = output_dir / staged_binding_name(target, artifact_profile) source_archive = ( - runtime_merged_archive(platform, target, lib_path, compilation_mode, bazel_configs) + merged_built_runtime_archive(platform, lib_path, compilation_mode, bazel_configs) if needs_merged_runtime_archive(target, lib_path) else lib_path ) - - with source_archive.open("rb") as src, staged_library.open("wb") as dst: - with gzip.GzipFile( - filename="", - mode="wb", - fileobj=dst, - compresslevel=6, - mtime=0, - ) as gz: - shutil.copyfileobj(src, gz) - - shutil.copyfile(binding_path, staged_binding) - - staged_checksums = output_dir / staged_checksums_name(target, artifact_profile) - with staged_checksums.open("w", encoding="utf-8") as checksums: - for path in [staged_library, staged_binding]: - digest = hashlib.sha256() - with path.open("rb") as artifact: - for chunk in iter(lambda: artifact.read(1024 * 1024), b""): - digest.update(chunk) - checksums.write(f"{digest.hexdigest()} {path.name}\n") - - print(staged_library) - print(staged_binding) - print(staged_checksums) + stage_artifacts(target, source_archive, binding_path, output_dir, sandbox) def parse_args() -> argparse.Namespace: @@ -575,6 +419,14 @@ def parse_args() -> argparse.Namespace: choices=["fastbuild", "opt", "dbg"], ) + stage_upstream_release_pair_parser = subparsers.add_parser( + "stage-upstream-release-pair" + ) + stage_upstream_release_pair_parser.add_argument("--source-root", type=Path, required=True) + stage_upstream_release_pair_parser.add_argument("--target", required=True) + stage_upstream_release_pair_parser.add_argument("--output-dir", required=True) + stage_upstream_release_pair_parser.add_argument("--sandbox", action="store_true") + subparsers.add_parser("resolved-v8-crate-version") check_module_bazel_parser = subparsers.add_parser("check-module-bazel") @@ -610,6 +462,14 @@ def main() -> int: sandbox=args.sandbox, ) return 0 + if args.command == "stage-upstream-release-pair": + stage_upstream_release_pair( + source_root=args.source_root, + target=args.target, + output_dir=Path(args.output_dir), + sandbox=args.sandbox, + ) + return 0 if args.command == "resolved-v8-crate-version": print(resolved_v8_crate_version()) return 0 diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index e2f7c17d1b7d..5d68336980fb 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -4,6 +4,7 @@ import textwrap import unittest +from tempfile import TemporaryDirectory from pathlib import Path from unittest.mock import Mock from unittest.mock import patch @@ -59,12 +60,17 @@ def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self def test_needs_merged_runtime_archive(self) -> None: for target in [ - "x86_64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", ]: self.assertTrue(rusty_v8_bazel.needs_merged_runtime_archive(target, Path("v8.a"))) + self.assertFalse( + rusty_v8_bazel.needs_merged_runtime_archive( + "x86_64-apple-darwin", + Path("v8.a"), + ) + ) self.assertFalse( rusty_v8_bazel.needs_merged_runtime_archive( "x86_64-pc-windows-msvc", @@ -72,59 +78,68 @@ def test_needs_merged_runtime_archive(self) -> None: ) ) - def test_needs_built_runtime_archives(self) -> None: - for target in [ - "x86_64-unknown-linux-gnu", - "x86_64-unknown-linux-musl", - ]: - self.assertTrue(rusty_v8_bazel.needs_built_runtime_archives(target)) - - self.assertFalse(rusty_v8_bazel.needs_built_runtime_archives("x86_64-apple-darwin")) - self.assertFalse(rusty_v8_bazel.needs_built_runtime_archives("x86_64-pc-windows-msvc")) - - def test_upstream_rusty_v8_archive_url(self) -> None: + def test_upstream_release_pair_paths(self) -> None: self.assertEqual( ( - "https://github.com/denoland/rusty_v8/releases/download/" - "v147.4.0/librusty_v8_release_x86_64-apple-darwin.a.gz" + Path( + "/tmp/rusty_v8/target/x86_64-apple-darwin/release/gn_out/obj/" + "librusty_v8.a" + ), + Path( + "/tmp/rusty_v8/target/x86_64-apple-darwin/release/gn_out/" + "src_binding.rs" + ), ), - rusty_v8_bazel.upstream_rusty_v8_archive_url( + rusty_v8_bazel.upstream_release_pair_paths( + Path("/tmp/rusty_v8"), "x86_64-apple-darwin", - "147.4.0", ), ) - - @patch("rusty_v8_bazel.merged_built_runtime_archive") - @patch("rusty_v8_bazel.merged_darwin_runtime_archive") - def test_runtime_merged_archive_dispatches_by_target( - self, - merged_darwin_runtime_archive: Mock, - merged_built_runtime_archive: Mock, - ) -> None: - merged_darwin_runtime_archive.return_value = Path("/tmp/darwin.a") - merged_built_runtime_archive.return_value = Path("/tmp/linux.a") - self.assertEqual( - Path("/tmp/darwin.a"), - rusty_v8_bazel.runtime_merged_archive( - "macos_amd64", - "x86_64-apple-darwin", - Path("/tmp/v8.a"), + ( + Path( + "/tmp/rusty_v8/target/x86_64-pc-windows-msvc/release/gn_out/" + "obj/rusty_v8.lib" + ), + Path( + "/tmp/rusty_v8/target/x86_64-pc-windows-msvc/release/gn_out/" + "src_binding.rs" + ), ), - ) - self.assertEqual( - Path("/tmp/linux.a"), - rusty_v8_bazel.runtime_merged_archive( - "linux_amd64", - "x86_64-unknown-linux-gnu", - Path("/tmp/v8.a"), + rusty_v8_bazel.upstream_release_pair_paths( + Path("/tmp/rusty_v8"), + "x86_64-pc-windows-msvc", ), ) - with self.assertRaisesRegex(SystemExit, "unsupported runtime merge target"): - rusty_v8_bazel.runtime_merged_archive( - "windows_amd64", - "x86_64-pc-windows-msvc", - Path("/tmp/v8.a"), + + def test_stage_upstream_release_pair(self) -> None: + with TemporaryDirectory() as source_dir, TemporaryDirectory() as output_dir: + source_root = Path(source_dir) + gn_out = ( + source_root + / "target" + / "aarch64-apple-darwin" + / "release" + / "gn_out" + ) + (gn_out / "obj").mkdir(parents=True) + (gn_out / "obj" / "librusty_v8.a").write_bytes(b"archive") + (gn_out / "src_binding.rs").write_text("binding") + + rusty_v8_bazel.stage_upstream_release_pair( + source_root, + "aarch64-apple-darwin", + Path(output_dir), + sandbox=True, + ) + + self.assertEqual( + { + "librusty_v8_ptrcomp_sandbox_release_aarch64-apple-darwin.a.gz", + "src_binding_ptrcomp_sandbox_release_aarch64-apple-darwin.rs", + "rusty_v8_ptrcomp_sandbox_release_aarch64-apple-darwin.sha256", + }, + {path.name for path in Path(output_dir).iterdir()}, ) @patch("rusty_v8_bazel.ensure_bazel_output_files") diff --git a/.github/workflows/rusty-v8-release.yml b/.github/workflows/rusty-v8-release.yml index ff376f18b7bb..24c63bf7033c 100644 --- a/.github/workflows/rusty-v8-release.yml +++ b/.github/workflows/rusty-v8-release.yml @@ -64,62 +64,60 @@ jobs: matrix: include: - runner: ubuntu-24.04 - bazel_config: ci-v8 - platform: linux_amd64 + producer: upstream sandbox: true target: x86_64-unknown-linux-gnu variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm - bazel_config: ci-v8 - platform: linux_arm64 + producer: upstream sandbox: true target: aarch64-unknown-linux-gnu variant: ptrcomp-sandbox - - runner: macos-15-xlarge - bazel_config: ci-macos - platform: macos_amd64 + - runner: macos-15-large + producer: upstream sandbox: true target: x86_64-apple-darwin variant: ptrcomp-sandbox - - runner: macos-15-xlarge - bazel_config: ci-macos - platform: macos_arm64 + - runner: macos-15 + producer: upstream sandbox: true target: aarch64-apple-darwin variant: ptrcomp-sandbox - runner: ubuntu-24.04 + producer: bazel bazel_config: ci-v8 platform: linux_amd64_musl sandbox: false target: x86_64-unknown-linux-musl variant: release - runner: ubuntu-24.04-arm + producer: bazel bazel_config: ci-v8 platform: linux_arm64_musl sandbox: false target: aarch64-unknown-linux-musl variant: release - runner: ubuntu-24.04 + producer: bazel bazel_config: ci-v8 platform: linux_amd64_musl sandbox: true target: x86_64-unknown-linux-musl variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm + producer: bazel bazel_config: ci-v8 platform: linux_arm64_musl sandbox: true target: aarch64-unknown-linux-musl variant: ptrcomp-sandbox - - runner: ubuntu-24.04 - bazel_config: ci-v8 - platform: windows_amd64 + - runner: windows-2022 + producer: upstream sandbox: true target: x86_64-pc-windows-msvc variant: ptrcomp-sandbox - - runner: ubuntu-24.04-arm - bazel_config: ci-v8 - platform: windows_arm64 + - runner: windows-2022 + producer: upstream sandbox: true target: aarch64-pc-windows-msvc variant: ptrcomp-sandbox @@ -130,6 +128,7 @@ jobs: persist-credentials: false - name: Set up Bazel + if: matrix.producer == 'bazel' uses: ./.github/actions/setup-bazel-ci with: target: ${{ matrix.target }} @@ -139,7 +138,76 @@ jobs: with: python-version: "3.12" + - name: Configure git for upstream checkout + if: matrix.producer == 'upstream' + shell: bash + run: git config --global core.symlinks true + + - name: Check out upstream rusty_v8 + if: matrix.producer == 'upstream' + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + repository: denoland/rusty_v8 + ref: v${{ needs.metadata.outputs.v8_version }} + path: upstream-rusty-v8 + submodules: recursive + + - name: Set up upstream Rust toolchain + if: matrix.producer == 'upstream' + uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 + with: + toolchain: "1.91.0" + targets: ${{ matrix.target }} + + - name: Install Clang for upstream Linux build + if: matrix.producer == 'upstream' && runner.os == 'Linux' + shell: bash + run: | + set -euo pipefail + + echo "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main" | sudo tee /etc/apt/sources.list.d/llvm-toolchain-noble-19.list + curl https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/llvm-snapshot.gpg >/dev/null + sudo apt-get update + sudo apt-get install -y lld-19 clang-19 clang-tools-19 clang-tidy-19 clang-format-19 libclang-19-dev + echo "LIBCLANG_PATH=/usr/lib/llvm-19/lib" >> "${GITHUB_ENV}" + + - name: Set LIBCLANG_PATH for upstream macOS build + if: matrix.producer == 'upstream' && runner.os == 'macOS' + shell: bash + run: | + set -euo pipefail + xcode_clang_lib="$(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib" + echo "LIBCLANG_PATH=${xcode_clang_lib}" >> "${GITHUB_ENV}" + + - name: Install Chromium clang for ARM64 MSVC cross build + if: matrix.producer == 'upstream' && matrix.target == 'aarch64-pc-windows-msvc' + shell: bash + working-directory: upstream-rusty-v8 + run: python3 tools/clang/scripts/update.py + + - name: Build upstream rusty_v8 release pair + if: matrix.producer == 'upstream' + env: + TARGET: ${{ matrix.target }} + shell: bash + working-directory: upstream-rusty-v8 + run: | + set -euo pipefail + + cargo_args=( + build + --locked + --release + --target "${TARGET}" + ) + if [[ "${{ matrix.sandbox }}" == "true" ]]; then + cargo_args+=(--features v8_enable_sandbox) + fi + + V8_FROM_SOURCE=true cargo "${cargo_args[@]}" + - name: Build Bazel V8 release pair + if: matrix.producer == 'bazel' env: BUILDBUDDY_API_KEY: ${{ secrets.BUILDBUDDY_API_KEY }} PLATFORM: ${{ matrix.platform }} @@ -183,26 +251,38 @@ jobs: - name: Stage release pair env: PLATFORM: ${{ matrix.platform }} + PRODUCER: ${{ matrix.producer }} SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} shell: bash run: | set -euo pipefail - stage_args=( - --platform "${PLATFORM}" - --target "${TARGET}" - --compilation-mode opt - --output-dir "dist/${TARGET}" - ) - if [[ "${SANDBOX}" == "true" ]]; then - stage_args+=(--sandbox) + if [[ "${PRODUCER}" == "upstream" ]]; then + stage_args=( + --source-root upstream-rusty-v8 + --target "${TARGET}" + --output-dir "dist/${TARGET}" + ) + if [[ "${SANDBOX}" == "true" ]]; then + stage_args+=(--sandbox) + fi + python3 .github/scripts/rusty_v8_bazel.py stage-upstream-release-pair "${stage_args[@]}" else - stage_args+=(--bazel-config v8-release-compat) + stage_args=( + --platform "${PLATFORM}" + --target "${TARGET}" + --compilation-mode opt + --output-dir "dist/${TARGET}" + ) + if [[ "${SANDBOX}" == "true" ]]; then + stage_args+=(--sandbox) + else + stage_args+=(--bazel-config v8-release-compat) + fi + python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" fi - python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" - - name: Upload staged artifacts uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index 42e98458211c..d3c7c9ea4862 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -70,53 +70,63 @@ jobs: matrix: include: - runner: ubuntu-24.04 - bazel_config: ci-v8 - platform: linux_amd64 + producer: upstream sandbox: true target: x86_64-unknown-linux-gnu variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm - bazel_config: ci-v8 - platform: linux_arm64 + producer: upstream sandbox: true target: aarch64-unknown-linux-gnu variant: ptrcomp-sandbox - - runner: macos-15-xlarge - bazel_config: ci-macos - platform: macos_amd64 + - runner: macos-15-large + producer: upstream sandbox: true target: x86_64-apple-darwin variant: ptrcomp-sandbox - - runner: macos-15-xlarge - bazel_config: ci-macos - platform: macos_arm64 + - runner: macos-15 + producer: upstream sandbox: true target: aarch64-apple-darwin variant: ptrcomp-sandbox - runner: ubuntu-24.04 + producer: bazel bazel_config: ci-v8 platform: linux_amd64_musl sandbox: false target: x86_64-unknown-linux-musl variant: release - runner: ubuntu-24.04 + producer: bazel bazel_config: ci-v8 platform: linux_amd64_musl sandbox: true target: x86_64-unknown-linux-musl variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm + producer: bazel bazel_config: ci-v8 platform: linux_arm64_musl sandbox: false target: aarch64-unknown-linux-musl variant: release - runner: ubuntu-24.04-arm + producer: bazel bazel_config: ci-v8 platform: linux_arm64_musl sandbox: true target: aarch64-unknown-linux-musl variant: ptrcomp-sandbox + - runner: windows-2022 + producer: upstream + sandbox: true + target: x86_64-pc-windows-msvc + variant: ptrcomp-sandbox + - runner: windows-2022 + producer: upstream + sandbox: true + target: aarch64-pc-windows-msvc + variant: ptrcomp-sandbox steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -125,6 +135,7 @@ jobs: persist-credentials: false - name: Set up Bazel + if: matrix.producer == 'bazel' uses: ./.github/actions/setup-bazel-ci with: target: ${{ matrix.target }} @@ -134,7 +145,76 @@ jobs: with: python-version: "3.12" + - name: Configure git for upstream checkout + if: matrix.producer == 'upstream' + shell: bash + run: git config --global core.symlinks true + + - name: Check out upstream rusty_v8 + if: matrix.producer == 'upstream' + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + repository: denoland/rusty_v8 + ref: v${{ needs.metadata.outputs.v8_version }} + path: upstream-rusty-v8 + submodules: recursive + + - name: Set up upstream Rust toolchain + if: matrix.producer == 'upstream' + uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 + with: + toolchain: "1.91.0" + targets: ${{ matrix.target }} + + - name: Install Clang for upstream Linux build + if: matrix.producer == 'upstream' && runner.os == 'Linux' + shell: bash + run: | + set -euo pipefail + + echo "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main" | sudo tee /etc/apt/sources.list.d/llvm-toolchain-noble-19.list + curl https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/llvm-snapshot.gpg >/dev/null + sudo apt-get update + sudo apt-get install -y lld-19 clang-19 clang-tools-19 clang-tidy-19 clang-format-19 libclang-19-dev + echo "LIBCLANG_PATH=/usr/lib/llvm-19/lib" >> "${GITHUB_ENV}" + + - name: Set LIBCLANG_PATH for upstream macOS build + if: matrix.producer == 'upstream' && runner.os == 'macOS' + shell: bash + run: | + set -euo pipefail + xcode_clang_lib="$(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib" + echo "LIBCLANG_PATH=${xcode_clang_lib}" >> "${GITHUB_ENV}" + + - name: Install Chromium clang for ARM64 MSVC cross build + if: matrix.producer == 'upstream' && matrix.target == 'aarch64-pc-windows-msvc' + shell: bash + working-directory: upstream-rusty-v8 + run: python3 tools/clang/scripts/update.py + + - name: Build upstream rusty_v8 release pair + if: matrix.producer == 'upstream' + env: + TARGET: ${{ matrix.target }} + shell: bash + working-directory: upstream-rusty-v8 + run: | + set -euo pipefail + + cargo_args=( + build + --locked + --release + --target "${TARGET}" + ) + if [[ "${{ matrix.sandbox }}" == "true" ]]; then + cargo_args+=(--features v8_enable_sandbox) + fi + + V8_FROM_SOURCE=true cargo "${cargo_args[@]}" + - name: Build Bazel V8 release pair + if: matrix.producer == 'bazel' env: BUILDBUDDY_API_KEY: ${{ secrets.BUILDBUDDY_API_KEY }} PLATFORM: ${{ matrix.platform }} @@ -176,26 +256,38 @@ jobs: - name: Stage release pair env: PLATFORM: ${{ matrix.platform }} + PRODUCER: ${{ matrix.producer }} SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} shell: bash run: | set -euo pipefail - stage_args=( - --platform "${PLATFORM}" - --target "${TARGET}" - --output-dir "dist/${TARGET}" - ) - if [[ "${SANDBOX}" == "true" ]]; then - stage_args+=(--sandbox) + if [[ "${PRODUCER}" == "upstream" ]]; then + stage_args=( + --source-root upstream-rusty-v8 + --target "${TARGET}" + --output-dir "dist/${TARGET}" + ) + if [[ "${SANDBOX}" == "true" ]]; then + stage_args+=(--sandbox) + fi + python3 .github/scripts/rusty_v8_bazel.py stage-upstream-release-pair "${stage_args[@]}" else - stage_args+=(--bazel-config v8-release-compat) + stage_args=( + --platform "${PLATFORM}" + --target "${TARGET}" + --output-dir "dist/${TARGET}" + ) + if [[ "${SANDBOX}" == "true" ]]; then + stage_args+=(--sandbox) + else + stage_args+=(--bazel-config v8-release-compat) + fi + python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" fi - python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" - - - name: Upload staged musl artifacts + - name: Upload staged artifacts uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: v8-canary-${{ needs.metadata.outputs.v8_version }}-${{ matrix.variant }}-${{ matrix.target }} diff --git a/third_party/v8/README.md b/third_party/v8/README.md index dae87f45d91c..2d15a1b3dcdb 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -57,8 +57,11 @@ their raw names: - `src_binding_ptrcomp_sandbox_release_.rs` The dedicated publishing workflow is `.github/workflows/rusty-v8-release.yml`. -Every tagged run builds the current musl release pairs from source and keeps the -release artifacts as the statically linked form: +For GNU Linux, Darwin, and Windows MSVC, the workflow checks out the exact +upstream `denoland/rusty_v8` tag and uses its `V8_FROM_SOURCE=true` Cargo/GN +build to produce sandbox-profile artifacts with the same archive shape upstream +publishes. Musl remains an extra platform that upstream does not publish, so +tagged runs still build the current musl release pairs with our Bazel producer: - `//third_party/v8:rusty_v8_release_pair_x86_64_unknown_linux_musl` - `//third_party/v8:rusty_v8_release_pair_aarch64_unknown_linux_musl` @@ -76,12 +79,11 @@ The same run also builds the matching sandbox pair targets: If a tagged run targets an existing GitHub release, publication amends only the sandbox-profile files and leaves the current release-profile assets unchanged. -Unix sandbox archives are staged with matching static libc++ and libc++abi -runtime objects merged in so Cargo consumers can link them with the `v8` crate's -default `use_custom_libcxx` feature. Linux artifacts use the hermetic LLVM -runtime builds directly; Darwin artifacts reuse the matching runtime members -from the upstream `rusty_v8` archive because the upstream release already ships -those custom libc++ objects for Apple targets. +The upstream-shaped GNU, Darwin, and MSVC builds let GN fold custom libc++ into +the final archive the same way `rusty_v8` does for its own releases. Musl +sandbox archives still merge the matching static libc++ and libc++abi runtime +libraries after the Bazel build so Cargo consumers can link them with the `v8` +crate's default `use_custom_libcxx` feature. Cargo musl builds use `RUSTY_V8_ARCHIVE` plus a downloaded `RUSTY_V8_SRC_BINDING_PATH` to point at those `openai/codex` release assets From 0cbb0b258de1c250fdcd9719d4e6b424c51f196f Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Fri, 8 May 2026 00:23:13 -0700 Subject: [PATCH 09/19] bazel: build rusty_v8 release artifacts hermetically --- .bazelrc | 5 + .github/scripts/rusty_v8_bazel.py | 174 ++------------- .github/scripts/test_rusty_v8_bazel.py | 171 +++++--------- .github/workflows/rusty-v8-release.yml | 209 ++++++++---------- .github/workflows/v8-canary.yml | 205 ++++++++--------- MODULE.bazel | 30 +++ patches/BUILD.bazel | 1 + patches/rules_cc_rusty_v8_custom_libcxx.patch | 35 +++ patches/v8_bazel_rules.patch | 175 ++++++++++++--- third_party/v8/BUILD.bazel | 119 ++++++---- third_party/v8/README.md | 37 ++-- third_party/v8/libcxx.BUILD.bazel | 157 +++++++++++++ third_party/v8/libcxx_config/BUILD.bazel | 12 + .../v8/libcxx_config/__assertion_handler | 27 +++ third_party/v8/libcxx_config/__config_site | 55 +++++ third_party/v8/libcxxabi.BUILD.bazel | 98 ++++++++ third_party/v8/llvm_libc.BUILD.bazel | 10 + 17 files changed, 918 insertions(+), 602 deletions(-) create mode 100644 patches/rules_cc_rusty_v8_custom_libcxx.patch create mode 100644 third_party/v8/libcxx.BUILD.bazel create mode 100644 third_party/v8/libcxx_config/BUILD.bazel create mode 100644 third_party/v8/libcxx_config/__assertion_handler create mode 100644 third_party/v8/libcxx_config/__config_site create mode 100644 third_party/v8/libcxxabi.BUILD.bazel create mode 100644 third_party/v8/llvm_libc.BUILD.bazel diff --git a/.bazelrc b/.bazelrc index 911e0802b546..6357eb83e406 100644 --- a/.bazelrc +++ b/.bazelrc @@ -193,5 +193,10 @@ common --@v8//:v8_enable_sandbox=True common:v8-release-compat --@v8//:v8_enable_pointer_compression=False common:v8-release-compat --@v8//:v8_enable_sandbox=False +# Match rusty_v8's upstream GN release contract for published artifacts: every +# target object uses Chromium's custom libc++ headers and the archive folds in +# the matching runtime objects. +common:rusty-v8-upstream-libcxx --@v8//:v8_use_rusty_v8_custom_libcxx=True + # Optional per-user local overrides. try-import %workspace%/user.bazelrc diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index 33455b93a1b7..f380cc7a510a 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -9,7 +9,6 @@ import shutil import subprocess import sys -import tempfile import tomllib from pathlib import Path @@ -23,14 +22,9 @@ ROOT = Path(__file__).resolve().parents[2] MODULE_BAZEL = ROOT / "MODULE.bazel" RUSTY_V8_CHECKSUMS_DIR = ROOT / "third_party" / "v8" -STATIC_RUNTIME_ARCHIVE_LABELS = [ - "@llvm//runtimes/libcxx:libcxx.static", - "@llvm//runtimes/libcxx:libcxxabi.static", -] -LLVM_AR_LABEL = "@llvm//tools:llvm-ar" -LLVM_RANLIB_LABEL = "@llvm//tools:llvm-ranlib" RELEASE_ARTIFACT_PROFILE = "release" SANDBOX_ARTIFACT_PROFILE = "ptrcomp_sandbox_release" +ARTIFACT_BAZEL_CONFIGS = ["rusty-v8-upstream-libcxx"] def bazel_execroot() -> Path: @@ -116,10 +110,8 @@ def ensure_bazel_output_files( compilation_mode: str = "fastbuild", bazel_configs: list[str] | None = None, ) -> list[Path]: - outputs = bazel_output_files(platform, labels, compilation_mode, bazel_configs) - if all(path.exists() for path in outputs): - return outputs - + # Bazel output paths can be reused across config flips, so existence alone + # does not prove the files match the requested flags. bazel_build(platform, labels, compilation_mode, bazel_configs) outputs = bazel_output_files(platform, labels, compilation_mode, bazel_configs) missing = [str(path) for path in outputs if not path.exists()] @@ -128,6 +120,14 @@ def ensure_bazel_output_files( return outputs +def artifact_bazel_configs(bazel_configs: list[str] | None = None) -> list[str]: + configured = list(ARTIFACT_BAZEL_CONFIGS) + for config in bazel_configs or []: + if config not in configured: + configured.append(config) + return configured + + def release_pair_label(target: str, sandbox: bool = False) -> str: target_suffix = target.replace("-", "_") pair_kind = "sandbox_release_pair" if sandbox else "release_pair" @@ -184,7 +184,7 @@ def command_manifest_path(manifest: Path | None, version: str) -> Path: def staged_archive_name(target: str, source_path: Path, artifact_profile: str) -> str: - if source_path.suffix == ".lib": + if target.endswith("-pc-windows-msvc"): return f"rusty_v8_{artifact_profile}_{target}.lib.gz" return f"librusty_v8_{artifact_profile}_{target}.a.gz" @@ -197,122 +197,6 @@ def staged_checksums_name(target: str, artifact_profile: str) -> str: return f"rusty_v8_{artifact_profile}_{target}.sha256" -def needs_merged_runtime_archive(target: str, source_path: Path) -> bool: - return source_path.suffix == ".a" and target.endswith( - ("-unknown-linux-gnu", "-unknown-linux-musl") - ) - - -def single_bazel_output_file( - platform: str, - label: str, - compilation_mode: str = "fastbuild", - bazel_configs: list[str] | None = None, -) -> Path: - outputs = ensure_bazel_output_files(platform, [label], compilation_mode, bazel_configs) - if len(outputs) != 1: - raise SystemExit(f"expected exactly one output for {label}, found {outputs}") - return outputs[0] - - -def host_runnable_bazel_output_file( - platform: str, - label: str, - compilation_mode: str = "fastbuild", - bazel_configs: list[str] | None = None, -) -> Path: - outputs = ensure_bazel_output_files(platform, [label], compilation_mode, bazel_configs) - if len(outputs) == 1: - return outputs[0] - - runnable_outputs = [] - for output in outputs: - try: - result = subprocess.run( - [str(output), "--version"], - cwd=ROOT, - capture_output=True, - text=True, - ) - except OSError: - continue - if result.returncode == 0: - runnable_outputs.append(output) - - if len(runnable_outputs) != 1: - raise SystemExit( - f"expected exactly one host-runnable output for {label}, " - f"found {runnable_outputs} from {outputs}" - ) - return runnable_outputs[0] - - -def merged_archive( - platform: str, - lib_path: Path, - extra_archives: list[Path], - compilation_mode: str = "fastbuild", - bazel_configs: list[str] | None = None, -) -> Path: - llvm_ar = host_runnable_bazel_output_file( - platform, - LLVM_AR_LABEL, - compilation_mode, - bazel_configs, - ) - llvm_ranlib = host_runnable_bazel_output_file( - platform, - LLVM_RANLIB_LABEL, - compilation_mode, - bazel_configs, - ) - temp_dir = Path(tempfile.mkdtemp(prefix="rusty-v8-runtime-stage-")) - merged_archive = temp_dir / lib_path.name - merge_commands = "\n".join( - [ - f"create {merged_archive}", - f"addlib {lib_path}", - *[f"addlib {archive}" for archive in extra_archives], - "save", - "end", - ] - ) - subprocess.run( - [str(llvm_ar), "-M"], - cwd=ROOT, - check=True, - input=merge_commands, - text=True, - ) - subprocess.run([str(llvm_ranlib), str(merged_archive)], cwd=ROOT, check=True) - return merged_archive - - -def merged_built_runtime_archive( - platform: str, - lib_path: Path, - compilation_mode: str = "fastbuild", - bazel_configs: list[str] | None = None, -) -> Path: - runtime_archives = [ - single_bazel_output_file(platform, label, compilation_mode, bazel_configs) - for label in STATIC_RUNTIME_ARCHIVE_LABELS - ] - return merged_archive( - platform, - lib_path, - runtime_archives, - compilation_mode, - bazel_configs, - ) - - -def upstream_release_pair_paths(source_root: Path, target: str) -> tuple[Path, Path]: - lib_name = "rusty_v8.lib" if target.endswith("-pc-windows-msvc") else "librusty_v8.a" - gn_out = source_root / "target" / target / "release" / "gn_out" - return gn_out / "obj" / lib_name, gn_out / "src_binding.rs" - - def stage_artifacts( target: str, lib_path: Path, @@ -355,16 +239,6 @@ def stage_artifacts( print(staged_checksums) -def stage_upstream_release_pair( - source_root: Path, - target: str, - output_dir: Path, - sandbox: bool = False, -) -> None: - lib_path, binding_path = upstream_release_pair_paths(source_root, target) - stage_artifacts(target, lib_path, binding_path, output_dir, sandbox) - - def stage_release_pair( platform: str, target: str, @@ -373,6 +247,7 @@ def stage_release_pair( bazel_configs: list[str] | None = None, sandbox: bool = False, ) -> None: + bazel_configs = artifact_bazel_configs(bazel_configs) outputs = ensure_bazel_output_files( platform, [release_pair_label(target, sandbox)], @@ -390,12 +265,7 @@ def stage_release_pair( except StopIteration as exc: raise SystemExit(f"missing Rust binding output for {target}") from exc - source_archive = ( - merged_built_runtime_archive(platform, lib_path, compilation_mode, bazel_configs) - if needs_merged_runtime_archive(target, lib_path) - else lib_path - ) - stage_artifacts(target, source_archive, binding_path, output_dir, sandbox) + stage_artifacts(target, lib_path, binding_path, output_dir, sandbox) def parse_args() -> argparse.Namespace: @@ -419,14 +289,6 @@ def parse_args() -> argparse.Namespace: choices=["fastbuild", "opt", "dbg"], ) - stage_upstream_release_pair_parser = subparsers.add_parser( - "stage-upstream-release-pair" - ) - stage_upstream_release_pair_parser.add_argument("--source-root", type=Path, required=True) - stage_upstream_release_pair_parser.add_argument("--target", required=True) - stage_upstream_release_pair_parser.add_argument("--output-dir", required=True) - stage_upstream_release_pair_parser.add_argument("--sandbox", action="store_true") - subparsers.add_parser("resolved-v8-crate-version") check_module_bazel_parser = subparsers.add_parser("check-module-bazel") @@ -462,14 +324,6 @@ def main() -> int: sandbox=args.sandbox, ) return 0 - if args.command == "stage-upstream-release-pair": - stage_upstream_release_pair( - source_root=args.source_root, - target=args.target, - output_dir=Path(args.output_dir), - sandbox=args.sandbox, - ) - return 0 if args.command == "resolved-v8-crate-version": print(resolved_v8_crate_version()) return 0 diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index 5d68336980fb..66c69f9a5b7f 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -4,9 +4,8 @@ import textwrap import unittest -from tempfile import TemporaryDirectory from pathlib import Path -from unittest.mock import Mock +from tempfile import TemporaryDirectory from unittest.mock import patch import rusty_v8_bazel @@ -14,6 +13,22 @@ class RustyV8BazelTest(unittest.TestCase): + def test_artifact_bazel_configs_always_enable_upstream_libcxx(self) -> None: + self.assertEqual( + ["rusty-v8-upstream-libcxx"], + rusty_v8_bazel.artifact_bazel_configs(), + ) + self.assertEqual( + ["rusty-v8-upstream-libcxx", "v8-release-compat"], + rusty_v8_bazel.artifact_bazel_configs(["v8-release-compat"]), + ) + self.assertEqual( + ["rusty-v8-upstream-libcxx", "v8-release-compat"], + rusty_v8_bazel.artifact_bazel_configs( + ["rusty-v8-upstream-libcxx", "v8-release-compat"] + ), + ) + def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self) -> None: self.assertEqual( "//third_party/v8:rusty_v8_release_pair_x86_64_unknown_linux_musl", @@ -36,7 +51,7 @@ def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self ), ) self.assertEqual( - "librusty_v8_ptrcomp_sandbox_release_x86_64-pc-windows-msvc.a.gz", + "rusty_v8_ptrcomp_sandbox_release_x86_64-pc-windows-msvc.lib.gz", rusty_v8_bazel.staged_archive_name( "x86_64-pc-windows-msvc", Path("v8.a"), @@ -58,77 +73,18 @@ def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self ), ) - def test_needs_merged_runtime_archive(self) -> None: - for target in [ - "x86_64-unknown-linux-gnu", - "x86_64-unknown-linux-musl", - ]: - self.assertTrue(rusty_v8_bazel.needs_merged_runtime_archive(target, Path("v8.a"))) - - self.assertFalse( - rusty_v8_bazel.needs_merged_runtime_archive( - "x86_64-apple-darwin", - Path("v8.a"), - ) - ) - self.assertFalse( - rusty_v8_bazel.needs_merged_runtime_archive( - "x86_64-pc-windows-msvc", - Path("v8.a"), - ) - ) - - def test_upstream_release_pair_paths(self) -> None: - self.assertEqual( - ( - Path( - "/tmp/rusty_v8/target/x86_64-apple-darwin/release/gn_out/obj/" - "librusty_v8.a" - ), - Path( - "/tmp/rusty_v8/target/x86_64-apple-darwin/release/gn_out/" - "src_binding.rs" - ), - ), - rusty_v8_bazel.upstream_release_pair_paths( - Path("/tmp/rusty_v8"), - "x86_64-apple-darwin", - ), - ) - self.assertEqual( - ( - Path( - "/tmp/rusty_v8/target/x86_64-pc-windows-msvc/release/gn_out/" - "obj/rusty_v8.lib" - ), - Path( - "/tmp/rusty_v8/target/x86_64-pc-windows-msvc/release/gn_out/" - "src_binding.rs" - ), - ), - rusty_v8_bazel.upstream_release_pair_paths( - Path("/tmp/rusty_v8"), - "x86_64-pc-windows-msvc", - ), - ) - - def test_stage_upstream_release_pair(self) -> None: + def test_stage_artifacts(self) -> None: with TemporaryDirectory() as source_dir, TemporaryDirectory() as output_dir: source_root = Path(source_dir) - gn_out = ( - source_root - / "target" - / "aarch64-apple-darwin" - / "release" - / "gn_out" - ) - (gn_out / "obj").mkdir(parents=True) - (gn_out / "obj" / "librusty_v8.a").write_bytes(b"archive") - (gn_out / "src_binding.rs").write_text("binding") + archive = source_root / "librusty_v8.a" + binding = source_root / "src_binding.rs" + archive.write_bytes(b"archive") + binding.write_text("binding") - rusty_v8_bazel.stage_upstream_release_pair( - source_root, + rusty_v8_bazel.stage_artifacts( "aarch64-apple-darwin", + archive, + binding, Path(output_dir), sandbox=True, ) @@ -142,53 +98,40 @@ def test_stage_upstream_release_pair(self) -> None: {path.name for path in Path(output_dir).iterdir()}, ) - @patch("rusty_v8_bazel.ensure_bazel_output_files") - @patch("rusty_v8_bazel.subprocess.run") - def test_host_runnable_bazel_output_file_selects_runnable_candidate( - self, - run: Mock, - ensure_outputs: Mock, - ) -> None: - amd64_tool = Path("/tmp/llvm-amd64/bin/llvm-ar") - arm64_tool = Path("/tmp/llvm-arm64/bin/llvm-ar") - ensure_outputs.return_value = [amd64_tool, arm64_tool] - run.side_effect = [ - OSError("Exec format error"), - Mock(returncode=0), - ] + def test_ensure_bazel_output_files_rebuilds_existing_outputs(self) -> None: + with TemporaryDirectory() as output_dir: + output = Path(output_dir) / "libv8.a" + output.write_bytes(b"archive") + + with ( + patch.object(rusty_v8_bazel, "bazel_build") as bazel_build, + patch.object( + rusty_v8_bazel, + "bazel_output_files", + return_value=[output], + ) as bazel_output_files, + ): + self.assertEqual( + [output], + rusty_v8_bazel.ensure_bazel_output_files( + "macos_arm64", + ["//third_party/v8:pair"], + "opt", + ["rusty-v8-upstream-libcxx"], + ), + ) - self.assertEqual( - arm64_tool, - rusty_v8_bazel.host_runnable_bazel_output_file( - "linux_arm64_musl", - "@llvm//tools:llvm-ar", + bazel_build.assert_called_once_with( + "macos_arm64", + ["//third_party/v8:pair"], "opt", - ), - ) - - @patch("rusty_v8_bazel.ensure_bazel_output_files") - @patch("rusty_v8_bazel.subprocess.run") - def test_host_runnable_bazel_output_file_rejects_ambiguous_candidates( - self, - run: Mock, - ensure_outputs: Mock, - ) -> None: - amd64_tool = Path("/tmp/llvm-amd64/bin/llvm-ar") - arm64_tool = Path("/tmp/llvm-arm64/bin/llvm-ar") - ensure_outputs.return_value = [amd64_tool, arm64_tool] - run.side_effect = [ - Mock(returncode=0), - Mock(returncode=0), - ] - - with self.assertRaisesRegex( - SystemExit, - "expected exactly one host-runnable output", - ): - rusty_v8_bazel.host_runnable_bazel_output_file( - "linux_arm64_musl", - "@llvm//tools:llvm-ar", + ["rusty-v8-upstream-libcxx"], + ) + bazel_output_files.assert_called_once_with( + "macos_arm64", + ["//third_party/v8:pair"], "opt", + ["rusty-v8-upstream-libcxx"], ) def test_update_module_bazel_replaces_and_inserts_sha256(self) -> None: diff --git a/.github/workflows/rusty-v8-release.yml b/.github/workflows/rusty-v8-release.yml index 24c63bf7033c..0b1776ba7397 100644 --- a/.github/workflows/rusty-v8-release.yml +++ b/.github/workflows/rusty-v8-release.yml @@ -64,63 +64,77 @@ jobs: matrix: include: - runner: ubuntu-24.04 - producer: upstream + bazel_config: ci-v8 + platform: linux_amd64 + sandbox: false + target: x86_64-unknown-linux-gnu + variant: release + - runner: ubuntu-24.04 + bazel_config: ci-v8 + platform: linux_amd64 sandbox: true target: x86_64-unknown-linux-gnu variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm - producer: upstream + bazel_config: ci-v8 + platform: linux_arm64 + sandbox: false + target: aarch64-unknown-linux-gnu + variant: release + - runner: ubuntu-24.04-arm + bazel_config: ci-v8 + platform: linux_arm64 sandbox: true target: aarch64-unknown-linux-gnu variant: ptrcomp-sandbox - - runner: macos-15-large - producer: upstream + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_amd64 + sandbox: false + target: x86_64-apple-darwin + variant: release + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_amd64 sandbox: true target: x86_64-apple-darwin variant: ptrcomp-sandbox - - runner: macos-15 - producer: upstream + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_arm64 + sandbox: false + target: aarch64-apple-darwin + variant: release + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_arm64 sandbox: true target: aarch64-apple-darwin variant: ptrcomp-sandbox - runner: ubuntu-24.04 - producer: bazel bazel_config: ci-v8 platform: linux_amd64_musl sandbox: false target: x86_64-unknown-linux-musl variant: release - runner: ubuntu-24.04-arm - producer: bazel bazel_config: ci-v8 platform: linux_arm64_musl sandbox: false target: aarch64-unknown-linux-musl variant: release - runner: ubuntu-24.04 - producer: bazel bazel_config: ci-v8 platform: linux_amd64_musl sandbox: true target: x86_64-unknown-linux-musl variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm - producer: bazel bazel_config: ci-v8 platform: linux_arm64_musl sandbox: true target: aarch64-unknown-linux-musl variant: ptrcomp-sandbox - - runner: windows-2022 - producer: upstream - sandbox: true - target: x86_64-pc-windows-msvc - variant: ptrcomp-sandbox - - runner: windows-2022 - producer: upstream - sandbox: true - target: aarch64-pc-windows-msvc - variant: ptrcomp-sandbox steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -128,7 +142,6 @@ jobs: persist-credentials: false - name: Set up Bazel - if: matrix.producer == 'bazel' uses: ./.github/actions/setup-bazel-ci with: target: ${{ matrix.target }} @@ -138,76 +151,12 @@ jobs: with: python-version: "3.12" - - name: Configure git for upstream checkout - if: matrix.producer == 'upstream' - shell: bash - run: git config --global core.symlinks true - - - name: Check out upstream rusty_v8 - if: matrix.producer == 'upstream' - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - repository: denoland/rusty_v8 - ref: v${{ needs.metadata.outputs.v8_version }} - path: upstream-rusty-v8 - submodules: recursive - - - name: Set up upstream Rust toolchain - if: matrix.producer == 'upstream' + - name: Set up Rust toolchain for Cargo smoke uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 with: - toolchain: "1.91.0" - targets: ${{ matrix.target }} - - - name: Install Clang for upstream Linux build - if: matrix.producer == 'upstream' && runner.os == 'Linux' - shell: bash - run: | - set -euo pipefail - - echo "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main" | sudo tee /etc/apt/sources.list.d/llvm-toolchain-noble-19.list - curl https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/llvm-snapshot.gpg >/dev/null - sudo apt-get update - sudo apt-get install -y lld-19 clang-19 clang-tools-19 clang-tidy-19 clang-format-19 libclang-19-dev - echo "LIBCLANG_PATH=/usr/lib/llvm-19/lib" >> "${GITHUB_ENV}" - - - name: Set LIBCLANG_PATH for upstream macOS build - if: matrix.producer == 'upstream' && runner.os == 'macOS' - shell: bash - run: | - set -euo pipefail - xcode_clang_lib="$(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib" - echo "LIBCLANG_PATH=${xcode_clang_lib}" >> "${GITHUB_ENV}" - - - name: Install Chromium clang for ARM64 MSVC cross build - if: matrix.producer == 'upstream' && matrix.target == 'aarch64-pc-windows-msvc' - shell: bash - working-directory: upstream-rusty-v8 - run: python3 tools/clang/scripts/update.py - - - name: Build upstream rusty_v8 release pair - if: matrix.producer == 'upstream' - env: - TARGET: ${{ matrix.target }} - shell: bash - working-directory: upstream-rusty-v8 - run: | - set -euo pipefail - - cargo_args=( - build - --locked - --release - --target "${TARGET}" - ) - if [[ "${{ matrix.sandbox }}" == "true" ]]; then - cargo_args+=(--features v8_enable_sandbox) - fi - - V8_FROM_SOURCE=true cargo "${cargo_args[@]}" + toolchain: "1.93.0" - name: Build Bazel V8 release pair - if: matrix.producer == 'bazel' env: BUILDBUDDY_API_KEY: ${{ secrets.BUILDBUDDY_API_KEY }} PLATFORM: ${{ matrix.platform }} @@ -229,15 +178,10 @@ jobs: -c opt "--platforms=@llvm//platforms:${PLATFORM}" + --config=rusty-v8-upstream-libcxx "${pair_target}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) ) - if [[ "${TARGET}" == *-unknown-linux-* ]]; then - bazel_args+=( - "@llvm//runtimes/libcxx:libcxx.static" - "@llvm//runtimes/libcxx:libcxxabi.static" - ) - fi if [[ "${SANDBOX}" != "true" ]]; then bazel_args+=(--config=v8-release-compat) fi @@ -251,38 +195,64 @@ jobs: - name: Stage release pair env: PLATFORM: ${{ matrix.platform }} - PRODUCER: ${{ matrix.producer }} SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} shell: bash run: | set -euo pipefail - if [[ "${PRODUCER}" == "upstream" ]]; then - stage_args=( - --source-root upstream-rusty-v8 - --target "${TARGET}" - --output-dir "dist/${TARGET}" - ) - if [[ "${SANDBOX}" == "true" ]]; then - stage_args+=(--sandbox) - fi - python3 .github/scripts/rusty_v8_bazel.py stage-upstream-release-pair "${stage_args[@]}" + stage_args=( + --platform "${PLATFORM}" + --target "${TARGET}" + --compilation-mode opt + --output-dir "dist/${TARGET}" + ) + if [[ "${SANDBOX}" == "true" ]]; then + stage_args+=(--sandbox) else - stage_args=( - --platform "${PLATFORM}" - --target "${TARGET}" - --compilation-mode opt - --output-dir "dist/${TARGET}" - ) - if [[ "${SANDBOX}" == "true" ]]; then - stage_args+=(--sandbox) - else - stage_args+=(--bazel-config v8-release-compat) - fi - python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" + stage_args+=(--bazel-config v8-release-compat) fi + python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" + + - name: Smoke test staged artifact with Cargo + env: + SANDBOX: ${{ matrix.sandbox }} + TARGET: ${{ matrix.target }} + shell: bash + run: | + set -euo pipefail + + host_arch="$(uname -m)" + case "${TARGET}:${host_arch}" in + x86_64-apple-darwin:x86_64|aarch64-apple-darwin:arm64|x86_64-unknown-linux-gnu:x86_64|aarch64-unknown-linux-gnu:aarch64) + ;; + *) + echo "Skipping non-native Cargo smoke for ${TARGET} on ${host_arch}." + exit 0 + ;; + esac + + archive="$(find "dist/${TARGET}" -maxdepth 1 -type f -name 'librusty_v8_*.a.gz' -print -quit)" + binding="$(find "dist/${TARGET}" -maxdepth 1 -type f -name 'src_binding_*.rs' -print -quit)" + if [[ -z "${archive}" || -z "${binding}" ]]; then + echo "Missing staged archive or binding for ${TARGET}." >&2 + exit 1 + fi + + cargo_args=(test -p codex-v8-poc) + if [[ "${SANDBOX}" == "true" ]]; then + cargo_args+=(--features sandbox) + fi + + ( + cd codex-rs + CARGO_TARGET_DIR="${RUNNER_TEMP}/rusty-v8-cargo-smoke-${TARGET}-${SANDBOX}" \ + RUSTY_V8_ARCHIVE="${GITHUB_WORKSPACE}/${archive}" \ + RUSTY_V8_SRC_BINDING_PATH="${GITHUB_WORKSPACE}/${binding}" \ + cargo "${cargo_args[@]}" + ) + - name: Upload staged artifacts uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: @@ -328,16 +298,13 @@ jobs: # Keep V8 artifact releases out of Codex's normal "latest release" channel. prerelease: true - - name: Amend existing GitHub Release with sandbox artifacts + - name: Amend existing GitHub Release if: ${{ steps.release.outputs.exists == 'true' }} uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 with: tag_name: ${{ needs.metadata.outputs.release_tag }} name: ${{ needs.metadata.outputs.release_tag }} - files: | - dist/**/librusty_v8_ptrcomp_sandbox_release_*.a.gz - dist/**/src_binding_ptrcomp_sandbox_release_*.rs - dist/**/rusty_v8_ptrcomp_sandbox_release_*.sha256 + files: dist/** overwrite_files: true # Keep V8 artifact releases out of Codex's normal "latest release" channel. prerelease: true diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index d3c7c9ea4862..315d15e32bae 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -11,6 +11,7 @@ on: - "MODULE.bazel.lock" - "codex-rs/Cargo.toml" - "patches/BUILD.bazel" + - "patches/rules_cc_*.patch" - "patches/v8_*.patch" - "third_party/v8/**" push: @@ -25,6 +26,7 @@ on: - "MODULE.bazel.lock" - "codex-rs/Cargo.toml" - "patches/BUILD.bazel" + - "patches/rules_cc_*.patch" - "patches/v8_*.patch" - "third_party/v8/**" workflow_dispatch: @@ -59,7 +61,7 @@ jobs: echo "version=${version}" >> "$GITHUB_OUTPUT" build: - name: Build ${{ matrix.target }} + name: Build ${{ matrix.variant }} ${{ matrix.target }} needs: metadata runs-on: ${{ matrix.runner }} permissions: @@ -70,64 +72,77 @@ jobs: matrix: include: - runner: ubuntu-24.04 - producer: upstream + bazel_config: ci-v8 + platform: linux_amd64 + sandbox: false + target: x86_64-unknown-linux-gnu + variant: release + - runner: ubuntu-24.04 + bazel_config: ci-v8 + platform: linux_amd64 sandbox: true target: x86_64-unknown-linux-gnu variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm - producer: upstream + bazel_config: ci-v8 + platform: linux_arm64 + sandbox: false + target: aarch64-unknown-linux-gnu + variant: release + - runner: ubuntu-24.04-arm + bazel_config: ci-v8 + platform: linux_arm64 sandbox: true target: aarch64-unknown-linux-gnu variant: ptrcomp-sandbox - - runner: macos-15-large - producer: upstream + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_amd64 + sandbox: false + target: x86_64-apple-darwin + variant: release + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_amd64 sandbox: true target: x86_64-apple-darwin variant: ptrcomp-sandbox - - runner: macos-15 - producer: upstream + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_arm64 + sandbox: false + target: aarch64-apple-darwin + variant: release + - runner: macos-15-xlarge + bazel_config: ci-macos + platform: macos_arm64 sandbox: true target: aarch64-apple-darwin variant: ptrcomp-sandbox - runner: ubuntu-24.04 - producer: bazel bazel_config: ci-v8 platform: linux_amd64_musl sandbox: false target: x86_64-unknown-linux-musl variant: release - runner: ubuntu-24.04 - producer: bazel bazel_config: ci-v8 platform: linux_amd64_musl sandbox: true target: x86_64-unknown-linux-musl variant: ptrcomp-sandbox - runner: ubuntu-24.04-arm - producer: bazel bazel_config: ci-v8 platform: linux_arm64_musl sandbox: false target: aarch64-unknown-linux-musl variant: release - runner: ubuntu-24.04-arm - producer: bazel bazel_config: ci-v8 platform: linux_arm64_musl sandbox: true target: aarch64-unknown-linux-musl variant: ptrcomp-sandbox - - runner: windows-2022 - producer: upstream - sandbox: true - target: x86_64-pc-windows-msvc - variant: ptrcomp-sandbox - - runner: windows-2022 - producer: upstream - sandbox: true - target: aarch64-pc-windows-msvc - variant: ptrcomp-sandbox - steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: @@ -135,7 +150,6 @@ jobs: persist-credentials: false - name: Set up Bazel - if: matrix.producer == 'bazel' uses: ./.github/actions/setup-bazel-ci with: target: ${{ matrix.target }} @@ -145,76 +159,12 @@ jobs: with: python-version: "3.12" - - name: Configure git for upstream checkout - if: matrix.producer == 'upstream' - shell: bash - run: git config --global core.symlinks true - - - name: Check out upstream rusty_v8 - if: matrix.producer == 'upstream' - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - repository: denoland/rusty_v8 - ref: v${{ needs.metadata.outputs.v8_version }} - path: upstream-rusty-v8 - submodules: recursive - - - name: Set up upstream Rust toolchain - if: matrix.producer == 'upstream' + - name: Set up Rust toolchain for Cargo smoke uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 with: - toolchain: "1.91.0" - targets: ${{ matrix.target }} - - - name: Install Clang for upstream Linux build - if: matrix.producer == 'upstream' && runner.os == 'Linux' - shell: bash - run: | - set -euo pipefail - - echo "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main" | sudo tee /etc/apt/sources.list.d/llvm-toolchain-noble-19.list - curl https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/llvm-snapshot.gpg >/dev/null - sudo apt-get update - sudo apt-get install -y lld-19 clang-19 clang-tools-19 clang-tidy-19 clang-format-19 libclang-19-dev - echo "LIBCLANG_PATH=/usr/lib/llvm-19/lib" >> "${GITHUB_ENV}" - - - name: Set LIBCLANG_PATH for upstream macOS build - if: matrix.producer == 'upstream' && runner.os == 'macOS' - shell: bash - run: | - set -euo pipefail - xcode_clang_lib="$(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib" - echo "LIBCLANG_PATH=${xcode_clang_lib}" >> "${GITHUB_ENV}" - - - name: Install Chromium clang for ARM64 MSVC cross build - if: matrix.producer == 'upstream' && matrix.target == 'aarch64-pc-windows-msvc' - shell: bash - working-directory: upstream-rusty-v8 - run: python3 tools/clang/scripts/update.py - - - name: Build upstream rusty_v8 release pair - if: matrix.producer == 'upstream' - env: - TARGET: ${{ matrix.target }} - shell: bash - working-directory: upstream-rusty-v8 - run: | - set -euo pipefail - - cargo_args=( - build - --locked - --release - --target "${TARGET}" - ) - if [[ "${{ matrix.sandbox }}" == "true" ]]; then - cargo_args+=(--features v8_enable_sandbox) - fi - - V8_FROM_SOURCE=true cargo "${cargo_args[@]}" + toolchain: "1.93.0" - name: Build Bazel V8 release pair - if: matrix.producer == 'bazel' env: BUILDBUDDY_API_KEY: ${{ secrets.BUILDBUDDY_API_KEY }} PLATFORM: ${{ matrix.platform }} @@ -234,15 +184,10 @@ jobs: bazel_args=( build "--platforms=@llvm//platforms:${PLATFORM}" + --config=rusty-v8-upstream-libcxx "${pair_target}" --build_metadata=COMMIT_SHA=$(git rev-parse HEAD) ) - if [[ "${TARGET}" == *-unknown-linux-* ]]; then - bazel_args+=( - "@llvm//runtimes/libcxx:libcxx.static" - "@llvm//runtimes/libcxx:libcxxabi.static" - ) - fi if [[ "${SANDBOX}" != "true" ]]; then bazel_args+=(--config=v8-release-compat) fi @@ -256,37 +201,63 @@ jobs: - name: Stage release pair env: PLATFORM: ${{ matrix.platform }} - PRODUCER: ${{ matrix.producer }} SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} shell: bash run: | set -euo pipefail - if [[ "${PRODUCER}" == "upstream" ]]; then - stage_args=( - --source-root upstream-rusty-v8 - --target "${TARGET}" - --output-dir "dist/${TARGET}" - ) - if [[ "${SANDBOX}" == "true" ]]; then - stage_args+=(--sandbox) - fi - python3 .github/scripts/rusty_v8_bazel.py stage-upstream-release-pair "${stage_args[@]}" + stage_args=( + --platform "${PLATFORM}" + --target "${TARGET}" + --output-dir "dist/${TARGET}" + ) + if [[ "${SANDBOX}" == "true" ]]; then + stage_args+=(--sandbox) else - stage_args=( - --platform "${PLATFORM}" - --target "${TARGET}" - --output-dir "dist/${TARGET}" - ) - if [[ "${SANDBOX}" == "true" ]]; then - stage_args+=(--sandbox) - else - stage_args+=(--bazel-config v8-release-compat) - fi - python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" + stage_args+=(--bazel-config v8-release-compat) fi + python3 .github/scripts/rusty_v8_bazel.py stage-release-pair "${stage_args[@]}" + + - name: Smoke test staged artifact with Cargo + env: + SANDBOX: ${{ matrix.sandbox }} + TARGET: ${{ matrix.target }} + shell: bash + run: | + set -euo pipefail + + host_arch="$(uname -m)" + case "${TARGET}:${host_arch}" in + x86_64-apple-darwin:x86_64|aarch64-apple-darwin:arm64|x86_64-unknown-linux-gnu:x86_64|aarch64-unknown-linux-gnu:aarch64) + ;; + *) + echo "Skipping non-native Cargo smoke for ${TARGET} on ${host_arch}." + exit 0 + ;; + esac + + archive="$(find "dist/${TARGET}" -maxdepth 1 -type f -name 'librusty_v8_*.a.gz' -print -quit)" + binding="$(find "dist/${TARGET}" -maxdepth 1 -type f -name 'src_binding_*.rs' -print -quit)" + if [[ -z "${archive}" || -z "${binding}" ]]; then + echo "Missing staged archive or binding for ${TARGET}." >&2 + exit 1 + fi + + cargo_args=(test -p codex-v8-poc) + if [[ "${SANDBOX}" == "true" ]]; then + cargo_args+=(--features sandbox) + fi + + ( + cd codex-rs + CARGO_TARGET_DIR="${RUNNER_TEMP}/rusty-v8-cargo-smoke-${TARGET}-${SANDBOX}" \ + RUSTY_V8_ARCHIVE="${GITHUB_WORKSPACE}/${archive}" \ + RUSTY_V8_SRC_BINDING_PATH="${GITHUB_WORKSPACE}/${binding}" \ + cargo "${cargo_args[@]}" + ) + - name: Upload staged artifacts uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: diff --git a/MODULE.bazel b/MODULE.bazel index 6aa9925fc7b2..dac8ded4ff42 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -77,6 +77,13 @@ use_repo(osx, "macos_sdk") # Needed to disable xcode... bazel_dep(name = "apple_support", version = "2.1.0") bazel_dep(name = "rules_cc", version = "0.2.16") +single_version_override( + module_name = "rules_cc", + patch_strip = 1, + patches = [ + "//patches:rules_cc_rusty_v8_custom_libcxx.patch", + ], +) bazel_dep(name = "rules_platform", version = "0.1.0") bazel_dep(name = "rules_rs", version = "0.0.58") # `rules_rs` still does not model `windows-gnullvm` as a distinct Windows exec @@ -439,6 +446,29 @@ http_archive( urls = ["https://static.crates.io/crates/v8/v8-147.4.0.crate"], ) +git_repository = use_repo_rule("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") + +git_repository( + name = "rusty_v8_libcxx", + build_file = "//third_party/v8:libcxx.BUILD.bazel", + commit = "7ab65651aed6802d2599dcb7a73b1f82d5179d05", + remote = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git", +) + +git_repository( + name = "rusty_v8_libcxxabi", + build_file = "//third_party/v8:libcxxabi.BUILD.bazel", + commit = "8f11bb1d4438d0239d0dfc1bd9456a9f31629dda", + remote = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git", +) + +git_repository( + name = "rusty_v8_llvm_libc", + build_file = "//third_party/v8:llvm_libc.BUILD.bazel", + commit = "b3aa5bb702ff9e890179fd1e7d3ba346e17ecf8e", + remote = "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libc.git", +) + http_file( name = "rusty_v8_146_4_0_aarch64_apple_darwin_archive", downloaded_file_path = "librusty_v8_release_aarch64-apple-darwin.a.gz", diff --git a/patches/BUILD.bazel b/patches/BUILD.bazel index b58292c72783..3a5345de0ffc 100644 --- a/patches/BUILD.bazel +++ b/patches/BUILD.bazel @@ -12,6 +12,7 @@ exports_files([ "rules_rust_windows_process_wrapper_skip_temp_outputs.patch", "rules_rust_windows_msvc_direct_link_args.patch", "rules_rust_windows_gnullvm_build_script.patch", + "rules_cc_rusty_v8_custom_libcxx.patch", "rules_rs_windows_gnullvm_exec.patch", "rules_rs_windows_exec_linker.patch", "rusty_v8_prebuilt_out_dir.patch", diff --git a/patches/rules_cc_rusty_v8_custom_libcxx.patch b/patches/rules_cc_rusty_v8_custom_libcxx.patch new file mode 100644 index 000000000000..1e4e7d9d539d --- /dev/null +++ b/patches/rules_cc_rusty_v8_custom_libcxx.patch @@ -0,0 +1,35 @@ +diff --git a/cc/cc_library.bzl b/cc/cc_library.bzl +--- a/cc/cc_library.bzl ++++ b/cc/cc_library.bzl +@@ -16,4 +16,31 @@ + load("@cc_compatibility_proxy//:proxy.bzl", _cc_library = "cc_library") + ++_RUSTY_V8_CUSTOM_LIBCXX_COPTS = select({ ++ "@@//third_party/v8:use_rusty_v8_custom_libcxx": [ ++ "-nostdinc++", ++ "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS", ++ "-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE", ++ "-D_LIBCPP_INSTRUMENTED_WITH_ASAN=0", ++ "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS", ++ ], ++ "//conditions:default": [], ++}) ++ ++_RUSTY_V8_CUSTOM_LIBCXX_DEPS = select({ ++ "@@//third_party/v8:use_rusty_v8_custom_libcxx": [ ++ "@@//third_party/v8:rusty_v8_custom_libcxx_headers", ++ ], ++ "//conditions:default": [], ++}) ++ ++def _should_use_rusty_v8_custom_libcxx(): ++ # V8 and ICU are patched in-tree. Abseil is the only external dependency ++ # that still exchanges STL types with the artifact objects. ++ return native.repository_name() == "@abseil-cpp+" ++ + def cc_library(**kwargs): ++ if _should_use_rusty_v8_custom_libcxx(): ++ kwargs["copts"] = (kwargs.get("copts", []) or []) + _RUSTY_V8_CUSTOM_LIBCXX_COPTS ++ kwargs["deps"] = (kwargs.get("deps", []) or []) + _RUSTY_V8_CUSTOM_LIBCXX_DEPS ++ kwargs["features"] = (kwargs.get("features", []) or []) + ["-module_maps"] + _cc_library(**kwargs) diff --git a/patches/v8_bazel_rules.patch b/patches/v8_bazel_rules.patch index 70ab440d85d0..71265b32ae01 100644 --- a/patches/v8_bazel_rules.patch +++ b/patches/v8_bazel_rules.patch @@ -7,16 +7,47 @@ diff --git a/orig/v8-14.6.202.11/bazel/defs.bzl b/mod/v8-14.6.202.11/bazel/defs. index 9648e4a..88efd41 100644 --- a/orig/v8-14.6.202.11/bazel/defs.bzl +++ b/mod/v8-14.6.202.11/bazel/defs.bzl -@@ -97,7 +97,7 @@ v8_config = rule( +@@ -33,9 +33,21 @@ + ) + + def v8_flag(name, default = False): +- _create_option_flag(name = name, build_setting_default = default) +- native.config_setting(name = "is_" + name, flag_values = {name: "True"}) +- native.config_setting(name = "is_not_" + name, flag_values = {name: "False"}) ++ _create_option_flag( ++ name = name, ++ build_setting_default = default, ++ visibility = ["//visibility:public"], ++ ) ++ native.config_setting( ++ name = "is_" + name, ++ flag_values = {name: "True"}, ++ visibility = ["//visibility:public"], ++ ) ++ native.config_setting( ++ name = "is_not_" + name, ++ flag_values = {name: "False"}, ++ visibility = ["//visibility:public"], ++ ) + + def v8_string(name, default = ""): + _create_option_string(name = name, build_setting_default = default) +@@ -97,7 +109,13 @@ def _default_args(): return struct( - deps = [":define_flags", "@libcxx//:libc++"], -+ deps = [":define_flags"], ++ deps = [":define_flags"] + select({ ++ "@v8//:is_v8_use_rusty_v8_custom_libcxx": [ ++ "@@//third_party/v8:rusty_v8_custom_libcxx_headers", ++ "@@//third_party/v8:rusty_v8_custom_libcxx_runtime", ++ ], ++ "//conditions:default": [], ++ }), defines = select({ "@v8//bazel/config:is_windows": [ "UNICODE", -@@ -128,12 +128,6 @@ def _default_args(): +@@ -127,12 +145,15 @@ ], "//conditions:default": [], }) + select({ @@ -26,20 +57,29 @@ index 9648e4a..88efd41 100644 - "-Wno-deprecated-declarations", - "-std=c++20", - ], ++ "@v8//:is_v8_use_rusty_v8_custom_libcxx": [ ++ "-nostdinc++", ++ "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS", ++ "-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE", ++ "-D_LIBCPP_INSTRUMENTED_WITH_ASAN=0", ++ "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS", ++ ], ++ "//conditions:default": [], ++ }) + select({ "@v8//bazel/config:is_gcc": [ "-Wno-extra", "-Wno-array-bounds", -@@ -155,7 +149,15 @@ def _default_args(): -- "@v8//bazel/config:is_windows": [ +@@ -152,9 +173,17 @@ + "-std=gnu++2a", + ], + "@v8//bazel/config:is_windows": [ - "/std:c++20", -- ], -- "//conditions:default": [], -+ "@v8//bazel/config:is_windows": [ + "-Wno-invalid-offsetof", + "-Wno-deprecated-this-capture", + "-Wno-deprecated-declarations", + "-std=c++20", -+ ], + ], +- "//conditions:default": [], + "//conditions:default": [ + "-Wno-invalid-offsetof", + "-Wno-deprecated-this-capture", @@ -49,7 +89,9 @@ index 9648e4a..88efd41 100644 }) + select({ "@v8//bazel/config:is_gcc_fastbuild": [ # Non-debug builds without optimizations fail because -@@ -180,10 +179,10 @@ def _default_args(): +@@ -178,12 +207,12 @@ + includes = ["include"], + linkopts = select({ "@v8//bazel/config:is_windows": [ - "Winmm.lib", - "DbgHelp.lib", @@ -65,19 +107,21 @@ index 9648e4a..88efd41 100644 ":should_add_rdynamic": ["-rdynamic"], "//conditions:default": [], diff --git a/orig/v8-14.6.202.11/BUILD.bazel b/mod/v8-14.6.202.11/BUILD.bazel -index 85f31b7..bbc351b 100644 +index 421ebcd..52283ea 100644 --- a/orig/v8-14.6.202.11/BUILD.bazel +++ b/mod/v8-14.6.202.11/BUILD.bazel -@@ -148,6 +148,8 @@ v8_flag(name = "v8_enable_trace_maps") +@@ -148,6 +148,10 @@ v8_flag(name = "v8_enable_trace_maps") v8_flag(name = "v8_enable_v8_checks") +v8_flag(name = "v8_enable_sandbox") ++ ++v8_flag(name = "v8_use_rusty_v8_custom_libcxx") + v8_flag(name = "v8_enable_verify_csa") v8_flag(name = "v8_enable_verify_heap") -@@ -303,7 +305,7 @@ v8_int( +@@ -313,7 +317,7 @@ v8_int( # If no explicit value for v8_enable_pointer_compression, we set it to 'none'. v8_string( name = "v8_enable_pointer_compression", @@ -86,7 +130,7 @@ index 85f31b7..bbc351b 100644 ) # Default setting for v8_enable_pointer_compression. -@@ -503,6 +505,7 @@ v8_config( +@@ -513,6 +517,7 @@ v8_config( "v8_enable_slow_dchecks": "ENABLE_SLOW_DCHECKS", "v8_enable_runtime_call_stats": "V8_RUNTIME_CALL_STATS", "v8_enable_snapshot_native_code_counters": "V8_SNAPSHOT_NATIVE_CODE_COUNTERS", @@ -94,7 +138,7 @@ index 85f31b7..bbc351b 100644 "v8_enable_trace_maps": "V8_TRACE_MAPS", "v8_enable_turbofan": "V8_ENABLE_TURBOFAN", "v8_enable_v8_checks": "V8_ENABLE_CHECKS", -@@ -4077,28 +4080,14 @@ filegroup( +@@ -4098,28 +4103,14 @@ filegroup( }), ) @@ -129,7 +173,7 @@ index 85f31b7..bbc351b 100644 ) filegroup( -@@ -4405,6 +4394,20 @@ genrule( +@@ -4422,6 +4413,20 @@ genrule( srcs = [ "include/js_protocol.pdl", "src/inspector/inspector_protocol_config.json", @@ -150,7 +194,7 @@ index 85f31b7..bbc351b 100644 ], outs = [ "include/inspector/Debugger.h", -@@ -4426,15 +4429,19 @@ genrule( +@@ -4443,15 +4448,19 @@ genrule( "src/inspector/protocol/Schema.cpp", "src/inspector/protocol/Schema.h", ], @@ -174,7 +218,7 @@ index 85f31b7..bbc351b 100644 ], ) -@@ -4448,6 +4455,15 @@ filegroup( +@@ -4465,6 +4474,15 @@ filegroup( ], ) @@ -190,7 +234,7 @@ index 85f31b7..bbc351b 100644 filegroup( name = "d8_files", srcs = [ -@@ -4567,16 +4583,9 @@ cc_library( +@@ -4584,16 +4602,9 @@ cc_library( ], ) @@ -210,7 +254,7 @@ index 85f31b7..bbc351b 100644 ) v8_library( -@@ -4593,7 +4602,7 @@ v8_library( +@@ -4610,7 +4621,7 @@ v8_library( copts = ["-Wno-implicit-fallthrough"], icu_deps = [ ":icu/generated_torque_definitions_headers", @@ -219,7 +263,7 @@ index 85f31b7..bbc351b 100644 ], icu_srcs = [ ":generated_regexp_special_case", -@@ -4608,7 +4617,7 @@ v8_library( +@@ -4625,7 +4636,7 @@ v8_library( ], deps = [ ":lib_dragonbox", @@ -228,7 +272,7 @@ index 85f31b7..bbc351b 100644 ":lib_fp16", ":simdutf", ":v8_libbase", -@@ -4664,6 +4673,7 @@ alias( +@@ -4681,6 +4692,7 @@ alias( alias( name = "core_lib_icu", actual = "icu/v8", @@ -236,7 +280,7 @@ index 85f31b7..bbc351b 100644 ) v8_library( -@@ -4715,7 +4725,7 @@ v8_binary( +@@ -4732,7 +4744,7 @@ v8_binary( ], deps = [ ":v8_libbase", @@ -245,17 +289,53 @@ index 85f31b7..bbc351b 100644 ], ) +@@ -4772,9 +4784,15 @@ v8_binary( + ":icu/generated_torque_initializers", + ":icu/v8_initializers_files", + ], ++ # Match GN's mksnapshot `disable_icf` config. If the linker folds distinct ++ # external-reference helpers together while producing the snapshot, the ++ # final embedder binary may not fold the same pair and startup ++ # deserialization will reject the snapshot. + linkopts = select({ + "@v8//bazel/config:is_android": ["-llog"], +- "//conditions:default": [], ++ "@v8//bazel/config:is_macos": ["-Wl,-no_deduplicate"], ++ "@v8//bazel/config:is_windows": ["/OPT:NOICF"], ++ "//conditions:default": ["-Wl,--icf=none"], + }), + noicu_deps = [":v8_libshared_noicu"], + noicu_srcs = [ diff --git a/orig/v8-14.6.202.11/bazel/BUILD.icu b/mod/v8-14.6.202.11/bazel/BUILD.icu -index 5fda2f4..381386c 100644 +index 5fda2f4..9729451 100644 --- a/orig/v8-14.6.202.11/bazel/BUILD.icu +++ b/mod/v8-14.6.202.11/bazel/BUILD.icu -@@ -1,3 +1,5 @@ +@@ -1,3 +1,24 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") ++ ++CUSTOM_LIBCXX_COPTS = select({ ++ "@v8//:is_v8_use_rusty_v8_custom_libcxx": [ ++ "-nostdinc++", ++ "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS", ++ "-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE", ++ "-D_LIBCPP_INSTRUMENTED_WITH_ASAN=0", ++ "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS", ++ ], ++ "//conditions:default": [], ++}) ++ ++CUSTOM_LIBCXX_DEPS = select({ ++ "@v8//:is_v8_use_rusty_v8_custom_libcxx": [ ++ "@@//third_party/v8:rusty_v8_custom_libcxx_headers", ++ "@@//third_party/v8:rusty_v8_custom_libcxx_runtime", ++ ], ++ "//conditions:default": [], ++}) + # Copyright 2021 the V8 project authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -@@ -16,10 +18,7 @@ cc_library( +@@ -16,15 +37,12 @@ ]), copts = select({ "@platforms//os:windows": [ @@ -267,7 +347,21 @@ index 5fda2f4..381386c 100644 ], "//conditions:default": [ "-Wno-deprecated-declarations", -@@ -65,10 +64,7 @@ cc_library( + ], +- }), ++ }) + CUSTOM_LIBCXX_COPTS, + data = [":icudata"], + defines = [ + "HAVE_DLOPEN=0", +@@ -54,6 +72,7 @@ + "U_ICUDATAENTRY_IN_COMMON", + ], + tags = ["requires-rtti"], ++ deps = CUSTOM_LIBCXX_DEPS, + alwayslink = 1, + ) + +@@ -65,19 +84,16 @@ ]), copts = select({ "@platforms//os:windows": [ @@ -279,7 +373,18 @@ index 5fda2f4..381386c 100644 ], "//conditions:default": [ "-Wno-deprecated-declarations", -@@ -93,10 +89,7 @@ cc_library( + ], +- }), ++ }) + CUSTOM_LIBCXX_COPTS, + local_defines = [ + "U_I18N_IMPLEMENTATION", + ], +- deps = [":icuuc"], ++ deps = [":icuuc"] + CUSTOM_LIBCXX_DEPS, + alwayslink = 1, + ) + +@@ -93,13 +109,10 @@ ]), copts = select({ "@platforms//os:windows": [ @@ -290,4 +395,16 @@ index 5fda2f4..381386c 100644 + "-Wno-deprecated-declarations", ], "//conditions:default": [], - }), +- }), ++ }) + CUSTOM_LIBCXX_COPTS, + include_prefix = "third_party/icu", + local_defines = [ + "U_COMMON_IMPLEMENTATION", +@@ -108,6 +121,6 @@ + deps = [ + ":icui18n", + ":icuuc", +- ], ++ ] + CUSTOM_LIBCXX_DEPS, + alwayslink = 1, + ) diff --git a/third_party/v8/BUILD.bazel b/third_party/v8/BUILD.bazel index f122433f73ac..9d26188348b1 100644 --- a/third_party/v8/BUILD.bazel +++ b/third_party/v8/BUILD.bazel @@ -22,6 +22,13 @@ config_setting( ], ) +config_setting( + name = "use_rusty_v8_custom_libcxx", + flag_values = { + "@v8//:v8_use_rusty_v8_custom_libcxx": "True", + }, +) + alias( name = "v8_146_4_0_x86_64_apple_darwin", actual = "@rusty_v8_146_4_0_x86_64_apple_darwin_archive//file", @@ -165,11 +172,40 @@ alias( V8_COPTS = ["-std=c++20"] +V8_CUSTOM_LIBCXX_COPTS = select({ + ":use_rusty_v8_custom_libcxx": [ + "-nostdinc++", + "-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS", + "-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE", + "-D_LIBCPP_INSTRUMENTED_WITH_ASAN=0", + "-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS", + ], + "//conditions:default": [], +}) + V8_STATIC_LIBRARY_FEATURES = [ "-symbol_check", "-validate-static-library", ] +cc_library( + name = "rusty_v8_custom_libcxx_headers", + deps = [ + "@rusty_v8_libcxx//:headers", + "@rusty_v8_libcxxabi//:headers", + ], + visibility = ["//visibility:public"], +) + +cc_library( + name = "rusty_v8_custom_libcxx_runtime", + deps = [ + "@rusty_v8_libcxx//:libcxx", + "@rusty_v8_libcxxabi//:libcxxabi", + ], + visibility = ["//visibility:public"], +) + genrule( name = "binding_cc", srcs = ["@v8_crate_146_4_0//:binding_cc"], @@ -239,11 +275,16 @@ cc_library( name = "v8_147_4_0_binding", srcs = [":binding_cc_147_4_0"], hdrs = [":support_h_147_4_0"], - copts = V8_COPTS, + copts = V8_COPTS + V8_CUSTOM_LIBCXX_COPTS, deps = [ "@v8//:core_lib_icu", "@v8//:rusty_v8_internal_headers", - ], + ] + select({ + ":use_rusty_v8_custom_libcxx": [ + ":rusty_v8_custom_libcxx_headers", + ], + "//conditions:default": [], + }), ) cc_static_library( @@ -330,19 +371,28 @@ filegroup( cc_static_library( name = "v8_147_4_0_aarch64_apple_darwin_bazel", - deps = [":v8_147_4_0_binding"], + deps = [ + ":rusty_v8_custom_libcxx_runtime", + ":v8_147_4_0_binding", + ], features = V8_STATIC_LIBRARY_FEATURES, ) cc_static_library( name = "v8_147_4_0_aarch64_unknown_linux_gnu_bazel", - deps = [":v8_147_4_0_binding"], + deps = [ + ":rusty_v8_custom_libcxx_runtime", + ":v8_147_4_0_binding", + ], features = V8_STATIC_LIBRARY_FEATURES, ) cc_static_library( name = "v8_147_4_0_aarch64_unknown_linux_musl_release_base", - deps = [":v8_147_4_0_binding"], + deps = [ + ":rusty_v8_custom_libcxx_runtime", + ":v8_147_4_0_binding", + ], features = V8_STATIC_LIBRARY_FEATURES, ) @@ -372,31 +422,28 @@ EOF cc_static_library( name = "v8_147_4_0_x86_64_apple_darwin_bazel", - deps = [":v8_147_4_0_binding"], + deps = [ + ":rusty_v8_custom_libcxx_runtime", + ":v8_147_4_0_binding", + ], features = V8_STATIC_LIBRARY_FEATURES, ) cc_static_library( name = "v8_147_4_0_x86_64_unknown_linux_gnu_bazel", - deps = [":v8_147_4_0_binding"], + deps = [ + ":rusty_v8_custom_libcxx_runtime", + ":v8_147_4_0_binding", + ], features = V8_STATIC_LIBRARY_FEATURES, ) cc_static_library( name = "v8_147_4_0_x86_64_unknown_linux_musl_release", - deps = [":v8_147_4_0_binding"], - features = V8_STATIC_LIBRARY_FEATURES, -) - -cc_static_library( - name = "v8_147_4_0_aarch64_pc_windows_msvc_bazel", - deps = [":v8_147_4_0_binding"], - features = V8_STATIC_LIBRARY_FEATURES, -) - -cc_static_library( - name = "v8_147_4_0_x86_64_pc_windows_msvc_bazel", - deps = [":v8_147_4_0_binding"], + deps = [ + ":rusty_v8_custom_libcxx_runtime", + ":v8_147_4_0_binding", + ], features = V8_STATIC_LIBRARY_FEATURES, ) @@ -443,32 +490,32 @@ filegroup( filegroup( name = "rusty_v8_release_pair_x86_64_apple_darwin", srcs = [ - ":v8_146_4_0_x86_64_apple_darwin", - ":src_binding_release_x86_64_apple_darwin", + ":v8_147_4_0_x86_64_apple_darwin_bazel", + ":src_binding_release_x86_64_apple_darwin_147_4_0_release", ], ) filegroup( name = "rusty_v8_release_pair_aarch64_apple_darwin", srcs = [ - ":v8_146_4_0_aarch64_apple_darwin", - ":src_binding_release_aarch64_apple_darwin", + ":v8_147_4_0_aarch64_apple_darwin_bazel", + ":src_binding_release_aarch64_apple_darwin_147_4_0_release", ], ) filegroup( name = "rusty_v8_release_pair_x86_64_unknown_linux_gnu", srcs = [ - ":v8_146_4_0_x86_64_unknown_linux_gnu", - ":src_binding_release_x86_64_unknown_linux_gnu", + ":v8_147_4_0_x86_64_unknown_linux_gnu_bazel", + ":src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", ], ) filegroup( name = "rusty_v8_release_pair_aarch64_unknown_linux_gnu", srcs = [ - ":v8_146_4_0_aarch64_unknown_linux_gnu", - ":src_binding_release_aarch64_unknown_linux_gnu", + ":v8_147_4_0_aarch64_unknown_linux_gnu_bazel", + ":src_binding_release_aarch64_unknown_linux_gnu_147_4_0_release", ], ) @@ -551,19 +598,3 @@ filegroup( ":src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", ], ) - -filegroup( - name = "rusty_v8_sandbox_release_pair_x86_64_pc_windows_msvc", - srcs = [ - ":v8_147_4_0_x86_64_pc_windows_msvc_bazel", - ":src_binding_release_x86_64_pc_windows_msvc_147_4_0_release", - ], -) - -filegroup( - name = "rusty_v8_sandbox_release_pair_aarch64_pc_windows_msvc", - srcs = [ - ":v8_147_4_0_aarch64_pc_windows_msvc_bazel", - ":src_binding_release_aarch64_pc_windows_msvc_147_4_0_release", - ], -) diff --git a/third_party/v8/README.md b/third_party/v8/README.md index 2d15a1b3dcdb..dc38cdc5daec 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -21,7 +21,7 @@ artifact contract. Current pinned versions: - Rust crate: `v8 = =147.4.0` -- Embedded upstream V8 source for musl release builds: `14.7.173.20` +- Embedded upstream V8 source for Bazel-produced release builds: `14.7.173.20` When bumping the Rust crate version, keep the checked-in checksum manifest and `MODULE.bazel` in sync: @@ -40,7 +40,7 @@ The consumer-facing selectors are: - `//third_party/v8:rusty_v8_archive_for_target` - `//third_party/v8:rusty_v8_binding_for_target` -Current musl release assets are expected at the tag: +Published release assets are expected at the tag: - `rusty-v8-v` @@ -57,12 +57,12 @@ their raw names: - `src_binding_ptrcomp_sandbox_release_.rs` The dedicated publishing workflow is `.github/workflows/rusty-v8-release.yml`. -For GNU Linux, Darwin, and Windows MSVC, the workflow checks out the exact -upstream `denoland/rusty_v8` tag and uses its `V8_FROM_SOURCE=true` Cargo/GN -build to produce sandbox-profile artifacts with the same archive shape upstream -publishes. Musl remains an extra platform that upstream does not publish, so -tagged runs still build the current musl release pairs with our Bazel producer: +Tagged runs build release artifacts from the Bazel graph itself: +- `//third_party/v8:rusty_v8_release_pair_x86_64_apple_darwin` +- `//third_party/v8:rusty_v8_release_pair_aarch64_apple_darwin` +- `//third_party/v8:rusty_v8_release_pair_x86_64_unknown_linux_gnu` +- `//third_party/v8:rusty_v8_release_pair_aarch64_unknown_linux_gnu` - `//third_party/v8:rusty_v8_release_pair_x86_64_unknown_linux_musl` - `//third_party/v8:rusty_v8_release_pair_aarch64_unknown_linux_musl` @@ -74,16 +74,19 @@ The same run also builds the matching sandbox pair targets: - `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_unknown_linux_gnu` - `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_unknown_linux_musl` - `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_unknown_linux_musl` -- `//third_party/v8:rusty_v8_sandbox_release_pair_x86_64_pc_windows_msvc` -- `//third_party/v8:rusty_v8_sandbox_release_pair_aarch64_pc_windows_msvc` - -If a tagged run targets an existing GitHub release, publication amends only the -sandbox-profile files and leaves the current release-profile assets unchanged. -The upstream-shaped GNU, Darwin, and MSVC builds let GN fold custom libc++ into -the final archive the same way `rusty_v8` does for its own releases. Musl -sandbox archives still merge the matching static libc++ and libc++abi runtime -libraries after the Bazel build so Cargo consumers can link them with the `v8` -crate's default `use_custom_libcxx` feature. + +The Bazel graph pins the same libc++, libc++abi, and llvm-libc source revisions +used by `rusty_v8 v147.4.0`, compiles published artifact targets with +`--config=rusty-v8-upstream-libcxx`, and folds the matching runtime objects into +the final static archive so Cargo consumers can link it with the `v8` crate's +default `use_custom_libcxx` feature. The config keeps the object files and the +bundled runtime on Chromium's `std::__Cr` ABI namespace instead of mixing those +objects with the toolchain libc++ default namespace. + +MSVC is not part of the Bazel-produced matrix yet. The repository's current +hermetic Windows C++ platform is `windows-gnullvm`/`x86_64-w64-windows-gnu`, so +it cannot truthfully reproduce upstream's `*-pc-windows-msvc` archives until we +add a real MSVC-targeting C++ toolchain to the Bazel graph. Cargo musl builds use `RUSTY_V8_ARCHIVE` plus a downloaded `RUSTY_V8_SRC_BINDING_PATH` to point at those `openai/codex` release assets diff --git a/third_party/v8/libcxx.BUILD.bazel b/third_party/v8/libcxx.BUILD.bazel new file mode 100644 index 000000000000..5550cfd0a245 --- /dev/null +++ b/third_party/v8/libcxx.BUILD.bazel @@ -0,0 +1,157 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") +load("@llvm//toolchain/runtimes:cc_runtime_library.bzl", "cc_runtime_stage0_library") + +package(default_visibility = ["//visibility:public"]) + +config_setting( + name = "is_linux", + constraint_values = ["@platforms//os:linux"], +) + +config_setting( + name = "is_windows", + constraint_values = ["@platforms//os:windows"], +) + +LIBCXX_SRCS = [ + "src/algorithm.cpp", + "src/any.cpp", + "src/atomic.cpp", + "src/barrier.cpp", + "src/bind.cpp", + "src/call_once.cpp", + "src/charconv.cpp", + "src/chrono.cpp", + "src/condition_variable.cpp", + "src/condition_variable_destructor.cpp", + "src/error_category.cpp", + "src/exception.cpp", + "src/filesystem/directory_iterator.cpp", + "src/filesystem/filesystem_error.cpp", + "src/filesystem/operations.cpp", + "src/filesystem/path.cpp", + "src/functional.cpp", + "src/future.cpp", + "src/hash.cpp", + "src/ios.cpp", + "src/ios.instantiations.cpp", + "src/iostream.cpp", + "src/locale.cpp", + "src/memory.cpp", + "src/mutex.cpp", + "src/mutex_destructor.cpp", + "src/new.cpp", + "src/new_handler.cpp", + "src/new_helpers.cpp", + "src/optional.cpp", + "src/random.cpp", + "src/random_shuffle.cpp", + "src/regex.cpp", + "src/ryu/d2fixed.cpp", + "src/ryu/d2s.cpp", + "src/ryu/f2s.cpp", + "src/shared_mutex.cpp", + "src/stdexcept.cpp", + "src/string.cpp", + "src/strstream.cpp", + "src/system_error.cpp", + "src/thread.cpp", + "src/typeinfo.cpp", + "src/valarray.cpp", + "src/variant.cpp", + "src/vector.cpp", + "src/verbose_abort.cpp", +] + +cc_library( + name = "headers", + hdrs = glob(["include/**"]), + includes = ["include"], + deps = ["@//third_party/v8/libcxx_config:headers"], +) + +cc_library( + name = "internal_headers", + hdrs = glob([ + "src/**/*.h", + "src/**/*.ipp", + ]), + includes = ["src"], +) + +cc_runtime_stage0_library( + name = "libcxx", + srcs = LIBCXX_SRCS + select({ + ":is_linux": [ + "src/filesystem/directory_entry.cpp", + "src/filesystem/filesystem_clock.cpp", + ], + "//conditions:default": [], + }) + select({ + ":is_windows": [ + "src/support/win32/locale_win32.cpp", + "src/support/win32/support.cpp", + "src/support/win32/thread_win32.cpp", + ], + "//conditions:default": [], + }), + copts = [ + "-fexceptions", + "-frtti", + "-fstrict-aliasing", + "-fvisibility=hidden", + "-fvisibility-inlines-hidden", + "-nostdinc++", + "-std=c++23", + "-Wno-nullability-completeness", + "-Wno-unused-parameter", + "-Wundef", + ] + select({ + ":is_windows": ["-Wno-macro-redefined"], + "//conditions:default": ["-fPIC"], + }), + defines = [ + "CR_LIBCXX_REVISION=7ab65651aed6802d2599dcb7a73b1f82d5179d05", + "LIBCXX_BUILDING_LIBCXXABI", + "LIBC_NAMESPACE=__llvm_libc_cr", + "_LIBCPP_BUILDING_LIBRARY", + "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS", + "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE", + "_LIBCPP_INSTRUMENTED_WITH_ASAN=0", + "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS", + ] + select({ + "@llvm//platforms/config:musl": [ + # Chromium's checked-in __config_site uses this switch to enable + # libc++'s musl-specific configuration. + "ANDROID_HOST_MUSL", + ], + "//conditions:default": [], + }) + select({ + ":is_windows": [ + "NTDDI_VERSION=NTDDI_WIN7", + "WINVER=_WIN32_WINNT_WIN7", + "_WIN32_WINNT=_WIN32_WINNT_WIN7", + ], + "//conditions:default": [], + }), + includes = ["src"], + implementation_deps = [ + ":headers", + ":internal_headers", + "@rusty_v8_libcxxabi//:headers", + "@rusty_v8_llvm_libc//:headers", + ] + select({ + ":is_linux": [ + "@@llvm++kernel_headers+kernel_headers//:kernel_headers", + ], + "//conditions:default": [], + }) + select({ + "@llvm//platforms/config:gnu": [ + "@@llvm++glibc+glibc//:gnu_libc_headers", + ], + "@llvm//platforms/config:musl": [ + "@@llvm++musl+musl_libc//:musl_libc_headers", + ], + "//conditions:default": [], + }), +) diff --git a/third_party/v8/libcxx_config/BUILD.bazel b/third_party/v8/libcxx_config/BUILD.bazel new file mode 100644 index 000000000000..e4a3ee6a8561 --- /dev/null +++ b/third_party/v8/libcxx_config/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") + +package(default_visibility = ["//visibility:public"]) + +cc_library( + name = "headers", + hdrs = [ + "__assertion_handler", + "__config_site", + ], + includes = ["."], +) diff --git a/third_party/v8/libcxx_config/__assertion_handler b/third_party/v8/libcxx_config/__assertion_handler new file mode 100644 index 000000000000..1d1c2c98f2c3 --- /dev/null +++ b/third_party/v8/libcxx_config/__assertion_handler @@ -0,0 +1,27 @@ +// -*- C++ -*- + +#ifndef _LIBCPP___ASSERTION_HANDLER +#define _LIBCPP___ASSERTION_HANDLER + +#include <__config> +#include <__verbose_abort> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#if defined(OFFICIAL_BUILD) && !defined(DCHECK_ALWAYS_ON) + +[[noreturn]] inline _LIBCPP_HIDE_FROM_ABI void __libcpp_hardening_failure() { + __builtin_trap(); +} + +#define _LIBCPP_ASSERTION_HANDLER(message) ((void)message, __libcpp_hardening_failure()) + +#else + +#define _LIBCPP_ASSERTION_HANDLER(message) _LIBCPP_VERBOSE_ABORT("%s", message) + +#endif + +#endif // _LIBCPP___ASSERTION_HANDLER diff --git a/third_party/v8/libcxx_config/__config_site b/third_party/v8/libcxx_config/__config_site new file mode 100644 index 000000000000..1053f9fe45b1 --- /dev/null +++ b/third_party/v8/libcxx_config/__config_site @@ -0,0 +1,55 @@ +#ifndef _LIBCPP_CONFIG_SITE +#define _LIBCPP_CONFIG_SITE + +#define _LIBCPP_ABI_NAMESPACE __Cr +#define _LIBCPP_ABI_VERSION 2 + +#define _LIBCPP_ABI_FORCE_ITANIUM 0 +#define _LIBCPP_ABI_FORCE_MICROSOFT 0 +#define _LIBCPP_HAS_THREADS 1 +#define _LIBCPP_HAS_MONOTONIC_CLOCK 1 +#define _LIBCPP_HAS_TERMINAL 1 + +#ifdef ANDROID_HOST_MUSL +#define _LIBCPP_HAS_MUSL_LIBC 1 +#else +#define _LIBCPP_HAS_MUSL_LIBC 0 +#endif + +#ifdef _WIN32 +#define _LIBCPP_HAS_THREAD_API_PTHREAD 0 +#define _LIBCPP_HAS_THREAD_API_EXTERNAL 0 +#define _LIBCPP_HAS_THREAD_API_WIN32 1 +#else +#define _LIBCPP_HAS_THREAD_API_PTHREAD 1 +#define _LIBCPP_HAS_THREAD_API_EXTERNAL 0 +#define _LIBCPP_HAS_THREAD_API_WIN32 0 +#endif + +#define _LIBCPP_HAS_VENDOR_AVAILABILITY_ANNOTATIONS 0 +#define _LIBCPP_HAS_FILESYSTEM 1 +#define _LIBCPP_HAS_RANDOM_DEVICE 1 +#define _LIBCPP_HAS_LOCALIZATION 1 +#define _LIBCPP_HAS_UNICODE 1 +#define _LIBCPP_HAS_WIDE_CHARACTERS 1 +#define _LIBCPP_HAS_TIME_ZONE_DATABASE 1 + +#if defined(__APPLE__) +#define _LIBCPP_PSTL_BACKEND_LIBDISPATCH +#else +#define _LIBCPP_PSTL_BACKEND_STD_THREAD +#endif + +#define _LIBCPP_ASSERTION_SEMANTIC_DEFAULT \ + _LIBCPP_ASSERTION_SEMANTIC_HARDENING_DEPENDENT + +#define _LIBCPP_LIBC_PICOLIBC 0 +#define _LIBCPP_LIBC_NEWLIB 0 + +#define _LIBCPP_NO_AUTO_LINK +#define _LIBCPP_REMOVE_TRANSITIVE_INCLUDES +#define _LIBCPP_NO_ABI_TAG +#define _LIBCPP_VERBOSE_ABORT(...) ::std::__libcpp_verbose_abort(__VA_ARGS__) +#define _LIBCPP_HAS_NO_INCOMPLETE_PSTL + +#endif // _LIBCPP_CONFIG_SITE diff --git a/third_party/v8/libcxxabi.BUILD.bazel b/third_party/v8/libcxxabi.BUILD.bazel new file mode 100644 index 000000000000..de4289b4dc31 --- /dev/null +++ b/third_party/v8/libcxxabi.BUILD.bazel @@ -0,0 +1,98 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") +load("@llvm//toolchain/runtimes:cc_runtime_library.bzl", "cc_runtime_stage0_library") + +package(default_visibility = ["//visibility:public"]) + +config_setting( + name = "is_linux", + constraint_values = ["@platforms//os:linux"], +) + +config_setting( + name = "is_windows", + constraint_values = ["@platforms//os:windows"], +) + +cc_library( + name = "headers", + hdrs = glob(["include/**"]), + includes = ["include"], +) + +cc_runtime_stage0_library( + name = "libcxxabi", + srcs = [ + "src/abort_message.cpp", + "src/cxa_aux_runtime.cpp", + "src/cxa_default_handlers.cpp", + "src/cxa_demangle.cpp", + "src/cxa_exception.cpp", + "src/cxa_exception_storage.cpp", + "src/cxa_guard.cpp", + "src/cxa_handlers.cpp", + "src/cxa_personality.cpp", + "src/cxa_vector.cpp", + "src/cxa_virtual.cpp", + "src/fallback_malloc.cpp", + "src/private_typeinfo.cpp", + "src/stdlib_exception.cpp", + "src/stdlib_stdexcept.cpp", + "src/stdlib_typeinfo.cpp", + ] + select({ + ":is_linux": ["src/cxa_thread_atexit.cpp"], + "//conditions:default": [], + }), + textual_hdrs = glob([ + "src/**/*.def", + "src/**/*.h", + "src/**/*.inc", + ]), + copts = [ + "-fexceptions", + "-frtti", + "-fstrict-aliasing", + "-fvisibility=hidden", + "-fvisibility-inlines-hidden", + "-nostdinc++", + "-std=c++23", + "-Wno-nullability-completeness", + "-Wno-unused-parameter", + "-Wundef", + ] + select({ + ":is_windows": ["-Wno-macro-redefined"], + "//conditions:default": ["-fPIC"], + }), + defines = [ + "LIBCXXABI_SILENT_TERMINATE", + "_LIBCPP_BUILDING_LIBRARY", + "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS", + "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE", + "_LIBCPP_INSTRUMENTED_WITH_ASAN=0", + "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS", + ] + select({ + "@llvm//platforms/config:musl": [ + "ANDROID_HOST_MUSL", + ], + "//conditions:default": [], + }), + includes = ["src"], + implementation_deps = [ + ":headers", + "@rusty_v8_libcxx//:headers", + "@rusty_v8_libcxx//:internal_headers", + "@//third_party/v8/libcxx_config:headers", + ] + select({ + ":is_linux": [ + "@@llvm++kernel_headers+kernel_headers//:kernel_headers", + ], + "//conditions:default": [], + }) + select({ + "@llvm//platforms/config:gnu": [ + "@@llvm++glibc+glibc//:gnu_libc_headers", + ], + "@llvm//platforms/config:musl": [ + "@@llvm++musl+musl_libc//:musl_libc_headers", + ], + "//conditions:default": [], + }), +) diff --git a/third_party/v8/llvm_libc.BUILD.bazel b/third_party/v8/llvm_libc.BUILD.bazel new file mode 100644 index 000000000000..7940656fb886 --- /dev/null +++ b/third_party/v8/llvm_libc.BUILD.bazel @@ -0,0 +1,10 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") + +package(default_visibility = ["//visibility:public"]) + +cc_library( + name = "headers", + hdrs = glob(["**/*.h"]), + defines = ["LIBC_NAMESPACE=__llvm_libc_cr"], + includes = ["."], +) From dbb188d762290df21f3d74928c69a2ce7f041df2 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Fri, 8 May 2026 18:27:22 +0000 Subject: [PATCH 10/19] fix(v8): restore Linux sandbox artifact builds Keep non-Windows rusty-v8 consumers on the resolved 147.4.0 source-built graph. Avoid mixing LLVM's default libc++ headers into rusty-v8's custom libc++ build, propagate that configuration to external C++ deps, and export the musl-specific libc++ define through the shared header target. Also make checksum validation follow the remaining prebuilt asset version while the source-build migration is in progress. Co-authored-by: Codex --- .github/scripts/rusty_v8_bazel.py | 11 +++ .github/scripts/rusty_v8_module_bazel.py | 13 +++ .github/scripts/test_rusty_v8_bazel.py | 78 ++++++++++++++++++ MODULE.bazel | 1 + patches/BUILD.bazel | 1 + patches/llvm_rusty_v8_custom_libcxx.patch | 79 +++++++++++++++++++ patches/rules_cc_rusty_v8_custom_libcxx.patch | 17 +++- third_party/v8/BUILD.bazel | 33 ++++---- third_party/v8/README.md | 9 ++- third_party/v8/libcxx.BUILD.bazel | 2 +- third_party/v8/libcxxabi.BUILD.bazel | 2 +- 11 files changed, 222 insertions(+), 24 deletions(-) create mode 100644 patches/llvm_rusty_v8_custom_libcxx.patch diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index f380cc7a510a..562accd58a66 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -15,6 +15,7 @@ from rusty_v8_module_bazel import ( RustyV8ChecksumError, check_module_bazel, + rusty_v8_http_file_versions, update_module_bazel, ) @@ -172,6 +173,16 @@ def rusty_v8_checksum_manifest_path(version: str) -> Path: def command_version(version: str | None) -> str: if version is not None: return version + + manifest_versions = rusty_v8_http_file_versions(MODULE_BAZEL.read_text()) + if len(manifest_versions) == 1: + return manifest_versions[0] + if len(manifest_versions) > 1: + raise SystemExit( + "expected at most one rusty_v8 http_file version in MODULE.bazel, " + f"found: {manifest_versions}; pass --version explicitly" + ) + return resolved_v8_crate_version() diff --git a/.github/scripts/rusty_v8_module_bazel.py b/.github/scripts/rusty_v8_module_bazel.py index 7f474fc5d2b0..5d5dec08d5f6 100644 --- a/.github/scripts/rusty_v8_module_bazel.py +++ b/.github/scripts/rusty_v8_module_bazel.py @@ -9,6 +9,7 @@ SHA256_RE = re.compile(r"[0-9a-f]{64}") HTTP_FILE_BLOCK_RE = re.compile(r"(?ms)^http_file\(\n.*?^\)\n?") +HTTP_FILE_VERSION_RE = re.compile(r"^rusty_v8_([0-9]+)_([0-9]+)_([0-9]+)_") class RustyV8ChecksumError(ValueError): @@ -95,6 +96,18 @@ def rusty_v8_http_files(module_bazel: str, version: str) -> list[RustyV8HttpFile return entries +def rusty_v8_http_file_versions(module_bazel: str) -> list[str]: + versions = set() + for match in HTTP_FILE_BLOCK_RE.finditer(module_bazel): + name = string_field(match.group(0), "name") + if not name: + continue + version_match = HTTP_FILE_VERSION_RE.match(name) + if version_match: + versions.add(".".join(version_match.groups())) + return sorted(versions) + + def module_entry_set_errors( entries: list[RustyV8HttpFile], checksums: dict[str, str], diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index 66c69f9a5b7f..f516b871e309 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -13,6 +13,56 @@ class RustyV8BazelTest(unittest.TestCase): + def test_non_windows_consumer_selectors_track_resolved_crate_version(self) -> None: + build_bazel = ( + rusty_v8_bazel.ROOT / "third_party" / "v8" / "BUILD.bazel" + ).read_text() + version_suffix = rusty_v8_bazel.resolved_v8_crate_version().replace(".", "_") + + for selector in [ + "aarch64_apple_darwin_bazel", + "aarch64_unknown_linux_gnu_bazel", + "aarch64_unknown_linux_musl_release_base", + "x86_64_apple_darwin_bazel", + "x86_64_unknown_linux_gnu_bazel", + "x86_64_unknown_linux_musl_release", + ]: + self.assertIn( + f":v8_{version_suffix}_{selector}", + build_bazel, + ) + + for selector in [ + "aarch64_apple_darwin", + "aarch64_unknown_linux_gnu", + "aarch64_unknown_linux_musl", + "x86_64_apple_darwin", + "x86_64_unknown_linux_gnu", + "x86_64_unknown_linux_musl", + ]: + self.assertIn( + f":src_binding_release_{selector}_{version_suffix}_release", + build_bazel, + ) + + def test_command_version_tracks_remaining_http_file_assets(self) -> None: + with TemporaryDirectory() as temp_dir: + module_bazel = Path(temp_dir) / "MODULE.bazel" + module_bazel.write_text( + textwrap.dedent( + """\ + http_file( + name = "rusty_v8_146_4_0_x86_64_unknown_linux_gnu_archive", + downloaded_file_path = "librusty_v8_release_x86_64-unknown-linux-gnu.a.gz", + urls = ["https://example.test/archive.gz"], + ) + """ + ) + ) + + with patch.object(rusty_v8_bazel, "MODULE_BAZEL", module_bazel): + self.assertEqual("146.4.0", rusty_v8_bazel.command_version(None)) + def test_artifact_bazel_configs_always_enable_upstream_libcxx(self) -> None: self.assertEqual( ["rusty-v8-upstream-libcxx"], @@ -246,6 +296,34 @@ def test_check_module_bazel_rejects_manifest_drift(self) -> None: "146.4.0", ) + def test_rusty_v8_http_file_versions(self) -> None: + module_bazel = textwrap.dedent( + """\ + http_file( + name = "rusty_v8_146_4_0_x86_64_unknown_linux_gnu_archive", + downloaded_file_path = "archive.gz", + urls = ["https://example.test/archive.gz"], + ) + + http_file( + name = "rusty_v8_147_4_0_x86_64_unknown_linux_gnu_archive", + downloaded_file_path = "new-archive.gz", + urls = ["https://example.test/new-archive.gz"], + ) + + http_file( + name = "unrelated_archive", + downloaded_file_path = "other.gz", + urls = ["https://example.test/other.gz"], + ) + """ + ) + + self.assertEqual( + ["146.4.0", "147.4.0"], + rusty_v8_module_bazel.rusty_v8_http_file_versions(module_bazel), + ) + if __name__ == "__main__": unittest.main() diff --git a/MODULE.bazel b/MODULE.bazel index dac8ded4ff42..4febc090a2e8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,6 +10,7 @@ single_version_override( module_name = "llvm", patch_strip = 1, patches = [ + "//patches:llvm_rusty_v8_custom_libcxx.patch", "//patches:llvm_windows_symlink_extract.patch", ], ) diff --git a/patches/BUILD.bazel b/patches/BUILD.bazel index 3a5345de0ffc..72d699079084 100644 --- a/patches/BUILD.bazel +++ b/patches/BUILD.bazel @@ -4,6 +4,7 @@ exports_files([ "aws-lc-sys_windows_msvc_prebuilt_nasm.patch", "aws-lc-sys_windows_msvc_memcmp_probe.patch", "bzip2_windows_stack_args.patch", + "llvm_rusty_v8_custom_libcxx.patch", "llvm_windows_symlink_extract.patch", "rules_rust_windows_bootstrap_process_wrapper_linker.patch", "rules_rust_windows_build_script_runner_paths.patch", diff --git a/patches/llvm_rusty_v8_custom_libcxx.patch b/patches/llvm_rusty_v8_custom_libcxx.patch new file mode 100644 index 000000000000..c30a28ac639f --- /dev/null +++ b/patches/llvm_rusty_v8_custom_libcxx.patch @@ -0,0 +1,79 @@ +diff --git a/toolchain/BUILD.bazel b/toolchain/BUILD.bazel +index fa00156236..bf0ee9d368 100644 +--- a/toolchain/BUILD.bazel ++++ b/toolchain/BUILD.bazel +@@ -222,11 +222,16 @@ cc_args_list( + + # TODO(cerisier): extract those into proper semantic args list. + # TODO(zbarsky): This must match llvm/toolchains/llvm.bzl ++_DEFAULT_LIBCXX_HEADER_ARGS = select({ ++ "@@//third_party/v8:use_rusty_v8_custom_libcxx": [], ++ "//conditions:default": [ ++ "//toolchain/args:libcxx_headers_include_search_paths", ++ ], ++}) ++ + cc_args_list( + name = "linux_toolchain_args", +- args = [ +- "//toolchain/args:libcxx_headers_include_search_paths", +- ] + select({ ++ args = _DEFAULT_LIBCXX_HEADER_ARGS + select({ + "//platforms/config:musl": [ + "//toolchain/args/linux:kernel_headers_include_search_paths", + "//toolchain/args/linux:musl_libc_headers_include_search_paths", +@@ -252,8 +257,7 @@ cc_args_list( + # TODO(zbarsky): This must match llvm/toolchains/llvm.bzl + cc_args_list( + name = "windows_toolchain_args", +- args = [ +- "//toolchain/args:libcxx_headers_include_search_paths", ++ args = _DEFAULT_LIBCXX_HEADER_ARGS + [ + "//toolchain/args/windows:mingw_headers_include_search_paths", + ], + ) +diff --git a/toolchain/llvm/llvm.bzl b/toolchain/llvm/llvm.bzl +index d36d8b94bd..97aa879d4a 100644 +--- a/toolchain/llvm/llvm.bzl ++++ b/toolchain/llvm/llvm.bzl +@@ -186,16 +186,22 @@ def declare_llvm_targets(*, suffix = ""): + ], + ) + ++ default_libcxx_target_headers = select({ ++ "@@//third_party/v8:use_rusty_v8_custom_libcxx": [], ++ "//conditions:default": [ ++ "@llvm//runtimes/libcxx:libcxx_headers_include_search_directory", ++ "@llvm//runtimes/libcxx:libcxxabi_headers_include_search_directory", ++ ], ++ }) ++ + # This must match //toolchain:linux_toolchain_args + include_path( + name = "linux_target_headers", + srcs = [ + ":builtin_resource_dir", +- "@llvm//runtimes/libcxx:libcxx_headers_include_search_directory", +- "@llvm//runtimes/libcxx:libcxxabi_headers_include_search_directory", + "@kernel_headers//:kernel_headers_directory", + "@llvm//sanitizers:sanitizers_headers_include_search_directory", +- ] + select({ ++ ] + default_libcxx_target_headers + select({ + "@llvm//platforms/config:musl": [ + "@llvm//runtimes/musl:musl_headers_include_search_directory", + ], +@@ -210,13 +216,11 @@ def declare_llvm_targets(*, suffix = ""): + name = "windows_target_headers", + srcs = [ + ":builtin_resource_dir", +- "@llvm//runtimes/libcxx:libcxx_headers_include_search_directory", +- "@llvm//runtimes/libcxx:libcxxabi_headers_include_search_directory", + "@mingw//:mingw_generated_headers_crt_directory", + "@mingw//:mingw_w64_headers_include_directory", + "@mingw//:mingw_w64_headers_crt_directory", + "@mingw//:mingw_w64_winpthreads_include_directory", +- ], ++ ] + default_libcxx_target_headers, + ) + + include_path( diff --git a/patches/rules_cc_rusty_v8_custom_libcxx.patch b/patches/rules_cc_rusty_v8_custom_libcxx.patch index 1e4e7d9d539d..3efda03525fd 100644 --- a/patches/rules_cc_rusty_v8_custom_libcxx.patch +++ b/patches/rules_cc_rusty_v8_custom_libcxx.patch @@ -1,7 +1,9 @@ diff --git a/cc/cc_library.bzl b/cc/cc_library.bzl +index c45c5fd954..2e3a01f12a 100644 --- a/cc/cc_library.bzl +++ b/cc/cc_library.bzl -@@ -16,4 +16,31 @@ +@@ -15,5 +15,39 @@ + load("@cc_compatibility_proxy//:proxy.bzl", _cc_library = "cc_library") +_RUSTY_V8_CUSTOM_LIBCXX_COPTS = select({ @@ -22,10 +24,17 @@ diff --git a/cc/cc_library.bzl b/cc/cc_library.bzl + "//conditions:default": [], +}) + ++_RUSTY_V8_CUSTOM_LIBCXX_REPOS = [ ++ # V8 and ICU are patched in-tree. These external C++ dependencies still ++ # build inside the artifact closure once the LLVM toolchain's default ++ # libc++ headers are suppressed. ++ "@abseil-cpp+", ++ "@v8++http_archive+highway", ++ "@v8++http_archive+simdutf", ++] ++ +def _should_use_rusty_v8_custom_libcxx(): -+ # V8 and ICU are patched in-tree. Abseil is the only external dependency -+ # that still exchanges STL types with the artifact objects. -+ return native.repository_name() == "@abseil-cpp+" ++ return native.repository_name() in _RUSTY_V8_CUSTOM_LIBCXX_REPOS + def cc_library(**kwargs): + if _should_use_rusty_v8_custom_libcxx(): diff --git a/third_party/v8/BUILD.bazel b/third_party/v8/BUILD.bazel index 9d26188348b1..190f11f095bf 100644 --- a/third_party/v8/BUILD.bazel +++ b/third_party/v8/BUILD.bazel @@ -139,34 +139,34 @@ alias( alias( name = "rusty_v8_archive_for_target", actual = select({ - "@rules_rs//rs/experimental/platforms/config:aarch64-apple-darwin": ":v8_146_4_0_aarch64_apple_darwin_bazel", + "@rules_rs//rs/experimental/platforms/config:aarch64-apple-darwin": ":v8_147_4_0_aarch64_apple_darwin_bazel", "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-gnullvm": ":v8_146_4_0_aarch64_pc_windows_gnullvm", "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-msvc": ":v8_146_4_0_aarch64_pc_windows_msvc", - "@rules_rs//rs/experimental/platforms/config:aarch64-unknown-linux-gnu": ":v8_146_4_0_aarch64_unknown_linux_gnu_bazel", - ":platform_aarch64_unknown_linux_musl": ":v8_146_4_0_aarch64_unknown_linux_musl_release_base", - "@rules_rs//rs/experimental/platforms/config:x86_64-apple-darwin": ":v8_146_4_0_x86_64_apple_darwin_bazel", + "@rules_rs//rs/experimental/platforms/config:aarch64-unknown-linux-gnu": ":v8_147_4_0_aarch64_unknown_linux_gnu_bazel", + ":platform_aarch64_unknown_linux_musl": ":v8_147_4_0_aarch64_unknown_linux_musl_release_base", + "@rules_rs//rs/experimental/platforms/config:x86_64-apple-darwin": ":v8_147_4_0_x86_64_apple_darwin_bazel", "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-gnullvm": ":v8_146_4_0_x86_64_pc_windows_gnullvm", "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-msvc": ":v8_146_4_0_x86_64_pc_windows_msvc", - "@rules_rs//rs/experimental/platforms/config:x86_64-unknown-linux-gnu": ":v8_146_4_0_x86_64_unknown_linux_gnu_bazel", - ":platform_x86_64_unknown_linux_musl": ":v8_146_4_0_x86_64_unknown_linux_musl_release", - "//conditions:default": ":v8_146_4_0_x86_64_unknown_linux_gnu_bazel", + "@rules_rs//rs/experimental/platforms/config:x86_64-unknown-linux-gnu": ":v8_147_4_0_x86_64_unknown_linux_gnu_bazel", + ":platform_x86_64_unknown_linux_musl": ":v8_147_4_0_x86_64_unknown_linux_musl_release", + "//conditions:default": ":v8_147_4_0_x86_64_unknown_linux_gnu_bazel", }), ) alias( name = "rusty_v8_binding_for_target", actual = select({ - "@rules_rs//rs/experimental/platforms/config:aarch64-apple-darwin": ":src_binding_release_aarch64_apple_darwin", + "@rules_rs//rs/experimental/platforms/config:aarch64-apple-darwin": ":src_binding_release_aarch64_apple_darwin_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-gnullvm": ":src_binding_release_aarch64_pc_windows_gnullvm", "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-msvc": ":src_binding_release_aarch64_pc_windows_msvc", - "@rules_rs//rs/experimental/platforms/config:aarch64-unknown-linux-gnu": ":src_binding_release_aarch64_unknown_linux_gnu", - ":platform_aarch64_unknown_linux_musl": ":src_binding_release_aarch64_unknown_linux_musl", - "@rules_rs//rs/experimental/platforms/config:x86_64-apple-darwin": ":src_binding_release_x86_64_apple_darwin", + "@rules_rs//rs/experimental/platforms/config:aarch64-unknown-linux-gnu": ":src_binding_release_aarch64_unknown_linux_gnu_147_4_0_release", + ":platform_aarch64_unknown_linux_musl": ":src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", + "@rules_rs//rs/experimental/platforms/config:x86_64-apple-darwin": ":src_binding_release_x86_64_apple_darwin_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-gnullvm": ":src_binding_release_x86_64_pc_windows_gnullvm", "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-msvc": ":src_binding_release_x86_64_pc_windows_msvc", - "@rules_rs//rs/experimental/platforms/config:x86_64-unknown-linux-gnu": ":src_binding_release_x86_64_unknown_linux_gnu", - ":platform_x86_64_unknown_linux_musl": ":src_binding_release_x86_64_unknown_linux_musl", - "//conditions:default": ":src_binding_release_x86_64_unknown_linux_gnu", + "@rules_rs//rs/experimental/platforms/config:x86_64-unknown-linux-gnu": ":src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", + ":platform_x86_64_unknown_linux_musl": ":src_binding_release_x86_64_unknown_linux_musl_147_4_0_release", + "//conditions:default": ":src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", }), ) @@ -190,6 +190,11 @@ V8_STATIC_LIBRARY_FEATURES = [ cc_library( name = "rusty_v8_custom_libcxx_headers", + defines = select({ + ":platform_aarch64_unknown_linux_musl": ["ANDROID_HOST_MUSL"], + ":platform_x86_64_unknown_linux_musl": ["ANDROID_HOST_MUSL"], + "//conditions:default": [], + }), deps = [ "@rusty_v8_libcxx//:headers", "@rusty_v8_libcxxabi//:headers", diff --git a/third_party/v8/README.md b/third_party/v8/README.md index dc38cdc5daec..df54fb7a7f79 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -23,16 +23,17 @@ Current pinned versions: - Rust crate: `v8 = =147.4.0` - Embedded upstream V8 source for Bazel-produced release builds: `14.7.173.20` -When bumping the Rust crate version, keep the checked-in checksum manifest and -`MODULE.bazel` in sync: +When changing the remaining prebuilt `rusty_v8` `http_file` inputs, keep the +checked-in checksum manifest and `MODULE.bazel` in sync: ```bash python3 .github/scripts/rusty_v8_bazel.py update-module-bazel python3 .github/scripts/rusty_v8_bazel.py check-module-bazel ``` -The commands read `third_party/v8/rusty_v8_.sha256` by default -and validate every matching `rusty_v8_` `http_file` entry. +The commands default to the single `rusty_v8_*` `http_file` version still +present in `MODULE.bazel` and validate every matching entry. During the source +build rollout, that asset version can lag the resolved Rust crate version. CI runs the check command to block checksum drift. The consumer-facing selectors are: diff --git a/third_party/v8/libcxx.BUILD.bazel b/third_party/v8/libcxx.BUILD.bazel index 5550cfd0a245..71a8f8ddcec1 100644 --- a/third_party/v8/libcxx.BUILD.bazel +++ b/third_party/v8/libcxx.BUILD.bazel @@ -66,7 +66,7 @@ LIBCXX_SRCS = [ cc_library( name = "headers", hdrs = glob(["include/**"]), - includes = ["include"], + strip_include_prefix = "include", deps = ["@//third_party/v8/libcxx_config:headers"], ) diff --git a/third_party/v8/libcxxabi.BUILD.bazel b/third_party/v8/libcxxabi.BUILD.bazel index de4289b4dc31..0645511db739 100644 --- a/third_party/v8/libcxxabi.BUILD.bazel +++ b/third_party/v8/libcxxabi.BUILD.bazel @@ -16,7 +16,7 @@ config_setting( cc_library( name = "headers", hdrs = glob(["include/**"]), - includes = ["include"], + strip_include_prefix = "include", ) cc_runtime_stage0_library( From 7369abcf8cf66d644600c8821e864d673e8e1567 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Fri, 8 May 2026 21:40:26 -0700 Subject: [PATCH 11/19] ci(v8): add Windows source-build canary --- .github/scripts/rusty_v8_bazel.py | 32 ++++++ .github/scripts/test_rusty_v8_bazel.py | 64 +++++++++++ .github/workflows/v8-canary.yml | 140 +++++++++++++++++++++++++ 3 files changed, 236 insertions(+) diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index 562accd58a66..2548252efa57 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -250,6 +250,22 @@ def stage_artifacts( print(staged_checksums) +def upstream_release_pair_paths(source_root: Path, target: str) -> tuple[Path, Path]: + lib_name = "rusty_v8.lib" if target.endswith("-pc-windows-msvc") else "librusty_v8.a" + gn_out = source_root / "target" / target / "release" / "gn_out" + return gn_out / "obj" / lib_name, gn_out / "src_binding.rs" + + +def stage_upstream_release_pair( + source_root: Path, + target: str, + output_dir: Path, + sandbox: bool = False, +) -> None: + lib_path, binding_path = upstream_release_pair_paths(source_root, target) + stage_artifacts(target, lib_path, binding_path, output_dir, sandbox) + + def stage_release_pair( platform: str, target: str, @@ -300,6 +316,14 @@ def parse_args() -> argparse.Namespace: choices=["fastbuild", "opt", "dbg"], ) + stage_upstream_release_pair_parser = subparsers.add_parser( + "stage-upstream-release-pair" + ) + stage_upstream_release_pair_parser.add_argument("--source-root", type=Path, required=True) + stage_upstream_release_pair_parser.add_argument("--target", required=True) + stage_upstream_release_pair_parser.add_argument("--output-dir", required=True) + stage_upstream_release_pair_parser.add_argument("--sandbox", action="store_true") + subparsers.add_parser("resolved-v8-crate-version") check_module_bazel_parser = subparsers.add_parser("check-module-bazel") @@ -335,6 +359,14 @@ def main() -> int: sandbox=args.sandbox, ) return 0 + if args.command == "stage-upstream-release-pair": + stage_upstream_release_pair( + source_root=args.source_root, + target=args.target, + output_dir=Path(args.output_dir), + sandbox=args.sandbox, + ) + return 0 if args.command == "resolved-v8-crate-version": print(resolved_v8_crate_version()) return 0 diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index f516b871e309..73d6b8ed9b6b 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -148,6 +148,70 @@ def test_stage_artifacts(self) -> None: {path.name for path in Path(output_dir).iterdir()}, ) + def test_upstream_release_pair_paths(self) -> None: + self.assertEqual( + ( + Path( + "/tmp/rusty_v8/target/x86_64-apple-darwin/release/gn_out/obj/" + "librusty_v8.a" + ), + Path( + "/tmp/rusty_v8/target/x86_64-apple-darwin/release/gn_out/" + "src_binding.rs" + ), + ), + rusty_v8_bazel.upstream_release_pair_paths( + Path("/tmp/rusty_v8"), + "x86_64-apple-darwin", + ), + ) + self.assertEqual( + ( + Path( + "/tmp/rusty_v8/target/x86_64-pc-windows-msvc/release/gn_out/" + "obj/rusty_v8.lib" + ), + Path( + "/tmp/rusty_v8/target/x86_64-pc-windows-msvc/release/gn_out/" + "src_binding.rs" + ), + ), + rusty_v8_bazel.upstream_release_pair_paths( + Path("/tmp/rusty_v8"), + "x86_64-pc-windows-msvc", + ), + ) + + def test_stage_upstream_release_pair(self) -> None: + with TemporaryDirectory() as source_dir, TemporaryDirectory() as output_dir: + source_root = Path(source_dir) + gn_out = ( + source_root + / "target" + / "x86_64-pc-windows-msvc" + / "release" + / "gn_out" + ) + (gn_out / "obj").mkdir(parents=True) + (gn_out / "obj" / "rusty_v8.lib").write_bytes(b"archive") + (gn_out / "src_binding.rs").write_text("binding") + + rusty_v8_bazel.stage_upstream_release_pair( + source_root, + "x86_64-pc-windows-msvc", + Path(output_dir), + sandbox=True, + ) + + self.assertEqual( + { + "rusty_v8_ptrcomp_sandbox_release_x86_64-pc-windows-msvc.lib.gz", + "src_binding_ptrcomp_sandbox_release_x86_64-pc-windows-msvc.rs", + "rusty_v8_ptrcomp_sandbox_release_x86_64-pc-windows-msvc.sha256", + }, + {path.name for path in Path(output_dir).iterdir()}, + ) + def test_ensure_bazel_output_files_rebuilds_existing_outputs(self) -> None: with TemporaryDirectory() as output_dir: output = Path(output_dir) / "libv8.a" diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index 315d15e32bae..5a23ceaaa763 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -3,14 +3,17 @@ name: v8-canary on: pull_request: paths: + - ".bazelrc" - ".github/actions/setup-bazel-ci/**" - ".github/scripts/rusty_v8_bazel.py" + - ".github/scripts/rusty_v8_module_bazel.py" - ".github/workflows/rusty-v8-release.yml" - ".github/workflows/v8-canary.yml" - "MODULE.bazel" - "MODULE.bazel.lock" - "codex-rs/Cargo.toml" - "patches/BUILD.bazel" + - "patches/llvm_*.patch" - "patches/rules_cc_*.patch" - "patches/v8_*.patch" - "third_party/v8/**" @@ -18,14 +21,17 @@ on: branches: - main paths: + - ".bazelrc" - ".github/actions/setup-bazel-ci/**" - ".github/scripts/rusty_v8_bazel.py" + - ".github/scripts/rusty_v8_module_bazel.py" - ".github/workflows/rusty-v8-release.yml" - ".github/workflows/v8-canary.yml" - "MODULE.bazel" - "MODULE.bazel.lock" - "codex-rs/Cargo.toml" - "patches/BUILD.bazel" + - "patches/llvm_*.patch" - "patches/rules_cc_*.patch" - "patches/v8_*.patch" - "third_party/v8/**" @@ -263,3 +269,137 @@ jobs: with: name: v8-canary-${{ needs.metadata.outputs.v8_version }}-${{ matrix.variant }}-${{ matrix.target }} path: dist/${{ matrix.target }}/* + + build-windows-source: + name: Build ptrcomp-sandbox ${{ matrix.target }} from source + needs: metadata + runs-on: ${{ matrix.runner }} + permissions: + contents: read + strategy: + fail-fast: false + matrix: + include: + - runner: windows-2022 + target: x86_64-pc-windows-msvc + - runner: windows-2022 + target: aarch64-pc-windows-msvc + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + + - name: Configure git for upstream checkout + shell: bash + run: git config --global core.symlinks true + + - name: Check out upstream rusty_v8 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + repository: denoland/rusty_v8 + ref: v${{ needs.metadata.outputs.v8_version }} + path: upstream-rusty-v8 + submodules: recursive + + - name: Set up Python + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.11" + architecture: x64 + + - name: Set up rusty_v8 Rust toolchain + uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 + with: + toolchain: "1.91.0" + targets: ${{ matrix.target }} + + - name: Set up Codex Rust toolchain for Cargo smoke + uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 + with: + toolchain: "1.93.0" + targets: ${{ matrix.target }} + + - name: Write upstream submodule status + shell: bash + working-directory: upstream-rusty-v8 + run: git submodule status --recursive > git_submodule_status.txt + + - name: Restore upstream source-build cache + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5 + with: + path: | + upstream-rusty-v8/target/sccache + upstream-rusty-v8/target/${{ matrix.target }}/release/gn_out + key: rusty-v8-source-${{ matrix.target }}-sandbox-${{ hashFiles('upstream-rusty-v8/Cargo.lock', 'upstream-rusty-v8/build.rs', 'upstream-rusty-v8/git_submodule_status.txt') }} + restore-keys: | + rusty-v8-source-${{ matrix.target }}-sandbox- + + - name: Install and start sccache + shell: pwsh + env: + SCCACHE_CACHE_SIZE: 256M + SCCACHE_DIR: ${{ github.workspace }}/upstream-rusty-v8/target/sccache + SCCACHE_IDLE_TIMEOUT: 0 + run: | + $version = "v0.8.2" + $platform = "x86_64-pc-windows-msvc" + $basename = "sccache-$version-$platform" + $url = "https://github.com/mozilla/sccache/releases/download/$version/$basename.tar.gz" + cd ~ + curl -LO $url + tar -xzvf "$basename.tar.gz" + . $basename/sccache --start-server + echo "$(pwd)/$basename" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Install Chromium clang for ARM64 MSVC cross build + if: matrix.target == 'aarch64-pc-windows-msvc' + shell: bash + working-directory: upstream-rusty-v8 + run: python3 tools/clang/scripts/update.py + + - name: Build upstream rusty_v8 sandbox release pair + env: + SCCACHE_IDLE_TIMEOUT: 0 + TARGET: ${{ matrix.target }} + V8_FROM_SOURCE: "1" + shell: bash + working-directory: upstream-rusty-v8 + run: cargo +1.91.0 build --locked --release --target "${TARGET}" --features v8_enable_sandbox + + - name: Stage upstream sandbox release pair + env: + TARGET: ${{ matrix.target }} + shell: bash + run: | + set -euo pipefail + python3 .github/scripts/rusty_v8_bazel.py stage-upstream-release-pair \ + --source-root upstream-rusty-v8 \ + --target "${TARGET}" \ + --output-dir "dist/${TARGET}" \ + --sandbox + + - name: Smoke link staged artifact with Cargo + env: + TARGET: ${{ matrix.target }} + shell: bash + run: | + set -euo pipefail + + archive="$(find "dist/${TARGET}" -maxdepth 1 -type f -name 'rusty_v8_*.lib.gz' -print -quit)" + binding="$(find "dist/${TARGET}" -maxdepth 1 -type f -name 'src_binding_*.rs' -print -quit)" + if [[ -z "${archive}" || -z "${binding}" ]]; then + echo "Missing staged archive or binding for ${TARGET}." >&2 + exit 1 + fi + + ( + cd codex-rs + RUSTY_V8_ARCHIVE="${GITHUB_WORKSPACE}/${archive}" \ + RUSTY_V8_SRC_BINDING_PATH="${GITHUB_WORKSPACE}/${binding}" \ + cargo +1.93.0 test -p codex-v8-poc --target "${TARGET}" --features sandbox --no-run + ) + + - name: Upload staged artifacts + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + with: + name: v8-canary-${{ needs.metadata.outputs.v8_version }}-ptrcomp-sandbox-${{ matrix.target }} + path: dist/${{ matrix.target }}/* From 70be87332869e5150cb0de9098ca24d347090d66 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Sat, 9 May 2026 00:15:57 -0700 Subject: [PATCH 12/19] ci(v8): install upstream Rust target explicitly --- .github/workflows/v8-canary.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index 5a23ceaaa763..23cd74c3c9c5 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -306,18 +306,21 @@ jobs: python-version: "3.11" architecture: x64 - - name: Set up rusty_v8 Rust toolchain - uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 - with: - toolchain: "1.91.0" - targets: ${{ matrix.target }} - - name: Set up Codex Rust toolchain for Cargo smoke uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0 with: toolchain: "1.93.0" targets: ${{ matrix.target }} + - name: Install rusty_v8 Rust toolchain + env: + TARGET: ${{ matrix.target }} + shell: bash + run: | + set -euo pipefail + rustup toolchain install 1.91.0 --profile minimal --no-self-update + rustup target add --toolchain 1.91.0 "${TARGET}" + - name: Write upstream submodule status shell: bash working-directory: upstream-rusty-v8 From 109b4710a1ecb3a378be21beeaed8a6a1776310f Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Sat, 9 May 2026 00:25:14 -0700 Subject: [PATCH 13/19] fix(v8): address review feedback --- .github/scripts/rusty_v8_bazel.py | 10 +++ .github/scripts/test_rusty_v8_bazel.py | 17 +++++- .github/workflows/rusty-v8-release.yml | 3 + .github/workflows/v8-canary.yml | 3 + MODULE.bazel | 84 ++------------------------ third_party/v8/BUILD.bazel | 74 ++++------------------- third_party/v8/README.md | 5 +- third_party/v8/rusty_v8_146_4_0.sha256 | 10 --- third_party/v8/rusty_v8_147_4_0.sha256 | 2 + 9 files changed, 54 insertions(+), 154 deletions(-) delete mode 100644 third_party/v8/rusty_v8_146_4_0.sha256 create mode 100644 third_party/v8/rusty_v8_147_4_0.sha256 diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index 2548252efa57..ee874b7deb06 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -5,6 +5,7 @@ import argparse import gzip import hashlib +import os import re import shutil import subprocess @@ -28,6 +29,13 @@ ARTIFACT_BAZEL_CONFIGS = ["rusty-v8-upstream-libcxx"] +def bazel_remote_args() -> list[str]: + buildbuddy_api_key = os.environ.get("BUILDBUDDY_API_KEY") + if not buildbuddy_api_key: + return [] + return [f"--remote_header=x-buildbuddy-api-key={buildbuddy_api_key}"] + + def bazel_execroot() -> Path: result = subprocess.run( ["bazel", "info", "execution_root"], @@ -72,6 +80,7 @@ def bazel_output_files( compilation_mode, f"--platforms=@llvm//platforms:{platform}", *[f"--config={config}" for config in bazel_configs], + *bazel_remote_args(), "--output=files", expression, ], @@ -98,6 +107,7 @@ def bazel_build( compilation_mode, f"--platforms=@llvm//platforms:{platform}", *[f"--config={config}" for config in bazel_configs], + *bazel_remote_args(), *labels, ], cwd=ROOT, diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index 73d6b8ed9b6b..11e988dca3cc 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -4,6 +4,7 @@ import textwrap import unittest +from os import environ from pathlib import Path from tempfile import TemporaryDirectory from unittest.mock import patch @@ -13,7 +14,7 @@ class RustyV8BazelTest(unittest.TestCase): - def test_non_windows_consumer_selectors_track_resolved_crate_version(self) -> None: + def test_consumer_selectors_track_resolved_crate_version(self) -> None: build_bazel = ( rusty_v8_bazel.ROOT / "third_party" / "v8" / "BUILD.bazel" ).read_text() @@ -21,9 +22,11 @@ def test_non_windows_consumer_selectors_track_resolved_crate_version(self) -> No for selector in [ "aarch64_apple_darwin_bazel", + "aarch64_pc_windows_msvc", "aarch64_unknown_linux_gnu_bazel", "aarch64_unknown_linux_musl_release_base", "x86_64_apple_darwin_bazel", + "x86_64_pc_windows_msvc", "x86_64_unknown_linux_gnu_bazel", "x86_64_unknown_linux_musl_release", ]: @@ -34,9 +37,11 @@ def test_non_windows_consumer_selectors_track_resolved_crate_version(self) -> No for selector in [ "aarch64_apple_darwin", + "aarch64_pc_windows_msvc", "aarch64_unknown_linux_gnu", "aarch64_unknown_linux_musl", "x86_64_apple_darwin", + "x86_64_pc_windows_msvc", "x86_64_unknown_linux_gnu", "x86_64_unknown_linux_musl", ]: @@ -79,6 +84,16 @@ def test_artifact_bazel_configs_always_enable_upstream_libcxx(self) -> None: ), ) + def test_bazel_remote_args_include_buildbuddy_header_when_present(self) -> None: + with patch.dict(environ, {"BUILDBUDDY_API_KEY": "token"}, clear=False): + self.assertEqual( + ["--remote_header=x-buildbuddy-api-key=token"], + rusty_v8_bazel.bazel_remote_args(), + ) + + with patch.dict(environ, {}, clear=True): + self.assertEqual([], rusty_v8_bazel.bazel_remote_args()) + def test_release_pair_labels_and_staged_names_distinguish_sandbox_artifacts(self) -> None: self.assertEqual( "//third_party/v8:rusty_v8_release_pair_x86_64_unknown_linux_musl", diff --git a/.github/workflows/rusty-v8-release.yml b/.github/workflows/rusty-v8-release.yml index 0b1776ba7397..3b56a1e93f68 100644 --- a/.github/workflows/rusty-v8-release.yml +++ b/.github/workflows/rusty-v8-release.yml @@ -194,6 +194,8 @@ jobs: - name: Stage release pair env: + BAZEL_CONFIG: ${{ matrix.bazel_config }} + BUILDBUDDY_API_KEY: ${{ secrets.BUILDBUDDY_API_KEY }} PLATFORM: ${{ matrix.platform }} SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} @@ -206,6 +208,7 @@ jobs: --target "${TARGET}" --compilation-mode opt --output-dir "dist/${TARGET}" + --bazel-config "${BAZEL_CONFIG}" ) if [[ "${SANDBOX}" == "true" ]]; then stage_args+=(--sandbox) diff --git a/.github/workflows/v8-canary.yml b/.github/workflows/v8-canary.yml index 23cd74c3c9c5..979e991504b2 100644 --- a/.github/workflows/v8-canary.yml +++ b/.github/workflows/v8-canary.yml @@ -206,6 +206,8 @@ jobs: - name: Stage release pair env: + BAZEL_CONFIG: ${{ matrix.bazel_config }} + BUILDBUDDY_API_KEY: ${{ secrets.BUILDBUDDY_API_KEY }} PLATFORM: ${{ matrix.platform }} SANDBOX: ${{ matrix.sandbox }} TARGET: ${{ matrix.target }} @@ -217,6 +219,7 @@ jobs: --platform "${PLATFORM}" --target "${TARGET}" --output-dir "dist/${TARGET}" + --bazel-config "${BAZEL_CONFIG}" ) if [[ "${SANDBOX}" == "true" ]]; then stage_args+=(--sandbox) diff --git a/MODULE.bazel b/MODULE.bazel index 4febc090a2e8..81f16b7b9ec6 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -471,92 +471,20 @@ git_repository( ) http_file( - name = "rusty_v8_146_4_0_aarch64_apple_darwin_archive", - downloaded_file_path = "librusty_v8_release_aarch64-apple-darwin.a.gz", - sha256 = "bfe2c9be32a56c28546f0f965825ee68fbf606405f310cc4e17b448a568cf98a", - urls = [ - "https://github.com/denoland/rusty_v8/releases/download/v146.4.0/librusty_v8_release_aarch64-apple-darwin.a.gz", - ], -) - -http_file( - name = "rusty_v8_146_4_0_aarch64_unknown_linux_gnu_archive", - downloaded_file_path = "librusty_v8_release_aarch64-unknown-linux-gnu.a.gz", - sha256 = "dbf165b07c81bdb054bc046b43d23e69fcf7bcc1a4c1b5b4776983a71062ecd8", - urls = [ - "https://github.com/denoland/rusty_v8/releases/download/v146.4.0/librusty_v8_release_aarch64-unknown-linux-gnu.a.gz", - ], -) - -http_file( - name = "rusty_v8_146_4_0_aarch64_pc_windows_msvc_archive", + name = "rusty_v8_147_4_0_aarch64_pc_windows_msvc_archive", downloaded_file_path = "rusty_v8_release_aarch64-pc-windows-msvc.lib.gz", - sha256 = "ed13363659c6d08583ac8fdc40493445c5767d8b94955a4d5d7bb8d5a81f6bf8", - urls = [ - "https://github.com/denoland/rusty_v8/releases/download/v146.4.0/rusty_v8_release_aarch64-pc-windows-msvc.lib.gz", - ], -) - -http_file( - name = "rusty_v8_146_4_0_x86_64_apple_darwin_archive", - downloaded_file_path = "librusty_v8_release_x86_64-apple-darwin.a.gz", - sha256 = "630cd240f1bbecdb071417dc18387ab81cf67c549c1c515a0b4fcf9eba647bb7", - urls = [ - "https://github.com/denoland/rusty_v8/releases/download/v146.4.0/librusty_v8_release_x86_64-apple-darwin.a.gz", - ], -) - -http_file( - name = "rusty_v8_146_4_0_x86_64_unknown_linux_gnu_archive", - downloaded_file_path = "librusty_v8_release_x86_64-unknown-linux-gnu.a.gz", - sha256 = "e64b4d99e4ae293a2e846244a89b80178ba10382c13fb591c1fa6968f5291153", + sha256 = "1fa3f94d9e09cff1f6bcce94c478e5cb072c0755f6a0357abadb9dd3b48d8127", urls = [ - "https://github.com/denoland/rusty_v8/releases/download/v146.4.0/librusty_v8_release_x86_64-unknown-linux-gnu.a.gz", + "https://github.com/denoland/rusty_v8/releases/download/v147.4.0/rusty_v8_release_aarch64-pc-windows-msvc.lib.gz", ], ) http_file( - name = "rusty_v8_146_4_0_x86_64_pc_windows_msvc_archive", + name = "rusty_v8_147_4_0_x86_64_pc_windows_msvc_archive", downloaded_file_path = "rusty_v8_release_x86_64-pc-windows-msvc.lib.gz", - sha256 = "90a9a2346acd3685a355e98df85c24dbe406cb124367d16259a4b5d522621862", - urls = [ - "https://github.com/denoland/rusty_v8/releases/download/v146.4.0/rusty_v8_release_x86_64-pc-windows-msvc.lib.gz", - ], -) - -http_file( - name = "rusty_v8_146_4_0_aarch64_unknown_linux_musl_archive", - downloaded_file_path = "librusty_v8_release_aarch64-unknown-linux-musl.a.gz", - sha256 = "27a08ed26c34297bfd93e514692ccc44b85f8b15c6aa39cf34e784f84fb37e8e", - urls = [ - "https://github.com/openai/codex/releases/download/rusty-v8-v146.4.0/librusty_v8_release_aarch64-unknown-linux-musl.a.gz", - ], -) - -http_file( - name = "rusty_v8_146_4_0_aarch64_unknown_linux_musl_binding", - downloaded_file_path = "src_binding_release_aarch64-unknown-linux-musl.rs", - sha256 = "09f8900ced8297c229246c7a50b2e0ec23c54d0a554f369619cc29863f38dd1a", - urls = [ - "https://github.com/openai/codex/releases/download/rusty-v8-v146.4.0/src_binding_release_aarch64-unknown-linux-musl.rs", - ], -) - -http_file( - name = "rusty_v8_146_4_0_x86_64_unknown_linux_musl_archive", - downloaded_file_path = "librusty_v8_release_x86_64-unknown-linux-musl.a.gz", - sha256 = "20d8271ad712323d352c1383c36e3c4b755abc41ece35819c49c75ec7134d2f8", - urls = [ - "https://github.com/openai/codex/releases/download/rusty-v8-v146.4.0/librusty_v8_release_x86_64-unknown-linux-musl.a.gz", - ], -) - -http_file( - name = "rusty_v8_146_4_0_x86_64_unknown_linux_musl_binding", - downloaded_file_path = "src_binding_release_x86_64-unknown-linux-musl.rs", - sha256 = "09f8900ced8297c229246c7a50b2e0ec23c54d0a554f369619cc29863f38dd1a", + sha256 = "e2827ff98b1a9d4c0343000fc5124ac30dfab3007bc0129c168c9355fc2fcd7c", urls = [ - "https://github.com/openai/codex/releases/download/rusty-v8-v146.4.0/src_binding_release_x86_64-unknown-linux-musl.rs", + "https://github.com/denoland/rusty_v8/releases/download/v147.4.0/rusty_v8_release_x86_64-pc-windows-msvc.lib.gz", ], ) diff --git a/third_party/v8/BUILD.bazel b/third_party/v8/BUILD.bazel index 190f11f095bf..4d7e174ed23c 100644 --- a/third_party/v8/BUILD.bazel +++ b/third_party/v8/BUILD.bazel @@ -30,43 +30,13 @@ config_setting( ) alias( - name = "v8_146_4_0_x86_64_apple_darwin", - actual = "@rusty_v8_146_4_0_x86_64_apple_darwin_archive//file", + name = "v8_147_4_0_x86_64_pc_windows_msvc", + actual = "@rusty_v8_147_4_0_x86_64_pc_windows_msvc_archive//file", ) alias( - name = "v8_146_4_0_aarch64_apple_darwin", - actual = "@rusty_v8_146_4_0_aarch64_apple_darwin_archive//file", -) - -alias( - name = "v8_146_4_0_x86_64_unknown_linux_gnu", - actual = "@rusty_v8_146_4_0_x86_64_unknown_linux_gnu_archive//file", -) - -alias( - name = "v8_146_4_0_aarch64_unknown_linux_gnu", - actual = "@rusty_v8_146_4_0_aarch64_unknown_linux_gnu_archive//file", -) - -alias( - name = "v8_146_4_0_x86_64_unknown_linux_musl", - actual = "@rusty_v8_146_4_0_x86_64_unknown_linux_musl_archive//file", -) - -alias( - name = "v8_146_4_0_aarch64_unknown_linux_musl", - actual = "@rusty_v8_146_4_0_aarch64_unknown_linux_musl_archive//file", -) - -alias( - name = "v8_146_4_0_x86_64_pc_windows_msvc", - actual = "@rusty_v8_146_4_0_x86_64_pc_windows_msvc_archive//file", -) - -alias( - name = "v8_146_4_0_aarch64_pc_windows_msvc", - actual = "@rusty_v8_146_4_0_aarch64_pc_windows_msvc_archive//file", + name = "v8_147_4_0_aarch64_pc_windows_msvc", + actual = "@rusty_v8_147_4_0_aarch64_pc_windows_msvc_archive//file", ) alias( @@ -102,26 +72,6 @@ filegroup( srcs = ["@v8_crate_146_4_0//:src_binding_release_x86_64_unknown_linux_gnu"], ) -alias( - name = "src_binding_release_x86_64_unknown_linux_musl", - actual = "@rusty_v8_146_4_0_x86_64_unknown_linux_musl_binding//file", -) - -alias( - name = "src_binding_release_aarch64_unknown_linux_musl", - actual = "@rusty_v8_146_4_0_aarch64_unknown_linux_musl_binding//file", -) - -filegroup( - name = "src_binding_release_x86_64_pc_windows_msvc", - srcs = ["@v8_crate_146_4_0//:src_binding_release_x86_64_pc_windows_msvc"], -) - -filegroup( - name = "src_binding_release_aarch64_pc_windows_msvc", - srcs = ["@v8_crate_146_4_0//:src_binding_release_aarch64_pc_windows_msvc"], -) - alias( name = "src_binding_release_x86_64_pc_windows_gnullvm", # `rusty_v8` does not publish a Windows GNU binding file. The generated @@ -141,12 +91,12 @@ alias( actual = select({ "@rules_rs//rs/experimental/platforms/config:aarch64-apple-darwin": ":v8_147_4_0_aarch64_apple_darwin_bazel", "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-gnullvm": ":v8_146_4_0_aarch64_pc_windows_gnullvm", - "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-msvc": ":v8_146_4_0_aarch64_pc_windows_msvc", + "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-msvc": ":v8_147_4_0_aarch64_pc_windows_msvc", "@rules_rs//rs/experimental/platforms/config:aarch64-unknown-linux-gnu": ":v8_147_4_0_aarch64_unknown_linux_gnu_bazel", ":platform_aarch64_unknown_linux_musl": ":v8_147_4_0_aarch64_unknown_linux_musl_release_base", "@rules_rs//rs/experimental/platforms/config:x86_64-apple-darwin": ":v8_147_4_0_x86_64_apple_darwin_bazel", "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-gnullvm": ":v8_146_4_0_x86_64_pc_windows_gnullvm", - "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-msvc": ":v8_146_4_0_x86_64_pc_windows_msvc", + "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-msvc": ":v8_147_4_0_x86_64_pc_windows_msvc", "@rules_rs//rs/experimental/platforms/config:x86_64-unknown-linux-gnu": ":v8_147_4_0_x86_64_unknown_linux_gnu_bazel", ":platform_x86_64_unknown_linux_musl": ":v8_147_4_0_x86_64_unknown_linux_musl_release", "//conditions:default": ":v8_147_4_0_x86_64_unknown_linux_gnu_bazel", @@ -158,12 +108,12 @@ alias( actual = select({ "@rules_rs//rs/experimental/platforms/config:aarch64-apple-darwin": ":src_binding_release_aarch64_apple_darwin_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-gnullvm": ":src_binding_release_aarch64_pc_windows_gnullvm", - "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-msvc": ":src_binding_release_aarch64_pc_windows_msvc", + "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-msvc": ":src_binding_release_aarch64_pc_windows_msvc_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:aarch64-unknown-linux-gnu": ":src_binding_release_aarch64_unknown_linux_gnu_147_4_0_release", ":platform_aarch64_unknown_linux_musl": ":src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:x86_64-apple-darwin": ":src_binding_release_x86_64_apple_darwin_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-gnullvm": ":src_binding_release_x86_64_pc_windows_gnullvm", - "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-msvc": ":src_binding_release_x86_64_pc_windows_msvc", + "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-msvc": ":src_binding_release_x86_64_pc_windows_msvc_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:x86_64-unknown-linux-gnu": ":src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", ":platform_x86_64_unknown_linux_musl": ":src_binding_release_x86_64_unknown_linux_musl_147_4_0_release", "//conditions:default": ":src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", @@ -543,16 +493,16 @@ filegroup( filegroup( name = "rusty_v8_release_pair_x86_64_pc_windows_msvc", srcs = [ - ":v8_146_4_0_x86_64_pc_windows_msvc", - ":src_binding_release_x86_64_pc_windows_msvc", + ":v8_147_4_0_x86_64_pc_windows_msvc", + ":src_binding_release_x86_64_pc_windows_msvc_147_4_0_release", ], ) filegroup( name = "rusty_v8_release_pair_aarch64_pc_windows_msvc", srcs = [ - ":v8_146_4_0_aarch64_pc_windows_msvc", - ":src_binding_release_aarch64_pc_windows_msvc", + ":v8_147_4_0_aarch64_pc_windows_msvc", + ":src_binding_release_aarch64_pc_windows_msvc_147_4_0_release", ], ) diff --git a/third_party/v8/README.md b/third_party/v8/README.md index df54fb7a7f79..ff9867414091 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -32,9 +32,8 @@ python3 .github/scripts/rusty_v8_bazel.py check-module-bazel ``` The commands default to the single `rusty_v8_*` `http_file` version still -present in `MODULE.bazel` and validate every matching entry. During the source -build rollout, that asset version can lag the resolved Rust crate version. -CI runs the check command to block checksum drift. +present in `MODULE.bazel` and validate every matching entry. CI runs the check +command to block checksum drift. The consumer-facing selectors are: diff --git a/third_party/v8/rusty_v8_146_4_0.sha256 b/third_party/v8/rusty_v8_146_4_0.sha256 deleted file mode 100644 index 09b3e1b0b254..000000000000 --- a/third_party/v8/rusty_v8_146_4_0.sha256 +++ /dev/null @@ -1,10 +0,0 @@ -bfe2c9be32a56c28546f0f965825ee68fbf606405f310cc4e17b448a568cf98a librusty_v8_release_aarch64-apple-darwin.a.gz -dbf165b07c81bdb054bc046b43d23e69fcf7bcc1a4c1b5b4776983a71062ecd8 librusty_v8_release_aarch64-unknown-linux-gnu.a.gz -ed13363659c6d08583ac8fdc40493445c5767d8b94955a4d5d7bb8d5a81f6bf8 rusty_v8_release_aarch64-pc-windows-msvc.lib.gz -630cd240f1bbecdb071417dc18387ab81cf67c549c1c515a0b4fcf9eba647bb7 librusty_v8_release_x86_64-apple-darwin.a.gz -e64b4d99e4ae293a2e846244a89b80178ba10382c13fb591c1fa6968f5291153 librusty_v8_release_x86_64-unknown-linux-gnu.a.gz -90a9a2346acd3685a355e98df85c24dbe406cb124367d16259a4b5d522621862 rusty_v8_release_x86_64-pc-windows-msvc.lib.gz -27a08ed26c34297bfd93e514692ccc44b85f8b15c6aa39cf34e784f84fb37e8e librusty_v8_release_aarch64-unknown-linux-musl.a.gz -09f8900ced8297c229246c7a50b2e0ec23c54d0a554f369619cc29863f38dd1a src_binding_release_aarch64-unknown-linux-musl.rs -20d8271ad712323d352c1383c36e3c4b755abc41ece35819c49c75ec7134d2f8 librusty_v8_release_x86_64-unknown-linux-musl.a.gz -09f8900ced8297c229246c7a50b2e0ec23c54d0a554f369619cc29863f38dd1a src_binding_release_x86_64-unknown-linux-musl.rs diff --git a/third_party/v8/rusty_v8_147_4_0.sha256 b/third_party/v8/rusty_v8_147_4_0.sha256 new file mode 100644 index 000000000000..a287e5fd5b5c --- /dev/null +++ b/third_party/v8/rusty_v8_147_4_0.sha256 @@ -0,0 +1,2 @@ +1fa3f94d9e09cff1f6bcce94c478e5cb072c0755f6a0357abadb9dd3b48d8127 rusty_v8_release_aarch64-pc-windows-msvc.lib.gz +e2827ff98b1a9d4c0343000fc5124ac30dfab3007bc0129c168c9355fc2fcd7c rusty_v8_release_x86_64-pc-windows-msvc.lib.gz From 0d1b1db9da7ca9a0b4b6d7241cc69c53f6429d56 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Sat, 9 May 2026 23:26:36 -0700 Subject: [PATCH 14/19] fix(v8): materialize staged Bazel outputs --- .github/scripts/rusty_v8_bazel.py | 11 ++++++++++- .github/scripts/test_rusty_v8_bazel.py | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/scripts/rusty_v8_bazel.py b/.github/scripts/rusty_v8_bazel.py index ee874b7deb06..2f46daf45eb1 100644 --- a/.github/scripts/rusty_v8_bazel.py +++ b/.github/scripts/rusty_v8_bazel.py @@ -97,8 +97,10 @@ def bazel_build( labels: list[str], compilation_mode: str = "fastbuild", bazel_configs: list[str] | None = None, + download_toplevel: bool = False, ) -> None: bazel_configs = bazel_configs or [] + download_args = ["--remote_download_toplevel"] if download_toplevel else [] subprocess.run( [ "bazel", @@ -108,6 +110,7 @@ def bazel_build( f"--platforms=@llvm//platforms:{platform}", *[f"--config={config}" for config in bazel_configs], *bazel_remote_args(), + *download_args, *labels, ], cwd=ROOT, @@ -123,7 +126,13 @@ def ensure_bazel_output_files( ) -> list[Path]: # Bazel output paths can be reused across config flips, so existence alone # does not prove the files match the requested flags. - bazel_build(platform, labels, compilation_mode, bazel_configs) + bazel_build( + platform, + labels, + compilation_mode, + bazel_configs, + download_toplevel=True, + ) outputs = bazel_output_files(platform, labels, compilation_mode, bazel_configs) missing = [str(path) for path in outputs if not path.exists()] if missing: diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index 11e988dca3cc..a5654ba837bc 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -255,6 +255,7 @@ def test_ensure_bazel_output_files_rebuilds_existing_outputs(self) -> None: ["//third_party/v8:pair"], "opt", ["rusty-v8-upstream-libcxx"], + download_toplevel=True, ) bazel_output_files.assert_called_once_with( "macos_arm64", From 2f79c7ad9d6eec1b79245e9c3fea05f2913f0cdd Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Sun, 10 May 2026 17:54:54 -0700 Subject: [PATCH 15/19] fix(v8): align windows gnullvm with 147 --- .github/scripts/test_rusty_v8_bazel.py | 4 +++ third_party/v8/BUILD.bazel | 36 +++++++++++++++++--------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/.github/scripts/test_rusty_v8_bazel.py b/.github/scripts/test_rusty_v8_bazel.py index a5654ba837bc..19690dbece44 100644 --- a/.github/scripts/test_rusty_v8_bazel.py +++ b/.github/scripts/test_rusty_v8_bazel.py @@ -22,10 +22,12 @@ def test_consumer_selectors_track_resolved_crate_version(self) -> None: for selector in [ "aarch64_apple_darwin_bazel", + "aarch64_pc_windows_gnullvm", "aarch64_pc_windows_msvc", "aarch64_unknown_linux_gnu_bazel", "aarch64_unknown_linux_musl_release_base", "x86_64_apple_darwin_bazel", + "x86_64_pc_windows_gnullvm", "x86_64_pc_windows_msvc", "x86_64_unknown_linux_gnu_bazel", "x86_64_unknown_linux_musl_release", @@ -37,10 +39,12 @@ def test_consumer_selectors_track_resolved_crate_version(self) -> None: for selector in [ "aarch64_apple_darwin", + "aarch64_pc_windows_gnullvm", "aarch64_pc_windows_msvc", "aarch64_unknown_linux_gnu", "aarch64_unknown_linux_musl", "x86_64_apple_darwin", + "x86_64_pc_windows_gnullvm", "x86_64_pc_windows_msvc", "x86_64_unknown_linux_gnu", "x86_64_unknown_linux_musl", diff --git a/third_party/v8/BUILD.bazel b/third_party/v8/BUILD.bazel index 4d7e174ed23c..df8e06328cd8 100644 --- a/third_party/v8/BUILD.bazel +++ b/third_party/v8/BUILD.bazel @@ -40,16 +40,16 @@ alias( ) alias( - name = "v8_146_4_0_aarch64_pc_windows_gnullvm", + name = "v8_147_4_0_aarch64_pc_windows_gnullvm", # `rusty_v8` only ships prebuilt Windows archives for MSVC. Build the # GNU-flavored archive in-tree so windows-gnullvm consumers can link # against a matching ABI instead of trying to reuse the MSVC release. - actual = ":v8_146_4_0_aarch64_pc_windows_gnullvm_bazel", + actual = ":v8_147_4_0_aarch64_pc_windows_gnullvm_bazel", ) alias( - name = "v8_146_4_0_x86_64_pc_windows_gnullvm", - actual = ":v8_146_4_0_x86_64_pc_windows_gnullvm_bazel", + name = "v8_147_4_0_x86_64_pc_windows_gnullvm", + actual = ":v8_147_4_0_x86_64_pc_windows_gnullvm_bazel", ) filegroup( @@ -73,29 +73,29 @@ filegroup( ) alias( - name = "src_binding_release_x86_64_pc_windows_gnullvm", + name = "src_binding_release_x86_64_pc_windows_gnullvm_147_4_0_release", # `rusty_v8` does not publish a Windows GNU binding file. The generated # binding only describes this V8 release's C++ API surface, so reuse the # Linux release binding while the windows-gnullvm archive build is still # experimental. - actual = ":src_binding_release_x86_64_unknown_linux_gnu", + actual = ":src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", ) alias( - name = "src_binding_release_aarch64_pc_windows_gnullvm", - actual = ":src_binding_release_aarch64_unknown_linux_gnu", + name = "src_binding_release_aarch64_pc_windows_gnullvm_147_4_0_release", + actual = ":src_binding_release_aarch64_unknown_linux_gnu_147_4_0_release", ) alias( name = "rusty_v8_archive_for_target", actual = select({ "@rules_rs//rs/experimental/platforms/config:aarch64-apple-darwin": ":v8_147_4_0_aarch64_apple_darwin_bazel", - "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-gnullvm": ":v8_146_4_0_aarch64_pc_windows_gnullvm", + "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-gnullvm": ":v8_147_4_0_aarch64_pc_windows_gnullvm", "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-msvc": ":v8_147_4_0_aarch64_pc_windows_msvc", "@rules_rs//rs/experimental/platforms/config:aarch64-unknown-linux-gnu": ":v8_147_4_0_aarch64_unknown_linux_gnu_bazel", ":platform_aarch64_unknown_linux_musl": ":v8_147_4_0_aarch64_unknown_linux_musl_release_base", "@rules_rs//rs/experimental/platforms/config:x86_64-apple-darwin": ":v8_147_4_0_x86_64_apple_darwin_bazel", - "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-gnullvm": ":v8_146_4_0_x86_64_pc_windows_gnullvm", + "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-gnullvm": ":v8_147_4_0_x86_64_pc_windows_gnullvm", "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-msvc": ":v8_147_4_0_x86_64_pc_windows_msvc", "@rules_rs//rs/experimental/platforms/config:x86_64-unknown-linux-gnu": ":v8_147_4_0_x86_64_unknown_linux_gnu_bazel", ":platform_x86_64_unknown_linux_musl": ":v8_147_4_0_x86_64_unknown_linux_musl_release", @@ -107,12 +107,12 @@ alias( name = "rusty_v8_binding_for_target", actual = select({ "@rules_rs//rs/experimental/platforms/config:aarch64-apple-darwin": ":src_binding_release_aarch64_apple_darwin_147_4_0_release", - "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-gnullvm": ":src_binding_release_aarch64_pc_windows_gnullvm", + "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-gnullvm": ":src_binding_release_aarch64_pc_windows_gnullvm_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:aarch64-pc-windows-msvc": ":src_binding_release_aarch64_pc_windows_msvc_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:aarch64-unknown-linux-gnu": ":src_binding_release_aarch64_unknown_linux_gnu_147_4_0_release", ":platform_aarch64_unknown_linux_musl": ":src_binding_release_aarch64_unknown_linux_musl_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:x86_64-apple-darwin": ":src_binding_release_x86_64_apple_darwin_147_4_0_release", - "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-gnullvm": ":src_binding_release_x86_64_pc_windows_gnullvm", + "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-gnullvm": ":src_binding_release_x86_64_pc_windows_gnullvm_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:x86_64-pc-windows-msvc": ":src_binding_release_x86_64_pc_windows_msvc_147_4_0_release", "@rules_rs//rs/experimental/platforms/config:x86_64-unknown-linux-gnu": ":src_binding_release_x86_64_unknown_linux_gnu_147_4_0_release", ":platform_x86_64_unknown_linux_musl": ":src_binding_release_x86_64_unknown_linux_musl_147_4_0_release", @@ -342,6 +342,12 @@ cc_static_library( features = V8_STATIC_LIBRARY_FEATURES, ) +cc_static_library( + name = "v8_147_4_0_aarch64_pc_windows_gnullvm_bazel", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + cc_static_library( name = "v8_147_4_0_aarch64_unknown_linux_musl_release_base", deps = [ @@ -393,6 +399,12 @@ cc_static_library( features = V8_STATIC_LIBRARY_FEATURES, ) +cc_static_library( + name = "v8_147_4_0_x86_64_pc_windows_gnullvm_bazel", + deps = [":v8_147_4_0_binding"], + features = V8_STATIC_LIBRARY_FEATURES, +) + cc_static_library( name = "v8_147_4_0_x86_64_unknown_linux_musl_release", deps = [ From ca7d8f9a7853dd1f8485a06978747b71b9eb8589 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Mon, 11 May 2026 03:54:06 +0000 Subject: [PATCH 16/19] v8: include CRDTP bindings in 147 Bazel builds Add the `crdtp_binding.cc` source and CRDTP headers to the 147 Bazel V8 binding target so Windows GNU builds provide the symbols required by the `v8::crdtp` Rust APIs. Add a regression test that exercises CRDTP JSON conversion and dispatchable message parsing. --- codex-rs/v8-poc/src/lib.rs | 11 +++++++++++ patches/v8_bazel_rules.patch | 22 +++++++++++++++++++++- third_party/v8/BUILD.bazel | 20 +++++++++++++++++++- third_party/v8/v8_crate.BUILD.bazel | 5 +++++ 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/codex-rs/v8-poc/src/lib.rs b/codex-rs/v8-poc/src/lib.rs index f43a9a12532c..5103cdeb39d5 100644 --- a/codex-rs/v8-poc/src/lib.rs +++ b/codex-rs/v8-poc/src/lib.rs @@ -78,4 +78,15 @@ mod tests { fn evaluates_string_concatenation() { assert_eq!(evaluate_expression("'hello ' + 'world'"), "hello world"); } + + #[test] + fn parses_crdtp_dispatchable_messages() { + let cbor = v8::crdtp::json_to_cbor(br#"{"id":7,"method":"Runtime.evaluate","params":{}}"#) + .expect("JSON should convert to CBOR"); + let dispatchable = v8::crdtp::Dispatchable::new(&cbor); + + assert!(dispatchable.ok()); + assert_eq!(dispatchable.call_id(), 7); + assert_eq!(dispatchable.method(), b"Runtime.evaluate"); + } } diff --git a/patches/v8_bazel_rules.patch b/patches/v8_bazel_rules.patch index 71265b32ae01..1c49d06b093c 100644 --- a/patches/v8_bazel_rules.patch +++ b/patches/v8_bazel_rules.patch @@ -218,7 +218,7 @@ index 421ebcd..52283ea 100644 ], ) -@@ -4465,6 +4474,15 @@ filegroup( +@@ -4465,6 +4474,35 @@ filegroup( ], ) @@ -230,6 +230,26 @@ index 421ebcd..52283ea 100644 + strip_include_prefix = "", + visibility = ["//visibility:public"], +) ++ ++cc_library( ++ name = "rusty_v8_crdtp_headers", ++ hdrs = [ ++ "third_party/inspector_protocol/crdtp/cbor.h", ++ "third_party/inspector_protocol/crdtp/dispatch.h", ++ "third_party/inspector_protocol/crdtp/error_support.h", ++ "third_party/inspector_protocol/crdtp/export.h", ++ "third_party/inspector_protocol/crdtp/find_by_first.h", ++ "third_party/inspector_protocol/crdtp/frontend_channel.h", ++ "third_party/inspector_protocol/crdtp/json.h", ++ "third_party/inspector_protocol/crdtp/parser_handler.h", ++ "third_party/inspector_protocol/crdtp/protocol_core.h", ++ "third_party/inspector_protocol/crdtp/serializable.h", ++ "third_party/inspector_protocol/crdtp/span.h", ++ "third_party/inspector_protocol/crdtp/status.h", ++ ], ++ strip_include_prefix = "", ++ visibility = ["//visibility:public"], ++) + filegroup( name = "d8_files", diff --git a/third_party/v8/BUILD.bazel b/third_party/v8/BUILD.bazel index df8e06328cd8..459d935854fc 100644 --- a/third_party/v8/BUILD.bazel +++ b/third_party/v8/BUILD.bazel @@ -220,6 +220,20 @@ genrule( ]), ) +genrule( + name = "crdtp_binding_cc_147_4_0", + srcs = ["@v8_crate_147_4_0//:crdtp_binding_cc"], + outs = ["crdtp_binding_147_4_0.cc"], + cmd = " ".join([ + "sed", + "-e 's|#include \"support.h\"|#include \"support_147_4_0.h\"|'", + "-e 's|\"v8/third_party/inspector_protocol/|\"third_party/inspector_protocol/|g'", + "$(location @v8_crate_147_4_0//:crdtp_binding_cc)", + ">", + '"$@"', + ]), +) + copy_file( name = "support_h_147_4_0", src = "@v8_crate_147_4_0//:support_h", @@ -228,11 +242,15 @@ copy_file( cc_library( name = "v8_147_4_0_binding", - srcs = [":binding_cc_147_4_0"], + srcs = [ + ":binding_cc_147_4_0", + ":crdtp_binding_cc_147_4_0", + ], hdrs = [":support_h_147_4_0"], copts = V8_COPTS + V8_CUSTOM_LIBCXX_COPTS, deps = [ "@v8//:core_lib_icu", + "@v8//:rusty_v8_crdtp_headers", "@v8//:rusty_v8_internal_headers", ] + select({ ":use_rusty_v8_custom_libcxx": [ diff --git a/third_party/v8/v8_crate.BUILD.bazel b/third_party/v8/v8_crate.BUILD.bazel index f9b2a1998cac..3988bc03455a 100644 --- a/third_party/v8/v8_crate.BUILD.bazel +++ b/third_party/v8/v8_crate.BUILD.bazel @@ -5,6 +5,11 @@ filegroup( srcs = ["src/binding.cc"], ) +filegroup( + name = "crdtp_binding_cc", + srcs = ["src/crdtp_binding.cc"], +) + filegroup( name = "support_h", srcs = ["src/support.h"], From f0da0c62bc2fac88ee5d2c5fc959523011627f18 Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Mon, 11 May 2026 04:01:29 +0000 Subject: [PATCH 17/19] fix(v8): verify musl artifacts with release checksums Fetch the published per-target checksum asset alongside the musl archive and binding so Cargo musl jobs keep working without re-expanding the MODULE.bazel checksum manifest contract. --- .github/actions/setup-rusty-v8-musl/action.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/actions/setup-rusty-v8-musl/action.yml b/.github/actions/setup-rusty-v8-musl/action.yml index 871c73a26810..fbec1feb4636 100644 --- a/.github/actions/setup-rusty-v8-musl/action.yml +++ b/.github/actions/setup-rusty-v8-musl/action.yml @@ -31,16 +31,14 @@ runs: archive_path="${binding_dir}/librusty_v8_release_${TARGET}.a.gz" binding_path="${binding_dir}/src_binding_release_${TARGET}.rs" checksums_path="${binding_dir}/rusty_v8_release_${TARGET}.sha256" - checksums_source="${GITHUB_WORKSPACE}/third_party/v8/rusty_v8_${version//./_}.sha256" mkdir -p "${binding_dir}" curl -fsSL "${base_url}/librusty_v8_release_${TARGET}.a.gz" -o "${archive_path}" curl -fsSL "${base_url}/src_binding_release_${TARGET}.rs" -o "${binding_path}" - grep -E " (librusty_v8_release_${TARGET}[.]a[.]gz|src_binding_release_${TARGET}[.]rs)$" \ - "${checksums_source}" > "${checksums_path}" + curl -fsSL "${base_url}/rusty_v8_release_${TARGET}.sha256" -o "${checksums_path}" if [[ "$(wc -l < "${checksums_path}")" -ne 2 ]]; then - echo "Expected exactly two checksums for ${TARGET} in ${checksums_source}" >&2 + echo "Expected exactly two checksums for ${TARGET} in ${checksums_path}" >&2 exit 1 fi From 41daf100284c91a6e6df3697017a4ac8835d50cc Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Mon, 11 May 2026 22:48:33 +0000 Subject: [PATCH 18/19] docs(v8): document release update workflow --- third_party/v8/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/third_party/v8/README.md b/third_party/v8/README.md index ff9867414091..336d03c74b8e 100644 --- a/third_party/v8/README.md +++ b/third_party/v8/README.md @@ -23,6 +23,18 @@ Current pinned versions: - Rust crate: `v8 = =147.4.0` - Embedded upstream V8 source for Bazel-produced release builds: `14.7.173.20` +## Updating to a new `v8` release + +Use this as the maintainer flow for a version bump: + +1. Bump the `v8` crate version and refresh `codex-rs/Cargo.lock`. +2. Update the Bazel versioned inputs in `MODULE.bazel`, then refresh the + matching checksum manifest and generated checksums as described below. +3. Publish a release-candidate PR and validate that `v8-canary` passes. +4. If the canary is green, publish the release tag and release build. +5. Once the release build completes, rerun the build on the candidate branch + and verify that the final artifact builds and tests pass. + When changing the remaining prebuilt `rusty_v8` `http_file` inputs, keep the checked-in checksum manifest and `MODULE.bazel` in sync: From b489b060b9d1177537f1f8eb02990b1909de176d Mon Sep 17 00:00:00 2001 From: Channing Conger Date: Tue, 12 May 2026 03:48:20 +0000 Subject: [PATCH 19/19] docs(skill): add v8 update workflow --- .codex/skills/update-v8-version/SKILL.md | 72 +++++++++++++++++++ .../update-v8-version/agents/openai.yaml | 4 ++ 2 files changed, 76 insertions(+) create mode 100644 .codex/skills/update-v8-version/SKILL.md create mode 100644 .codex/skills/update-v8-version/agents/openai.yaml diff --git a/.codex/skills/update-v8-version/SKILL.md b/.codex/skills/update-v8-version/SKILL.md new file mode 100644 index 000000000000..512cc0d5a787 --- /dev/null +++ b/.codex/skills/update-v8-version/SKILL.md @@ -0,0 +1,72 @@ +--- +name: update-v8-version +description: Update Codex's pinned `v8` / `rusty_v8` versions, validate the release-candidate path, and investigate failed V8 canary or artifact builds. Use when asked to bump V8, update `rusty_v8` artifacts, prepare or validate a V8 release candidate, check `v8-canary`, or diagnose why a V8 version update no longer builds. +--- + +# Update V8 Version + +## Core Workflow + +1. Read `third_party/v8/README.md` and follow its version-bump sequence. Treat + that document as the release-process source of truth. +2. Inspect and update the concrete repo surfaces that carry the pin: + - `codex-rs/Cargo.toml` + - `codex-rs/Cargo.lock` + - `MODULE.bazel` + - `third_party/v8/BUILD.bazel` + - `third_party/v8/README.md` + - the matching `third_party/v8/rusty_v8_.sha256` manifest when the + remaining prebuilt inputs change +3. Keep the existing checksum helpers in the loop: + + ```bash + python3 .github/scripts/rusty_v8_bazel.py update-module-bazel + python3 .github/scripts/rusty_v8_bazel.py check-module-bazel + python3 -m unittest discover -s .github/scripts -p test_rusty_v8_bazel.py + ``` + +4. Validate the release-candidate path before broadening the work: + - Prefer checking the `v8-canary` CI result for the candidate branch or PR + when one exists, using GitHub check tooling or `gh` as appropriate. + - If CI is unavailable or the user asked for a local-only check, run the + closest local validation that is practical for the changed surface and say + explicitly that it is a local substitute, not the full hosted canary. +5. If the canary path passes, stop there. Summarize the result and encourage the + user to commit the candidate changes or proceed with the release flow they + requested. Do not publish tags, releases, or pushes unless the user asked. + +## Failure Path + +Enter this path only when the canary or local build path fails. + +1. Capture the failing target, workflow job, and first actionable error. +2. Compare the currently pinned version with the target version at the relevant + upstream tag or SHA. Inspect both: + - `denoland/rusty_v8` + - upstream V8 source at the target Bazel-pinned version +3. Track build-relevant deltas rather than broad source churn: + - generated binding layout changes + - archive or asset naming changes + - GN/Bazel target changes + - custom libc++ / libc++abi / llvm-libc inputs + - sandbox or pointer-compression feature relationships + - patch hunks in `patches/` that no longer apply or no longer match upstream +4. Trace each failing delta back into Codex's build graph: + - `MODULE.bazel` + - `third_party/v8/BUILD.bazel` + - `.github/scripts/rusty_v8_bazel.py` + - `.github/workflows/v8-canary.yml` + - `.github/workflows/rusty-v8-release.yml` +5. Update only the pieces required to restore the target version's build and + artifact contract. Keep patch explanations and doc changes close to the + affected files. +6. Re-run the focused validation. If it becomes green, return to the normal + workflow and stop with a concise summary plus the remaining release step. + +## Reporting + +- Say whether validation came from hosted `v8-canary` or from a local + substitute. +- Distinguish "version bump complete" from "release published". +- When blocked, report the upstream delta that matters, the Codex file it hits, + and the next concrete fix to try. diff --git a/.codex/skills/update-v8-version/agents/openai.yaml b/.codex/skills/update-v8-version/agents/openai.yaml new file mode 100644 index 000000000000..36e7af80d8d8 --- /dev/null +++ b/.codex/skills/update-v8-version/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Update V8 Version" + short_description: "Guide V8 bumps and release validation" + default_prompt: "Use $update-v8-version to update Codex to a new v8 release and validate the release-candidate path."