extension: Update to wasm32-wasip2 target (#30953)
Cleans things up now that wasm32-wasip2 is a supported target. Before we merge, I will need to test against the current extensions to make sure this is fine. However, since our wit world isn't using any wasi package imports, this shouldn't be a breaking change. Release Notes: - N/A
This commit is contained in:
parent
d9a5dc2dfe
commit
5a0a8ce30a
7 changed files with 32 additions and 89 deletions
44
Cargo.lock
generated
44
Cargo.lock
generated
|
@ -5120,10 +5120,8 @@ dependencies = [
|
||||||
"task",
|
"task",
|
||||||
"toml 0.8.20",
|
"toml 0.8.20",
|
||||||
"util",
|
"util",
|
||||||
"wasi-preview1-component-adapter-provider",
|
|
||||||
"wasm-encoder 0.221.3",
|
"wasm-encoder 0.221.3",
|
||||||
"wasmparser 0.221.3",
|
"wasmparser 0.221.3",
|
||||||
"wit-component 0.221.3",
|
|
||||||
"workspace-hack",
|
"workspace-hack",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -17397,12 +17395,6 @@ dependencies = [
|
||||||
"wit-bindgen-rt 0.39.0",
|
"wit-bindgen-rt 0.39.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasi-preview1-component-adapter-provider"
|
|
||||||
version = "29.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dcd9f21bbde82ba59e415a8725e6ad0d0d7e9e460b1a3ccbca5bdee952c1a324"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasite"
|
name = "wasite"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -17525,22 +17517,6 @@ dependencies = [
|
||||||
"wasmparser 0.201.0",
|
"wasmparser 0.201.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-metadata"
|
|
||||||
version = "0.221.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "11f4ef50d17e103a88774cd4aa5d06bfb1ae44036a8f3f1325e0e9b3e3417ac4"
|
|
||||||
dependencies = [
|
|
||||||
"anyhow",
|
|
||||||
"indexmap",
|
|
||||||
"serde",
|
|
||||||
"serde_derive",
|
|
||||||
"serde_json",
|
|
||||||
"spdx",
|
|
||||||
"wasm-encoder 0.221.3",
|
|
||||||
"wasmparser 0.221.3",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-metadata"
|
name = "wasm-metadata"
|
||||||
version = "0.227.1"
|
version = "0.227.1"
|
||||||
|
@ -19037,25 +19013,6 @@ dependencies = [
|
||||||
"wit-parser 0.201.0",
|
"wit-parser 0.201.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wit-component"
|
|
||||||
version = "0.221.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "66c55ca8772d2b270e28066caed50ce4e53a28c3ac10e01efbd90e5be31e448b"
|
|
||||||
dependencies = [
|
|
||||||
"anyhow",
|
|
||||||
"bitflags 2.9.0",
|
|
||||||
"indexmap",
|
|
||||||
"log",
|
|
||||||
"serde",
|
|
||||||
"serde_derive",
|
|
||||||
"serde_json",
|
|
||||||
"wasm-encoder 0.221.3",
|
|
||||||
"wasm-metadata 0.221.3",
|
|
||||||
"wasmparser 0.221.3",
|
|
||||||
"wit-parser 0.221.3",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-component"
|
name = "wit-component"
|
||||||
version = "0.227.1"
|
version = "0.227.1"
|
||||||
|
@ -19362,7 +19319,6 @@ dependencies = [
|
||||||
"unicode-properties",
|
"unicode-properties",
|
||||||
"url",
|
"url",
|
||||||
"uuid",
|
"uuid",
|
||||||
"wasm-encoder 0.221.3",
|
|
||||||
"wasmparser 0.221.3",
|
"wasmparser 0.221.3",
|
||||||
"wasmtime",
|
"wasmtime",
|
||||||
"wasmtime-cranelift",
|
"wasmtime-cranelift",
|
||||||
|
|
|
@ -603,7 +603,6 @@ url = "2.2"
|
||||||
urlencoding = "2.1.2"
|
urlencoding = "2.1.2"
|
||||||
uuid = { version = "1.1.2", features = ["v4", "v5", "v7", "serde"] }
|
uuid = { version = "1.1.2", features = ["v4", "v5", "v7", "serde"] }
|
||||||
walkdir = "2.5"
|
walkdir = "2.5"
|
||||||
wasi-preview1-component-adapter-provider = "29"
|
|
||||||
wasm-encoder = "0.221"
|
wasm-encoder = "0.221"
|
||||||
wasmparser = "0.221"
|
wasmparser = "0.221"
|
||||||
wasmtime = { version = "29", default-features = false, features = [
|
wasmtime = { version = "29", default-features = false, features = [
|
||||||
|
@ -617,7 +616,6 @@ wasmtime = { version = "29", default-features = false, features = [
|
||||||
] }
|
] }
|
||||||
wasmtime-wasi = "29"
|
wasmtime-wasi = "29"
|
||||||
which = "6.0.0"
|
which = "6.0.0"
|
||||||
wit-component = "0.221"
|
|
||||||
workspace-hack = "0.1.0"
|
workspace-hack = "0.1.0"
|
||||||
zed_llm_client = "0.8.3"
|
zed_llm_client = "0.8.3"
|
||||||
zstd = "0.11"
|
zstd = "0.11"
|
||||||
|
|
|
@ -33,8 +33,6 @@ serde_json.workspace = true
|
||||||
task.workspace = true
|
task.workspace = true
|
||||||
toml.workspace = true
|
toml.workspace = true
|
||||||
util.workspace = true
|
util.workspace = true
|
||||||
wasi-preview1-component-adapter-provider.workspace = true
|
|
||||||
wasm-encoder.workspace = true
|
wasm-encoder.workspace = true
|
||||||
wasmparser.workspace = true
|
wasmparser.workspace = true
|
||||||
wit-component.workspace = true
|
|
||||||
workspace-hack.workspace = true
|
workspace-hack.workspace = true
|
||||||
|
|
|
@ -14,18 +14,11 @@ use std::{
|
||||||
process::Stdio,
|
process::Stdio,
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
};
|
};
|
||||||
use wasi_preview1_component_adapter_provider::WASI_SNAPSHOT_PREVIEW1_REACTOR_ADAPTER;
|
|
||||||
use wasm_encoder::{ComponentSectionId, Encode as _, RawSection, Section as _};
|
use wasm_encoder::{ComponentSectionId, Encode as _, RawSection, Section as _};
|
||||||
use wasmparser::Parser;
|
use wasmparser::Parser;
|
||||||
use wit_component::ComponentEncoder;
|
|
||||||
|
|
||||||
/// Currently, we compile with Rust's `wasm32-wasip1` target, which works with WASI `preview1`.
|
/// Currently, we compile with Rust's `wasm32-wasip2` target, which works with WASI `preview2` and the component model.
|
||||||
/// But the WASM component model is based on WASI `preview2`. So we need an 'adapter' WASM
|
const RUST_TARGET: &str = "wasm32-wasip2";
|
||||||
/// module, which implements the `preview1` interface in terms of `preview2`.
|
|
||||||
///
|
|
||||||
/// Once Rust 1.78 is released, there will be a `wasm32-wasip2` target available, so we will
|
|
||||||
/// not need the adapter anymore.
|
|
||||||
const RUST_TARGET: &str = "wasm32-wasip1";
|
|
||||||
|
|
||||||
/// Compiling Tree-sitter parsers from C to WASM requires Clang 17, and a WASM build of libc
|
/// Compiling Tree-sitter parsers from C to WASM requires Clang 17, and a WASM build of libc
|
||||||
/// and clang's runtime library. The `wasi-sdk` provides these binaries.
|
/// and clang's runtime library. The `wasi-sdk` provides these binaries.
|
||||||
|
@ -174,31 +167,18 @@ impl ExtensionBuilder {
|
||||||
&cargo_toml
|
&cargo_toml
|
||||||
.package
|
.package
|
||||||
.name
|
.name
|
||||||
// The wasm32-wasip1 target normalizes `-` in package names to `_` in the resulting `.wasm` file.
|
// The wasm32-wasip2 target normalizes `-` in package names to `_` in the resulting `.wasm` file.
|
||||||
.replace('-', "_"),
|
.replace('-', "_"),
|
||||||
]);
|
]);
|
||||||
wasm_path.set_extension("wasm");
|
wasm_path.set_extension("wasm");
|
||||||
|
|
||||||
let wasm_bytes = fs::read(&wasm_path)
|
|
||||||
.with_context(|| format!("failed to read output module `{}`", wasm_path.display()))?;
|
|
||||||
|
|
||||||
let mut encoder = ComponentEncoder::default()
|
|
||||||
.module(&wasm_bytes)?
|
|
||||||
.adapter(
|
|
||||||
"wasi_snapshot_preview1",
|
|
||||||
WASI_SNAPSHOT_PREVIEW1_REACTOR_ADAPTER,
|
|
||||||
)
|
|
||||||
.context("failed to load adapter module")?
|
|
||||||
.validate(true);
|
|
||||||
|
|
||||||
log::info!(
|
log::info!(
|
||||||
"encoding wasm component for extension {}",
|
"encoding wasm component for extension {}",
|
||||||
extension_dir.display()
|
extension_dir.display()
|
||||||
);
|
);
|
||||||
|
|
||||||
let component_bytes = encoder
|
let component_bytes = fs::read(&wasm_path)
|
||||||
.encode()
|
.with_context(|| format!("failed to read output module `{}`", wasm_path.display()))?;
|
||||||
.context("failed to encode wasm component")?;
|
|
||||||
|
|
||||||
let component_bytes = self
|
let component_bytes = self
|
||||||
.strip_custom_sections(&component_bytes)
|
.strip_custom_sections(&component_bytes)
|
||||||
|
@ -439,26 +419,34 @@ impl ExtensionBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
// This was adapted from:
|
// This was adapted from:
|
||||||
// https://github.com/bytecodealliance/wasm-tools/blob/1791a8f139722e9f8679a2bd3d8e423e55132b22/src/bin/wasm-tools/strip.rs
|
// https://github.com/bytecodealliance/wasm-tools/blob/e8809bb17fcf69aa8c85cd5e6db7cff5cf36b1de/src/bin/wasm-tools/strip.rs
|
||||||
fn strip_custom_sections(&self, input: &Vec<u8>) -> Result<Vec<u8>> {
|
fn strip_custom_sections(&self, input: &Vec<u8>) -> Result<Vec<u8>> {
|
||||||
use wasmparser::Payload::*;
|
use wasmparser::Payload::*;
|
||||||
|
|
||||||
let strip_custom_section = |name: &str| name.starts_with(".debug");
|
let strip_custom_section = |name: &str| {
|
||||||
|
// Default strip everything but:
|
||||||
|
// * the `name` section
|
||||||
|
// * any `component-type` sections
|
||||||
|
// * the `dylink.0` section
|
||||||
|
// * our custom version section
|
||||||
|
name != "name"
|
||||||
|
&& !name.starts_with("component-type:")
|
||||||
|
&& name != "dylink.0"
|
||||||
|
&& name != "zed:api-version"
|
||||||
|
};
|
||||||
|
|
||||||
let mut output = Vec::new();
|
let mut output = Vec::new();
|
||||||
let mut stack = Vec::new();
|
let mut stack = Vec::new();
|
||||||
|
|
||||||
for payload in Parser::new(0).parse_all(input) {
|
for payload in Parser::new(0).parse_all(&input) {
|
||||||
let payload = payload?;
|
let payload = payload?;
|
||||||
let component_header = wasm_encoder::Component::HEADER;
|
|
||||||
let module_header = wasm_encoder::Module::HEADER;
|
|
||||||
|
|
||||||
// Track nesting depth, so that we don't mess with inner producer sections:
|
// Track nesting depth, so that we don't mess with inner producer sections:
|
||||||
match payload {
|
match payload {
|
||||||
Version { encoding, .. } => {
|
Version { encoding, .. } => {
|
||||||
output.extend_from_slice(match encoding {
|
output.extend_from_slice(match encoding {
|
||||||
wasmparser::Encoding::Component => &component_header,
|
wasmparser::Encoding::Component => &wasm_encoder::Component::HEADER,
|
||||||
wasmparser::Encoding::Module => &module_header,
|
wasmparser::Encoding::Module => &wasm_encoder::Module::HEADER,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
ModuleSection { .. } | ComponentSection { .. } => {
|
ModuleSection { .. } | ComponentSection { .. } => {
|
||||||
|
@ -470,7 +458,7 @@ impl ExtensionBuilder {
|
||||||
Some(c) => c,
|
Some(c) => c,
|
||||||
None => break,
|
None => break,
|
||||||
};
|
};
|
||||||
if output.starts_with(&component_header) {
|
if output.starts_with(&wasm_encoder::Component::HEADER) {
|
||||||
parent.push(ComponentSectionId::Component as u8);
|
parent.push(ComponentSectionId::Component as u8);
|
||||||
output.encode(&mut parent);
|
output.encode(&mut parent);
|
||||||
} else {
|
} else {
|
||||||
|
@ -482,12 +470,15 @@ impl ExtensionBuilder {
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let CustomSection(c) = &payload {
|
match &payload {
|
||||||
if strip_custom_section(c.name()) {
|
CustomSection(c) => {
|
||||||
continue;
|
if strip_custom_section(c.name()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
if let Some((id, range)) = payload.as_section() {
|
if let Some((id, range)) = payload.as_section() {
|
||||||
RawSection {
|
RawSection {
|
||||||
id,
|
id,
|
||||||
|
|
|
@ -23,7 +23,7 @@ need to set your `crate-type` accordingly:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
zed_extension_api = "0.5.0"
|
zed_extension_api = "0.6.0"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib"]
|
crate-type = ["cdylib"]
|
||||||
|
@ -51,6 +51,8 @@ zed::register_extension!(MyExtension);
|
||||||
|
|
||||||
To run your extension in Zed as you're developing it:
|
To run your extension in Zed as you're developing it:
|
||||||
|
|
||||||
|
- Make sure you have [Rust installed](https://www.rust-lang.org/learn/get-started)
|
||||||
|
- Have the `wasm32-wasip2` target installed (`rustup target add wasm32-wasip2`)
|
||||||
- Open the extensions view using the `zed: extensions` action in the command palette.
|
- Open the extensions view using the `zed: extensions` action in the command palette.
|
||||||
- Click the `Install Dev Extension` button in the top right
|
- Click the `Install Dev Extension` button in the top right
|
||||||
- Choose the path to your extension directory.
|
- Choose the path to your extension directory.
|
||||||
|
|
|
@ -7,6 +7,6 @@ targets = [
|
||||||
"aarch64-apple-darwin",
|
"aarch64-apple-darwin",
|
||||||
"x86_64-unknown-linux-gnu",
|
"x86_64-unknown-linux-gnu",
|
||||||
"x86_64-pc-windows-msvc",
|
"x86_64-pc-windows-msvc",
|
||||||
"wasm32-wasip1", # extensions
|
"wasm32-wasip2", # extensions
|
||||||
"x86_64-unknown-linux-musl", # remote server
|
"x86_64-unknown-linux-musl", # remote server
|
||||||
]
|
]
|
||||||
|
|
|
@ -134,7 +134,6 @@ unicode-normalization = { version = "0.1" }
|
||||||
unicode-properties = { version = "0.1" }
|
unicode-properties = { version = "0.1" }
|
||||||
url = { version = "2", features = ["serde"] }
|
url = { version = "2", features = ["serde"] }
|
||||||
uuid = { version = "1", features = ["serde", "v4", "v5", "v7"] }
|
uuid = { version = "1", features = ["serde", "v4", "v5", "v7"] }
|
||||||
wasm-encoder = { version = "0.221", features = ["wasmparser"] }
|
|
||||||
wasmparser = { version = "0.221" }
|
wasmparser = { version = "0.221" }
|
||||||
wasmtime = { version = "29", default-features = false, features = ["async", "component-model", "cranelift", "demangle", "gc-drc", "incremental-cache", "parallel-compilation"] }
|
wasmtime = { version = "29", default-features = false, features = ["async", "component-model", "cranelift", "demangle", "gc-drc", "incremental-cache", "parallel-compilation"] }
|
||||||
wasmtime-cranelift = { version = "29", default-features = false, features = ["component-model", "gc-drc", "incremental-cache"] }
|
wasmtime-cranelift = { version = "29", default-features = false, features = ["component-model", "gc-drc", "incremental-cache"] }
|
||||||
|
@ -273,7 +272,6 @@ unicode-normalization = { version = "0.1" }
|
||||||
unicode-properties = { version = "0.1" }
|
unicode-properties = { version = "0.1" }
|
||||||
url = { version = "2", features = ["serde"] }
|
url = { version = "2", features = ["serde"] }
|
||||||
uuid = { version = "1", features = ["serde", "v4", "v5", "v7"] }
|
uuid = { version = "1", features = ["serde", "v4", "v5", "v7"] }
|
||||||
wasm-encoder = { version = "0.221", features = ["wasmparser"] }
|
|
||||||
wasmparser = { version = "0.221" }
|
wasmparser = { version = "0.221" }
|
||||||
wasmtime = { version = "29", default-features = false, features = ["async", "component-model", "cranelift", "demangle", "gc-drc", "incremental-cache", "parallel-compilation"] }
|
wasmtime = { version = "29", default-features = false, features = ["async", "component-model", "cranelift", "demangle", "gc-drc", "incremental-cache", "parallel-compilation"] }
|
||||||
wasmtime-cranelift = { version = "29", default-features = false, features = ["component-model", "gc-drc", "incremental-cache"] }
|
wasmtime-cranelift = { version = "29", default-features = false, features = ["component-model", "gc-drc", "incremental-cache"] }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue