Skip to content

Commit 5924d1d

Browse files
authored
Vendor wasm runtime (#78)
* build without wasmtime-platform.h Signed-off-by: Jorge Prendes <[email protected]> * remove unused import Signed-off-by: Jorge Prendes <[email protected]> * Allow using wasm_runtime as a vendored tar file Signed-off-by: Jorge Prendes <[email protected]> * Add hl-wasm-macro to lint targets Signed-off-by: Jorge Prendes <[email protected]> * do not distribute the wasm_runtime binary Signed-off-by: Jorge Prendes <[email protected]> * add comment explaining vendor.tar Signed-off-by: Jorge Prendes <[email protected]> --------- Signed-off-by: Jorge Prendes <[email protected]>
1 parent eefcb56 commit 5924d1d

File tree

13 files changed

+170
-98
lines changed

13 files changed

+170
-98
lines changed

.github/workflows/dep_cargo_publish.yml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,6 @@ jobs:
2424
with:
2525
rust-toolchain: "1.85.0"
2626

27-
- name: Download Wasm Host (debug)
28-
uses: actions/download-artifact@v4
29-
with:
30-
name: wasm-runtime-debug
31-
path: ${{ github.workspace }}/src/hyperlight_wasm/redist/debug/
32-
33-
- name: Download Wasm Host (release)
34-
uses: actions/download-artifact@v4
35-
with:
36-
name: wasm-runtime-release
37-
path: ${{ github.workspace }}/src/hyperlight_wasm/redist/release/
38-
3927
# github actions that run against PRs check out a ref to the PR merge branch
4028
# we need to switch / create a branch for cargo ws to run late
4129
- name: set-branch-for-PRs

Cargo.lock

Lines changed: 44 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Justfile

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ wit-world := if os() == "windows" { "$env:WIT_WORLD=\"" + justfile_directory() +
77

88
set windows-shell := ["pwsh.exe", "-NoLogo", "-Command"]
99

10+
make-vendor-tar:
11+
tar cf ./src/hyperlight_wasm/vendor.tar \
12+
--exclude-vcs-ignores \
13+
-C ./src wasm_runtime hyperlight_wasm_macro
14+
1015
ensure-tools:
1116
cargo install --locked wasm-tools --version 1.235.0
1217
cargo install cargo-component --locked --version 0.21.1
@@ -19,16 +24,12 @@ build target=default-target features="": (build-wasm-runtime target) (fmt-check)
1924
mkdir-redist target=default-target:
2025
mkdir {{ mkdir-arg }} x64
2126
mkdir {{ mkdir-arg }} x64/{{ target }}
22-
mkdir {{ mkdir-arg }} src/hyperlight_wasm/redist
23-
mkdir {{ mkdir-arg }} src/hyperlight_wasm/redist/{{ target }}
2427

25-
build-wasm-runtime target=default-target: (mkdir-redist target)
26-
cd ./src/wasm_runtime && cargo build --verbose --profile={{ if target == "debug" {"dev"} else { target } }}
27-
cp ./src/wasm_runtime/target/x86_64-unknown-none/{{target}}/wasm_runtime ./x64/{{target}}/wasm_runtime
28-
cp ./src/wasm_runtime/target/x86_64-unknown-none/{{target}}/wasm_runtime ./src/hyperlight_wasm/redist/{{target}}/wasm_runtime
28+
build-wasm-runtime target=default-target:
29+
cd ./src/wasm_runtime && cargo build --verbose --profile={{ if target == "debug" {"dev"} else { target } }} && rm -R target
2930

3031
build-wasm-examples target=default-target:
31-
{{ build-wasm-examples-command}} {{target}}
32+
{{ build-wasm-examples-command }} {{target}}
3233

3334
build-rust-wasm-examples target=default-target: (mkdir-redist target)
3435
rustup target add wasm32-unknown-unknown
@@ -50,24 +51,29 @@ check target=default-target:
5051
cd src/rust_wasm_samples && cargo check --profile={{ if target == "debug" {"dev"} else { target } }}
5152
cd src/component_sample && cargo check --profile={{ if target == "debug" {"dev"} else { target } }}
5253
cd src/wasm_runtime && cargo check --profile={{ if target == "debug" {"dev"} else { target } }}
54+
cd src/hyperlight_wasm_macro && cargo check --profile={{ if target == "debug" {"dev"} else { target } }}
5355

5456
fmt-check:
5557
rustup toolchain install nightly -c rustfmt && cargo +nightly fmt -v --all -- --check
5658
cd src/rust_wasm_samples && rustup toolchain install nightly -c rustfmt && cargo +nightly fmt -v --all -- --check
5759
cd src/component_sample && rustup toolchain install nightly -c rustfmt && cargo +nightly fmt -v --all -- --check
5860
cd src/wasm_runtime && rustup toolchain install nightly -c rustfmt && cargo +nightly fmt -v --all -- --check
61+
cd src/hyperlight_wasm_macro && rustup toolchain install nightly -c rustfmt && cargo +nightly fmt -v --all -- --check
62+
5963
fmt:
6064
rustup toolchain install nightly -c rustfmt
6165
cargo +nightly fmt --all
6266
cd src/rust_wasm_samples && cargo +nightly fmt -v --all
6367
cd src/component_sample && cargo +nightly fmt -v --all
6468
cd src/wasm_runtime && cargo +nightly fmt -v --all
69+
cd src/hyperlight_wasm_macro && cargo +nightly fmt -v --all
6570

6671
clippy target=default-target: (check target)
6772
cargo clippy --profile={{ if target == "debug" {"dev"} else { target } }} --all-targets --all-features -- -D warnings
6873
cd src/rust_wasm_samples && cargo clippy --profile={{ if target == "debug" {"dev"} else { target } }} --all-targets --all-features -- -D warnings
6974
cd src/component_sample && cargo clippy --profile={{ if target == "debug" {"dev"} else { target } }} --all-targets --all-features -- -D warnings
7075
cd src/wasm_runtime && cargo clippy --profile={{ if target == "debug" {"dev"} else { target } }} --all-targets --all-features -- -D warnings
76+
cd src/hyperlight_wasm_macro && cargo clippy --profile={{ if target == "debug" {"dev"} else { target } }} --all-targets --all-features -- -D warnings
7177

7278
# TESTING
7379
# Metrics tests cannot run with other tests they are marked as ignored so that cargo test works

src/hyperlight_wasm/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
vendor.tar

src/hyperlight_wasm/Cargo.toml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,17 @@ name = "hyperlight-wasm"
33
version = "0.1.0"
44
edition = "2024"
55
rust-version = "1.85"
6-
include = ["*"] # Make sure wasm_runtime is included!
6+
description = "Library that enables wasm modules and components to be run inside lightweight Virtual Machine backed Sandbox. It is built on top of Hyperlight."
7+
license = "Apache-2.0"
8+
repository = "https://github.com/hyperlight-dev/hyperlight-wasm"
9+
include = [
10+
"/src",
11+
"/scripts",
12+
"/examples",
13+
"benches",
14+
"/build.rs",
15+
"/vendor.tar", # Make sure vendor.tar is included!
16+
]
717

818
[lib]
919
name = "hyperlight_wasm"
@@ -59,6 +69,7 @@ blake3 = "1.8"
5969
built = { version = "0.8.0", features = ["chrono", "git2"] }
6070
anyhow = { version = "1.0" }
6171
goblin = "0.10.0"
72+
tar = "0.4.44"
6273

6374
[features]
6475
default = ["function_call_metrics", "kvm", "mshv2"]

src/hyperlight_wasm/build.rs

Lines changed: 76 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,83 @@ use std::{env, fs};
3030
use anyhow::Result;
3131
use built::write_built_file;
3232

33+
fn get_wasm_runtime_path() -> PathBuf {
34+
let manifest_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap();
35+
let manifest_dir = PathBuf::from(manifest_dir);
36+
37+
let tar_path = manifest_dir.join("vendor.tar");
38+
39+
let out_dir = env::var_os("OUT_DIR").unwrap();
40+
let out_dir = PathBuf::from(out_dir);
41+
let vendor_dir = out_dir.join("vendor");
42+
43+
if vendor_dir.exists() {
44+
fs::remove_dir_all(&vendor_dir).unwrap();
45+
}
46+
47+
println!("cargo::rerun-if-changed={}", tar_path.display());
48+
49+
// If the vendor.tar file exists, extract it to the OUT_DIR/vendor directory
50+
// and return the wasm_runtime directory inside it.
51+
// This is useful for vendoring the wasm_runtime crate in a release build, since crates.io
52+
// does not allow vendoring folders with Cargo.toml files (i.e., other crates).
53+
// The vendor.tar file is expected to be in the same directory as this build script.
54+
if tar_path.exists() {
55+
let out_dir = env::var_os("OUT_DIR").unwrap();
56+
let out_dir = PathBuf::from(out_dir);
57+
let vendor_dir = out_dir.join("vendor");
58+
59+
let mut tar = tar::Archive::new(fs::File::open(&tar_path).unwrap());
60+
tar.unpack(&vendor_dir).unwrap();
61+
62+
let wasm_runtime_dir = vendor_dir.join("wasm_runtime");
63+
64+
println!(
65+
"cargo::warning=using vendor wasm_runtime from {}",
66+
tar_path.display()
67+
);
68+
return wasm_runtime_dir;
69+
}
70+
71+
let crates_dir = manifest_dir.parent().unwrap();
72+
73+
#[cfg(unix)]
74+
std::os::unix::fs::symlink(crates_dir, &vendor_dir).unwrap();
75+
76+
#[cfg(not(unix))]
77+
std::os::windows::fs::symlink_dir(crates_dir, &vendor_dir).unwrap();
78+
79+
let wasm_runtime_dir = crates_dir.join("wasm_runtime");
80+
if wasm_runtime_dir.exists() {
81+
return wasm_runtime_dir;
82+
}
83+
84+
panic!(
85+
r#"
86+
The wasm_runtime directory not found in the expected locations.
87+
If you are using hyperlight-wasm from a crates.io release, please file an issue: https://github.com/hyperlight-dev/hyperlight-wasm/issues
88+
"#
89+
);
90+
}
91+
3392
fn build_wasm_runtime() -> PathBuf {
34-
let proj_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap();
93+
let cargo_bin = env::var_os("CARGO").unwrap();
3594
let profile = env::var_os("PROFILE").unwrap();
95+
let out_dir = env::var_os("OUT_DIR").unwrap();
96+
97+
let target_dir = Path::new("").join(&out_dir).join("target");
98+
99+
let in_repo_dir = get_wasm_runtime_path();
36100

37-
let in_repo_dir = PathBuf::from(&proj_dir)
38-
.parent()
39-
.unwrap_or_else(|| panic!("could not find parent of cargo manifest directory"))
40-
.join("wasm_runtime");
41101
if !in_repo_dir.exists() {
42-
panic!("hyperlight_wasm does not yet support being compiled from a release package");
102+
panic!("missing wasm_runtime in-tree dependency");
43103
}
44-
print!("cargo::rerun-if-changed=");
45-
let _ = std::io::stdout()
46-
.write_all(AsRef::<std::ffi::OsStr>::as_ref(&in_repo_dir).as_encoded_bytes());
47-
println!();
104+
105+
println!("cargo::rerun-if-changed={}", in_repo_dir.display());
48106
println!("cargo::rerun-if-env-changed=WIT_WORLD");
49107
// the PROFILE env var unfortunately only gives us 1 bit of "dev or release"
50108
let cargo_profile = if profile == "debug" { "dev" } else { "release" };
51-
let mut cmd = std::process::Command::new("cargo");
109+
let mut cmd = std::process::Command::new(cargo_bin);
52110

53111
// Clear the variables that control Cargo's behaviour (as listed
54112
// at https://doc.rust-lang.org/cargo/reference/environment-variables.html):
@@ -57,7 +115,12 @@ fn build_wasm_runtime() -> PathBuf {
57115
env_vars.retain(|(key, _)| !key.starts_with("CARGO_"));
58116

59117
let cmd = cmd
60-
.args(["build", &format!("--profile={}", cargo_profile), "-v"])
118+
.arg("build")
119+
.arg("--profile")
120+
.arg(cargo_profile)
121+
.arg("-v")
122+
.arg("--target-dir")
123+
.arg(&target_dir)
61124
.current_dir(&in_repo_dir)
62125
.env_clear()
63126
.envs(env_vars);
@@ -68,8 +131,7 @@ fn build_wasm_runtime() -> PathBuf {
68131
if !status.success() {
69132
panic!("could not compile wasm_runtime");
70133
}
71-
let resource = in_repo_dir
72-
.join("target")
134+
let resource = target_dir
73135
.join("x86_64-unknown-none")
74136
.join(profile)
75137
.join("wasm_runtime");

src/hyperlight_wasm/src/lib.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,8 @@ mod tests {
7272
fn test_wasmtime_version() {
7373
let wasmtime_version = super::get_wasmtime_version();
7474
// get the wasmtime version from the wasm_runtime binary's Cargo.toml
75-
let proj_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap();
76-
let cargo_toml_path = Path::new(&proj_dir)
77-
.parent()
78-
.unwrap()
75+
let cargo_toml_path = Path::new(env!("OUT_DIR"))
76+
.join("vendor")
7977
.join("wasm_runtime")
8078
.join("Cargo.toml");
8179
let cargo_toml_content =

src/hyperlight_wasm/src/sandbox/wasm_sandbox.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,7 @@ mod tests {
221221
.expect("Failed to get CARGO_MANIFEST_DIR or RUST_DIR_FOR_DEBUGGING_TESTS env var")
222222
});
223223

224-
let relative_path = if filename == "wasm_runtime" {
225-
"redist"
226-
} else {
227-
"../../x64"
228-
};
224+
let relative_path = "../../x64";
229225

230226
let filename_path = Path::new(&proj_dir)
231227
.join(relative_path)

0 commit comments

Comments
 (0)