From bc9b40a4444f34e8367b335f5626e86e01e905cc Mon Sep 17 00:00:00 2001 From: Nazar Mishturak Date: Tue, 18 Aug 2020 01:33:50 +0300 Subject: [PATCH] Add support for linking to winsqlite3 Signed-off-by: Nazar Mishturak --- Cargo.toml | 1 + libsqlite3-sys/Cargo.toml | 2 ++ libsqlite3-sys/build.rs | 37 +++++++++++++++++++++++++++++++++++++ libsqlite3-sys/wrapper.h | 4 ++++ 4 files changed, 44 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 01c4d05..2e1dec0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ bundled-windows = ["libsqlite3-sys/bundled-windows"] with-asan = ["libsqlite3-sys/with-asan"] column_decltype = [] wasm32-wasi-vfs = ["libsqlite3-sys/wasm32-wasi-vfs"] +winsqlite3 = ["libsqlite3-sys/winsqlite3"] # Helper feature for enabling both `bundled` and most non-build-related optional # features or dependencies. This is useful for running tests / clippy / etc. New diff --git a/libsqlite3-sys/Cargo.toml b/libsqlite3-sys/Cargo.toml index b224f5c..6fe2659 100644 --- a/libsqlite3-sys/Cargo.toml +++ b/libsqlite3-sys/Cargo.toml @@ -33,6 +33,8 @@ session = ["preupdate_hook", "buildtime_bindgen"] in_gecko = [] with-asan = [] wasm32-wasi-vfs = [] +# lowest version shipped with Windows 10.0.10586 was 3.8.8.3 +winsqlite3 = ["min_sqlite_version_3_7_16"] [build-dependencies] bindgen = { version = "0.55", optional = true, default-features = false, features = ["runtime"] } diff --git a/libsqlite3-sys/build.rs b/libsqlite3-sys/build.rs index 8b1927b..6535c50 100644 --- a/libsqlite3-sys/build.rs +++ b/libsqlite3-sys/build.rs @@ -245,6 +245,11 @@ mod build_linked { // on is available, for example. println!("cargo:link-target={}", link_lib); + if cfg!(all(windows, feature = "winsqlite3")) { + println!("cargo:rustc-link-lib=dylib={}", link_lib); + return HeaderLocation::Wrapper; + } + // Allow users to specify where to find SQLite. if let Ok(dir) = env::var(format!("{}_LIB_DIR", env_prefix())) { // Try to use pkg-config to determine link commands @@ -306,6 +311,8 @@ mod build_linked { fn link_lib() -> &'static str { if cfg!(feature = "sqlcipher") { "sqlcipher" + } else if cfg!(all(windows, feature = "winsqlite3")) { + "winsqlite3" } else { "sqlite3" } @@ -386,6 +393,36 @@ mod bindings { if cfg!(feature = "session") { bindings = bindings.clang_arg("-DSQLITE_ENABLE_SESSION"); } + if cfg!(all(windows, feature = "winsqlite3")) { + bindings = bindings + .clang_arg("-DBINDGEN_USE_WINSQLITE3") + .blacklist_item("NTDDI_.+") + .blacklist_item("WINAPI_FAMILY.*") + .blacklist_item("_WIN32_.+") + .blacklist_item("_VCRT_COMPILER_PREPROCESSOR") + .blacklist_item("_SAL_VERSION") + .blacklist_item("__SAL_H_VERSION") + .blacklist_item("_USE_DECLSPECS_FOR_SAL") + .blacklist_item("_USE_ATTRIBUTES_FOR_SAL") + .blacklist_item("_CRT_PACKING") + .blacklist_item("_HAS_EXCEPTIONS") + .blacklist_item("_STL_LANG") + .blacklist_item("_HAS_CXX17") + .blacklist_item("_HAS_CXX20") + .blacklist_item("_HAS_NODISCARD") + .blacklist_item("WDK_NTDDI_VERSION") + .blacklist_item("OSVERSION_MASK") + .blacklist_item("SPVERSION_MASK") + .blacklist_item("SUBVERSION_MASK") + .blacklist_item("WINVER") + .blacklist_item("__security_cookie") + .blacklist_type("size_t") + .blacklist_type("__vcrt_bool") + .blacklist_type("wchar_t") + .blacklist_function("__security_init_cookie") + .blacklist_function("__report_gsfailure") + .blacklist_function("__va_start"); + } // When cross compiling unless effort is taken to fix the issue, bindgen // will find the wrong headers. There's only one header included by the diff --git a/libsqlite3-sys/wrapper.h b/libsqlite3-sys/wrapper.h index b5e2c60..ecbcc44 100644 --- a/libsqlite3-sys/wrapper.h +++ b/libsqlite3-sys/wrapper.h @@ -1 +1,5 @@ +#ifdef BINDGEN_USE_WINSQLITE3 +#include +#else #include "sqlite3.h" +#endif