From 97f041d6be08f7be317baa5f5b8a61394e511859 Mon Sep 17 00:00:00 2001 From: Simon Choi <13610195+simc@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:48:33 +0100 Subject: [PATCH] wasm --- libsqlite3-sys/Cargo.toml | 4 +++ libsqlite3-sys/build.rs | 72 +++++++++++++++++++++++++++++++-------- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/libsqlite3-sys/Cargo.toml b/libsqlite3-sys/Cargo.toml index e926668..1ec8f50 100644 --- a/libsqlite3-sys/Cargo.toml +++ b/libsqlite3-sys/Cargo.toml @@ -43,6 +43,10 @@ winsqlite3 = [] [dependencies] openssl-sys = { version = "0.9", optional = true } +[target.wasm32-unknown-unknown.dependencies] +compiler-rt-builtins = "0.1" +wasm32-unknown-unknown-openbsd-libc = "0.2" + [build-dependencies] bindgen = { version = "0.66", optional = true, default-features = false, features = ["runtime"] } pkg-config = { version = "0.3.19", optional = true } diff --git a/libsqlite3-sys/build.rs b/libsqlite3-sys/build.rs index e3aefad..159c2c4 100644 --- a/libsqlite3-sys/build.rs +++ b/libsqlite3-sys/build.rs @@ -115,22 +115,15 @@ mod build_bundled { .flag("-DSQLITE_CORE") .flag("-DSQLITE_DEFAULT_FOREIGN_KEYS=1") .flag("-DSQLITE_ENABLE_API_ARMOR") - .flag("-DSQLITE_ENABLE_COLUMN_METADATA") - .flag("-DSQLITE_ENABLE_DBSTAT_VTAB") - .flag("-DSQLITE_ENABLE_FTS3") - .flag("-DSQLITE_ENABLE_FTS3_PARENTHESIS") - .flag("-DSQLITE_ENABLE_FTS5") - .flag("-DSQLITE_ENABLE_JSON1") - .flag("-DSQLITE_ENABLE_LOAD_EXTENSION=1") - .flag("-DSQLITE_ENABLE_MEMORY_MANAGEMENT") - .flag("-DSQLITE_ENABLE_RTREE") - .flag("-DSQLITE_ENABLE_STAT2") - .flag("-DSQLITE_ENABLE_STAT4") - .flag("-DSQLITE_SOUNDEX") .flag("-DSQLITE_THREADSAFE=1") .flag("-DSQLITE_USE_URI") - .flag("-DHAVE_USLEEP=1") .flag("-D_POSIX_THREAD_SAFE_FUNCTIONS") // cross compile with MinGW + .flag("-DSQLITE_DEFAULT_MEMSTATUS=0") + .flag("-DSQLITE_MAX_EXPR_DEPTH=0") + .flag("-DSQLITE_OMIT_DECLTYPE") + .flag("-DSQLITE_OMIT_DEPRECATED") + .flag("-DSQLITE_OMIT_PROGRESS_CALLBACK") + .flag("-DSQLITE_LIKE_DOESNT_MATCH_BLOBS") .warnings(false); if cfg!(feature = "bundled-sqlcipher") { @@ -234,7 +227,7 @@ mod build_bundled { if vs_has_nan { cfg.flag("-DHAVE_ISNAN"); } - } else { + } else if env::var("TARGET") != Ok("wasm32-unknown-unknown".to_string()) { cfg.flag("-DHAVE_ISNAN"); } if !win_target() { @@ -249,6 +242,57 @@ mod build_bundled { cfg.file("sqlite3/wasm32-wasi-vfs.c"); } } + if env::var("TARGET") == Ok("wasm32-unknown-unknown".to_string()) { + // Apple clang doesn't support wasm32, so use Homebrew clang by default. + if env::var("HOST") == Ok("x86_64-apple-darwin".to_string()) { + if env::var("CC").is_err() { + std::env::set_var("CC", "/usr/local/opt/llvm/bin/clang"); + } + if env::var("AR").is_err() { + std::env::set_var("AR", "/usr/local/opt/llvm/bin/llvm-ar"); + } + } else if env::var("HOST") == Ok("aarch64-apple-darwin".to_string()) { + if env::var("CC").is_err() { + std::env::set_var("CC", "/opt/homebrew/opt/llvm/bin/clang"); + } + if env::var("AR").is_err() { + std::env::set_var("AR", "/opt/homebrew/opt/llvm/bin/llvm-ar"); + } + } + + cfg.flag("-DSQLITE_OS_OTHER") + .flag("-DSQLITE_TEMP_STORE=3") + .flag("-DSQLITE_OMIT_LOCALTIME") + .flag("-Wno-incompatible-library-redeclaration"); + + let supported_features = [ + "atomics", + "bulk-memory", + "exception-handling", + "multivalue", + "mutable-globals", + "nontrapping-fptoint", + "reference-types", + "relaxed-simd", + "sign-ext", + "simd128", + ]; + for feature in env::var("CARGO_CFG_TARGET_FEATURE") + .unwrap_or_default() + .split(',') + { + if supported_features.contains(&feature) { + cfg.flag(&format!("-m{feature}")); + } + } + + cfg.include( + std::env::var_os("DEP_WASM32_UNKNOWN_UNKNOWN_OPENBSD_LIBC_INCLUDE").unwrap(), + ); + + println!("cargo:rustc-link-lib=compiler-rt-builtins"); + println!("cargo:rustc-link-lib=wasm32-unknown-unknown-openbsd-libc"); + } if cfg!(feature = "unlock_notify") { cfg.flag("-DSQLITE_ENABLE_UNLOCK_NOTIFY"); }