@@ -30,25 +30,78 @@ use std::{env, fs};
3030use anyhow:: Result ;
3131use 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 tar_path. exists ( ) {
50+ let out_dir = env:: var_os ( "OUT_DIR" ) . unwrap ( ) ;
51+ let out_dir = PathBuf :: from ( out_dir) ;
52+ let vendor_dir = out_dir. join ( "vendor" ) ;
53+
54+ let mut tar = tar:: Archive :: new ( fs:: File :: open ( & tar_path) . unwrap ( ) ) ;
55+ tar. unpack ( & vendor_dir) . unwrap ( ) ;
56+
57+ let wasm_runtime_dir = vendor_dir. join ( "wasm_runtime" ) ;
58+
59+ println ! (
60+ "cargo::warning=using vendor wasm_runtime from {}" ,
61+ tar_path. display( )
62+ ) ;
63+ return wasm_runtime_dir;
64+ }
65+
66+ let crates_dir = manifest_dir. parent ( ) . unwrap ( ) ;
67+
68+ #[ cfg( unix) ]
69+ std:: os:: unix:: fs:: symlink ( & crates_dir, & vendor_dir) . unwrap ( ) ;
70+
71+ #[ cfg( not( unix) ) ]
72+ std:: os:: windows:: fs:: symlink_dir ( & crates_dir, & vendor_dir) . unwrap ( ) ;
73+
74+ let wasm_runtime_dir = crates_dir. join ( "wasm_runtime" ) ;
75+ if wasm_runtime_dir. exists ( ) {
76+ return wasm_runtime_dir;
77+ }
78+
79+ panic ! (
80+ r#"
81+ The wasm_runtime directory not found in the expected locations.
82+ If you are using hyperlight-wasm from a crates.io release, please file an issue: https://github.com/hyperlight-dev/hyperlight-wasm/issues
83+ "#
84+ ) ;
85+ }
86+
3387fn build_wasm_runtime ( ) -> PathBuf {
34- let proj_dir = env:: var_os ( "CARGO_MANIFEST_DIR " ) . unwrap ( ) ;
88+ let cargo_bin = env:: var_os ( "CARGO " ) . unwrap ( ) ;
3589 let profile = env:: var_os ( "PROFILE" ) . unwrap ( ) ;
90+ let out_dir = env:: var_os ( "OUT_DIR" ) . unwrap ( ) ;
91+
92+ let target_dir = Path :: new ( "" ) . join ( & out_dir) . join ( "target" ) ;
93+
94+ let in_repo_dir = get_wasm_runtime_path ( ) ;
3695
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" ) ;
4196 if !in_repo_dir. exists ( ) {
42- panic ! ( "hyperlight_wasm does not yet support being compiled from a release package " ) ;
97+ panic ! ( "missing wasm_runtime in-tree dependency " ) ;
4398 }
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 ! ( ) ;
99+
100+ println ! ( "cargo::rerun-if-changed={}" , in_repo_dir. display( ) ) ;
48101 println ! ( "cargo::rerun-if-env-changed=WIT_WORLD" ) ;
49102 // the PROFILE env var unfortunately only gives us 1 bit of "dev or release"
50103 let cargo_profile = if profile == "debug" { "dev" } else { "release" } ;
51- let mut cmd = std:: process:: Command :: new ( "cargo" ) ;
104+ let mut cmd = std:: process:: Command :: new ( cargo_bin ) ;
52105
53106 // Clear the variables that control Cargo's behaviour (as listed
54107 // at https://doc.rust-lang.org/cargo/reference/environment-variables.html):
@@ -57,7 +110,12 @@ fn build_wasm_runtime() -> PathBuf {
57110 env_vars. retain ( |( key, _) | !key. starts_with ( "CARGO_" ) ) ;
58111
59112 let cmd = cmd
60- . args ( [ "build" , & format ! ( "--profile={}" , cargo_profile) , "-v" ] )
113+ . arg ( "build" )
114+ . arg ( "--profile" )
115+ . arg ( cargo_profile)
116+ . arg ( "-v" )
117+ . arg ( "--target-dir" )
118+ . arg ( & target_dir)
61119 . current_dir ( & in_repo_dir)
62120 . env_clear ( )
63121 . envs ( env_vars) ;
@@ -68,8 +126,7 @@ fn build_wasm_runtime() -> PathBuf {
68126 if !status. success ( ) {
69127 panic ! ( "could not compile wasm_runtime" ) ;
70128 }
71- let resource = in_repo_dir
72- . join ( "target" )
129+ let resource = target_dir
73130 . join ( "x86_64-unknown-none" )
74131 . join ( profile)
75132 . join ( "wasm_runtime" ) ;
0 commit comments