Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions ci/rebuild-libwit-bindgen-cabi.sh
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ wasip3_get=wit_bindgen_${version}_get_task_context
wasip3_set=wit_bindgen_${version}_set_task_context

rm -f crates/guest-rust/src/rt/wit_bindgen_*.{rs,o,c}
rm -f crates/guest-rust/src/rt/libwit_bindgen_cabi.a
rm -f crates/guest-rust/src/rt/libwit_bindgen_cabi_realloc.a
rm -f crates/guest-rust/src/rt/libwit_bindgen_cabi_wasip3.a

cat >./crates/guest-rust/src/rt/wit_bindgen_cabi_realloc.rs <<-EOF
// This file is generated by $0
Expand Down Expand Up @@ -125,6 +126,7 @@ build() {
build wit_bindgen_cabi_realloc
build wit_bindgen_cabi_wasip3

$WASI_SDK_PATH/bin/llvm-ar crus crates/guest-rust/src/rt/libwit_bindgen_cabi.a \
crates/guest-rust/src/rt/wit_bindgen_cabi_realloc.o \
$WASI_SDK_PATH/bin/llvm-ar crus crates/guest-rust/src/rt/libwit_bindgen_cabi_realloc.a \
crates/guest-rust/src/rt/wit_bindgen_cabi_realloc.o
$WASI_SDK_PATH/bin/llvm-ar crus crates/guest-rust/src/rt/libwit_bindgen_cabi_wasip3.a \
crates/guest-rust/src/rt/wit_bindgen_cabi_wasip3.o
16 changes: 13 additions & 3 deletions crates/guest-rust/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use std::path::PathBuf;
fn main() {
let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap_or(String::new());
let target_family = env::var("CARGO_CFG_TARGET_FAMILY").unwrap_or(String::new());
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
let target_env = env::var("CARGO_CFG_TARGET_ENV").unwrap_or(String::new());

if target_family != "wasm" {
return;
Expand All @@ -14,13 +14,23 @@ fn main() {
panic!("only wasm32 supports cabi-realloc right now");
}

if target_env == "p1" || target_env == "" {
link_lib("cabi_realloc");
}
if target_env == "p3" {
link_lib("cabi_wasip3");
}
}

fn link_lib(name: &str) {
let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
let mut src = env::current_dir().unwrap();
src.push("src");
src.push("rt");
src.push("libwit_bindgen_cabi.a");
src.push(&format!("libwit_bindgen_{name}.a"));

let dst_name = format!(
"wit_bindgen_cabi{}",
"wit_bindgen_{name}_{}",
env!("CARGO_PKG_VERSION").replace(".", "_")
);
let dst = out_dir.join(format!("lib{dst_name}.a"));
Expand Down
Binary file removed crates/guest-rust/src/rt/libwit_bindgen_cabi.a
Binary file not shown.
Binary file not shown.
Binary file not shown.
59 changes: 38 additions & 21 deletions crates/test/src/rust.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ pub struct Rust;

#[derive(Default)]
pub struct State {
wit_bindgen_rlib: PathBuf,
futures_rlib: PathBuf,
wit_bindgen_files: Vec<String>,
futures_files: Vec<String>,
wit_bindgen_deps: Vec<PathBuf>,
}

Expand All @@ -53,6 +53,9 @@ enum CargoMessage {
target: CargoTarget,
filenames: Vec<String>,
},
BuildScriptExecuted {
linked_paths: Vec<String>,
},
}

#[derive(Deserialize, Debug)]
Expand Down Expand Up @@ -161,8 +164,8 @@ path = 'lib.rs'
.arg(&opts.rust_target)
.arg("--message-format=json"),
)?;
let mut wit_bindgen_rlib = None;
let mut futures_rlib = None;
let mut wit_bindgen_files = None;
let mut futures_files = None;
let mut wit_bindgen_deps = Vec::new();
let mut deps_seen = HashSet::new();

Expand All @@ -172,23 +175,32 @@ path = 'lib.rs'
};
match msg {
CargoMessage::CompilerArtifact { target, filenames } => {
let lib = filenames.iter().find(|f| !f.ends_with(".rmeta")).unwrap();
if target.name == "futures" {
futures_rlib = Some(lib.clone());
futures_files = Some(filenames.clone());
} else if target.name == "wit_bindgen" {
wit_bindgen_rlib = Some(lib.clone());
wit_bindgen_files = Some(filenames.clone());
}
for file in &filenames {
let dir = Path::new(file).parent().unwrap();
if deps_seen.insert(dir.to_path_buf()) {
wit_bindgen_deps.push(dir.to_path_buf());
}
}
let dir = Path::new(&lib).parent().unwrap();
if deps_seen.insert(dir.to_path_buf()) {
wit_bindgen_deps.push(dir.to_path_buf());
}
CargoMessage::BuildScriptExecuted { linked_paths } => {
for path in linked_paths {
let path = PathBuf::from(path);
if deps_seen.insert(path.clone()) {
wit_bindgen_deps.push(path);
}
}
}
}
}

runner.rust_state = Some(State {
wit_bindgen_rlib: wit_bindgen_rlib.unwrap().into(),
futures_rlib: futures_rlib.unwrap().into(),
wit_bindgen_files: wit_bindgen_files.unwrap().into(),
futures_files: futures_files.unwrap().into(),
wit_bindgen_deps,
});
Ok(())
Expand Down Expand Up @@ -313,20 +325,25 @@ impl Runner {
Edition::E2021 => "--edition=2021",
Edition::E2024 => "--edition=2024",
})
.arg(&format!(
"--extern=wit_bindgen={}",
state.wit_bindgen_rlib.display()
))
.arg(&format!(
"--extern=futures={}",
state.futures_rlib.display()
))
.arg("--target")
.arg(&opts.rust_target)
.arg("-Dwarnings")
.arg("-Cdebuginfo=1");
for dep in state.wit_bindgen_deps.iter() {
cmd.arg(&format!("-Ldependency={}", dep.display()));
let dep = dep.display();
if dep.to_string().contains('=') {
cmd.arg(&format!("-L{dep}"));
} else {
cmd.arg(&format!("-Ldependency={dep}"));
}
}
for (name, files) in [
("wit_bindgen", &state.wit_bindgen_files),
("futures", &state.futures_files),
] {
for file in files {
cmd.arg(&format!("--extern={name}={file}",));
}
}
cmd
}
Expand Down
Loading