Files
simple-rust-tests/__wasm/wit-bindgen-sample/wit-bindgen/crates/test-helpers/build.rs

169 lines
6.6 KiB
Rust

use std::env;
use std::fs;
use std::path::PathBuf;
use std::process::Command;
use wit_bindgen_gen_core::{wit_parser::Interface, Generator};
fn main() {
let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap());
let mut wasms = Vec::new();
if cfg!(feature = "wasm-rust") {
let mut cmd = Command::new("cargo");
cmd.arg("build")
.current_dir("../test-rust-wasm")
.arg("--target=wasm32-wasi")
.env("CARGO_TARGET_DIR", &out_dir)
.env("CARGO_PROFILE_DEV_DEBUG", "1")
.env("RUSTFLAGS", "-Clink-args=--export-table")
.env_remove("CARGO_ENCODED_RUSTFLAGS");
let status = cmd.status().unwrap();
assert!(status.success());
for file in out_dir.join("wasm32-wasi/debug").read_dir().unwrap() {
let file = file.unwrap().path();
if file.extension().and_then(|s| s.to_str()) != Some("wasm") {
continue;
}
wasms.push((
"rust",
file.file_stem().unwrap().to_str().unwrap().to_string(),
file.to_str().unwrap().to_string(),
));
let dep_file = file.with_extension("d");
let deps = fs::read_to_string(&dep_file).expect("failed to read dep file");
for dep in deps
.splitn(2, ":")
.skip(1)
.next()
.unwrap()
.split_whitespace()
{
println!("cargo:rerun-if-changed={}", dep);
}
}
println!("cargo:rerun-if-changed=../test-rust-wasm/Cargo.toml");
}
if cfg!(feature = "wasm-c") {
for test_dir in fs::read_dir("../../tests/runtime").unwrap() {
let test_dir = test_dir.unwrap().path();
let c_impl = test_dir.join("wasm.c");
if !c_impl.exists() {
continue;
}
let imports = test_dir.join("imports.wit");
let exports = test_dir.join("exports.wit");
println!("cargo:rerun-if-changed={}", imports.display());
println!("cargo:rerun-if-changed={}", exports.display());
println!("cargo:rerun-if-changed={}", c_impl.display());
let import = Interface::parse_file(&test_dir.join("imports.wit")).unwrap();
let export = Interface::parse_file(&test_dir.join("exports.wit")).unwrap();
let mut files = Default::default();
// TODO: should combine this into one
wit_bindgen_gen_c::Opts::default()
.build()
.generate_all(&[import], &[], &mut files);
wit_bindgen_gen_c::Opts::default()
.build()
.generate_all(&[], &[export], &mut files);
let out_dir = out_dir.join(format!(
"c-{}",
test_dir.file_name().unwrap().to_str().unwrap()
));
drop(fs::remove_dir_all(&out_dir));
fs::create_dir(&out_dir).unwrap();
for (file, contents) in files.iter() {
let dst = out_dir.join(file);
fs::write(dst, contents).unwrap();
}
let path = PathBuf::from(env::var_os("WASI_SDK_PATH").expect(
"point the `WASI_SDK_PATH` environment variable to the path of your wasi-sdk",
));
let mut cmd = Command::new(path.join("bin/clang"));
let out_wasm = out_dir.join("c.wasm");
cmd.arg("--sysroot").arg(path.join("share/wasi-sysroot"));
cmd.arg(c_impl)
.arg(out_dir.join("imports.c"))
.arg(out_dir.join("exports.c"))
.arg("-I")
.arg(&out_dir)
.arg("-Wall")
.arg("-Wextra")
.arg("-Werror")
.arg("-Wno-unused-parameter")
.arg("-mexec-model=reactor")
.arg("-g")
.arg("-o")
.arg(&out_wasm);
println!("{:?}", cmd);
let output = match cmd.output() {
Ok(output) => output,
Err(e) => panic!("failed to spawn compiler: {}", e),
};
if !output.status.success() {
println!("status: {}", output.status);
println!("stdout: ------------------------------------------");
println!("{}", String::from_utf8_lossy(&output.stdout));
println!("stderr: ------------------------------------------");
println!("{}", String::from_utf8_lossy(&output.stderr));
panic!("failed to compile");
}
wasms.push((
"c",
test_dir.file_stem().unwrap().to_str().unwrap().to_string(),
out_wasm.to_str().unwrap().to_string(),
));
}
}
if cfg!(feature = "wasm-spidermonkey") {
for test_dir in fs::read_dir("../../tests/runtime").unwrap() {
let test_dir = test_dir.unwrap().path();
let js_impl = test_dir.join("wasm.js");
if !js_impl.exists() {
continue;
}
let imports = test_dir.join("imports.wit");
let exports = test_dir.join("exports.wit");
println!("cargo:rerun-if-changed={}", imports.display());
println!("cargo:rerun-if-changed={}", exports.display());
println!("cargo:rerun-if-changed={}", js_impl.display());
let import = Interface::parse_file(&test_dir.join("imports.wit")).unwrap();
let export = Interface::parse_file(&test_dir.join("exports.wit")).unwrap();
let mut files = Default::default();
let js = fs::read_to_string(&js_impl).unwrap();
let mut gen = wit_bindgen_gen_spidermonkey::SpiderMonkeyWasm::new("wasm.js", &js);
gen.import_spidermonkey(true);
gen.generate_all(&[import], &[export], &mut files);
let out_dir = out_dir.join(format!(
"js-{}",
test_dir.file_name().unwrap().to_str().unwrap()
));
drop(fs::remove_dir_all(&out_dir));
fs::create_dir(&out_dir).unwrap();
for (file, contents) in files.iter() {
let dst = out_dir.join(file);
fs::write(dst, contents).unwrap();
}
wasms.push((
"spidermonkey",
test_dir.file_stem().unwrap().to_str().unwrap().to_string(),
out_dir.join("wasm.wasm").to_str().unwrap().to_string(),
));
}
}
let src = format!("const WASMS: &[(&str, &str, &str)] = &{:?};", wasms);
std::fs::write(out_dir.join("wasms.rs"), src).unwrap();
}