diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..876130392 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "gdal-src/source"] + path = gdal-src/source + url = https://github.com/OSGeo/gdal diff --git a/Cargo.toml b/Cargo.toml index 0c0ef3c1d..11963eaa3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ tempfile = "3.8" arrow2 = "0.18" [workspace] -members = ["gdal-sys"] +members = [ "gdal-src","gdal-sys"] # docs.rs-specific configuration [package.metadata.docs.rs] @@ -44,3 +44,9 @@ members = ["gdal-sys"] features = ["array"] # define attribute `docsrs` for feature badges rustdoc-args = ["--cfg", "docsrs"] + + +[patch.crates-io] +proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "73797d3b4601b5770b16f0e1cdb656d51295b471" } +libsqlite3-sys = { git = "https://github.com/GiGainfosystems/rusqlite/", rev = "e60d993" } + diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml new file mode 100644 index 000000000..6267432cf --- /dev/null +++ b/gdal-src/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "gdal-src" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +proj-sys = { version = "0.23.2", features = ["bundled_proj"] } +libsqlite3-sys = { version = "0.27.0", features = ["bundled"] } + +[build-dependencies] +cmake = "0.1.50" diff --git a/gdal-src/build.rs b/gdal-src/build.rs new file mode 100644 index 000000000..3e1207aa2 --- /dev/null +++ b/gdal-src/build.rs @@ -0,0 +1,34 @@ +fn main() { + let sqlite3_include_dir = + std::env::var("DEP_SQLITE3_INCLUDE").expect("This is set by libsqlite3-sys"); + let sqlite3_lib_dir = std::env::var("DEP_SQLITE3_LIB_DIR").expect("set by libsqlite3-sys"); + let proj_root = std::env::var("DEP_PROJ_ROOT").expect("set by proj-sys"); + + let res = cmake::Config::new("source") + .define("GDAL_BUILD_OPTIONAL_DRIVERS", "OFF") + .define("OGR_BUILD_OPTIONAL_DRIVERS", "OFF") + .define("GDAL_USE_INTERNAL_LIBS", "ON") + .define("GDAL_USE_EXTERNAL_LIBS", "OFF") + .define("BUILD_SHARED_LIBS", "OFF") + .define("BUILD_STATIC_LIBS", "ON") + .define("BUILD_APPS", "OFF") + .define("BUILD_DOCS", "OFF") + .define("BUILD_TESTING", "OFF") + .define("BUILD_GMOCK", "OFF") + .define("PROJ_INCLUDE_DIRS", format!("{proj_root}/include")) + .define("PROJ_LIBRARY_DIRS", format!("{proj_root}/lib64/")) + // enable the gpkg driver + .define("GDAL_USE_SQLITE3", "ON") + .define("SQLite3_INCLUDE_DIR", sqlite3_include_dir) + .define("SQLite3_LIBRARY", format!("{sqlite3_lib_dir}/libsqlite3.a")) + .define("OGR_ENABLE_DRIVER_GPKG", "ON") + .pic(true) + .build(); + let lib_dir = res.join("lib64"); + + println!("cargo:rustc-link-lib=static={}", "gdal"); + println!( + "cargo:rustc-link-search=native={}", + lib_dir.to_str().unwrap() + ); +} diff --git a/gdal-src/source b/gdal-src/source new file mode 160000 index 000000000..654f4907a --- /dev/null +++ b/gdal-src/source @@ -0,0 +1 @@ +Subproject commit 654f4907abbbf6bf4226d58a8c067d134eaf3ce9 diff --git a/gdal-src/src/lib.rs b/gdal-src/src/lib.rs new file mode 100644 index 000000000..b40735f84 --- /dev/null +++ b/gdal-src/src/lib.rs @@ -0,0 +1,2 @@ +extern crate libsqlite3_sys; +extern crate proj_sys; diff --git a/gdal-sys/Cargo.toml b/gdal-sys/Cargo.toml index 4a2cad506..8a16045ad 100644 --- a/gdal-sys/Cargo.toml +++ b/gdal-sys/Cargo.toml @@ -12,8 +12,14 @@ links="gdal" [dependencies] libc = "0.2" +gdal-src = { path = "../gdal-src/", optional = true} [build-dependencies] bindgen = { version = "0.69", optional = true } pkg-config = "0.3" semver = "1.0" + + +[features] +default = [] +bundled = ["dep:gdal-src"] diff --git a/gdal-sys/build.rs b/gdal-sys/build.rs index 0fccd63bc..c927a1288 100644 --- a/gdal-sys/build.rs +++ b/gdal-sys/build.rs @@ -68,7 +68,7 @@ fn main() { // Hardcode a prebuilt binding version while generating docs. // Otherwise docs.rs will explode due to not actually having libgdal installed. - if std::env::var("DOCS_RS").is_ok() { + if std::env::var("DOCS_RS").is_ok() || cfg!(feature = "bundled") { let version = Version::parse("3.8.0").expect("invalid version for docs.rs"); println!( "cargo:rustc-cfg=gdal_sys_{}_{}_{}", diff --git a/gdal-sys/src/lib.rs b/gdal-sys/src/lib.rs index 98d15c1b7..f8c611e1a 100644 --- a/gdal-sys/src/lib.rs +++ b/gdal-sys/src/lib.rs @@ -4,4 +4,7 @@ #![allow(clippy::upper_case_acronyms)] #![allow(rustdoc::bare_urls)] +#[cfg(feature = "bundled")] +extern crate gdal_src; + include!(concat!(env!("OUT_DIR"), "/bindings.rs"));