mirror of
				https://github.com/isar/rusqlite.git
				synced 2025-11-04 08:08:55 +08:00 
			
		
		
		
	Add support for linking to SQLCipher
This commit is contained in:
		@@ -1,4 +1,5 @@
 | 
				
			|||||||
sudo: false
 | 
					sudo: false
 | 
				
			||||||
 | 
					dist: trusty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
language: rust
 | 
					language: rust
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -13,12 +14,10 @@ matrix:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
addons:
 | 
					addons:
 | 
				
			||||||
  apt:
 | 
					  apt:
 | 
				
			||||||
    sources:
 | 
					 | 
				
			||||||
      - llvm-toolchain-precise-3.9
 | 
					 | 
				
			||||||
      - ubuntu-toolchain-r-test
 | 
					 | 
				
			||||||
    packages: # recommanded versions for rust-bindgen
 | 
					    packages: # recommanded versions for rust-bindgen
 | 
				
			||||||
      - llvm-3.9-dev
 | 
					      - llvm-3.9-dev
 | 
				
			||||||
      - libclang-3.9-dev
 | 
					      - libclang-3.9-dev
 | 
				
			||||||
 | 
					      - libsqlcipher-dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
env: # specify the clang path for rust-bindgen
 | 
					env: # specify the clang path for rust-bindgen
 | 
				
			||||||
  - LIBCLANG_PATH=/usr/lib/llvm-3.9/lib
 | 
					  - LIBCLANG_PATH=/usr/lib/llvm-3.9/lib
 | 
				
			||||||
@@ -26,6 +25,7 @@ env: # specify the clang path for rust-bindgen
 | 
				
			|||||||
script:
 | 
					script:
 | 
				
			||||||
  - cargo build
 | 
					  - cargo build
 | 
				
			||||||
  - cargo build --features bundled
 | 
					  - cargo build --features bundled
 | 
				
			||||||
 | 
					  - cargo build --features sqlcipher
 | 
				
			||||||
  - cargo test
 | 
					  - cargo test
 | 
				
			||||||
  - cargo test --features backup
 | 
					  - cargo test --features backup
 | 
				
			||||||
  - cargo test --features blob
 | 
					  - cargo test --features blob
 | 
				
			||||||
@@ -36,6 +36,7 @@ script:
 | 
				
			|||||||
  - cargo test --features chrono
 | 
					  - cargo test --features chrono
 | 
				
			||||||
  - cargo test --features serde_json
 | 
					  - cargo test --features serde_json
 | 
				
			||||||
  - cargo test --features bundled
 | 
					  - cargo test --features bundled
 | 
				
			||||||
 | 
					  - cargo test --features sqlcipher
 | 
				
			||||||
  - cargo test --features "backup blob chrono functions limits load_extension serde_json trace"
 | 
					  - cargo test --features "backup blob chrono functions limits load_extension serde_json trace"
 | 
				
			||||||
  - cargo test --features "backup blob chrono functions limits load_extension serde_json trace buildtime_bindgen"
 | 
					  - cargo test --features "backup blob chrono functions limits load_extension serde_json trace buildtime_bindgen"
 | 
				
			||||||
  - cargo test --features "backup blob chrono functions limits load_extension serde_json trace bundled"
 | 
					  - cargo test --features "backup blob chrono functions limits load_extension serde_json trace bundled"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ trace = ["libsqlite3-sys/min_sqlite_version_3_6_23"]
 | 
				
			|||||||
bundled = ["libsqlite3-sys/bundled"]
 | 
					bundled = ["libsqlite3-sys/bundled"]
 | 
				
			||||||
buildtime_bindgen = ["libsqlite3-sys/buildtime_bindgen"]
 | 
					buildtime_bindgen = ["libsqlite3-sys/buildtime_bindgen"]
 | 
				
			||||||
