| 1 | use std::{env, path::Path}; |
| 2 | |
| 3 | pub fn setup() { |
| 4 | let link_dir = env::var("EMNAPI_LINK_DIR" ).expect("EMNAPI_LINK_DIR must be set" ); |
| 5 | println!("cargo:rerun-if-env-changed=EMNAPI_LINK_DIR" ); |
| 6 | println!("cargo:rerun-if-env-changed=WASI_REGISTER_TMP_PATH" ); |
| 7 | println!("cargo:rustc-link-search= {link_dir}" ); |
| 8 | println!("cargo:rustc-link-lib=static=emnapi-basic-mt" ); |
| 9 | println!("cargo:rustc-link-arg=--export=malloc" ); |
| 10 | println!("cargo:rustc-link-arg=--export=free" ); |
| 11 | println!("cargo:rustc-link-arg=--export=napi_register_wasm_v1" ); |
| 12 | println!("cargo:rustc-link-arg=--export-if-defined=node_api_module_get_api_version_v1" ); |
| 13 | println!("cargo:rustc-link-arg=--export-table" ); |
| 14 | println!("cargo:rustc-link-arg=--export=emnapi_async_worker_create" ); |
| 15 | println!("cargo:rustc-link-arg=--export=emnapi_async_worker_init" ); |
| 16 | println!("cargo:rustc-link-arg=--import-memory" ); |
| 17 | println!("cargo:rustc-link-arg=--import-undefined" ); |
| 18 | println!("cargo:rustc-link-arg=--max-memory=4294967296" ); |
| 19 | // lld only allocates 1MiB for the WebAssembly stack. |
| 20 | // 6400000 bytes = 64MiB |
| 21 | println!("cargo:rustc-link-arg=-zstack-size=6400000" ); |
| 22 | println!("cargo:rustc-link-arg=--no-check-features" ); |
| 23 | let rustc_path = env::var("RUSTC" ).expect("RUSTC must be set by Cargo" ); |
| 24 | let target = env::var("TARGET" ).expect("TARGET must be set by Cargo" ); |
| 25 | let crt_reactor_path = Path::new(&rustc_path) |
| 26 | .parent() |
| 27 | .and_then(|p| p.parent()) |
| 28 | .map_or_else( |
| 29 | || Path::new("" ).to_path_buf(), |
| 30 | |p| { |
| 31 | p.join("lib" ) |
| 32 | .join("rustlib" ) |
| 33 | .join(target) |
| 34 | .join("lib" ) |
| 35 | .join("self-contained" ) |
| 36 | .join("crt1-reactor.o" ) |
| 37 | }, |
| 38 | ); |
| 39 | if crt_reactor_path.exists() { |
| 40 | println!("cargo:rustc-link-arg= {}" , crt_reactor_path.display()); |
| 41 | println!("cargo:rustc-link-arg=--export=_initialize" ); |
| 42 | } else { |
| 43 | println!( |
| 44 | "cargo:warning=crt1-reactor.o not found at {}, the multi-threaded runtime may not be initialized correctly" , |
| 45 | crt_reactor_path.display() |
| 46 | ); |
| 47 | } |
| 48 | if let Ok(setjmp_link_dir) = env::var("SETJMP_LINK_DIR" ) { |
| 49 | println!("cargo:rustc-link-search= {setjmp_link_dir}" ); |
| 50 | println!("cargo:rustc-link-lib=static=setjmp-mt" ); |
| 51 | } |
| 52 | if let Ok(wasi_sdk_path) = env::var("WASI_SDK_PATH" ) { |
| 53 | println!( |
| 54 | "cargo:rustc-link-search= {wasi_sdk_path}/share/wasi-sysroot/lib/wasm32-wasip1-threads" |
| 55 | ); |
| 56 | } |
| 57 | } |
| 58 | |