From 5d1fe38a094c9c8b8092edae665630b73dd5967d Mon Sep 17 00:00:00 2001 From: Martin Nygren Date: Fri, 16 Oct 2026 23:27:11 +0100 Subject: [PATCH 1/2] Bump emsdk to 6.0.12. Emscripten 6.0 removes PThread.runningWorkers and no longer sets a per-worker `loaded` flag, which dtest's Node clean-exit hook reads. Both reads are guarded, so the hook degrades to a bounded retry before terminateAllThreads; the existing high-thread-count system test stays clean (and the race did not reproduce locally on 5.0.7 or 6.0.12 even with the wait disabled), so only its comment changes here. The generated isFileURI line is unchanged, so patch_web_wasm.py only needs its version note bumped. The pre-built cache still has no LTO system libraries, so the no-link-time-LTO note stands. Co-Authored-By: Claude Opus 5.5 --- MODULE.bazel | 12 +++++------ MODULE.bazel.lock | 45 +++++++++++++++++++++------------------- docs/wasm_build.md | 4 ++-- library/tests/dtest.cpp | 4 +++- specs/wasm-emscripten.md | 4 ++-- web/patch_web_wasm.py | 4 ++-- 6 files changed, 39 insertions(+), 34 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index f1a0f2cd6..109d909d6 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -39,7 +39,7 @@ bazel_dep(name = "apple_support", version = "2.10.1") # WASM builds (//wasm:*, //web:dds_web_wasm). If you bump this version, # rebuild and run web/update_wasm.sh; see docs/wasm_build.md and patch_web_wasm.py. -bazel_dep(name = "emsdk", version = "5.0.7") +bazel_dep(name = "emsdk", version = "6.0.12") # Java bindings (//jni:*). Provides the hermetic remote JDK used to build and run # the FFM (java.lang.foreign) smoke test. rules_java 9.9.0 registers remotejdk_21 # and remotejdk_25; we pin JDK 25 (>= 22, so the Foreign Function & Memory API is @@ -51,14 +51,14 @@ bazel_dep(name = "rules_java", version = "9.9.0") bazel_dep(name = "rules_jvm_external", version = "7.1") # Prefer GitHub, fall back to codeload CDN on transient timeouts (see CI flakes). -# Integrity and strip_prefix match BCR emsdk 5.0.7 source.json. +# Integrity and strip_prefix match BCR emsdk 6.0.12 source.json. archive_override( module_name = "emsdk", - integrity = "sha256-Jm30uWRN3hgwOvBdzn0EhUJzsLtSckbLf7aglZF3TM8=", - strip_prefix = "emsdk-5.0.7/bazel", + integrity = "sha256-TdOYQqDiy+O4KYeVdfuz+nArIkpf1LiYxHaMADVCJPk=", + strip_prefix = "emsdk-6.0.12/bazel", urls = [ - "https://github.com/emscripten-core/emsdk/archive/refs/tags/5.0.7.tar.gz", - "https://codeload.github.com/emscripten-core/emsdk/tar.gz/refs/tags/5.0.7", + "https://github.com/emscripten-core/emsdk/archive/refs/tags/6.0.12.tar.gz", + "https://codeload.github.com/emscripten-core/emsdk/tar.gz/refs/tags/6.0.12", ], ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 2ac32500a..6deee3781 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -296,15 +296,18 @@ "moduleExtensions": { "@@emsdk+//:emscripten_cache.bzl%emscripten_cache": { "general": { - "bzlTransitiveDigest": "uqDvXmpTNqW4+ie/Fk+xC3TrFrKvL+9hNtoP51Kt2oo=", - "usagesDigest": "pWzD9zlSoLlTg9KHHx+GNAE4f/zuf6Hiv5i/aMApD/U=", + "bzlTransitiveDigest": "3DgiP8fPZPy6qdtRGjf4cPNZFohfnP8gP3DSqOJ/bTQ=", + "usagesDigest": "j0qhTD5sk+iB1IrfY4adqZMEU79AbIp+5ZBSsKlRbas=", "recordedInputs": [], "generatedRepoSpecs": { "emscripten_cache": { "repoRuleId": "@@emsdk+//:emscripten_cache.bzl%_emscripten_cache_repository", "attributes": { "configuration": [], - "targets": [] + "targets": [], + "prebuilt_cache_url": "", + "prebuilt_cache_sha256": "", + "prebuilt_cache_strip_prefix": "" } } } @@ -312,8 +315,8 @@ }, "@@emsdk+//:emscripten_deps.bzl%emscripten_deps": { "general": { - "bzlTransitiveDigest": "EJqXFpA5GJ8rvygFWFdlw8H9g/+nTCLJKMvuE73WaXU=", - "usagesDigest": "wvQRffIp8pEJeKXankBKEQBAOCI8HTtmw9TvnW7/e1c=", + "bzlTransitiveDigest": "W3qo734P/T6JS0ckkD5z9s0NxMKjqjFivtNQNDg/Pzk=", + "usagesDigest": "ylRE9xa02aOPgtPFSFWXvW46yPVlgjW9ShIVIqKd84M=", "recordedInputs": [ "REPO_MAPPING:bazel_features+,bazel_features_globals bazel_features++version_extension+bazel_features_globals", "REPO_MAPPING:bazel_features+,bazel_features_version bazel_features++version_extension+bazel_features_version", @@ -333,51 +336,51 @@ "emscripten_bin_linux": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang\",\n \"bin/clang++\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang\",\n \"bin/llvm-ar\",\n \"bin/llvm-dwarfdump\",\n \"bin/llvm-nm\",\n \"bin/llvm-objcopy\",\n \"bin/wasm-ctor-eval\",\n \"bin/wasm-emscripten-finalize\",\n \"bin/wasm-ld\",\n \"bin/wasm-metadce\",\n \"bin/wasm-opt\",\n \"bin/wasm-split\",\n \"bin/wasm2js\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", - "sha256": "f96cc4df9263e386d70ad37c731959886cb2a7e983b7a68bdc9ccf32402be1bd", + "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"builtin_cache\",\n srcs = glob([\n \"emscripten/cache/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/em++.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang\",\n \"bin/clang++\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang\",\n \"bin/llvm-ar\",\n \"bin/llvm-dwarfdump\",\n \"bin/llvm-nm\",\n \"bin/llvm-objcopy\",\n \"bin/wasm-ctor-eval\",\n \"bin/wasm-emscripten-finalize\",\n \"bin/wasm-ld\",\n \"bin/wasm-metadce\",\n \"bin/wasm-opt\",\n \"bin/wasm-split\",\n \"bin/wasm2js\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", + "sha256": "7b073a102b07eca5a0fe344037681e53162639f3540432456874c0446a5e8fa7", "strip_prefix": "install", "type": "tar.xz", - "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/linux/6cd98e86d7749ff98b82b7f2ae78eb4f01942788/wasm-binaries.tar.xz" + "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/linux/6e9f6885cb17a3d6c8fd488a5cff730f50aba61d/wasm-binaries.tar.xz" } }, "emscripten_bin_linux_arm64": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang\",\n \"bin/clang++\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang\",\n \"bin/llvm-ar\",\n \"bin/llvm-dwarfdump\",\n \"bin/llvm-nm\",\n \"bin/llvm-objcopy\",\n \"bin/wasm-ctor-eval\",\n \"bin/wasm-emscripten-finalize\",\n \"bin/wasm-ld\",\n \"bin/wasm-metadce\",\n \"bin/wasm-opt\",\n \"bin/wasm-split\",\n \"bin/wasm2js\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", - "sha256": "3cd706f3c97bc9e2abc9898c66ed15988243d189194623a4fb02ec207dc48693", + "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"builtin_cache\",\n srcs = glob([\n \"emscripten/cache/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/em++.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang\",\n \"bin/clang++\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang\",\n \"bin/llvm-ar\",\n \"bin/llvm-dwarfdump\",\n \"bin/llvm-nm\",\n \"bin/llvm-objcopy\",\n \"bin/wasm-ctor-eval\",\n \"bin/wasm-emscripten-finalize\",\n \"bin/wasm-ld\",\n \"bin/wasm-metadce\",\n \"bin/wasm-opt\",\n \"bin/wasm-split\",\n \"bin/wasm2js\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", + "sha256": "207b288eef73de3aeb3e5e492b76e3e395d049eee9f6c96bfc4396ba275a9bac", "strip_prefix": "install", "type": "tar.xz", - "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/linux/6cd98e86d7749ff98b82b7f2ae78eb4f01942788/wasm-binaries-arm64.tar.xz" + "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/linux/6e9f6885cb17a3d6c8fd488a5cff730f50aba61d/wasm-binaries-arm64.tar.xz" } }, "emscripten_bin_mac": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang\",\n \"bin/clang++\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang\",\n \"bin/llvm-ar\",\n \"bin/llvm-dwarfdump\",\n \"bin/llvm-nm\",\n \"bin/llvm-objcopy\",\n \"bin/wasm-ctor-eval\",\n \"bin/wasm-emscripten-finalize\",\n \"bin/wasm-ld\",\n \"bin/wasm-metadce\",\n \"bin/wasm-opt\",\n \"bin/wasm-split\",\n \"bin/wasm2js\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", - "sha256": "0ccd510ae3e1014ffc565de482982507d1c2d3d6dc6f5bf243e857c73bd5d352", + "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"builtin_cache\",\n srcs = glob([\n \"emscripten/cache/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/em++.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang\",\n \"bin/clang++\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang\",\n \"bin/llvm-ar\",\n \"bin/llvm-dwarfdump\",\n \"bin/llvm-nm\",\n \"bin/llvm-objcopy\",\n \"bin/wasm-ctor-eval\",\n \"bin/wasm-emscripten-finalize\",\n \"bin/wasm-ld\",\n \"bin/wasm-metadce\",\n \"bin/wasm-opt\",\n \"bin/wasm-split\",\n \"bin/wasm2js\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", + "sha256": "2a36ac0619ad5e065d8b520c62ca8228ddf18aaf9624d4e1959b06fc4b9ebfab", "strip_prefix": "install", "type": "tar.xz", - "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/mac/6cd98e86d7749ff98b82b7f2ae78eb4f01942788/wasm-binaries.tar.xz" + "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/mac/6e9f6885cb17a3d6c8fd488a5cff730f50aba61d/wasm-binaries.tar.xz" } }, "emscripten_bin_mac_arm64": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang\",\n \"bin/clang++\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang\",\n \"bin/llvm-ar\",\n \"bin/llvm-dwarfdump\",\n \"bin/llvm-nm\",\n \"bin/llvm-objcopy\",\n \"bin/wasm-ctor-eval\",\n \"bin/wasm-emscripten-finalize\",\n \"bin/wasm-ld\",\n \"bin/wasm-metadce\",\n \"bin/wasm-opt\",\n \"bin/wasm-split\",\n \"bin/wasm2js\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", - "sha256": "37554ed4c36abb1c802aa280f2c1ef9702e19e832a66c2fe6d940b65a2049b2c", + "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"builtin_cache\",\n srcs = glob([\n \"emscripten/cache/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/em++.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang\",\n \"bin/clang++\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang\",\n \"bin/llvm-ar\",\n \"bin/llvm-dwarfdump\",\n \"bin/llvm-nm\",\n \"bin/llvm-objcopy\",\n \"bin/wasm-ctor-eval\",\n \"bin/wasm-emscripten-finalize\",\n \"bin/wasm-ld\",\n \"bin/wasm-metadce\",\n \"bin/wasm-opt\",\n \"bin/wasm-split\",\n \"bin/wasm2js\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", + "sha256": "8e91c0eca2b8728aa2babb32b805318eaf5e8d6652c6535163d0ea467a6d907c", "strip_prefix": "install", "type": "tar.xz", - "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/mac/6cd98e86d7749ff98b82b7f2ae78eb4f01942788/wasm-binaries-arm64.tar.xz" + "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/mac/6e9f6885cb17a3d6c8fd488a5cff730f50aba61d/wasm-binaries-arm64.tar.xz" } }, "emscripten_bin_win": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang.exe\",\n \"bin/clang++.exe\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang.exe\",\n \"bin/llvm-ar.exe\",\n \"bin/llvm-dwarfdump.exe\",\n \"bin/llvm-nm.exe\",\n \"bin/llvm-objcopy.exe\",\n \"bin/wasm-ctor-eval.exe\",\n \"bin/wasm-emscripten-finalize.exe\",\n \"bin/wasm-ld.exe\",\n \"bin/wasm-metadce.exe\",\n \"bin/wasm-opt.exe\",\n \"bin/wasm-split.exe\",\n \"bin/wasm2js.exe\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar.exe\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", - "sha256": "32995a98db21951cb7e84b4898b235ba57553c9f35eeaa158cfff052fab83856", + "build_file_content": "\npackage(default_visibility = ['//visibility:public'])\n\nfilegroup(\n name = \"all\",\n srcs = glob([\"**\"]),\n)\n\nfilegroup(\n name = \"includes\",\n srcs = glob([\n \"emscripten/cache/sysroot/include/c++/v1/**\",\n \"emscripten/cache/sysroot/include/compat/**\",\n \"emscripten/cache/sysroot/include/**\",\n \"lib/clang/**/include/**\",\n ]),\n)\n\nfilegroup(\n name = \"builtin_cache\",\n srcs = glob([\n \"emscripten/cache/**\",\n ]),\n)\n\nfilegroup(\n name = \"emcc_common\",\n srcs = [\n \"emscripten/emcc.py\",\n \"emscripten/em++.py\",\n \"emscripten/embuilder.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/cache/sysroot_install.stamp\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/third_party/**\",\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"compiler_files\",\n srcs = [\n \"bin/clang.exe\",\n \"bin/clang++.exe\",\n \":emcc_common\",\n \":includes\",\n ],\n)\n\nfilegroup(\n name = \"linker_files\",\n srcs = [\n \"bin/clang.exe\",\n \"bin/llvm-ar.exe\",\n \"bin/llvm-dwarfdump.exe\",\n \"bin/llvm-nm.exe\",\n \"bin/llvm-objcopy.exe\",\n \"bin/wasm-ctor-eval.exe\",\n \"bin/wasm-emscripten-finalize.exe\",\n \"bin/wasm-ld.exe\",\n \"bin/wasm-metadce.exe\",\n \"bin/wasm-opt.exe\",\n \"bin/wasm-split.exe\",\n \"bin/wasm2js.exe\",\n \":emcc_common\",\n ] + glob(\n include = [\n \"emscripten/cache/sysroot/lib/**\",\n \"emscripten/node_modules/**\",\n \"emscripten/src/**\",\n ],\n ),\n)\n\nfilegroup(\n name = \"ar_files\",\n srcs = [\n \"bin/llvm-ar.exe\",\n \"emscripten/emar.py\",\n \"emscripten/emscripten-version.txt\",\n \"emscripten/src/settings.js\",\n \"emscripten/src/settings_internal.js\",\n ] + glob(\n include = [\n \"emscripten/tools/**\",\n ],\n exclude = [\n \"**/__pycache__/**\",\n ],\n ),\n)\n", + "sha256": "51ac2e51a2c6eeba09fa04418496750662b5c1f022665814b0ee8f557c8328c9", "strip_prefix": "install", "type": "zip", - "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/win/6cd98e86d7749ff98b82b7f2ae78eb4f01942788/wasm-binaries.zip" + "url": "https://storage.googleapis.com/webassembly/emscripten-releases-builds/win/6e9f6885cb17a3d6c8fd488a5cff730f50aba61d/wasm-binaries.zip" } } } @@ -435,7 +438,7 @@ "@@rules_nodejs+//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "4pUxCNc22K4I+6+4Nxu52Hur12tFRfa1JMsN5mdDv60=", - "usagesDigest": "vZ6azLX/KFnBVNfNqvqrt+aTI+qpRIspF5DmoxPiuUs=", + "usagesDigest": "2M7mMWUyvVHuprBgqKwNd7hq64IT77Mutbf9CGEsSqw=", "recordedInputs": [], "generatedRepoSpecs": { "nodejs_linux_amd64": { diff --git a/docs/wasm_build.md b/docs/wasm_build.md index 2dc7c11b3..39b63cdb8 100644 --- a/docs/wasm_build.md +++ b/docs/wasm_build.md @@ -17,7 +17,7 @@ The Emscripten SDK (emsdk) does NOT need to be manually installed. Bazel downloa WASM builds use the Bazel Central Registry package pinned in `MODULE.bazel`: -- `bazel_dep(name = "emsdk", version = "5.0.7")` (Emscripten 5.0.x toolchain) +- `bazel_dep(name = "emsdk", version = "6.0.12")` (Emscripten 6.0.x toolchain) If you upgrade `emsdk`, rebuild WASM targets and the DDS Web (`./web/update_wasm.sh`). The post-build script `web/patch_web_wasm.py` patches one generated `isFileURI` helper for browser/file URL safety; if Emscripten changes that line, update the regex in that script and this note. @@ -159,7 +159,7 @@ For other experiments, copy built `.js` / `.wasm` files from `bazel-bin/wasm/` t `-flto` is applied at compile time (`DDS_CPPOPTS`) but deliberately **not** at link time. Passing `-flto` to the wasm link step was tried and reverted: the -`emsdk 5.0.7` package pinned in `MODULE.bazel` ships a frozen, pre-built cache +`emsdk` package pinned in `MODULE.bazel` (checked again at 6.0.12) ships a frozen, pre-built cache containing only non-LTO system libraries, and requesting link-time LTO makes Emscripten require LTO-bitcode variants of core sysroot libraries (e.g. `libprintf_long_double`) that the frozen cache can't build on demand inside diff --git a/library/tests/dtest.cpp b/library/tests/dtest.cpp index cfc6ad518..e4b04a7b4 100644 --- a/library/tests/dtest.cpp +++ b/library/tests/dtest.cpp @@ -52,7 +52,9 @@ EM_JS(void, dtest_schedule_pthread_clean_exit, (int code), { // Join C++ workers, let pending Worker "loaded" messages flush, then tear down // Emscripten pthread Workers and exit Node. Avoids ASSERTIONS noise of the form // `received "loaded" command from terminated worker` when -n exceeds the -// precreated PTHREAD_POOL_SIZE. +// precreated PTHREAD_POOL_SIZE. Emscripten 6 no longer exposes +// PThread.runningWorkers or a per-worker `loaded` flag, so there the wait is a +// bounded retry (up to 100 event-loop turns) rather than a readiness check. [[noreturn]] static void dtest_emscripten_clean_exit(const int code) { dds::internal::shutdown_parallel_boards_pool(); diff --git a/specs/wasm-emscripten.md b/specs/wasm-emscripten.md index 74ecb8ea4..667246a82 100644 --- a/specs/wasm-emscripten.md +++ b/specs/wasm-emscripten.md @@ -34,7 +34,7 @@ core solver builds and runs correctly under Emscripten. - **The toolchain is hermetic and transition-driven.** `wasm_cc_binary` applies an Emscripten **platform transition** to the underlying `cc_binary` — no `--config=wasm` or `.bazelrc` profile is needed. The emsdk toolchain is - downloaded/cached by Bazel (pinned in `MODULE.bazel`, currently `emsdk 5.0.7`). + downloaded/cached by Bazel (pinned in `MODULE.bazel`, currently `emsdk 6.0.12`). The transition is what makes the `//:build_wasm` config setting (`@platforms//cpu:wasm32`) active — see [build-system](build-system.md). - **WASM builds use pthreads.** Every `wasm_cc_binary` sets @@ -75,7 +75,7 @@ core solver builds and runs correctly under Emscripten. `dtest_wasm` is an additional harness port, not an example CLI. - **No link-time LTO.** `-flto` applies at WASM compile time only ([build-system](build-system.md)); enabling it at link time was tried and - reverted because the `emsdk 5.0.7` toolchain pinned in `MODULE.bazel` ships a + reverted because the `emsdk` toolchain pinned in `MODULE.bazel` (checked again at 6.0.12) ships a frozen, pre-built cache containing only non-LTO system libraries. Link-time LTO requires LTO-bitcode variants of core sysroot libraries (e.g. `libprintf_long_double`) that the frozen cache cannot build on demand inside diff --git a/web/patch_web_wasm.py b/web/patch_web_wasm.py index 4ba20e4e0..6ffb70c96 100755 --- a/web/patch_web_wasm.py +++ b/web/patch_web_wasm.py @@ -17,9 +17,9 @@ from pathlib import Path # Keep in sync with bazel_dep(name = "emsdk", version = "...") in MODULE.bazel. -EXPECTED_EMSDK_BAZEL_DEP_VERSION = "5.0.7" +EXPECTED_EMSDK_BAZEL_DEP_VERSION = "6.0.12" -# Emscripten 5.x (emsdk 5.0.7): var isFileURI = filename => filename.startsWith("file://"); +# Emscripten 5.x and 6.x (emsdk 6.0.12): var isFileURI = filename => filename.startsWith("file://"); # Older emsdk also emitted parentheses around the parameter. UNPATCHED_IS_FILE_URI = re.compile( r"var\s+isFileURI\s*=\s*(?:\(\s*)?(\w+)(?:\s*\))?\s*=>\s*" From 074d3f233cf9fa092f636dd1a3860587bdb454bb Mon Sep 17 00:00:00 2001 From: Martin Nygren Date: Sat, 17 Oct 2026 11:41:43 +0100 Subject: [PATCH 2/2] Declare wasmBinary in INCOMING_MODULE_JS_API for the web bundle. Emscripten 6.0.2 dropped wasmBinary from the default list of Module properties the generated JS reads. createDdsModule({wasmBinary}) then aborted in assertion builds (dds_web_wasm_system_test, and the e2e test waiting on the solver) and would silently ignore the embedded bytes in release builds. List exactly the property our two callers pass. Co-Authored-By: Claude Opus 5.5 --- web/BUILD.bazel | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/BUILD.bazel b/web/BUILD.bazel index d5cdbb016..e1cadc875 100644 --- a/web/BUILD.bazel +++ b/web/BUILD.bazel @@ -12,6 +12,10 @@ WASM_WEB_LINKOPTS = WASM_LINKOPTS + [ "-sEXPORTED_FUNCTIONS=['_dds_web_calc_table','_dds_web_solve_leads','_dds_web_solve_plays','_malloc','_free']", "-sEXPORTED_RUNTIME_METHODS=['ccall','getValue']", "-sENVIRONMENT=web,worker,node", + # The Module properties createDdsModule() is called with (dds_web_solve.js, + # tests/dds_web_wasm_node.mjs). Emscripten >= 6.0.2 dropped wasmBinary from + # the default list: debug builds abort and release builds ignore the bytes. + "-sINCOMING_MODULE_JS_API=['wasmBinary']", ] cc_binary(