limits = []
 | 
					limits = []
 | 
				
			||||||
 | 
					sqlcipher = ["libsqlite3-sys/sqlcipher"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
time = "0.1.0"
 | 
					time = "0.1.0"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,13 +7,14 @@ description = "Native bindings to the libsqlite3 library"
 | 
				
			|||||||
license = "MIT"
 | 
					license = "MIT"
 | 
				
			||||||
links = "sqlite3"
 | 
					links = "sqlite3"
 | 
				
			||||||
build = "build.rs"
 | 
					build = "build.rs"
 | 
				
			||||||
keywords = ["sqlite", "database", "ffi"]
 | 
					keywords = ["sqlite", "sqlcipher", "database", "ffi"]
 | 
				
			||||||
categories = ["database", "external-ffi-bindings"]
 | 
					categories = ["database", "external-ffi-bindings"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[features]
 | 
					[features]
 | 
				
			||||||
default = ["min_sqlite_version_3_6_8"]
 | 
					default = ["min_sqlite_version_3_6_8"]
 | 
				
			||||||
bundled = ["gcc"]
 | 
					bundled = ["gcc"]
 | 
				
			||||||
buildtime_bindgen = ["bindgen", "pkg-config", "vcpkg"]
 | 
					buildtime_bindgen = ["bindgen", "pkg-config", "vcpkg"]
 | 
				
			||||||
 | 
					sqlcipher = []
 | 
				
			||||||
min_sqlite_version_3_6_8 = ["pkg-config", "vcpkg"]
 | 
					min_sqlite_version_3_6_8 = ["pkg-config", "vcpkg"]
 | 
				
			||||||
min_sqlite_version_3_6_11 = ["pkg-config", "vcpkg"]
 | 
					min_sqlite_version_3_6_11 = ["pkg-config", "vcpkg"]
 | 
				
			||||||
min_sqlite_version_3_6_23 = ["pkg-config", "vcpkg"]
 | 
					min_sqlite_version_3_6_23 = ["pkg-config", "vcpkg"]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,10 @@ mod build {
 | 
				
			|||||||
    use std::path::Path;
 | 
					    use std::path::Path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn main() {
 | 
					    pub fn main() {
 | 
				
			||||||
 | 
					        if cfg!(feature = "sqlcipher") {
 | 
				
			||||||
 | 
					            panic!("Builds with bundled SQLCipher are not supported");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let out_dir = env::var("OUT_DIR").unwrap();
 | 
					        let out_dir = env::var("OUT_DIR").unwrap();
 | 
				
			||||||
        let out_path = Path::new(&out_dir).join("bindgen.rs");
 | 
					        let out_path = Path::new(&out_dir).join("bindgen.rs");
 | 
				
			||||||
        fs::copy("sqlite3/bindgen_bundled_version.rs", out_path)
 | 
					        fs::copy("sqlite3/bindgen_bundled_version.rs", out_path)
 | 
				
			||||||
@@ -58,8 +62,9 @@ mod build {
 | 
				
			|||||||
        fn from(header: HeaderLocation) -> String {
 | 
					        fn from(header: HeaderLocation) -> String {
 | 
				
			||||||
            match header {
 | 
					            match header {
 | 
				
			||||||
                HeaderLocation::FromEnvironment => {
 | 
					                HeaderLocation::FromEnvironment => {
 | 
				
			||||||
                    let mut header = env::var("SQLITE3_INCLUDE_DIR")
 | 
					                    let prefix = env_prefix();
 | 
				
			||||||
                        .expect("SQLITE3_INCLUDE_DIR must be set if SQLITE3_LIB_DIR is set");
 | 
					                    let mut header = env::var(format!("{}_INCLUDE_DIR", prefix))
 | 
				
			||||||
 | 
					                        .expect(&format!("{}_INCLUDE_DIR must be set if {}_LIB_DIR is set", prefix, prefix));
 | 
				
			||||||
                    header.push_str("/sqlite3.h");
 | 
					                    header.push_str("/sqlite3.h");
 | 
				
			||||||
                    header
 | 
					                    header
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -76,9 +81,11 @@ mod build {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Prints the necessary cargo link commands and returns the path to the header.
 | 
					    // Prints the necessary cargo link commands and returns the path to the header.
 | 
				
			||||||
    fn find_sqlite() -> HeaderLocation {
 | 
					    fn find_sqlite() -> HeaderLocation {
 | 
				
			||||||
 | 
					        let link_lib = link_lib();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Allow users to specify where to find SQLite.
 | 
					        // Allow users to specify where to find SQLite.
 | 
				
			||||||
        if let Ok(dir) = env::var("SQLITE3_LIB_DIR") {
 | 
					        if let Ok(dir) = env::var(format!("{}_LIB_DIR", env_prefix())) {
 | 
				
			||||||
            println!("cargo:rustc-link-lib=sqlite3");
 | 
					            println!("cargo:rustc-link-lib={}", link_lib);
 | 
				
			||||||
            println!("cargo:rustc-link-search={}", dir);
 | 
					            println!("cargo:rustc-link-search={}", dir);
 | 
				
			||||||
            return HeaderLocation::FromEnvironment;
 | 
					            return HeaderLocation::FromEnvironment;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -88,7 +95,7 @@ mod build {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // See if pkg-config can do everything for us.
 | 
					        // See if pkg-config can do everything for us.
 | 
				
			||||||
        match pkg_config::Config::new().print_system_libs(false).probe("sqlite3") {
 | 
					        match pkg_config::Config::new().print_system_libs(false).probe(link_lib) {
 | 
				
			||||||
            Ok(mut lib) => {
 | 
					            Ok(mut lib) => {
 | 
				
			||||||
                if let Some(mut header) = lib.include_paths.pop() {
 | 
					                if let Some(mut header) = lib.include_paths.pop() {
 | 
				
			||||||
                    header.push("sqlite3.h");
 | 
					                    header.push("sqlite3.h");
 | 
				
			||||||
@@ -102,7 +109,7 @@ mod build {
 | 
				
			|||||||
                // request and hope that the library exists on the system paths. We used to
 | 
					                // request and hope that the library exists on the system paths. We used to
 | 
				
			||||||
                // output /usr/lib explicitly, but that can introduce other linking problems; see
 | 
					                // output /usr/lib explicitly, but that can introduce other linking problems; see
 | 
				
			||||||
                // https://github.com/jgallagher/rusqlite/issues/207.
 | 
					                // https://github.com/jgallagher/rusqlite/issues/207.
 | 
				
			||||||
                println!("cargo:rustc-link-lib=sqlite3");
 | 
					                println!("cargo:rustc-link-lib={}", link_lib);
 | 
				
			||||||
                HeaderLocation::Wrapper
 | 
					                HeaderLocation::Wrapper
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -111,7 +118,7 @@ mod build {
 | 
				
			|||||||
    #[cfg(all(feature = "vcpkg", target_env = "msvc"))]
 | 
					    #[cfg(all(feature = "vcpkg", target_env = "msvc"))]
 | 
				
			||||||
    fn try_vcpkg() -> Option<HeaderLocation> {
 | 
					    fn try_vcpkg() -> Option<HeaderLocation> {
 | 
				
			||||||
        // See if vcpkg can find it.
 | 
					        // See if vcpkg can find it.
 | 
				
			||||||
        if let Ok(mut lib) = vcpkg::Config::new().probe("sqlite3") {
 | 
					        if let Ok(mut lib) = vcpkg::Config::new().probe(link_lib()) {
 | 
				
			||||||
            if let Some(mut header) = lib.include_paths.pop() {
 | 
					            if let Some(mut header) = lib.include_paths.pop() {
 | 
				
			||||||
                header.push("sqlite3.h");
 | 
					                header.push("sqlite3.h");
 | 
				
			||||||
                return Some(HeaderLocation::FromPath(header.to_string_lossy().into()));
 | 
					                return Some(HeaderLocation::FromPath(header.to_string_lossy().into()));
 | 
				
			||||||
@@ -125,6 +132,22 @@ mod build {
 | 
				
			|||||||
        None
 | 
					        None
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn env_prefix() -> &'static str {
 | 
				
			||||||
 | 
					        if cfg!(feature = "sqlcipher") {
 | 
				
			||||||
 | 
					            "SQLCIPHER"
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            "SQLITE3"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn link_lib() -> &'static str {
 | 
				
			||||||
 | 
					        if cfg!(feature = "sqlcipher") {
 | 
				
			||||||
 | 
					            "sqlcipher"
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            "sqlite3"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[cfg(not(feature = "buildtime_bindgen"))]
 | 
					    #[cfg(not(feature = "buildtime_bindgen"))]
 | 
				
			||||||
    mod bindings {
 | 
					    mod bindings {
 | 
				
			||||||
        use super::HeaderLocation;
 | 
					        use super::HeaderLocation;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user