diff --git a/MODULE.bazel b/MODULE.bazel index f4f48d7e..cb3db7fb 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -94,11 +94,12 @@ register_toolchains("@go_toolchains//:all") # WASI WIT interface definitions wasi_wit_ext = use_extension("//wasm:extensions.bzl", "wasi_wit") -wasi_wit_ext.init() +wasi_wit_ext.init(include_p3 = True) use_repo( wasi_wit_ext, # WASI 0.2.3 (default) "wasi_cli", + "wasi_p3", "wasi_clocks", "wasi_filesystem", "wasi_http", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 9b973b1d..50f92fd8 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -284,7 +284,7 @@ }, "//wasm:extensions.bzl%binaryen": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "c5GClIZ+xfHSKFn9WL/02Ag7wuihInOMqTGH5CxR/U8=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -308,7 +308,7 @@ }, "//wasm:extensions.bzl%cpp_component": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "ZtIrdMAeTaET/8t3kmG14kQp8U4FKMqhGB1+JS825Do=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -333,7 +333,7 @@ }, "//wasm:extensions.bzl%jco": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "MRHYkIS73wv1wYllXhdZBYX6dRIp7VySTL4edmOH2/M=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -358,7 +358,7 @@ }, "//wasm:extensions.bzl%meld": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "Nc45Hq7pjpIzzA1UXlHsAEAgQHpg1jE3/IUlCJYcFgU=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -382,7 +382,7 @@ }, "//wasm:extensions.bzl%spar": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "HteVAnfZ8Jv2xAL/oX+kiaSB6HLWRIt9g2CRFKUEz9k=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -406,7 +406,7 @@ }, "//wasm:extensions.bzl%synth": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "XTIJ1SQ/Se7btOFYHYJX2DjviC7xWk2ugwNS0Q3Icho=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -430,7 +430,7 @@ }, "//wasm:extensions.bzl%tinygo": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "esnFdrH+qxI9awhZ/uW4dIkm843wWmTCzO4b1pdmifs=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -454,7 +454,7 @@ }, "//wasm:extensions.bzl%wasi_sdk": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "4CDKvALAslODuYVBSBBBKgDbmaqWRdwJJ4yfDrzWeYg=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -480,8 +480,8 @@ }, "//wasm:extensions.bzl%wasi_wit": { "general": { - "bzlTransitiveDigest": "UFfBprXhjOyZGqtzTTHy4xJvtnfZ5+TqD5dis4Qyw/0=", - "usagesDigest": "aprKQAVHUGZU3Qda4GY+rceEATrn/fard2WlVtmwyIU=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", + "usagesDigest": "U6eB5Q0aHsInAdQhE4dKR56iYo3JPt3BqU0oMH5hOfk=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -815,6 +815,17 @@ "strip_prefix": "wasi-nn-0.2.0-rc-2024-10-28", "build_file_content": "\nload(\"@rules_wasm_component//wit:defs.bzl\", \"wit_library\")\n\nwit_library(\n name = \"nn\",\n srcs = glob([\"wit/*.wit\"]),\n package_name = \"wasi:nn@0.2.0-rc-2024-10-28\",\n interfaces = [\"tensor\", \"graph\", \"inference\", \"errors\"],\n visibility = [\"//visibility:public\"],\n)\n" } + }, + "wasi_p3": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "urls": [ + "https://github.com/WebAssembly/WASI/archive/refs/tags/v0.3.0.tar.gz" + ], + "sha256": "619928e4754a14db106ae42318daa5c7e29b842ab884662d6d86d8d1ac9a76fd", + "strip_prefix": "WASI-0.3.0", + "build_file_content": "\nload(\"@rules_wasm_component//wit:defs.bzl\", \"wit_library\")\n\n# WASI CLI P3 — run is async, stdio uses stream\nwit_library(\n name = \"cli\",\n srcs = glob([\"proposals/cli/wit/*.wit\"]),\n package_name = \"wasi:cli@0.3.0\",\n deps = [\":clocks\", \":filesystem\", \":sockets\", \":random\"],\n visibility = [\"//visibility:public\"],\n)\n\n# WASI HTTP P3 — handle/send are async, bodies are stream\nwit_library(\n name = \"http\",\n srcs = glob([\"proposals/http/wit/*.wit\"]),\n package_name = \"wasi:http@0.3.0\",\n deps = [\":cli\", \":clocks\"],\n visibility = [\"//visibility:public\"],\n)\n\n# WASI Clocks P3 — wait-until/wait-for are async (replaces subscribe+pollable)\nwit_library(\n name = \"clocks\",\n srcs = glob([\"proposals/clocks/wit/*.wit\"]),\n package_name = \"wasi:clocks@0.3.0\",\n visibility = [\"//visibility:public\"],\n)\n\n# WASI Filesystem P3 — all ops async, read/write use stream+future\nwit_library(\n name = \"filesystem\",\n srcs = glob([\"proposals/filesystem/wit/*.wit\"]),\n package_name = \"wasi:filesystem@0.3.0\",\n deps = [\":clocks\"],\n visibility = [\"//visibility:public\"],\n)\n\n# WASI Sockets P3 — TCP connect/send/receive async with stream\nwit_library(\n name = \"sockets\",\n srcs = glob([\"proposals/sockets/wit/*.wit\"]),\n package_name = \"wasi:sockets@0.3.0\",\n deps = [\":clocks\"],\n visibility = [\"//visibility:public\"],\n)\n\n# WASI Random P3 — minimal changes from P2\nwit_library(\n name = \"random\",\n srcs = glob([\"proposals/random/wit/*.wit\"]),\n package_name = \"wasi:random@0.3.0\",\n visibility = [\"//visibility:public\"],\n)\n" + } } }, "recordedRepoMappingEntries": [ @@ -828,7 +839,7 @@ }, "//wasm:extensions.bzl%wasm_toolchain": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "Keg+j4249N8787+5NDDpsnW8S0P3hp9HSaC26H2SeJg=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -862,7 +873,7 @@ }, "//wasm:extensions.bzl%wasmtime": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "W3m1ohl2c96vXpGAao2C6XIl3CGB+kZYZN2+bagGv0M=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -887,7 +898,7 @@ }, "//wasm:extensions.bzl%witness": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "vz4JVaRGcdcwU0XOHYN0kb54nuI69CDjEu/MXFK6r/g=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -911,7 +922,7 @@ }, "//wasm:extensions.bzl%wkg": { "general": { - "bzlTransitiveDigest": "ZUOnFoKoiyj/ZGS4bF11GxWRosVDPsXBQ/5i1O8V4j0=", + "bzlTransitiveDigest": "rHvHyqfz3j6JIu4iS6SbROZYG3QnnTJ5BUbCHJ7Frp0=", "usagesDigest": "ks+Q/IL0nntNP6PabzUcF0ruF4X9hTKhbmck/ueoPTg=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, diff --git a/test/p3/BUILD.bazel b/test/p3/BUILD.bazel index e81ad3f3..a47b62ff 100644 --- a/test/p3/BUILD.bazel +++ b/test/p3/BUILD.bazel @@ -55,6 +55,25 @@ build_test( targets = [":hello_p3"], ) +# ============================================================================ +# WASI 0.3 interface WIT (stable v0.3.0) — covers wasi_p3_deps.bzl +# ============================================================================ + +# Builds the per-proposal WASI 0.3.0 wit_library targets so the stable-tag +# retarget (proposals//wit/) stays green. Requires the wasi_wit +# extension with include_p3 = True (set in MODULE.bazel). +build_test( + name = "wasi_p3_wit_build_test", + targets = [ + "@wasi_p3//:cli", + "@wasi_p3//:clocks", + "@wasi_p3//:filesystem", + "@wasi_p3//:http", + "@wasi_p3//:random", + "@wasi_p3//:sockets", + ], +) + # ============================================================================ # Test suites # ============================================================================ @@ -66,7 +85,10 @@ test_suite( test_suite( name = "p3", - tests = [":p3_build_test"], + tests = [ + ":p3_build_test", + ":wasi_p3_wit_build_test", + ], ) test_suite( @@ -74,5 +96,6 @@ test_suite( tests = [ ":p2_build_test", ":p3_build_test", + ":wasi_p3_wit_build_test", ], ) diff --git a/wit/private/wasi_p3_deps.bzl b/wit/private/wasi_p3_deps.bzl index dd15f3c1..88380aa0 100644 --- a/wit/private/wasi_p3_deps.bzl +++ b/wit/private/wasi_p3_deps.bzl @@ -1,6 +1,6 @@ -"""WASI P3 (Preview 3) WIT interface dependencies — experimental +"""WASI P3 (Preview 3) WIT interface dependencies -Provides WASI 0.3.0-rc WIT definitions for async WebAssembly components. +Provides WASI 0.3.0 WIT definitions for async WebAssembly components. Key P3 changes from P2: - async func keyword in WIT @@ -8,17 +8,16 @@ Key P3 changes from P2: - wasi:io eliminated (streams/poll absorbed into Component Model) - All core interfaces redesigned around async primitives -Source: WebAssembly/WASI monorepo tag v0.3.0-rc-2026-03-15 -WIT files live in proposals//wit-0.3.0-draft/ directories. - -NOTE: This is experimental. The P3 spec is in RC phase, not finalized. +Source: WebAssembly/WASI monorepo tag v0.3.0 (ratified 2026-06-11). +WIT files live in proposals//wit/ directories (the RC used +wit-0.3.0-draft/; the stable tag renamed it to wit/). """ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -# The RC snapshot we track — update this when new RCs ship -WASI_P3_RC = "0.3.0-rc-2026-03-15" -WASI_P3_TAG = "v" + WASI_P3_RC +# The ratified WASI 0.3.0 release. +WASI_P3_VERSION = "0.3.0" +WASI_P3_TAG = "v" + WASI_P3_VERSION # Build file content for the monorepo — exposes per-proposal wit_library targets _WASI_P3_BUILD_FILE = """ @@ -27,7 +26,7 @@ load("@rules_wasm_component//wit:defs.bzl", "wit_library") # WASI CLI P3 — run is async, stdio uses stream wit_library( name = "cli", - srcs = glob(["proposals/cli/wit-0.3.0-draft/*.wit"]), + srcs = glob(["proposals/cli/wit/*.wit"]), package_name = "wasi:cli@0.3.0", deps = [":clocks", ":filesystem", ":sockets", ":random"], visibility = ["//visibility:public"], @@ -36,7 +35,7 @@ wit_library( # WASI HTTP P3 — handle/send are async, bodies are stream wit_library( name = "http", - srcs = glob(["proposals/http/wit-0.3.0-draft/*.wit"]), + srcs = glob(["proposals/http/wit/*.wit"]), package_name = "wasi:http@0.3.0", deps = [":cli", ":clocks"], visibility = ["//visibility:public"], @@ -45,7 +44,7 @@ wit_library( # WASI Clocks P3 — wait-until/wait-for are async (replaces subscribe+pollable) wit_library( name = "clocks", - srcs = glob(["proposals/clocks/wit-0.3.0-draft/*.wit"]), + srcs = glob(["proposals/clocks/wit/*.wit"]), package_name = "wasi:clocks@0.3.0", visibility = ["//visibility:public"], ) @@ -53,7 +52,7 @@ wit_library( # WASI Filesystem P3 — all ops async, read/write use stream+future wit_library( name = "filesystem", - srcs = glob(["proposals/filesystem/wit-0.3.0-draft/*.wit"]), + srcs = glob(["proposals/filesystem/wit/*.wit"]), package_name = "wasi:filesystem@0.3.0", deps = [":clocks"], visibility = ["//visibility:public"], @@ -62,7 +61,7 @@ wit_library( # WASI Sockets P3 — TCP connect/send/receive async with stream wit_library( name = "sockets", - srcs = glob(["proposals/sockets/wit-0.3.0-draft/*.wit"]), + srcs = glob(["proposals/sockets/wit/*.wit"]), package_name = "wasi:sockets@0.3.0", deps = [":clocks"], visibility = ["//visibility:public"], @@ -71,7 +70,7 @@ wit_library( # WASI Random P3 — minimal changes from P2 wit_library( name = "random", - srcs = glob(["proposals/random/wit-0.3.0-draft/*.wit"]), + srcs = glob(["proposals/random/wit/*.wit"]), package_name = "wasi:random@0.3.0", visibility = ["//visibility:public"], ) @@ -80,7 +79,7 @@ wit_library( def wasi_wit_p3_dependencies(): """Load WASI P3 WIT interface definitions from the WASI monorepo. - Downloads the entire WASI monorepo at the P3 RC tag and exposes + Downloads the entire WASI monorepo at the stable v0.3.0 tag and exposes per-proposal wit_library targets: - @wasi_p3//:cli - @wasi_p3//:http @@ -96,7 +95,7 @@ def wasi_wit_p3_dependencies(): http_archive( name = "wasi_p3", urls = ["https://github.com/WebAssembly/WASI/archive/refs/tags/{}.tar.gz".format(WASI_P3_TAG)], - sha256 = "29db1f783ae7624d1c453cebcd1e53eabd16723fc57c56556778fc11c0a9471d", - strip_prefix = "WASI-{}".format(WASI_P3_RC), + sha256 = "619928e4754a14db106ae42318daa5c7e29b842ab884662d6d86d8d1ac9a76fd", + strip_prefix = "WASI-{}".format(WASI_P3_VERSION), build_file_content = _WASI_P3_BUILD_FILE, )