From 840735ed860d7ed81bc7a09acb4dbf2ae0f576ec Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Thu, 25 Jan 2024 14:07:51 +0100 Subject: [PATCH 01/22] Provide a bundled flag for `gdal-sys` This commit introduces a new `gdal-src` crate which bundles gdal and builds by default a minimal version from source via `build.rs`. It exposes feature flags for many drivers and adds the neccesary dependencies to keep the build fully static. Fixes #465 --- .gitmodules | 4 + CHANGES.md | 3 + Cargo.toml | 6 +- gdal-src/Cargo.toml | 329 +++++++++++++++++++++++++++++++++++++++++ gdal-src/build.rs | 351 ++++++++++++++++++++++++++++++++++++++++++++ gdal-src/source | 1 + gdal-src/src/lib.rs | 15 ++ gdal-sys/Cargo.toml | 6 + gdal-sys/build.rs | 2 +- gdal-sys/src/lib.rs | 3 + 10 files changed, 718 insertions(+), 2 deletions(-) create mode 100644 .gitmodules create mode 100644 gdal-src/Cargo.toml create mode 100644 gdal-src/build.rs create mode 160000 gdal-src/source create mode 100644 gdal-src/src/lib.rs diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..6a97e1191 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "gdal-src/source"] + path = gdal-src/source + url = https://github.com/OSGeo/gdal + rev = 654f4907abbbf6bf4226d58a8c067d134eaf3ce9 diff --git a/CHANGES.md b/CHANGES.md index 09d57c495..ac0b75e25 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ ## Unreleased +- Add a `bundled` feature for `gdal-sys` that allows to build and statically link a minimal bundled version of gdal during `cargo build` + - Added pre-built bindings for GDAL 3.9 - @@ -83,6 +85,7 @@ - + - Added `{Display|FromStr} for ResampleAlg` and `ResampleAlg::iter`. - diff --git a/Cargo.toml b/Cargo.toml index cbb41291b..64e235a16 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ tempfile = "3.8" arrow = { version = "52.0", default-features = false, features = ["ffi"] } [workspace] -members = ["gdal-sys"] +members = ["gdal-src", "gdal-sys"] # docs.rs-specific configuration [package.metadata.docs.rs] @@ -44,3 +44,7 @@ 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 = "dc67b5afc17bc7d330371e4406dffd65cf9321cd" } diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml new file mode 100644 index 000000000..0b3c39416 --- /dev/null +++ b/gdal-src/Cargo.toml @@ -0,0 +1,329 @@ +[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] +link-cplusplus = "1.0" +proj-sys = { version = "0.23.2", features = ["bundled_proj"] } +libsqlite3-sys = { version = "0.28.0", features = ["bundled"], optional = true } +hdf5-src = { version = "0.8.1", optional = true, features = ["hl"] } +hdf5-sys = { version = "0.8.1", optional = true, features = ["static"] } +netcdf-src = { version = "0.3.2", optional = true } +pq-src = { version = "0.1.1", optional = true } +curl-sys = { version = "0.4.70", features = ["static-curl"], optional = true } +libz-sys = { version = "1.1.15", features = ["static"], optional = true } +geos-src = { version = "0.2.1", optional = true } +geos-sys = { version = "2", optional = true } + + +[build-dependencies] +cmake = "0.1.50" + +[features] +default = [] +enable_all_drivers = [ + "enable_all_internal", + "DRIVER_SQLITE", + "DRIVER_GPKG", + "DRIVER_VFK", + "DRIVER_HDF5", + "DRIVER_NETCDF", + "DRIVER_AMIGOCLOUD", + "DRIVER_CARTO", + "DRIVER_DAAS", + "DRIVER_EEDA", + "DRIVER_ELASTIC", + "DRIVER_NGW", + "DRIVER_OGCAPI", + "DRIVER_PLMOSAIC", + "DRIVER_WCS", + "DRIVER_WMS", + "DRIVER_WMTS", + "DRIVER_PG", + "DRIVER_POSTGIS_RASTER", +] + +# note that libgeos is LGPL licenced +# enabling this feature will means +# that you statically link libgeos and +# therefore makes your binary fall under +# LGPL as well +geos_static = ["geos-src", "geos"] +# as long as the `geos_static` feature +# is not enabled that will only +# dynamically link geos +geos = ["geos-sys"] + +enable_all_internal = [ + # ogr internal, + "DRIVER_AVC", + "DRIVER_CAD", + "DRIVER_CSV", + "DRIVER_DGN", + "DRIVER_DXF", + "DRIVER_EDIGEO", + "DRIVER_FLATGEOBUF", + "DRIVER_GEOCONCEPT", + "DRIVER_GEOJSON", + "DRIVER_GMT", + "DRIVER_GTFS", + "DRIVER_JSONFG", + "DRIVER_MAPML", + "DRIVER_OPENFILEGDB", + "DRIVER_PGDUMP", + "DRIVER_NTF", + "DRIVER_S57", + "DRIVER_SELAFIN", + "DRIVER_SHAPE", + "DRIVER_SXF", + "DRIVER_TAB", + "DRIVER_TIGER", + "DRIVER_VDV", + "DRIVER_WASP", + # gdal internal + "DRIVER_AAIGRID", + "DRIVER_ADRG", + "DRIVER_AIGRID", + "DRIVER_AIRSAR", + "DRIVER_BLX", + "DRIVER_BMP", + "DRIVER_BSB", + "DRIVER_CALS", + "DRIVER_CEOS", + "DRIVER_COASP", + "DRIVER_COSAR", + "DRIVER_CTG", + "DRIVER_DIMAP", + "DRIVER_DTED", + "DRIVER_ELAS", + "DRIVER_ENVISAT", + "DRIVER_ERS", + "DRIVER_FIT", + "DRIVER_GFF", + "DRIVER_GIF", + "DRIVER_GRIB", + "DRIVER_GSG", + "DRIVER_GTIFF", + "DRIVER_GXF", + "DRIVER_HF2", + "DRIVER_HFA", + "DRIVER_ILWIS", + "DRIVER_IRIS", + "DRIVER_JAXAPALSAR", + "DRIVER_JDEM", + "DRIVER_JPEG", + "DRIVER_KMLSUPEROVERLAY", + "DRIVER_L1B", + "DRIVER_LEVELLER", + "DRIVER_MAP", + "DRIVER_MRF", + "DRIVER_MSGN", + "DRIVER_NGSGEOID", + "DRIVER_NIFT", + "DRIVER_NORTHWOOD", + "DRIVER_OZI", + "DRIVER_PCIDSK", + "DRIVER_PCRASTER", + "DRIVER_PNG", + "DRIVER_PRF", + "DRIVER_R", + "DRIVER_RAW", + "DRIVER_RIK", + "DRIVER_RMF", + "DRIVER_RS2", + "DRIVER_SAFE", + "DRIVER_SAGA", + "DRIVER_SAR_CEOS", + "DRIVER_SENTINEL2", + "DRIVER_SGI", + "DRIVER_SIGDEM", + "DRIVER_SRTMHGT", + "DRIVER_STACIT", + "DRIVER_STACTA", + "DRIVER_TERRAGEN", + "DRIVER_TGA", + "DRIVER_TIL", + "DRIVER_TSX", + "DRIVER_USGSDEM", + "DRIVER_XPM", + "DRIVER_XYZ", + "DRIVER_ZMAP", + + # ogr and gdal + "DRIVER_IDRISI", + "DRIVER_PDS", + "DRIVER_SDTS", + "DRIVER_VRT", + "DRIVER_MEM", +] + +# ogr internal +DRIVER_AVC = [] +DRIVER_CAD = [] +DRIVER_CSV = [] +DRIVER_DGN = [] +DRIVER_DXF = [] +DRIVER_EDIGEO = [] +DRIVER_FLATGEOBUF = [] +DRIVER_GEOCONCEPT = [] +DRIVER_GEOJSON = [] +DRIVER_GMT = [] +DRIVER_GTFS = [] +DRIVER_JSONFG = [] +DRIVER_MAPML = [] +DRIVER_OPENFILEGDB = [] +DRIVER_PGDUMP = [] +DRIVER_NTF = [] +DRIVER_S57 = [] +DRIVER_SELAFIN = [] +DRIVER_SHAPE = [] +DRIVER_SXF = [] +DRIVER_TAB = [] +DRIVER_TIGER = [] +DRIVER_VDV = [] +DRIVER_WASP = [] + +#gdal internal +DRIVER_AAIGRID = [] +DRIVER_ADRG = [] +DRIVER_AIGRID = [] +DRIVER_AIRSAR = [] +DRIVER_BLX = [] +DRIVER_BMP = [] +DRIVER_BSB = [] +DRIVER_CALS = [] +DRIVER_CEOS = [] +DRIVER_COASP = [] +DRIVER_COSAR = [] +DRIVER_CTG = [] +DRIVER_DIMAP = [] +DRIVER_DTED = [] +DRIVER_ELAS = [] +DRIVER_ENVISAT =[] +DRIVER_ERS = [] +DRIVER_FIT = [] +DRIVER_GFF = [] +DRIVER_GIF = [] +DRIVER_GRIB = [] +DRIVER_GSG = [] +DRIVER_GTIFF = [] +DRIVER_GXF = [] +DRIVER_HF2 = [] +DRIVER_HFA = [] +DRIVER_ILWIS = [] +DRIVER_IRIS = [] +DRIVER_JAXAPALSAR = [] +DRIVER_JDEM = [] +DRIVER_JPEG = [] +DRIVER_KMLSUPEROVERLAY = [] +DRIVER_L1B = [] +DRIVER_LEVELLER = [] +DRIVER_MAP = [] +DRIVER_MRF = [] +DRIVER_MSGN = [] +DRIVER_NGSGEOID = [] +DRIVER_NIFT = [] +DRIVER_NORTHWOOD = [] +DRIVER_OZI = [] +DRIVER_PCIDSK = [] +DRIVER_PCRASTER = [] +DRIVER_PNG = [] +DRIVER_PRF = [] +DRIVER_R = [] +DRIVER_RAW = [] +DRIVER_RIK = [] +DRIVER_RMF = [] +DRIVER_RS2 = [] +DRIVER_SAFE = [] +DRIVER_SAGA = [] +DRIVER_SAR_CEOS = [] +DRIVER_SENTINEL2 = [] +DRIVER_SGI = [] +DRIVER_SIGDEM = [] +DRIVER_SRTMHGT = [] +DRIVER_STACIT = [] +DRIVER_STACTA = [] +DRIVER_TERRAGEN = [] +DRIVER_TGA = [] +DRIVER_TIL = [] +DRIVER_TSX = [] +DRIVER_USGSDEM = [] +DRIVER_XPM = [] +DRIVER_XYZ = [] +DRIVER_ZMAP = [] + +# ogr and gdal +DRIVER_IDRISI = [] +DRIVER_PDS = [] +DRIVER_SDTS = [] +DRIVER_VRT = [] +DRIVER_MEM = [] + +# external + +# sqlite +DRIVER_SQLITE = ["dep:libsqlite3-sys"] +DRIVER_GPKG = ["DRIVER_SQLITE"] +DRIVER_VFK = ["DRIVER_SQLITE"] +DRIVER_RASTERLITE = [] # unclear how to handle that + +# curl +DRIVER_AMIGOCLOUD = ["curl-sys"] +DRIVER_CARTO = ["curl-sys"] +DRIVER_DAAS = ["curl-sys"] +DRIVER_EEDA = ["curl-sys"] +DRIVER_ELASTIC = ["curl-sys"] +DRIVER_NGW = ["curl-sys"] + +DRIVER_OGCAPI = ["curl-sys"] +DRIVER_PLMOSAIC = ["curl-sys"] +DRIVER_WCS = ["curl-sys"] +DRIVER_WMS = ["curl-sys"] +DRIVER_WMTS = ["curl-sys"] + +# libexpat +# (there exists no expat-sys crate) +# DRIVER_GEORSS = [] +# DRIVER_GML = [] +# DRIVER_GPSBABEL = [] +# DRIVER_GPX = [] +# DRIVER_JML = [] +# DRIVER_KML = [] +# DRIVER_LVBAG = [] +# DRIVER_ODS = [] +# DRIVER_SVG = [] +# DRIVER_XLSX = [] + +# libmysqlclient +# (there is currently no bundling support in libmysqlclient) +# DRIVER_MYSQL = [] + +# libpq +DRIVER_PG = ["dep:pq-src"] +DRIVER_POSTGIS_RASTER = ["DRIVER_PG"] + +# libhdf5 +DRIVER_HDF5 = ["dep:hdf5-src", "dep:libz-sys"] + +# libnetcdf +DRIVER_NETCDF = ["dep:netcdf-src", "DRIVER_HDF5", "dep:hdf5-sys"] + +# poppler +#DRIVER_PDF = [] + +# combined +# these miss at least one dependency +# DRIVER_MVT = [] # requires sqlite + geos +# DRIVER_OSM = [] # requires sqlite + libexpat +# DRIVER_ZARR = [] # requires liblz4, libxz, libzstd and libblocs +# DRIVER_MBTILES = ["DRIVER_SQLITE", "DRIVER_MVT"] # also requires mvt (so geos) +# DRIVER_PMTILES = ["DRIVER_MVT"] # depends on driver_mvt +# DRIVER_CSW = ["curl-sys", "DRIVER_GML"] # depends on gml driver +# DRIVER_WFS = ["curl-sys", "DRIVER_GML"] + +# unclear +DRIVER_HTTP = [] +DRIVER_ARG = [] diff --git a/gdal-src/build.rs b/gdal-src/build.rs new file mode 100644 index 000000000..6468e8a54 --- /dev/null +++ b/gdal-src/build.rs @@ -0,0 +1,351 @@ +macro_rules! handle_ogr_driver { + ($config: ident, $driver: literal) => { + if cfg!(feature = $driver) { + $config.define(concat!("OGR_ENABLE_", $driver), "ON"); + } else { + $config.define(concat!("OGR_ENABLE_", $driver), "OFF"); + } + }; +} + +macro_rules! handle_gdal_driver { + ($config: ident, $driver: literal) => { + if cfg!(feature = $driver) { + $config.define(concat!("GDAL_ENABLE_", $driver), "ON"); + } else { + $config.define(concat!("GDAL_ENABLE_", $driver), "OFF"); + } + }; +} + +fn find_library(lib_name: &str, path: impl Into) -> String { + let path = path.into(); + if path.join("lib64").join(format!("lib{lib_name}.a")).exists() { + path.join("lib64") + .join(format!("lib{lib_name}.a")) + .display() + .to_string() + } else if path.join("lib").join(format!("lib{lib_name}.a")).exists() { + path.join("lib") + .join(format!("lib{lib_name}.a")) + .display() + .to_string() + } else if path.join("lib").join(format!("{lib_name}.lib")).exists() { + path.join("lib") + .join(format!("{lib_name}.lib")) + .display() + .to_string() + } else { + panic!("{lib_name} not found in {}", path.display()); + } +} + +fn main() { + let proj_root = + std::path::PathBuf::from(std::env::var("DEP_PROJ_ROOT").expect("set by proj-sys")); + let proj_library = if std::env::var("CARGO_CFG_TARGET_FAMILY").as_deref() == Ok("windows") { + if proj_root.join("lib").join("proj_d.lib").exists() { + proj_root.join("lib").join("proj.lib").display().to_string() + } else { + proj_root + .join("lib") + .join("proj_d.lib") + .display() + .to_string() + } + } else { + find_library("proj", &proj_root) + }; + + let mut config = cmake::Config::new("source"); + + config + .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_DIR", + format!("{}/include", proj_root.display()), + ) + .define("PROJ_LIBRARY", proj_library) + .pic(true) + .define("ACCEPT_MISSING_LINUX_FS_HEADER", "ON"); + // enable the gpkg driver + + // simple drivers without external dependencies + handle_ogr_driver!(config, "DRIVER_AVC"); + handle_ogr_driver!(config, "DRIVER_CAD"); + handle_ogr_driver!(config, "DRIVER_CSV"); + handle_ogr_driver!(config, "DRIVER_DGN"); + handle_ogr_driver!(config, "DRIVER_DXF"); + handle_ogr_driver!(config, "DRIVER_EDIGEO"); + handle_ogr_driver!(config, "DRIVER_FLATGEOBUF"); + handle_ogr_driver!(config, "DRIVER_GEOCONCEPT"); + handle_ogr_driver!(config, "DRIVER_GEOJSON"); + handle_ogr_driver!(config, "DRIVER_GMT"); + handle_ogr_driver!(config, "DRIVER_GTFS"); + handle_ogr_driver!(config, "DRIVER_JSONFG"); + handle_ogr_driver!(config, "DRIVER_MAPML"); + handle_ogr_driver!(config, "DRIVER_OPENFILEGDB"); + handle_ogr_driver!(config, "DRIVER_PGDUMP"); + handle_ogr_driver!(config, "DRIVER_NTF"); + handle_ogr_driver!(config, "DRIVER_S57"); + handle_ogr_driver!(config, "DRIVER_SELAFIN"); + handle_ogr_driver!(config, "DRIVER_SHAPE"); + handle_ogr_driver!(config, "DRIVER_SXF"); + handle_ogr_driver!(config, "DRIVER_TAB"); + handle_ogr_driver!(config, "DRIVER_TIGER"); + handle_ogr_driver!(config, "DRIVER_VDV"); + handle_ogr_driver!(config, "DRIVER_WASP"); + handle_ogr_driver!(config, "DRIVER_IDRISI"); + handle_ogr_driver!(config, "DRIVEr_PDS"); + handle_ogr_driver!(config, "DRIVER_SDTS"); + handle_ogr_driver!(config, "DRIVER_VRT"); + handle_ogr_driver!(config, "DRIVER_MEM"); + + handle_gdal_driver!(config, "DRIVER_AAIGRID"); + handle_gdal_driver!(config, "DRIVER_ADRG"); + handle_gdal_driver!(config, "DRIVER_AIGRID"); + handle_gdal_driver!(config, "DRIVER_AIRSAR"); + handle_gdal_driver!(config, "DRIVER_BLX"); + handle_gdal_driver!(config, "DRIVER_BMP"); + handle_gdal_driver!(config, "DRIVER_BSB"); + handle_gdal_driver!(config, "DRIVER_CALS"); + handle_gdal_driver!(config, "DRIVER_CEOS"); + handle_gdal_driver!(config, "DRIVER_COASP"); + handle_gdal_driver!(config, "DRIVER_COSAR"); + handle_gdal_driver!(config, "DRIVER_CTG"); + handle_gdal_driver!(config, "DRIVER_DIMAP"); + handle_gdal_driver!(config, "DRIVER_DTED"); + handle_gdal_driver!(config, "DRIVER_ELAS"); + handle_gdal_driver!(config, "DRIVER_ENVISAT"); + handle_gdal_driver!(config, "DRIVER_ERS"); + handle_gdal_driver!(config, "DRIVER_FIT"); + handle_gdal_driver!(config, "DRIVER_GFF"); + handle_gdal_driver!(config, "DRIVER_GIF"); + handle_gdal_driver!(config, "DRIVER_GRIB"); + handle_gdal_driver!(config, "DRIVER_GSG"); + handle_gdal_driver!(config, "DRIVER_GTIFF"); + handle_gdal_driver!(config, "DRIVER_GXF"); + handle_gdal_driver!(config, "DRIVER_HF2"); + handle_gdal_driver!(config, "DRIVER_HFA"); + handle_gdal_driver!(config, "DRIVER_ILWIS"); + handle_gdal_driver!(config, "DRIVER_IRIS"); + handle_gdal_driver!(config, "DRIVER_JAXAPALSAR"); + handle_gdal_driver!(config, "DRIVER_JDEM"); + handle_gdal_driver!(config, "DRIVER_JPEG"); + handle_gdal_driver!(config, "DRIVER_KMLSUPEROVERLAY"); + handle_gdal_driver!(config, "DRIVER_L1B"); + handle_gdal_driver!(config, "DRIVER_LEVELLER"); + handle_gdal_driver!(config, "DRIVER_MAP"); + handle_gdal_driver!(config, "DRIVER_MRF"); + handle_gdal_driver!(config, "DRIVER_MSGN"); + handle_gdal_driver!(config, "DRIVER_NGSGEOID"); + handle_gdal_driver!(config, "DRIVER_NIFT"); + handle_gdal_driver!(config, "DRIVER_NORTHWOOD"); + handle_gdal_driver!(config, "DRIVER_OZI"); + handle_gdal_driver!(config, "DRIVER_PCIDSK"); + handle_gdal_driver!(config, "DRIVER_PCRASTER"); + handle_gdal_driver!(config, "DRIVER_PNG"); + handle_gdal_driver!(config, "DRIVER_PRF"); + handle_gdal_driver!(config, "DRIVER_R"); + handle_gdal_driver!(config, "DRIVER_RAW"); + handle_gdal_driver!(config, "DRIVER_RIK"); + handle_gdal_driver!(config, "DRIVER_RMF"); + handle_gdal_driver!(config, "DRIVER_RS2"); + handle_gdal_driver!(config, "DRIVER_SAFE"); + handle_gdal_driver!(config, "DRIVER_SAGA"); + handle_gdal_driver!(config, "DRIVER_SAR_CEOS"); + handle_gdal_driver!(config, "DRIVER_SENTINEL2"); + handle_gdal_driver!(config, "DRIVER_SGI"); + handle_gdal_driver!(config, "DRIVER_SIGDEM"); + handle_gdal_driver!(config, "DRIVER_SRTMHGT"); + handle_gdal_driver!(config, "DRIVER_STACIT"); + handle_gdal_driver!(config, "DRIVER_STACTA"); + handle_gdal_driver!(config, "DRIVER_TERRAGEN"); + handle_gdal_driver!(config, "DRIVER_TGA"); + handle_gdal_driver!(config, "DRIVER_TIL"); + handle_gdal_driver!(config, "DRIVER_TSX"); + handle_gdal_driver!(config, "DRIVER_USGSDEM"); + handle_gdal_driver!(config, "DRIVER_XPM"); + handle_gdal_driver!(config, "DRIVER_XYZ"); + handle_gdal_driver!(config, "DRIVER_ZMAP"); + handle_gdal_driver!(config, "DRIVER_IDRISI"); + handle_gdal_driver!(config, "DRIVEr_PDS"); + handle_gdal_driver!(config, "DRIVER_SDTS"); + handle_gdal_driver!(config, "DRIVER_VRT"); + handle_gdal_driver!(config, "DRIVER_MEM"); + + if cfg!(feature = "DRIVER_SQLITE") { + 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"); + + config + .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_SQLITE", "ON"); + } else { + config.define("GDAL_USE_SQLITE3", "OFF"); + } + // these drivers depend on sqlite + handle_ogr_driver!(config, "DRIVER_GPKG"); + handle_ogr_driver!(config, "DRIVER_VFK"); + + if cfg!(feature = "DRIVER_HDF5") { + let hdf5_dir = std::env::var("DEP_HDF5SRC_ROOT").expect("This is set by hdf5-src"); + let hdf5_lib = std::env::var("DEP_HDF5SRC_LIBRARY").expect("This is set by hdf5-src"); + let hdf5_lib_dir = find_library(&hdf5_lib, &hdf5_dir); + let p = std::path::PathBuf::from(&hdf5_lib_dir); + let p = p.parent().unwrap(); + println!("cargo:rustc-link-search=native={}", p.display()); + println!("cargo:rustc-link-lib=static={hdf5_lib}"); + config + .define("GDAL_USE_HDF5", "ON") + .define("HDF5_C_COMPILER_EXECUTABLE", format!("{hdf5_dir}/bin/h5cc")) + .define("HDF5_C_INCLUDE_DIR", format!("{hdf5_dir}/include")) + .define("HDF5_hdf5_LIBRARY_DEBUG", &hdf5_lib_dir) + .define("HDF5_hdf5_LIBRARY_RELEASE", &hdf5_lib_dir) + .define("GDAL_ENABLE_DRIVER_HDF5", "ON") + .define("HDF5_USE_STATIC_LIBRARIES", "ON"); + } else { + config.define("GDAL_USE_HDF5", "OFF"); + } + + if cfg!(feature = "DRIVER_NETCDF") { + let netcdf_root_dir = + std::env::var("DEP_NETCDFSRC_ROOT").expect("This is set by netcdf-src"); + let hdf5_dir = std::env::var("DEP_HDF5SRC_ROOT").expect("This is set by hdf5-src"); + let hl_library = std::env::var("DEP_HDF5SRC_HL_LIBRARY").expect("This is set by hdf5-src"); + let netcdf_lib = find_library("netcdf", &netcdf_root_dir); + let hl_library_path = find_library(&hl_library, &hdf5_dir); + let hl_library_path = std::path::PathBuf::from(hl_library_path); + let hl_library_path = hl_library_path.parent().unwrap(); + + let netcdf_library_path = std::path::PathBuf::from(&netcdf_lib); + let netcdf_library_path = netcdf_library_path.parent().unwrap(); + println!( + "cargo:rustc-link-search=native={}", + netcdf_library_path.display() + ); + println!("cargo:rustc-link-lib=static=netcdf"); + println!( + "cargo:rustc-link-search=native={}", + hl_library_path.display() + ); + println!("cargo:rustc-link-lib=static={hl_library}"); + config + .define("GDAL_USE_NETCDF", "ON") + .define("NETCDF_INCLUDE_DIR", format!("{netcdf_root_dir}/include")) + .define("NETCDF_LIBRARY", netcdf_lib) + .define("GDAL_ENABLE_DRIVER_NETCDF", "ON"); + } else { + config.define("GDAL_USE_NETCDF", "OFF"); + } + + if cfg!(feature = "curl-sys") { + let curl_root = std::env::var("DEP_CURL_ROOT").expect("set from curl-sys"); + config + .define("GDAL_USE_CURL", "ON") + .define("CURL_INCLUDE_DIR", format!("{curl_root}/include")) + .define("CURL_LIBRARY_DEBUG", format!("{curl_root}/build/libcurl.a")) + .define( + "CURL_LIBRARY_RELEASE", + format!("{curl_root}/build/libcurl.a"), + ) + .define("CURL_USE_STATIC_LIBS", "ON"); + } else { + config.define("GDAL_USE_CURL", "OFF"); + } + + handle_ogr_driver!(config, "DRIVER_AMIGOCLOUD"); + handle_ogr_driver!(config, "DRIVER_CARTO"); + handle_ogr_driver!(config, "DRIVER_DAAS"); + handle_ogr_driver!(config, "DRIVER_EEDA"); + handle_ogr_driver!(config, "DRIVER_ELASTIC"); + handle_ogr_driver!(config, "DRIVER_NGW"); + handle_gdal_driver!(config, "DRIVER_OGCAPI"); + handle_gdal_driver!(config, "DRIVER_PLMOSAIC"); + handle_gdal_driver!(config, "DRIVER_WCS"); + handle_gdal_driver!(config, "DRIVER_WMS"); + handle_gdal_driver!(config, "DRIVER_WMTS"); + + if cfg!(feature = "DRIVER_PG") { + let pq_include = std::env::var("DEP_PQ_SYS_SRC_INCLUDE").expect("this is set by pq-src"); + let pq_lib = std::env::var("DEP_PQ_SYS_SRC_LIB_DIR").expect("this is set by pq-src"); + let pq_lib_path = std::path::PathBuf::from(&pq_lib); + let pq_lib_path = if pq_lib_path.join("libpq.a").exists() { + pq_lib_path.join("libpq.a").display().to_string() + } else if pq_lib_path.join("pq.lib").exists() { + pq_lib_path.join("pq.lib").display().to_string() + } else { + panic!("Libpq not found in {pq_lib}"); + }; + config + .define("GDAL_USE_POSTGRESQL", "ON") + .define("PostgreSQL_INCLUDE_DIR", pq_include) + .define("PostgreSQL_LIBRARY_DEBUG", &pq_lib_path) + .define("PostgreSQL_LIBRARY_RELEASE", &pq_lib_path) + .define("OGR_ENABLE_DRIVER_PG", "ON"); + } else { + config.define("GDAL_USE_POSTGRESQL", "OFF"); + } + handle_gdal_driver!(config, "DRIVER_POSTGIS_RASTER"); + + if cfg!(feature = "geos") { + config.define("GDAL_USE_GEOS", "ON"); + } else { + config.define("GDAL_USE_GEOS", "OFF"); + } + + if cfg!(feature = "geos_static") { + let geos_root = std::env::var("DEP_GEOSSRC_ROOT").expect("this is set by geos-src"); + config.define("GEOS_INCLUDE", format!("{geos_root}/include")); + } + + if cfg!(target_env = "msvc") { + // otherwise there are linking issues + // because rust always links the + // MSVC release runtime + config.profile("Release"); + // see + // https://github.com/OSGeo/PROJ/commit/6e9b324ab7bf5909df7e68409e060282db14fa54#diff-af8fe2f9d33a9c3408ff7683bfebd1e2334b4506f559add92406be3e150268fb + config.cxxflag("-DPROJ_DLL="); + // that windows library is somehow required + println!("cargo:rustc-link-lib=Wbemuuid"); + } + + let res = config.build(); + + // sometimes it's lib and sometimes it's lib64 and sometimes `build/lib` + let lib_dir = res.join("lib64"); + println!( + "cargo:rustc-link-search=native={}", + lib_dir.to_str().unwrap() + ); + let lib_dir = res.join("lib"); + println!( + "cargo:rustc-link-search=native={}", + lib_dir.to_str().unwrap() + ); + let lib_dir = res.join("build/lib"); + println!( + "cargo:rustc-link-search=native={}", + lib_dir.to_str().unwrap() + ); + + //gdal likes to create gdal_d when configured as debug and on MSVC, so link to that one if it exists + if res.join("lib").join("gdald.lib").exists() { + println!("cargo:rustc-link-lib=static=gdald"); + } else { + println!("cargo:rustc-link-lib=static=gdal"); + } +} 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..1a09c18ef --- /dev/null +++ b/gdal-src/src/lib.rs @@ -0,0 +1,15 @@ +#[cfg(feature = "curl-sys")] +extern crate curl_sys; +#[cfg(feature = "geos")] +extern crate geos_sys; +#[cfg(feature = "DRIVER_HDF5")] +extern crate hdf5_src; +#[cfg(feature = "DRIVER_SQLITE")] +extern crate libsqlite3_sys; +#[cfg(feature = "DRIVER_NETCDF")] +extern crate netcdf_src; +#[cfg(feature = "DRIVER_PG")] +extern crate pq_src; + +extern crate proj_sys; +extern crate link_cplusplus; diff --git a/gdal-sys/Cargo.toml b/gdal-sys/Cargo.toml index 4a2cad506..6d0cc3146 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 b4e20e62d..f6e516488 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.9.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")); From 10e9ec8114a65d098d33d025f90c8cf0ee6c1316 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 27 Feb 2024 19:38:15 +0100 Subject: [PATCH 02/22] Run rustfmt --- .gitmodules | 1 - Cargo.toml | 2 +- gdal-src/src/lib.rs | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 6a97e1191..876130392 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ [submodule "gdal-src/source"] path = gdal-src/source url = https://github.com/OSGeo/gdal - rev = 654f4907abbbf6bf4226d58a8c067d134eaf3ce9 diff --git a/Cargo.toml b/Cargo.toml index 64e235a16..e0b3f1c06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,4 +47,4 @@ rustdoc-args = ["--cfg", "docsrs"] [patch.crates-io] -proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "dc67b5afc17bc7d330371e4406dffd65cf9321cd" } +proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "44a503869709ea793a5f8452bfb9e2a99b7160fc" } diff --git a/gdal-src/src/lib.rs b/gdal-src/src/lib.rs index 1a09c18ef..181d4e4cf 100644 --- a/gdal-src/src/lib.rs +++ b/gdal-src/src/lib.rs @@ -11,5 +11,5 @@ extern crate netcdf_src; #[cfg(feature = "DRIVER_PG")] extern crate pq_src; -extern crate proj_sys; extern crate link_cplusplus; +extern crate proj_sys; From 43632b451d5520df106a6f0866303b25a5a61600 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 2 Apr 2024 08:33:54 +0200 Subject: [PATCH 03/22] Add a CI setup for the bundled builds --- .github/workflows/ci.yml | 53 ++++++++++++++++++++++++---- Cargo.toml | 2 ++ gdal-src/Cargo.toml | 10 +++--- gdal-src/build.rs | 11 +++--- gdal-src/source | 2 +- src/programs/raster/mdimtranslate.rs | 4 +-- src/raster/mdarray.rs | 28 +++++++-------- src/vector/sql.rs | 1 + 8 files changed, 79 insertions(+), 32 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 147fa95af..612bc3c01 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,15 +62,15 @@ jobs: - name: Check with Clippy run: cargo clippy --all-targets -- -D warnings - name: Check with Clippy (--all-features) - run: cargo clippy --all-targets --all-features -- -D warnings + run: cargo clippy --all-targets --features "default bindgen array" -- -D warnings - name: Build run: cargo build - name: Run tests run: cargo test - name: Build (--all-features) - run: cargo build --all-features + run: cargo build --features "default bindgen array" - name: Run tests (--all-features) - run: cargo test --all-features -- --nocapture + run: cargo test --features "default bindgen array" -- --nocapture ubuntu_lts: name: "ci ubuntu-lts" @@ -105,18 +105,59 @@ jobs: - name: Check with Clippy run: cargo clippy --all-targets -- -D warnings - name: Check with Clippy (--all-features) - run: cargo clippy --all-targets --all-features -- -D warnings + run: cargo clippy --all-targets --features "default bindgen array" -- -D warnings - name: Build run: cargo build - name: Run tests run: cargo test - name: Build (--all-features) - run: cargo build --all-features + run: cargo build --features "default bindgen array" - name: Run tests (--all-features) - run: cargo test --all-features -- --nocapture + run: cargo test --features "default bindgen array" -- --nocapture - name: Install valgrind and cargo-valgrind run: | sudo apt-get install valgrind -y cargo install cargo-valgrind - name: Run --lib tests under valgrind run: cargo valgrind test --lib + gdal_static: + name: "ci gdal-static" + strategy: + matrix: + os: + - ubuntu-latest + - windows-latest + - macos-latest # x86_64 + - macos-14 # aarch64 + runs-on: ${{ matrix.os }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: true + - name: Install stable + run: | + rustup install --no-self-update --profile minimal stable + rustup component add rustfmt clippy + # we need to have the sqlite binary in path for building proj from source + - name: Install Sqlite (Windows) + if: runner.os == 'Windows' + run: | + choco install sqlite + echo "C:\ProgramData\chocolatey\lib\SQLite\tools" >> $GITHUB_PATH + sqlite3 --version + # use the minimal driver set for clippy as the other + # drivers do not change the rust code + # enable `DRIVER_SQLITE` to force statically linking libsqlite3 for proj + - name: Check with Clippy (bundled) + run: cargo clippy --all-targets --features "gdal-sys/bundled gdal-src gdal-src/DRIVER_SQLITE" -- -D warnings + # we only build tests here as we have disabled features + # that are required for running tests + - name: Build bundled gdal (minimal features) + if: runner.os == 'Windows' + run: cargo test --features "gdal-sys/bundled gdal-src gdal-src/DRIVER_SQLITE" --no-run + - name: Build bundled gdal (minimal features) + if: runner.os != 'Windows' + run: cargo test --features "gdal-sys/bundled gdal-src" --no-run + - name: Test bundled (all features) + run: cargo test --features "gdal-sys/bundled gdal-src gdal-src/enable_all_drivers gdal-src/geos_static" diff --git a/Cargo.toml b/Cargo.toml index e0b3f1c06..918fdc53c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ thiserror = "1.0" libc = "0.2" geo-types = { version = "0.7.11" } gdal-sys = { path = "gdal-sys", version = "^0.9" } +gdal-src = { path = "gdal-src", optional = true, default-features = false } ndarray = { version = "0.15", optional = true } chrono = { version = "0.4.26", default-features = false } bitflags = "2.4" @@ -48,3 +49,4 @@ rustdoc-args = ["--cfg", "docsrs"] [patch.crates-io] proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "44a503869709ea793a5f8452bfb9e2a99b7160fc" } +pq-src = { git = "https://github.com/sgrif/pq-sys", rev = "7300e96574cc0eeb95985881fbbc2cf95886cca2" } diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index 0b3c39416..cc811312e 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -15,8 +15,10 @@ netcdf-src = { version = "0.3.2", optional = true } pq-src = { version = "0.1.1", optional = true } curl-sys = { version = "0.4.70", features = ["static-curl"], optional = true } libz-sys = { version = "1.1.15", features = ["static"], optional = true } -geos-src = { version = "0.2.1", optional = true } -geos-sys = { version = "2", optional = true } +geos-sys = { version = "2.0.6", optional = true } +# we need to depend directly on `geos-src` for the static +# build as otherwise `DEP_GEOSSRC_ROOT` is not set +geos-src = { version = "0.2.3", optional = true } [build-dependencies] @@ -51,7 +53,7 @@ enable_all_drivers = [ # that you statically link libgeos and # therefore makes your binary fall under # LGPL as well -geos_static = ["geos-src", "geos"] +geos_static = ["geos", "geos-sys/static", "geos-src"] # as long as the `geos_static` feature # is not enabled that will only # dynamically link geos @@ -315,7 +317,7 @@ DRIVER_NETCDF = ["dep:netcdf-src", "DRIVER_HDF5", "dep:hdf5-sys"] #DRIVER_PDF = [] # combined -# these miss at least one dependency +# these are missing at least one dependency # DRIVER_MVT = [] # requires sqlite + geos # DRIVER_OSM = [] # requires sqlite + libexpat # DRIVER_ZARR = [] # requires liblz4, libxz, libzstd and libblocs diff --git a/gdal-src/build.rs b/gdal-src/build.rs index 6468e8a54..86eb13f94 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -45,13 +45,13 @@ fn main() { std::path::PathBuf::from(std::env::var("DEP_PROJ_ROOT").expect("set by proj-sys")); let proj_library = if std::env::var("CARGO_CFG_TARGET_FAMILY").as_deref() == Ok("windows") { if proj_root.join("lib").join("proj_d.lib").exists() { - proj_root.join("lib").join("proj.lib").display().to_string() - } else { proj_root .join("lib") .join("proj_d.lib") .display() .to_string() + } else { + proj_root.join("lib").join("proj.lib").display().to_string() } } else { find_library("proj", &proj_root) @@ -75,7 +75,6 @@ fn main() { format!("{}/include", proj_root.display()), ) .define("PROJ_LIBRARY", proj_library) - .pic(true) .define("ACCEPT_MISSING_LINUX_FS_HEADER", "ON"); // enable the gpkg driver @@ -226,7 +225,7 @@ fn main() { let hdf5_dir = std::env::var("DEP_HDF5SRC_ROOT").expect("This is set by hdf5-src"); let hl_library = std::env::var("DEP_HDF5SRC_HL_LIBRARY").expect("This is set by hdf5-src"); let netcdf_lib = find_library("netcdf", &netcdf_root_dir); - let hl_library_path = find_library(&hl_library, &hdf5_dir); + let hl_library_path = find_library(&hl_library, hdf5_dir); let hl_library_path = std::path::PathBuf::from(hl_library_path); let hl_library_path = hl_library_path.parent().unwrap(); @@ -308,7 +307,9 @@ fn main() { if cfg!(feature = "geos_static") { let geos_root = std::env::var("DEP_GEOSSRC_ROOT").expect("this is set by geos-src"); - config.define("GEOS_INCLUDE", format!("{geos_root}/include")); + config.define("GEOS_INCLUDE_DIR", format!("{geos_root}/include")); + let lib_path = find_library("geos", geos_root); + config.define("GEOS_LIBRARY", lib_path); } if cfg!(target_env = "msvc") { diff --git a/gdal-src/source b/gdal-src/source index 654f4907a..c2d2a6173 160000 --- a/gdal-src/source +++ b/gdal-src/source @@ -1 +1 @@ -Subproject commit 654f4907abbbf6bf4226d58a8c067d134eaf3ce9 +Subproject commit c2d2a61739ca770bae5a26be3eeb25a045dd3458 diff --git a/src/programs/raster/mdimtranslate.rs b/src/programs/raster/mdimtranslate.rs index d90bd6363..c5544f49c 100644 --- a/src/programs/raster/mdimtranslate.rs +++ b/src/programs/raster/mdimtranslate.rs @@ -231,7 +231,7 @@ mod tests { use crate::{DriverManager, GdalOpenFlags}; #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] fn test_build_tiff_from_path() { let fixture = "/vsizip/fixtures/cf_nasa_4326.zarr.zip"; @@ -263,7 +263,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] fn test_build_tiff_from_dataset() { let fixture = "/vsizip/fixtures/cf_nasa_4326.zarr.zip"; diff --git a/src/raster/mdarray.rs b/src/raster/mdarray.rs index 594763e95..0039024c9 100644 --- a/src/raster/mdarray.rs +++ b/src/raster/mdarray.rs @@ -848,7 +848,7 @@ mod tests { use crate::{test_utils::TempFixture, Dataset, GdalOpenFlags}; #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_root_group_name() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -866,7 +866,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_array_names() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -888,7 +888,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_n_dimension() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -909,7 +909,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_n_elements() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -930,7 +930,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_dimension_name() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -966,7 +966,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_dimension_size() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -991,7 +991,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_read_data() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -1028,7 +1028,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_1), major_ge_4))] fn test_read_string_array() { // Beware https://github.com/georust/gdal/issues/299 if you want to reuse this @@ -1062,7 +1062,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_datatype() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -1089,7 +1089,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_spatial_ref() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -1115,7 +1115,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_no_data_value() { let fixture = "/vsizip/fixtures/byte_no_cf.zarr.zip"; @@ -1137,7 +1137,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_attributes() { let fixture = "/vsizip/fixtures/cf_nasa_4326.zarr.zip"; @@ -1189,7 +1189,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_unit() { let fixture = "/vsizip/fixtures/cf_nasa_4326.zarr.zip"; @@ -1230,7 +1230,7 @@ mod tests { } #[test] - #[cfg_attr(not(all(major_ge_3, minor_ge_4)), ignore)] + #[cfg_attr(any(not(all(major_ge_3, minor_ge_4)), feature = "gdal-src"), ignore)] #[cfg(any(all(major_is_3, minor_ge_2), major_ge_4))] fn test_stats() { // make a copy to avoid writing the statistics into the original file diff --git a/src/vector/sql.rs b/src/vector/sql.rs index 00f6ca9a7..31f017f06 100644 --- a/src/vector/sql.rs +++ b/src/vector/sql.rs @@ -236,6 +236,7 @@ mod tests { } #[test] + #[cfg_attr(feature = "gdal-src", ignore)] fn test_sql_with_dialect() { let query = "SELECT * FROM roads WHERE highway = 'pedestrian' and NumPoints(GEOMETRY) = 3"; let ds = Dataset::open(fixture("roads.geojson")).unwrap(); From 01a27ec698ffe53cea69243dd6eae70fb9f65872 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 2 Apr 2024 15:39:50 +0200 Subject: [PATCH 04/22] Use lower case feature names --- .github/workflows/ci.yml | 12 +- gdal-src/Cargo.toml | 506 +++++++++++++++++++-------------------- gdal-src/build.rs | 255 ++++++++++---------- 3 files changed, 393 insertions(+), 380 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 612bc3c01..c9077b45d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -148,16 +148,20 @@ jobs: sqlite3 --version # use the minimal driver set for clippy as the other # drivers do not change the rust code - # enable `DRIVER_SQLITE` to force statically linking libsqlite3 for proj + # enable `driver_sqlite` to force statically linking libsqlite3 for proj - name: Check with Clippy (bundled) - run: cargo clippy --all-targets --features "gdal-sys/bundled gdal-src gdal-src/DRIVER_SQLITE" -- -D warnings + run: cargo clippy --all-targets --features "gdal-sys/bundled gdal-src gdal-src/driver_sqlite" -- -D warnings # we only build tests here as we have disabled features # that are required for running tests - name: Build bundled gdal (minimal features) if: runner.os == 'Windows' - run: cargo test --features "gdal-sys/bundled gdal-src gdal-src/DRIVER_SQLITE" --no-run + # we use cargo test --no-run here because + # tests do not pass due to missing libgeos but we want to have a complete build (including linking) + run: cargo test --features "gdal-sys/bundled gdal-src gdal-src/driver_sqlite" --no-run - name: Build bundled gdal (minimal features) if: runner.os != 'Windows' + # we use cargo test --no-run here because + # tests do not pass due to missing libgeos but we want to have a complete build (including linking) run: cargo test --features "gdal-sys/bundled gdal-src" --no-run - name: Test bundled (all features) - run: cargo test --features "gdal-sys/bundled gdal-src gdal-src/enable_all_drivers gdal-src/geos_static" + run: cargo test --features "gdal-sys/bundled gdal-src gdal-src/all_drivers gdal-src/geos_static" diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index cc811312e..27cc67494 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -26,26 +26,26 @@ cmake = "0.1.50" [features] default = [] -enable_all_drivers = [ - "enable_all_internal", - "DRIVER_SQLITE", - "DRIVER_GPKG", - "DRIVER_VFK", - "DRIVER_HDF5", - "DRIVER_NETCDF", - "DRIVER_AMIGOCLOUD", - "DRIVER_CARTO", - "DRIVER_DAAS", - "DRIVER_EEDA", - "DRIVER_ELASTIC", - "DRIVER_NGW", - "DRIVER_OGCAPI", - "DRIVER_PLMOSAIC", - "DRIVER_WCS", - "DRIVER_WMS", - "DRIVER_WMTS", - "DRIVER_PG", - "DRIVER_POSTGIS_RASTER", +all_drivers = [ + "internal_drivers", + "driver_sqlite", + "driver_gpkg", + "driver_vfk", + "driver_hdf5", + "driver_netcdf", + "driver_amigocloud", + "driver_carto", + "driver_daas", + "driver_eeda", + "driver_elastic", + "driver_ngw", + "driver_ogcapi", + "driver_plmosaic", + "driver_wcs", + "driver_wms", + "driver_wmts", + "driver_pg", + "driver_postgis_raster", ] # note that libgeos is LGPL licenced @@ -59,273 +59,273 @@ geos_static = ["geos", "geos-sys/static", "geos-src"] # dynamically link geos geos = ["geos-sys"] -enable_all_internal = [ +internal_drivers = [ # ogr internal, - "DRIVER_AVC", - "DRIVER_CAD", - "DRIVER_CSV", - "DRIVER_DGN", - "DRIVER_DXF", - "DRIVER_EDIGEO", - "DRIVER_FLATGEOBUF", - "DRIVER_GEOCONCEPT", - "DRIVER_GEOJSON", - "DRIVER_GMT", - "DRIVER_GTFS", - "DRIVER_JSONFG", - "DRIVER_MAPML", - "DRIVER_OPENFILEGDB", - "DRIVER_PGDUMP", - "DRIVER_NTF", - "DRIVER_S57", - "DRIVER_SELAFIN", - "DRIVER_SHAPE", - "DRIVER_SXF", - "DRIVER_TAB", - "DRIVER_TIGER", - "DRIVER_VDV", - "DRIVER_WASP", + "driver_avc", + "driver_cad", + "driver_csv", + "driver_dgn", + "driver_dxf", + "driver_edigeo", + "driver_flatgeobuf", + "driver_geoconcept", + "driver_geojson", + "driver_gmt", + "driver_gtfs", + "driver_jsonfg", + "driver_mapml", + "driver_openfilegdb", + "driver_pgdump", + "driver_ntf", + "driver_s57", + "driver_selafin", + "driver_shape", + "driver_sxf", + "driver_tab", + "driver_tiger", + "driver_vdv", + "driver_wasp", # gdal internal - "DRIVER_AAIGRID", - "DRIVER_ADRG", - "DRIVER_AIGRID", - "DRIVER_AIRSAR", - "DRIVER_BLX", - "DRIVER_BMP", - "DRIVER_BSB", - "DRIVER_CALS", - "DRIVER_CEOS", - "DRIVER_COASP", - "DRIVER_COSAR", - "DRIVER_CTG", - "DRIVER_DIMAP", - "DRIVER_DTED", - "DRIVER_ELAS", - "DRIVER_ENVISAT", - "DRIVER_ERS", - "DRIVER_FIT", - "DRIVER_GFF", - "DRIVER_GIF", - "DRIVER_GRIB", - "DRIVER_GSG", - "DRIVER_GTIFF", - "DRIVER_GXF", - "DRIVER_HF2", - "DRIVER_HFA", - "DRIVER_ILWIS", - "DRIVER_IRIS", - "DRIVER_JAXAPALSAR", - "DRIVER_JDEM", - "DRIVER_JPEG", - "DRIVER_KMLSUPEROVERLAY", - "DRIVER_L1B", - "DRIVER_LEVELLER", - "DRIVER_MAP", - "DRIVER_MRF", - "DRIVER_MSGN", - "DRIVER_NGSGEOID", - "DRIVER_NIFT", - "DRIVER_NORTHWOOD", - "DRIVER_OZI", - "DRIVER_PCIDSK", - "DRIVER_PCRASTER", - "DRIVER_PNG", - "DRIVER_PRF", - "DRIVER_R", - "DRIVER_RAW", - "DRIVER_RIK", - "DRIVER_RMF", - "DRIVER_RS2", - "DRIVER_SAFE", - "DRIVER_SAGA", - "DRIVER_SAR_CEOS", - "DRIVER_SENTINEL2", - "DRIVER_SGI", - "DRIVER_SIGDEM", - "DRIVER_SRTMHGT", - "DRIVER_STACIT", - "DRIVER_STACTA", - "DRIVER_TERRAGEN", - "DRIVER_TGA", - "DRIVER_TIL", - "DRIVER_TSX", - "DRIVER_USGSDEM", - "DRIVER_XPM", - "DRIVER_XYZ", - "DRIVER_ZMAP", + "driver_aaigrid", + "driver_adrg", + "driver_aigrid", + "driver_airsar", + "driver_blx", + "driver_bmp", + "driver_bsb", + "driver_cals", + "driver_ceos", + "driver_coasp", + "driver_cosar", + "driver_ctg", + "driver_dimap", + "driver_dted", + "driver_elas", + "driver_envisat", + "driver_ers", + "driver_fit", + "driver_gff", + "driver_gif", + "driver_grib", + "driver_gsg", + "driver_gtiff", + "driver_gxf", + "driver_hf2", + "driver_hfa", + "driver_ilwis", + "driver_iris", + "driver_jaxapalsar", + "driver_jdem", + "driver_jpeg", + "driver_kmlsuperoverlay", + "driver_l1b", + "driver_leveller", + "driver_map", + "driver_mrf", + "driver_msgn", + "driver_ngsgeoid", + "driver_nift", + "driver_northwood", + "driver_ozi", + "driver_pcidsk", + "driver_pcraster", + "driver_png", + "driver_prf", + "driver_r", + "driver_raw", + "driver_rik", + "driver_rmf", + "driver_rs2", + "driver_safe", + "driver_saga", + "driver_sar_ceos", + "driver_sentinel2", + "driver_sgi", + "driver_sigdem", + "driver_srtmhgt", + "driver_stacit", + "driver_stacta", + "driver_terragen", + "driver_tga", + "driver_til", + "driver_tsx", + "driver_usgsdem", + "driver_xpm", + "driver_xyz", + "driver_zmap", # ogr and gdal - "DRIVER_IDRISI", - "DRIVER_PDS", - "DRIVER_SDTS", - "DRIVER_VRT", - "DRIVER_MEM", + "driver_idrisi", + "driver_pds", + "driver_sdts", + "driver_vrt", + "driver_mem", ] # ogr internal -DRIVER_AVC = [] -DRIVER_CAD = [] -DRIVER_CSV = [] -DRIVER_DGN = [] -DRIVER_DXF = [] -DRIVER_EDIGEO = [] -DRIVER_FLATGEOBUF = [] -DRIVER_GEOCONCEPT = [] -DRIVER_GEOJSON = [] -DRIVER_GMT = [] -DRIVER_GTFS = [] -DRIVER_JSONFG = [] -DRIVER_MAPML = [] -DRIVER_OPENFILEGDB = [] -DRIVER_PGDUMP = [] -DRIVER_NTF = [] -DRIVER_S57 = [] -DRIVER_SELAFIN = [] -DRIVER_SHAPE = [] -DRIVER_SXF = [] -DRIVER_TAB = [] -DRIVER_TIGER = [] -DRIVER_VDV = [] -DRIVER_WASP = [] +driver_avc = [] +driver_cad = [] +driver_csv = [] +driver_dgn = [] +driver_dxf = [] +driver_edigeo = [] +driver_flatgeobuf = [] +driver_geoconcept = [] +driver_geojson = [] +driver_gmt = [] +driver_gtfs = [] +driver_jsonfg = [] +driver_mapml = [] +driver_openfilegdb = [] +driver_pgdump = [] +driver_ntf = [] +driver_s57 = [] +driver_selafin = [] +driver_shape = [] +driver_sxf = [] +driver_tab = [] +driver_tiger = [] +driver_vdv = [] +driver_wasp = [] #gdal internal -DRIVER_AAIGRID = [] -DRIVER_ADRG = [] -DRIVER_AIGRID = [] -DRIVER_AIRSAR = [] -DRIVER_BLX = [] -DRIVER_BMP = [] -DRIVER_BSB = [] -DRIVER_CALS = [] -DRIVER_CEOS = [] -DRIVER_COASP = [] -DRIVER_COSAR = [] -DRIVER_CTG = [] -DRIVER_DIMAP = [] -DRIVER_DTED = [] -DRIVER_ELAS = [] -DRIVER_ENVISAT =[] -DRIVER_ERS = [] -DRIVER_FIT = [] -DRIVER_GFF = [] -DRIVER_GIF = [] -DRIVER_GRIB = [] -DRIVER_GSG = [] -DRIVER_GTIFF = [] -DRIVER_GXF = [] -DRIVER_HF2 = [] -DRIVER_HFA = [] -DRIVER_ILWIS = [] -DRIVER_IRIS = [] -DRIVER_JAXAPALSAR = [] -DRIVER_JDEM = [] -DRIVER_JPEG = [] -DRIVER_KMLSUPEROVERLAY = [] -DRIVER_L1B = [] -DRIVER_LEVELLER = [] -DRIVER_MAP = [] -DRIVER_MRF = [] -DRIVER_MSGN = [] -DRIVER_NGSGEOID = [] -DRIVER_NIFT = [] -DRIVER_NORTHWOOD = [] -DRIVER_OZI = [] -DRIVER_PCIDSK = [] -DRIVER_PCRASTER = [] -DRIVER_PNG = [] -DRIVER_PRF = [] -DRIVER_R = [] -DRIVER_RAW = [] -DRIVER_RIK = [] -DRIVER_RMF = [] -DRIVER_RS2 = [] -DRIVER_SAFE = [] -DRIVER_SAGA = [] -DRIVER_SAR_CEOS = [] -DRIVER_SENTINEL2 = [] -DRIVER_SGI = [] -DRIVER_SIGDEM = [] -DRIVER_SRTMHGT = [] -DRIVER_STACIT = [] -DRIVER_STACTA = [] -DRIVER_TERRAGEN = [] -DRIVER_TGA = [] -DRIVER_TIL = [] -DRIVER_TSX = [] -DRIVER_USGSDEM = [] -DRIVER_XPM = [] -DRIVER_XYZ = [] -DRIVER_ZMAP = [] +driver_aaigrid = [] +driver_adrg = [] +driver_aigrid = [] +driver_airsar = [] +driver_blx = [] +driver_bmp = [] +driver_bsb = [] +driver_cals = [] +driver_ceos = [] +driver_coasp = [] +driver_cosar = [] +driver_ctg = [] +driver_dimap = [] +driver_dted = [] +driver_elas = [] +driver_envisat =[] +driver_ers = [] +driver_fit = [] +driver_gff = [] +driver_gif = [] +driver_grib = [] +driver_gsg = [] +driver_gtiff = [] +driver_gxf = [] +driver_hf2 = [] +driver_hfa = [] +driver_ilwis = [] +driver_iris = [] +driver_jaxapalsar = [] +driver_jdem = [] +driver_jpeg = [] +driver_kmlsuperoverlay = [] +driver_l1b = [] +driver_leveller = [] +driver_map = [] +driver_mrf = [] +driver_msgn = [] +driver_ngsgeoid = [] +driver_nift = [] +driver_northwood = [] +driver_ozi = [] +driver_pcidsk = [] +driver_pcraster = [] +driver_png = [] +driver_prf = [] +driver_r = [] +driver_raw = [] +driver_rik = [] +driver_rmf = [] +driver_rs2 = [] +driver_safe = [] +driver_saga = [] +driver_sar_ceos = [] +driver_sentinel2 = [] +driver_sgi = [] +driver_sigdem = [] +driver_srtmhgt = [] +driver_stacit = [] +driver_stacta = [] +driver_terragen = [] +driver_tga = [] +driver_til = [] +driver_tsx = [] +driver_usgsdem = [] +driver_xpm = [] +driver_xyz = [] +driver_zmap = [] # ogr and gdal -DRIVER_IDRISI = [] -DRIVER_PDS = [] -DRIVER_SDTS = [] -DRIVER_VRT = [] -DRIVER_MEM = [] +driver_idrisi = [] +driver_pds = [] +driver_sdts = [] +driver_vrt = [] +driver_mem = [] # external # sqlite -DRIVER_SQLITE = ["dep:libsqlite3-sys"] -DRIVER_GPKG = ["DRIVER_SQLITE"] -DRIVER_VFK = ["DRIVER_SQLITE"] -DRIVER_RASTERLITE = [] # unclear how to handle that +driver_sqlite = ["dep:libsqlite3-sys"] +driver_gpkg = ["driver_sqlite"] +driver_vfk = ["driver_sqlite"] +driver_rasterlite = [] # unclear how to handle that # curl -DRIVER_AMIGOCLOUD = ["curl-sys"] -DRIVER_CARTO = ["curl-sys"] -DRIVER_DAAS = ["curl-sys"] -DRIVER_EEDA = ["curl-sys"] -DRIVER_ELASTIC = ["curl-sys"] -DRIVER_NGW = ["curl-sys"] +driver_amigocloud = ["curl-sys"] +driver_carto = ["curl-sys"] +driver_daas = ["curl-sys"] +driver_eeda = ["curl-sys"] +driver_elastic = ["curl-sys"] +driver_ngw = ["curl-sys"] -DRIVER_OGCAPI = ["curl-sys"] -DRIVER_PLMOSAIC = ["curl-sys"] -DRIVER_WCS = ["curl-sys"] -DRIVER_WMS = ["curl-sys"] -DRIVER_WMTS = ["curl-sys"] +driver_ogcapi = ["curl-sys"] +driver_plmosaic = ["curl-sys"] +driver_wcs = ["curl-sys"] +driver_wms = ["curl-sys"] +driver_wmts = ["curl-sys"] # libexpat # (there exists no expat-sys crate) -# DRIVER_GEORSS = [] -# DRIVER_GML = [] -# DRIVER_GPSBABEL = [] -# DRIVER_GPX = [] -# DRIVER_JML = [] -# DRIVER_KML = [] -# DRIVER_LVBAG = [] -# DRIVER_ODS = [] -# DRIVER_SVG = [] -# DRIVER_XLSX = [] +# driver_georss = [] +# driver_gml = [] +# driver_gpsbabel = [] +# driver_gpx = [] +# driver_jml = [] +# driver_kml = [] +# driver_lvbag = [] +# driver_ods = [] +# driver_svg = [] +# driver_xlsx = [] # libmysqlclient # (there is currently no bundling support in libmysqlclient) -# DRIVER_MYSQL = [] +# driver_mysql = [] # libpq -DRIVER_PG = ["dep:pq-src"] -DRIVER_POSTGIS_RASTER = ["DRIVER_PG"] +driver_pg = ["dep:pq-src"] +driver_postgis_raster = ["driver_pg"] # libhdf5 -DRIVER_HDF5 = ["dep:hdf5-src", "dep:libz-sys"] +driver_hdf5 = ["dep:hdf5-src", "dep:libz-sys"] # libnetcdf -DRIVER_NETCDF = ["dep:netcdf-src", "DRIVER_HDF5", "dep:hdf5-sys"] +driver_netcdf = ["dep:netcdf-src", "driver_hdf5", "dep:hdf5-sys"] # poppler -#DRIVER_PDF = [] +#driver_pdf = [] # combined # these are missing at least one dependency -# DRIVER_MVT = [] # requires sqlite + geos -# DRIVER_OSM = [] # requires sqlite + libexpat -# DRIVER_ZARR = [] # requires liblz4, libxz, libzstd and libblocs -# DRIVER_MBTILES = ["DRIVER_SQLITE", "DRIVER_MVT"] # also requires mvt (so geos) -# DRIVER_PMTILES = ["DRIVER_MVT"] # depends on driver_mvt -# DRIVER_CSW = ["curl-sys", "DRIVER_GML"] # depends on gml driver -# DRIVER_WFS = ["curl-sys", "DRIVER_GML"] +# driver_mvt = [] # requires sqlite + geos +# driver_osm = [] # requires sqlite + libexpat +# driver_zarr = [] # requires liblz4, libxz, libzstd and libblosc +# driver_mbtiles = ["driver_sqlite", "driver_mvt"] # also requires mvt (so geos) +# driver_pmtiles = ["driver_mvt"] # depends on driver_mvt +# driver_csw = ["curl-sys", "driver_gml"] # depends on gml driver +# driver_wfs = ["curl-sys", "driver_gml"] # unclear -DRIVER_HTTP = [] -DRIVER_ARG = [] +driver_http = [] +driver_arg = [] diff --git a/gdal-src/build.rs b/gdal-src/build.rs index 86eb13f94..044612051 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -1,9 +1,12 @@ macro_rules! handle_ogr_driver { ($config: ident, $driver: literal) => { if cfg!(feature = $driver) { - $config.define(concat!("OGR_ENABLE_", $driver), "ON"); + $config.define(format!("OGR_ENABLE_{}", $driver.to_ascii_uppercase()), "ON"); } else { - $config.define(concat!("OGR_ENABLE_", $driver), "OFF"); + $config.define( + format!("OGR_ENABLE_{}", $driver.to_ascii_uppercase()), + "OFF", + ); } }; } @@ -11,9 +14,15 @@ macro_rules! handle_ogr_driver { macro_rules! handle_gdal_driver { ($config: ident, $driver: literal) => { if cfg!(feature = $driver) { - $config.define(concat!("GDAL_ENABLE_", $driver), "ON"); + $config.define( + format!("GDAL_ENABLE_{}", $driver.to_ascii_uppercase()), + "ON", + ); } else { - $config.define(concat!("GDAL_ENABLE_", $driver), "OFF"); + $config.define( + format!("GDAL_ENABLE_{}", $driver.to_ascii_uppercase()), + "OFF", + ); } }; } @@ -79,110 +88,110 @@ fn main() { // enable the gpkg driver // simple drivers without external dependencies - handle_ogr_driver!(config, "DRIVER_AVC"); - handle_ogr_driver!(config, "DRIVER_CAD"); - handle_ogr_driver!(config, "DRIVER_CSV"); - handle_ogr_driver!(config, "DRIVER_DGN"); - handle_ogr_driver!(config, "DRIVER_DXF"); - handle_ogr_driver!(config, "DRIVER_EDIGEO"); - handle_ogr_driver!(config, "DRIVER_FLATGEOBUF"); - handle_ogr_driver!(config, "DRIVER_GEOCONCEPT"); - handle_ogr_driver!(config, "DRIVER_GEOJSON"); - handle_ogr_driver!(config, "DRIVER_GMT"); - handle_ogr_driver!(config, "DRIVER_GTFS"); - handle_ogr_driver!(config, "DRIVER_JSONFG"); - handle_ogr_driver!(config, "DRIVER_MAPML"); - handle_ogr_driver!(config, "DRIVER_OPENFILEGDB"); - handle_ogr_driver!(config, "DRIVER_PGDUMP"); - handle_ogr_driver!(config, "DRIVER_NTF"); - handle_ogr_driver!(config, "DRIVER_S57"); - handle_ogr_driver!(config, "DRIVER_SELAFIN"); - handle_ogr_driver!(config, "DRIVER_SHAPE"); - handle_ogr_driver!(config, "DRIVER_SXF"); - handle_ogr_driver!(config, "DRIVER_TAB"); - handle_ogr_driver!(config, "DRIVER_TIGER"); - handle_ogr_driver!(config, "DRIVER_VDV"); - handle_ogr_driver!(config, "DRIVER_WASP"); - handle_ogr_driver!(config, "DRIVER_IDRISI"); - handle_ogr_driver!(config, "DRIVEr_PDS"); - handle_ogr_driver!(config, "DRIVER_SDTS"); - handle_ogr_driver!(config, "DRIVER_VRT"); - handle_ogr_driver!(config, "DRIVER_MEM"); + handle_ogr_driver!(config, "driver_avc"); + handle_ogr_driver!(config, "driver_cad"); + handle_ogr_driver!(config, "driver_csv"); + handle_ogr_driver!(config, "driver_dgn"); + handle_ogr_driver!(config, "driver_dxf"); + handle_ogr_driver!(config, "driver_edigeo"); + handle_ogr_driver!(config, "driver_flatgeobuf"); + handle_ogr_driver!(config, "driver_geoconcept"); + handle_ogr_driver!(config, "driver_geojson"); + handle_ogr_driver!(config, "driver_gmt"); + handle_ogr_driver!(config, "driver_gtfs"); + handle_ogr_driver!(config, "driver_jsonfg"); + handle_ogr_driver!(config, "driver_mapml"); + handle_ogr_driver!(config, "driver_openfilegdb"); + handle_ogr_driver!(config, "driver_pgdump"); + handle_ogr_driver!(config, "driver_ntf"); + handle_ogr_driver!(config, "driver_s57"); + handle_ogr_driver!(config, "driver_selafin"); + handle_ogr_driver!(config, "driver_shape"); + handle_ogr_driver!(config, "driver_sxf"); + handle_ogr_driver!(config, "driver_tab"); + handle_ogr_driver!(config, "driver_tiger"); + handle_ogr_driver!(config, "driver_vdv"); + handle_ogr_driver!(config, "driver_wasp"); + handle_ogr_driver!(config, "driver_idrisi"); + handle_ogr_driver!(config, "driver_pds"); + handle_ogr_driver!(config, "driver_sdts"); + handle_ogr_driver!(config, "driver_vrt"); + handle_ogr_driver!(config, "driver_mem"); - handle_gdal_driver!(config, "DRIVER_AAIGRID"); - handle_gdal_driver!(config, "DRIVER_ADRG"); - handle_gdal_driver!(config, "DRIVER_AIGRID"); - handle_gdal_driver!(config, "DRIVER_AIRSAR"); - handle_gdal_driver!(config, "DRIVER_BLX"); - handle_gdal_driver!(config, "DRIVER_BMP"); - handle_gdal_driver!(config, "DRIVER_BSB"); - handle_gdal_driver!(config, "DRIVER_CALS"); - handle_gdal_driver!(config, "DRIVER_CEOS"); - handle_gdal_driver!(config, "DRIVER_COASP"); - handle_gdal_driver!(config, "DRIVER_COSAR"); - handle_gdal_driver!(config, "DRIVER_CTG"); - handle_gdal_driver!(config, "DRIVER_DIMAP"); - handle_gdal_driver!(config, "DRIVER_DTED"); - handle_gdal_driver!(config, "DRIVER_ELAS"); - handle_gdal_driver!(config, "DRIVER_ENVISAT"); - handle_gdal_driver!(config, "DRIVER_ERS"); - handle_gdal_driver!(config, "DRIVER_FIT"); - handle_gdal_driver!(config, "DRIVER_GFF"); - handle_gdal_driver!(config, "DRIVER_GIF"); - handle_gdal_driver!(config, "DRIVER_GRIB"); - handle_gdal_driver!(config, "DRIVER_GSG"); - handle_gdal_driver!(config, "DRIVER_GTIFF"); - handle_gdal_driver!(config, "DRIVER_GXF"); - handle_gdal_driver!(config, "DRIVER_HF2"); - handle_gdal_driver!(config, "DRIVER_HFA"); - handle_gdal_driver!(config, "DRIVER_ILWIS"); - handle_gdal_driver!(config, "DRIVER_IRIS"); - handle_gdal_driver!(config, "DRIVER_JAXAPALSAR"); - handle_gdal_driver!(config, "DRIVER_JDEM"); - handle_gdal_driver!(config, "DRIVER_JPEG"); - handle_gdal_driver!(config, "DRIVER_KMLSUPEROVERLAY"); - handle_gdal_driver!(config, "DRIVER_L1B"); - handle_gdal_driver!(config, "DRIVER_LEVELLER"); - handle_gdal_driver!(config, "DRIVER_MAP"); - handle_gdal_driver!(config, "DRIVER_MRF"); - handle_gdal_driver!(config, "DRIVER_MSGN"); - handle_gdal_driver!(config, "DRIVER_NGSGEOID"); - handle_gdal_driver!(config, "DRIVER_NIFT"); - handle_gdal_driver!(config, "DRIVER_NORTHWOOD"); - handle_gdal_driver!(config, "DRIVER_OZI"); - handle_gdal_driver!(config, "DRIVER_PCIDSK"); - handle_gdal_driver!(config, "DRIVER_PCRASTER"); - handle_gdal_driver!(config, "DRIVER_PNG"); - handle_gdal_driver!(config, "DRIVER_PRF"); - handle_gdal_driver!(config, "DRIVER_R"); - handle_gdal_driver!(config, "DRIVER_RAW"); - handle_gdal_driver!(config, "DRIVER_RIK"); - handle_gdal_driver!(config, "DRIVER_RMF"); - handle_gdal_driver!(config, "DRIVER_RS2"); - handle_gdal_driver!(config, "DRIVER_SAFE"); - handle_gdal_driver!(config, "DRIVER_SAGA"); - handle_gdal_driver!(config, "DRIVER_SAR_CEOS"); - handle_gdal_driver!(config, "DRIVER_SENTINEL2"); - handle_gdal_driver!(config, "DRIVER_SGI"); - handle_gdal_driver!(config, "DRIVER_SIGDEM"); - handle_gdal_driver!(config, "DRIVER_SRTMHGT"); - handle_gdal_driver!(config, "DRIVER_STACIT"); - handle_gdal_driver!(config, "DRIVER_STACTA"); - handle_gdal_driver!(config, "DRIVER_TERRAGEN"); - handle_gdal_driver!(config, "DRIVER_TGA"); - handle_gdal_driver!(config, "DRIVER_TIL"); - handle_gdal_driver!(config, "DRIVER_TSX"); - handle_gdal_driver!(config, "DRIVER_USGSDEM"); - handle_gdal_driver!(config, "DRIVER_XPM"); - handle_gdal_driver!(config, "DRIVER_XYZ"); - handle_gdal_driver!(config, "DRIVER_ZMAP"); - handle_gdal_driver!(config, "DRIVER_IDRISI"); - handle_gdal_driver!(config, "DRIVEr_PDS"); - handle_gdal_driver!(config, "DRIVER_SDTS"); - handle_gdal_driver!(config, "DRIVER_VRT"); - handle_gdal_driver!(config, "DRIVER_MEM"); + handle_gdal_driver!(config, "driver_aaigrid"); + handle_gdal_driver!(config, "driver_adrg"); + handle_gdal_driver!(config, "driver_aigrid"); + handle_gdal_driver!(config, "driver_airsar"); + handle_gdal_driver!(config, "driver_blx"); + handle_gdal_driver!(config, "driver_bmp"); + handle_gdal_driver!(config, "driver_bsb"); + handle_gdal_driver!(config, "driver_cals"); + handle_gdal_driver!(config, "driver_ceos"); + handle_gdal_driver!(config, "driver_coasp"); + handle_gdal_driver!(config, "driver_cosar"); + handle_gdal_driver!(config, "driver_ctg"); + handle_gdal_driver!(config, "driver_dimap"); + handle_gdal_driver!(config, "driver_dted"); + handle_gdal_driver!(config, "driver_elas"); + handle_gdal_driver!(config, "driver_envisat"); + handle_gdal_driver!(config, "driver_ers"); + handle_gdal_driver!(config, "driver_fit"); + handle_gdal_driver!(config, "driver_gff"); + handle_gdal_driver!(config, "driver_gif"); + handle_gdal_driver!(config, "driver_grib"); + handle_gdal_driver!(config, "driver_gsg"); + handle_gdal_driver!(config, "driver_gtiff"); + handle_gdal_driver!(config, "driver_gxf"); + handle_gdal_driver!(config, "driver_hf2"); + handle_gdal_driver!(config, "driver_hfa"); + handle_gdal_driver!(config, "driver_ilwis"); + handle_gdal_driver!(config, "driver_iris"); + handle_gdal_driver!(config, "driver_jaxapalsar"); + handle_gdal_driver!(config, "driver_jdem"); + handle_gdal_driver!(config, "driver_jpeg"); + handle_gdal_driver!(config, "driver_kmlsuperoverlay"); + handle_gdal_driver!(config, "driver_l1b"); + handle_gdal_driver!(config, "driver_leveller"); + handle_gdal_driver!(config, "driver_map"); + handle_gdal_driver!(config, "driver_mrf"); + handle_gdal_driver!(config, "driver_msgn"); + handle_gdal_driver!(config, "driver_ngsgeoid"); + handle_gdal_driver!(config, "driver_nift"); + handle_gdal_driver!(config, "driver_northwood"); + handle_gdal_driver!(config, "driver_ozi"); + handle_gdal_driver!(config, "driver_pcidsk"); + handle_gdal_driver!(config, "driver_pcraster"); + handle_gdal_driver!(config, "driver_png"); + handle_gdal_driver!(config, "driver_prf"); + handle_gdal_driver!(config, "driver_r"); + handle_gdal_driver!(config, "driver_raw"); + handle_gdal_driver!(config, "driver_rik"); + handle_gdal_driver!(config, "driver_rmf"); + handle_gdal_driver!(config, "driver_rs2"); + handle_gdal_driver!(config, "driver_safe"); + handle_gdal_driver!(config, "driver_saga"); + handle_gdal_driver!(config, "driver_sar_ceos"); + handle_gdal_driver!(config, "driver_sentinel2"); + handle_gdal_driver!(config, "driver_sgi"); + handle_gdal_driver!(config, "driver_sigdem"); + handle_gdal_driver!(config, "driver_srtmhgt"); + handle_gdal_driver!(config, "driver_stacit"); + handle_gdal_driver!(config, "driver_stacta"); + handle_gdal_driver!(config, "driver_terragen"); + handle_gdal_driver!(config, "driver_tga"); + handle_gdal_driver!(config, "driver_til"); + handle_gdal_driver!(config, "driver_tsx"); + handle_gdal_driver!(config, "driver_usgsdem"); + handle_gdal_driver!(config, "driver_xpm"); + handle_gdal_driver!(config, "driver_xyz"); + handle_gdal_driver!(config, "driver_zmap"); + handle_gdal_driver!(config, "driver_idrisi"); + handle_gdal_driver!(config, "driver_pds"); + handle_gdal_driver!(config, "driver_sdts"); + handle_gdal_driver!(config, "driver_vrt"); + handle_gdal_driver!(config, "driver_mem"); - if cfg!(feature = "DRIVER_SQLITE") { + if cfg!(feature = "driver_sqlite") { 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"); @@ -196,10 +205,10 @@ fn main() { config.define("GDAL_USE_SQLITE3", "OFF"); } // these drivers depend on sqlite - handle_ogr_driver!(config, "DRIVER_GPKG"); - handle_ogr_driver!(config, "DRIVER_VFK"); + handle_ogr_driver!(config, "driver_gpkg"); + handle_ogr_driver!(config, "driver_vfk"); - if cfg!(feature = "DRIVER_HDF5") { + if cfg!(feature = "driver_hdf5") { let hdf5_dir = std::env::var("DEP_HDF5SRC_ROOT").expect("This is set by hdf5-src"); let hdf5_lib = std::env::var("DEP_HDF5SRC_LIBRARY").expect("This is set by hdf5-src"); let hdf5_lib_dir = find_library(&hdf5_lib, &hdf5_dir); @@ -219,7 +228,7 @@ fn main() { config.define("GDAL_USE_HDF5", "OFF"); } - if cfg!(feature = "DRIVER_NETCDF") { + if cfg!(feature = "driver_netcdf") { let netcdf_root_dir = std::env::var("DEP_NETCDFSRC_ROOT").expect("This is set by netcdf-src"); let hdf5_dir = std::env::var("DEP_HDF5SRC_ROOT").expect("This is set by hdf5-src"); @@ -265,19 +274,19 @@ fn main() { config.define("GDAL_USE_CURL", "OFF"); } - handle_ogr_driver!(config, "DRIVER_AMIGOCLOUD"); - handle_ogr_driver!(config, "DRIVER_CARTO"); - handle_ogr_driver!(config, "DRIVER_DAAS"); - handle_ogr_driver!(config, "DRIVER_EEDA"); - handle_ogr_driver!(config, "DRIVER_ELASTIC"); - handle_ogr_driver!(config, "DRIVER_NGW"); - handle_gdal_driver!(config, "DRIVER_OGCAPI"); - handle_gdal_driver!(config, "DRIVER_PLMOSAIC"); - handle_gdal_driver!(config, "DRIVER_WCS"); - handle_gdal_driver!(config, "DRIVER_WMS"); - handle_gdal_driver!(config, "DRIVER_WMTS"); + handle_ogr_driver!(config, "driver_amigocloud"); + handle_ogr_driver!(config, "driver_carto"); + handle_ogr_driver!(config, "driver_daas"); + handle_ogr_driver!(config, "driver_eeda"); + handle_ogr_driver!(config, "driver_elastic"); + handle_ogr_driver!(config, "driver_ngw"); + handle_gdal_driver!(config, "driver_ogcapi"); + handle_gdal_driver!(config, "driver_plmosaic"); + handle_gdal_driver!(config, "driver_wcs"); + handle_gdal_driver!(config, "driver_wms"); + handle_gdal_driver!(config, "driver_wmts"); - if cfg!(feature = "DRIVER_PG") { + if cfg!(feature = "driver_pg") { let pq_include = std::env::var("DEP_PQ_SYS_SRC_INCLUDE").expect("this is set by pq-src"); let pq_lib = std::env::var("DEP_PQ_SYS_SRC_LIB_DIR").expect("this is set by pq-src"); let pq_lib_path = std::path::PathBuf::from(&pq_lib); @@ -297,7 +306,7 @@ fn main() { } else { config.define("GDAL_USE_POSTGRESQL", "OFF"); } - handle_gdal_driver!(config, "DRIVER_POSTGIS_RASTER"); + handle_gdal_driver!(config, "driver_postgis_raster"); if cfg!(feature = "geos") { config.define("GDAL_USE_GEOS", "ON"); From e2c87fa6b860e3df3f1ca09430f2f7aa92645a40 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 2 Apr 2024 15:40:01 +0200 Subject: [PATCH 05/22] Add some instructions for updating the bundled version --- Cargo.toml | 2 +- DEVELOPMENT.md | 17 +++++++++++++++++ gdal-src/Cargo.toml | 4 +--- gdal-src/build.rs | 4 +++- gdal-src/src/lib.rs | 8 ++++---- 5 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 DEVELOPMENT.md diff --git a/Cargo.toml b/Cargo.toml index 918fdc53c..c8ca3e3d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,4 +49,4 @@ rustdoc-args = ["--cfg", "docsrs"] [patch.crates-io] proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "44a503869709ea793a5f8452bfb9e2a99b7160fc" } -pq-src = { git = "https://github.com/sgrif/pq-sys", rev = "7300e96574cc0eeb95985881fbbc2cf95886cca2" } +pq-src = { git = "https://github.com/sgrif/pq-sys", rev = "3b0b90d9390ad5d53c7e6b2bcd167d8ef2a3a1e4" } diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 000000000..732813eb1 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,17 @@ +# Updating bundled gdal version for gdal-src + +Perform the following steps: + +``` +git submodule init +git submodule update +cd gdal-src/source +git pull +git checkout v3.8.3 # corresponds to the tag you want to update to +cd ../../ +git add gdal-src/source +git commit -m "Update bundled gdal version to 3.8.4" +``` + +These steps assume that there are no fundamental changes to the gdal build system. + diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index 27cc67494..c167b43ea 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -20,7 +20,6 @@ geos-sys = { version = "2.0.6", optional = true } # build as otherwise `DEP_GEOSSRC_ROOT` is not set geos-src = { version = "0.2.3", optional = true } - [build-dependencies] cmake = "0.1.50" @@ -156,7 +155,6 @@ internal_drivers = [ # ogr and gdal "driver_idrisi", - "driver_pds", "driver_sdts", "driver_vrt", "driver_mem", @@ -259,7 +257,6 @@ driver_zmap = [] # ogr and gdal driver_idrisi = [] -driver_pds = [] driver_sdts = [] driver_vrt = [] driver_mem = [] @@ -325,6 +322,7 @@ driver_netcdf = ["dep:netcdf-src", "driver_hdf5", "dep:hdf5-sys"] # driver_pmtiles = ["driver_mvt"] # depends on driver_mvt # driver_csw = ["curl-sys", "driver_gml"] # depends on gml driver # driver_wfs = ["curl-sys", "driver_gml"] +# driver_pds = ["driver_gml"] # unclear driver_http = [] diff --git a/gdal-src/build.rs b/gdal-src/build.rs index 044612051..b123a397c 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -113,7 +113,6 @@ fn main() { handle_ogr_driver!(config, "driver_vdv"); handle_ogr_driver!(config, "driver_wasp"); handle_ogr_driver!(config, "driver_idrisi"); - handle_ogr_driver!(config, "driver_pds"); handle_ogr_driver!(config, "driver_sdts"); handle_ogr_driver!(config, "driver_vrt"); handle_ogr_driver!(config, "driver_mem"); @@ -290,6 +289,7 @@ fn main() { let pq_include = std::env::var("DEP_PQ_SYS_SRC_INCLUDE").expect("this is set by pq-src"); let pq_lib = std::env::var("DEP_PQ_SYS_SRC_LIB_DIR").expect("this is set by pq-src"); let pq_lib_path = std::path::PathBuf::from(&pq_lib); + println!("cargo:rustc-link-search=native={}", pq_lib_path.display()); let pq_lib_path = if pq_lib_path.join("libpq.a").exists() { pq_lib_path.join("libpq.a").display().to_string() } else if pq_lib_path.join("pq.lib").exists() { @@ -297,6 +297,8 @@ fn main() { } else { panic!("Libpq not found in {pq_lib}"); }; + + println!("cargo:rustc-link-lib=static=pq"); config .define("GDAL_USE_POSTGRESQL", "ON") .define("PostgreSQL_INCLUDE_DIR", pq_include) diff --git a/gdal-src/src/lib.rs b/gdal-src/src/lib.rs index 181d4e4cf..764ac1e09 100644 --- a/gdal-src/src/lib.rs +++ b/gdal-src/src/lib.rs @@ -2,13 +2,13 @@ extern crate curl_sys; #[cfg(feature = "geos")] extern crate geos_sys; -#[cfg(feature = "DRIVER_HDF5")] +#[cfg(feature = "driver_hdf5")] extern crate hdf5_src; -#[cfg(feature = "DRIVER_SQLITE")] +#[cfg(feature = "driver_sqlite")] extern crate libsqlite3_sys; -#[cfg(feature = "DRIVER_NETCDF")] +#[cfg(feature = "driver_netcdf")] extern crate netcdf_src; -#[cfg(feature = "DRIVER_PG")] +#[cfg(feature = "driver_pg")] extern crate pq_src; extern crate link_cplusplus; From fd65b6f09068721c6d05ceb837c29119fec20973 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Thu, 4 Apr 2024 07:25:49 +0200 Subject: [PATCH 06/22] Use released pq-src version --- Cargo.toml | 1 - gdal-src/Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c8ca3e3d7..ea4f09479 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,4 +49,3 @@ rustdoc-args = ["--cfg", "docsrs"] [patch.crates-io] proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "44a503869709ea793a5f8452bfb9e2a99b7160fc" } -pq-src = { git = "https://github.com/sgrif/pq-sys", rev = "3b0b90d9390ad5d53c7e6b2bcd167d8ef2a3a1e4" } diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index c167b43ea..08b3f71b4 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -12,7 +12,7 @@ libsqlite3-sys = { version = "0.28.0", features = ["bundled"], optional = true } hdf5-src = { version = "0.8.1", optional = true, features = ["hl"] } hdf5-sys = { version = "0.8.1", optional = true, features = ["static"] } netcdf-src = { version = "0.3.2", optional = true } -pq-src = { version = "0.1.1", optional = true } +pq-src = { version = "0.1.3", optional = true } curl-sys = { version = "0.4.70", features = ["static-curl"], optional = true } libz-sys = { version = "1.1.15", features = ["static"], optional = true } geos-sys = { version = "2.0.6", optional = true } From 5cda7f33a438431a9df0c2b8a4f91324a82f51e8 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Mon, 8 Apr 2024 15:21:38 +0200 Subject: [PATCH 07/22] Use a patched netcdf version to fix the duplicated symbol issue --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index ea4f09479..fcd70c343 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,3 +49,4 @@ rustdoc-args = ["--cfg", "docsrs"] [patch.crates-io] proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "44a503869709ea793a5f8452bfb9e2a99b7160fc" } +netcdf-src = { git = "https://github.com/GiGainfosystems/netcdf", rev = "292309979f533f71d542f4fcf8fdac8830f0e22b" } From a10a39143a1efb297c8954995465d4a2880941cf Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 9 Apr 2024 09:38:51 +0200 Subject: [PATCH 08/22] Switch to a released netcdf-src version that pulls in the relevant fix --- Cargo.toml | 1 - gdal-src/Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fcd70c343..ea4f09479 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,4 +49,3 @@ rustdoc-args = ["--cfg", "docsrs"] [patch.crates-io] proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "44a503869709ea793a5f8452bfb9e2a99b7160fc" } -netcdf-src = { git = "https://github.com/GiGainfosystems/netcdf", rev = "292309979f533f71d542f4fcf8fdac8830f0e22b" } diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index 08b3f71b4..90977d432 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -11,7 +11,7 @@ proj-sys = { version = "0.23.2", features = ["bundled_proj"] } libsqlite3-sys = { version = "0.28.0", features = ["bundled"], optional = true } hdf5-src = { version = "0.8.1", optional = true, features = ["hl"] } hdf5-sys = { version = "0.8.1", optional = true, features = ["static"] } -netcdf-src = { version = "0.3.2", optional = true } +netcdf-src = { version = "0.3.3", optional = true } pq-src = { version = "0.1.3", optional = true } curl-sys = { version = "0.4.70", features = ["static-curl"], optional = true } libz-sys = { version = "1.1.15", features = ["static"], optional = true } From 29fa5e92f5f2b187cd1d48064cca39b88895ebd4 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Fri, 10 May 2024 07:30:42 +0200 Subject: [PATCH 09/22] Use upstream proj-sys --- Cargo.toml | 2 +- gdal-src/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ea4f09479..baa275a95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,4 +48,4 @@ rustdoc-args = ["--cfg", "docsrs"] [patch.crates-io] -proj-sys = { git = "https://github.com/GiGainfosystems/proj", rev = "44a503869709ea793a5f8452bfb9e2a99b7160fc" } +proj-sys = { git = "https://github.com/georust/proj", rev = "4a0e203" } diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index 90977d432..fe3dcd664 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] link-cplusplus = "1.0" -proj-sys = { version = "0.23.2", features = ["bundled_proj"] } +proj-sys = { version = "0.24.0", features = ["bundled_proj"] } libsqlite3-sys = { version = "0.28.0", features = ["bundled"], optional = true } hdf5-src = { version = "0.8.1", optional = true, features = ["hl"] } hdf5-sys = { version = "0.8.1", optional = true, features = ["static"] } From 76d7a5d056a74ce80cf2e1bc9452c82f543fc958 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 14 May 2024 13:57:57 +0200 Subject: [PATCH 10/22] Another proj update --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index baa275a95..0347b56a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,4 +48,4 @@ rustdoc-args = ["--cfg", "docsrs"] [patch.crates-io] -proj-sys = { git = "https://github.com/georust/proj", rev = "4a0e203" } +proj-sys = { git = "https://github.com/georust/proj", rev = "57c9e80" } From e42e65dd4db73af34f08a1e3244a089bc3c1a93c Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 14 May 2024 14:10:07 +0200 Subject: [PATCH 11/22] Update bundled version to gdal 3.9.0 --- gdal-src/source | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gdal-src/source b/gdal-src/source index c2d2a6173..bb5ea618e 160000 --- a/gdal-src/source +++ b/gdal-src/source @@ -1 +1 @@ -Subproject commit c2d2a61739ca770bae5a26be3eeb25a045dd3458 +Subproject commit bb5ea618e23e498e79e8b8e6bd7215ad94bb2103 From 3e670af1d06a1b5b2f1d54e9b73e598fe2d0e49a Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Wed, 15 May 2024 15:18:29 +0200 Subject: [PATCH 12/22] Path separator fixes --- gdal-src/build.rs | 113 +++++++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/gdal-src/build.rs b/gdal-src/build.rs index b123a397c..d7c3dd010 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + macro_rules! handle_ogr_driver { ($config: ident, $driver: literal) => { if cfg!(feature = $driver) { @@ -27,23 +29,14 @@ macro_rules! handle_gdal_driver { }; } -fn find_library(lib_name: &str, path: impl Into) -> String { +fn find_library(lib_name: &str, path: impl Into) -> PathBuf { let path = path.into(); if path.join("lib64").join(format!("lib{lib_name}.a")).exists() { - path.join("lib64") - .join(format!("lib{lib_name}.a")) - .display() - .to_string() + path.join("lib64").join(format!("lib{lib_name}.a")) } else if path.join("lib").join(format!("lib{lib_name}.a")).exists() { - path.join("lib") - .join(format!("lib{lib_name}.a")) - .display() - .to_string() + path.join("lib").join(format!("lib{lib_name}.a")) } else if path.join("lib").join(format!("{lib_name}.lib")).exists() { - path.join("lib") - .join(format!("{lib_name}.lib")) - .display() - .to_string() + path.join("lib").join(format!("{lib_name}.lib")) } else { panic!("{lib_name} not found in {}", path.display()); } @@ -54,17 +47,14 @@ fn main() { std::path::PathBuf::from(std::env::var("DEP_PROJ_ROOT").expect("set by proj-sys")); let proj_library = if std::env::var("CARGO_CFG_TARGET_FAMILY").as_deref() == Ok("windows") { if proj_root.join("lib").join("proj_d.lib").exists() { - proj_root - .join("lib") - .join("proj_d.lib") - .display() - .to_string() + proj_root.join("lib").join("proj_d.lib") } else { - proj_root.join("lib").join("proj.lib").display().to_string() + proj_root.join("lib").join("proj.lib") } } else { find_library("proj", &proj_root) }; + let proj_include = proj_root.join("include"); let mut config = cmake::Config::new("source"); @@ -79,11 +69,8 @@ fn main() { .define("BUILD_DOCS", "OFF") .define("BUILD_TESTING", "OFF") .define("BUILD_GMOCK", "OFF") - .define( - "PROJ_INCLUDE_DIR", - format!("{}/include", proj_root.display()), - ) - .define("PROJ_LIBRARY", proj_library) + .define("PROJ_INCLUDE_DIR", print_path(&proj_include)) + .define("PROJ_LIBRARY", print_path(&proj_library)) .define("ACCEPT_MISSING_LINUX_FS_HEADER", "ON"); // enable the gpkg driver @@ -194,11 +181,14 @@ 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 mut sqlite3_lib = PathBuf::from(sqlite3_lib_dir); + sqlite3_lib.push("libsqlite3.a"); + let sqlite3_include_dir = PathBuf::from(sqlite3_include_dir); config .define("GDAL_USE_SQLITE3", "ON") - .define("SQLite3_INCLUDE_DIR", sqlite3_include_dir) - .define("SQLite3_LIBRARY", format!("{sqlite3_lib_dir}/libsqlite3.a")) + .define("SQLite3_INCLUDE_DIR", print_path(&sqlite3_include_dir)) + .define("SQLite3_LIBRARY", print_path(&sqlite3_lib)) .define("OGR_ENABLE_DRIVER_SQLITE", "ON"); } else { config.define("GDAL_USE_SQLITE3", "OFF"); @@ -211,16 +201,21 @@ fn main() { let hdf5_dir = std::env::var("DEP_HDF5SRC_ROOT").expect("This is set by hdf5-src"); let hdf5_lib = std::env::var("DEP_HDF5SRC_LIBRARY").expect("This is set by hdf5-src"); let hdf5_lib_dir = find_library(&hdf5_lib, &hdf5_dir); - let p = std::path::PathBuf::from(&hdf5_lib_dir); + let p = PathBuf::from(&hdf5_lib_dir); + let mut hdf5_cc = PathBuf::from(&hdf5_dir); + hdf5_cc.push("bin"); + hdf5_cc.push("h5cc"); + let mut hdf5_include = PathBuf::from(&hdf5_dir); + hdf5_include.push("include"); let p = p.parent().unwrap(); println!("cargo:rustc-link-search=native={}", p.display()); println!("cargo:rustc-link-lib=static={hdf5_lib}"); config .define("GDAL_USE_HDF5", "ON") - .define("HDF5_C_COMPILER_EXECUTABLE", format!("{hdf5_dir}/bin/h5cc")) - .define("HDF5_C_INCLUDE_DIR", format!("{hdf5_dir}/include")) - .define("HDF5_hdf5_LIBRARY_DEBUG", &hdf5_lib_dir) - .define("HDF5_hdf5_LIBRARY_RELEASE", &hdf5_lib_dir) + .define("HDF5_C_COMPILER_EXECUTABLE", print_path(&hdf5_cc)) + .define("HDF5_C_INCLUDE_DIR", print_path(&hdf5_include)) + .define("HDF5_hdf5_LIBRARY_DEBUG", print_path(&hdf5_lib_dir)) + .define("HDF5_hdf5_LIBRARY_RELEASE", print_path(&hdf5_lib_dir)) .define("GDAL_ENABLE_DRIVER_HDF5", "ON") .define("HDF5_USE_STATIC_LIBRARIES", "ON"); } else { @@ -234,11 +229,9 @@ fn main() { let hl_library = std::env::var("DEP_HDF5SRC_HL_LIBRARY").expect("This is set by hdf5-src"); let netcdf_lib = find_library("netcdf", &netcdf_root_dir); let hl_library_path = find_library(&hl_library, hdf5_dir); - let hl_library_path = std::path::PathBuf::from(hl_library_path); let hl_library_path = hl_library_path.parent().unwrap(); - let netcdf_library_path = std::path::PathBuf::from(&netcdf_lib); - let netcdf_library_path = netcdf_library_path.parent().unwrap(); + let netcdf_library_path = netcdf_lib.parent().unwrap(); println!( "cargo:rustc-link-search=native={}", netcdf_library_path.display() @@ -249,10 +242,13 @@ fn main() { hl_library_path.display() ); println!("cargo:rustc-link-lib=static={hl_library}"); + + let mut netcdf_include = PathBuf::from(netcdf_root_dir); + netcdf_include.push("include"); config .define("GDAL_USE_NETCDF", "ON") - .define("NETCDF_INCLUDE_DIR", format!("{netcdf_root_dir}/include")) - .define("NETCDF_LIBRARY", netcdf_lib) + .define("NETCDF_INCLUDE_DIR", print_path(&netcdf_include)) + .define("NETCDF_LIBRARY", print_path(&netcdf_lib)) .define("GDAL_ENABLE_DRIVER_NETCDF", "ON"); } else { config.define("GDAL_USE_NETCDF", "OFF"); @@ -260,14 +256,16 @@ fn main() { if cfg!(feature = "curl-sys") { let curl_root = std::env::var("DEP_CURL_ROOT").expect("set from curl-sys"); + let mut curl_include = PathBuf::from(&curl_root); + curl_include.push("include"); + let mut curl_lib = PathBuf::from(curl_root); + curl_lib.push("build"); + curl_lib.push("libcurl.a"); config .define("GDAL_USE_CURL", "ON") - .define("CURL_INCLUDE_DIR", format!("{curl_root}/include")) - .define("CURL_LIBRARY_DEBUG", format!("{curl_root}/build/libcurl.a")) - .define( - "CURL_LIBRARY_RELEASE", - format!("{curl_root}/build/libcurl.a"), - ) + .define("CURL_INCLUDE_DIR", print_path(&curl_include)) + .define("CURL_LIBRARY_DEBUG", print_path(&curl_lib)) + .define("CURL_LIBRARY_RELEASE", print_path(&curl_lib)) .define("CURL_USE_STATIC_LIBS", "ON"); } else { config.define("GDAL_USE_CURL", "OFF"); @@ -291,19 +289,19 @@ fn main() { let pq_lib_path = std::path::PathBuf::from(&pq_lib); println!("cargo:rustc-link-search=native={}", pq_lib_path.display()); let pq_lib_path = if pq_lib_path.join("libpq.a").exists() { - pq_lib_path.join("libpq.a").display().to_string() + pq_lib_path.join("libpq.a") } else if pq_lib_path.join("pq.lib").exists() { - pq_lib_path.join("pq.lib").display().to_string() + pq_lib_path.join("pq.lib") } else { panic!("Libpq not found in {pq_lib}"); }; - + let pq_include = PathBuf::from(pq_include); println!("cargo:rustc-link-lib=static=pq"); config .define("GDAL_USE_POSTGRESQL", "ON") - .define("PostgreSQL_INCLUDE_DIR", pq_include) - .define("PostgreSQL_LIBRARY_DEBUG", &pq_lib_path) - .define("PostgreSQL_LIBRARY_RELEASE", &pq_lib_path) + .define("PostgreSQL_INCLUDE_DIR", print_path(&pq_include)) + .define("PostgreSQL_LIBRARY_DEBUG", print_path(&pq_lib_path)) + .define("PostgreSQL_LIBRARY_RELEASE", print_path(&pq_lib_path)) .define("OGR_ENABLE_DRIVER_PG", "ON"); } else { config.define("GDAL_USE_POSTGRESQL", "OFF"); @@ -318,9 +316,11 @@ fn main() { if cfg!(feature = "geos_static") { let geos_root = std::env::var("DEP_GEOSSRC_ROOT").expect("this is set by geos-src"); - config.define("GEOS_INCLUDE_DIR", format!("{geos_root}/include")); + let mut geos_include = PathBuf::from(&geos_root); + geos_include.push("include"); + config.define("GEOS_INCLUDE_DIR", print_path(&geos_include)); let lib_path = find_library("geos", geos_root); - config.define("GEOS_LIBRARY", lib_path); + config.define("GEOS_LIBRARY", print_path(&lib_path)); } if cfg!(target_env = "msvc") { @@ -348,7 +348,7 @@ fn main() { "cargo:rustc-link-search=native={}", lib_dir.to_str().unwrap() ); - let lib_dir = res.join("build/lib"); + let lib_dir = res.join("build").join("lib"); println!( "cargo:rustc-link-search=native={}", lib_dir.to_str().unwrap() @@ -361,3 +361,14 @@ fn main() { println!("cargo:rustc-link-lib=static=gdal"); } } + +// cmake sometimes does not like windows paths like `c:\\whatever\folder` +// it seems to tread `\` as escape sequence in some cases, therefore +// we rewrite the path here to always use `/` as seperator +// https://github.com/OSGeo/gdal/issues/9935 +fn print_path(path: &std::path::Path) -> String { + path.components() + .map(|c| c.as_os_str().to_str().unwrap()) + .collect::>() + .join("/") +} From acbf23661597b842ad4374fdbef0b00359d3c288 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Wed, 5 Jun 2024 08:27:35 +0200 Subject: [PATCH 13/22] Clean the previous build output as gdal doesn't like rebuilds --- gdal-src/build.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gdal-src/build.rs b/gdal-src/build.rs index d7c3dd010..d67612c74 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -43,6 +43,18 @@ fn find_library(lib_name: &str, path: impl Into) -> PathBuf } fn main() { + // gdal doesn't like non clean builds so we remove any artifact from an older build + // https://github.com/OSGeo/gdal/issues/10125 + // This hopefully does not break all the caching as we don't rerun the build script + // everytime, just if something changed. In that case we will do always a clean build + // and not an incremental rebuild because of the gdal build system seems not to be able + // to handle that well + let out_dir = std::path::PathBuf::from(std::env::var("OUT_DIR").expect("Set by cargo")); + if out_dir.exists() { + let _ = std::fs::remove_dir_all(&out_dir); + let _ = std::fs::create_dir_all(&out_dir); + } + let proj_root = std::path::PathBuf::from(std::env::var("DEP_PROJ_ROOT").expect("set by proj-sys")); let proj_library = if std::env::var("CARGO_CFG_TARGET_FAMILY").as_deref() == Ok("windows") { From f1793e365acc39acf4d2aad26d2709bb068d488c Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Wed, 17 Jul 2024 12:42:32 +0200 Subject: [PATCH 14/22] Introduce a `nobuild` feature for gdal-src` to skip builds --- gdal-src/Cargo.toml | 3 +++ gdal-src/build.rs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index fe3dcd664..9c8f8755b 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -25,6 +25,9 @@ cmake = "0.1.50" [features] default = [] +# force not building this crate +nobuild = ["proj-sys/nobuild"] + all_drivers = [ "internal_drivers", "driver_sqlite", diff --git a/gdal-src/build.rs b/gdal-src/build.rs index d67612c74..8346be944 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -43,6 +43,9 @@ fn find_library(lib_name: &str, path: impl Into) -> PathBuf } fn main() { + if cfg!(feature = "nobuild") { + return; + } // gdal doesn't like non clean builds so we remove any artifact from an older build // https://github.com/OSGeo/gdal/issues/10125 // This hopefully does not break all the caching as we don't rerun the build script From 8c488dd5d338ed91aeec1d7120e1642f970cd0d1 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Thu, 18 Jul 2024 14:01:45 +0200 Subject: [PATCH 15/22] Add a links annotation to make sure that the buildscript actually runs before any depentend crate --- gdal-src/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index 9c8f8755b..165b7095e 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -2,6 +2,7 @@ name = "gdal-src" version = "0.1.0" edition = "2021" +links = "gdal_src" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From e563aceb422f4de31b6ea3cacfc70251d1a3bafd Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Wed, 31 Jul 2024 21:35:03 +0200 Subject: [PATCH 16/22] Add missing feature flag for gdal-src --- gdal-src/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index 165b7095e..2f44a146e 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -234,6 +234,7 @@ driver_northwood = [] driver_ozi = [] driver_pcidsk = [] driver_pcraster = [] +driver_pds = [] driver_png = [] driver_prf = [] driver_r = [] From 8da23b2ee7d8d558a02958ba2415bd66b2b6c84d Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 13 Aug 2024 16:52:18 +0200 Subject: [PATCH 17/22] Fix choosing the build proj version --- gdal-src/build.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/gdal-src/build.rs b/gdal-src/build.rs index 8346be944..0cbb0bbb5 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -84,6 +84,7 @@ fn main() { .define("BUILD_DOCS", "OFF") .define("BUILD_TESTING", "OFF") .define("BUILD_GMOCK", "OFF") + .define("GDAL_FIND_PACKAGE_PROJ_MODE", "MODULE") .define("PROJ_INCLUDE_DIR", print_path(&proj_include)) .define("PROJ_LIBRARY", print_path(&proj_library)) .define("ACCEPT_MISSING_LINUX_FS_HEADER", "ON"); From 6d1dba8b381a66425893ddf1402d7ad43d658c25 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Tue, 13 Aug 2024 16:53:45 +0200 Subject: [PATCH 18/22] Bump bundled gdal to 3.9.1 --- gdal-src/source | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gdal-src/source b/gdal-src/source index bb5ea618e..01ac70772 160000 --- a/gdal-src/source +++ b/gdal-src/source @@ -1 +1 @@ -Subproject commit bb5ea618e23e498e79e8b8e6bd7215ad94bb2103 +Subproject commit 01ac70772b997ab87d2312e2036eb66faf6b0508 From a4f384bb42b1f0af9aa29ca18408a0c64d604a22 Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Wed, 4 Sep 2024 08:26:42 +0200 Subject: [PATCH 19/22] Use released proj-sys version --- Cargo.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 118e5d347..aed795695 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,5 +63,3 @@ check-cfg = [ 'cfg(minor_ge_9)', ] -[patch.crates-io] -proj-sys = { git = "https://github.com/georust/proj", rev = "57c9e80" } From 60154404f1b441311387ae58ab1cdeb835cd6a2b Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Wed, 4 Sep 2024 08:28:20 +0200 Subject: [PATCH 20/22] Hard code macos-13 for the mac x86_64 runner --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9077b45d..14fe1a0de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -127,7 +127,7 @@ jobs: os: - ubuntu-latest - windows-latest - - macos-latest # x86_64 + - macos-13 # x86_64 - macos-14 # aarch64 runs-on: ${{ matrix.os }} steps: From bddf34ad17e4983f530feacbc43c2da89bdf0cea Mon Sep 17 00:00:00 2001 From: Magnus Ulimoen Date: Wed, 4 Sep 2024 15:46:33 +0200 Subject: [PATCH 21/22] Simplify bundling of hdf5/netcdf --- gdal-src/Cargo.toml | 14 +++++++------- gdal-src/build.rs | 39 +++++++++++---------------------------- gdal-src/src/lib.rs | 4 ++-- 3 files changed, 20 insertions(+), 37 deletions(-) diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index 2f44a146e..cf91f771a 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -10,9 +10,8 @@ links = "gdal_src" link-cplusplus = "1.0" proj-sys = { version = "0.24.0", features = ["bundled_proj"] } libsqlite3-sys = { version = "0.28.0", features = ["bundled"], optional = true } -hdf5-src = { version = "0.8.1", optional = true, features = ["hl"] } -hdf5-sys = { version = "0.8.1", optional = true, features = ["static"] } -netcdf-src = { version = "0.3.3", optional = true } +hdf5-sys = { package = "hdf5-metno-sys", version = "0.9.1", optional = true, features = ["static", "hl", "deprecated"] } +netcdf-sys = { version = "0.8.1", optional = true, features = ["static"] } pq-src = { version = "0.1.3", optional = true } curl-sys = { version = "0.4.70", features = ["static-curl"], optional = true } libz-sys = { version = "1.1.15", features = ["static"], optional = true } @@ -56,11 +55,11 @@ all_drivers = [ # that you statically link libgeos and # therefore makes your binary fall under # LGPL as well -geos_static = ["geos", "geos-sys/static", "geos-src"] +geos_static = ["geos", "dep:geos-sys", "geos-sys?/static", "dep:geos-src"] # as long as the `geos_static` feature # is not enabled that will only # dynamically link geos -geos = ["geos-sys"] +geos = ["dep:geos-sys"] internal_drivers = [ # ogr internal, @@ -275,6 +274,7 @@ driver_vfk = ["driver_sqlite"] driver_rasterlite = [] # unclear how to handle that # curl +curl-sys = ["dep:curl-sys"] driver_amigocloud = ["curl-sys"] driver_carto = ["curl-sys"] driver_daas = ["curl-sys"] @@ -310,10 +310,10 @@ driver_pg = ["dep:pq-src"] driver_postgis_raster = ["driver_pg"] # libhdf5 -driver_hdf5 = ["dep:hdf5-src", "dep:libz-sys"] +driver_hdf5 = ["dep:hdf5-sys", "hdf5-sys?/zlib", "dep:libz-sys"] # libnetcdf -driver_netcdf = ["dep:netcdf-src", "driver_hdf5", "dep:hdf5-sys"] +driver_netcdf = ["dep:netcdf-sys", "driver_hdf5"] # poppler #driver_pdf = [] diff --git a/gdal-src/build.rs b/gdal-src/build.rs index 0cbb0bbb5..eadfbec44 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -214,18 +214,15 @@ fn main() { handle_ogr_driver!(config, "driver_vfk"); if cfg!(feature = "driver_hdf5") { - let hdf5_dir = std::env::var("DEP_HDF5SRC_ROOT").expect("This is set by hdf5-src"); - let hdf5_lib = std::env::var("DEP_HDF5SRC_LIBRARY").expect("This is set by hdf5-src"); + let hdf5_dir = std::env::var("DEP_HDF5_ROOT").expect("This is set by hdf5-sys"); + // let hdf5_dir = format!("{hdf5_dir}/.."); + let hdf5_lib = std::env::var("DEP_HDF5_LIBRARY").expect("This is set by hdf5-sys"); let hdf5_lib_dir = find_library(&hdf5_lib, &hdf5_dir); - let p = PathBuf::from(&hdf5_lib_dir); let mut hdf5_cc = PathBuf::from(&hdf5_dir); hdf5_cc.push("bin"); hdf5_cc.push("h5cc"); - let mut hdf5_include = PathBuf::from(&hdf5_dir); - hdf5_include.push("include"); - let p = p.parent().unwrap(); - println!("cargo:rustc-link-search=native={}", p.display()); - println!("cargo:rustc-link-lib=static={hdf5_lib}"); + let hdf5_include = std::env::var("DEP_HDF5_INCLUDE").expect("This is set by hdf5-sys"); + let hdf5_include = PathBuf::from(&hdf5_include); config .define("GDAL_USE_HDF5", "ON") .define("HDF5_C_COMPILER_EXECUTABLE", print_path(&hdf5_cc)) @@ -239,28 +236,14 @@ fn main() { } if cfg!(feature = "driver_netcdf") { - let netcdf_root_dir = - std::env::var("DEP_NETCDFSRC_ROOT").expect("This is set by netcdf-src"); - let hdf5_dir = std::env::var("DEP_HDF5SRC_ROOT").expect("This is set by hdf5-src"); - let hl_library = std::env::var("DEP_HDF5SRC_HL_LIBRARY").expect("This is set by hdf5-src"); - let netcdf_lib = find_library("netcdf", &netcdf_root_dir); - let hl_library_path = find_library(&hl_library, hdf5_dir); - let hl_library_path = hl_library_path.parent().unwrap(); + let netcdf_include = + std::env::var("DEP_NETCDF_INCLUDEDIR").expect("This is set by netcdf-sys"); + let netcdf_root = format!("{netcdf_include}/.."); - let netcdf_library_path = netcdf_lib.parent().unwrap(); - println!( - "cargo:rustc-link-search=native={}", - netcdf_library_path.display() - ); - println!("cargo:rustc-link-lib=static=netcdf"); - println!( - "cargo:rustc-link-search=native={}", - hl_library_path.display() - ); - println!("cargo:rustc-link-lib=static={hl_library}"); + let netcdf_include = PathBuf::from(netcdf_include); + let netcdf_root = PathBuf::from(netcdf_root); + let netcdf_lib = find_library("netcdf", &netcdf_root); - let mut netcdf_include = PathBuf::from(netcdf_root_dir); - netcdf_include.push("include"); config .define("GDAL_USE_NETCDF", "ON") .define("NETCDF_INCLUDE_DIR", print_path(&netcdf_include)) diff --git a/gdal-src/src/lib.rs b/gdal-src/src/lib.rs index 764ac1e09..d8a40ced8 100644 --- a/gdal-src/src/lib.rs +++ b/gdal-src/src/lib.rs @@ -3,11 +3,11 @@ extern crate curl_sys; #[cfg(feature = "geos")] extern crate geos_sys; #[cfg(feature = "driver_hdf5")] -extern crate hdf5_src; +extern crate hdf5_sys; #[cfg(feature = "driver_sqlite")] extern crate libsqlite3_sys; #[cfg(feature = "driver_netcdf")] -extern crate netcdf_src; +extern crate netcdf_sys; #[cfg(feature = "driver_pg")] extern crate pq_src; From c43cd2ae80e7f1b8675c9b39716d8e8a69f2baca Mon Sep 17 00:00:00 2001 From: Georg Semmler Date: Thu, 5 Sep 2024 17:19:20 +0000 Subject: [PATCH 22/22] Remove some unneeded lines --- gdal-src/Cargo.toml | 1 - gdal-src/build.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/gdal-src/Cargo.toml b/gdal-src/Cargo.toml index cf91f771a..e80ad6b0d 100644 --- a/gdal-src/Cargo.toml +++ b/gdal-src/Cargo.toml @@ -274,7 +274,6 @@ driver_vfk = ["driver_sqlite"] driver_rasterlite = [] # unclear how to handle that # curl -curl-sys = ["dep:curl-sys"] driver_amigocloud = ["curl-sys"] driver_carto = ["curl-sys"] driver_daas = ["curl-sys"] diff --git a/gdal-src/build.rs b/gdal-src/build.rs index eadfbec44..ccbcea306 100644 --- a/gdal-src/build.rs +++ b/gdal-src/build.rs @@ -215,7 +215,6 @@ fn main() { if cfg!(feature = "driver_hdf5") { let hdf5_dir = std::env::var("DEP_HDF5_ROOT").expect("This is set by hdf5-sys"); - // let hdf5_dir = format!("{hdf5_dir}/.."); let hdf5_lib = std::env::var("DEP_HDF5_LIBRARY").expect("This is set by hdf5-sys"); let hdf5_lib_dir = find_library(&hdf5_lib, &hdf5_dir); let mut hdf5_cc = PathBuf::from(&hdf5_dir);