# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os import sys from spack.build_systems.autotools import AutotoolsBuilder from spack.build_systems.cmake import CMakeBuilder from spack.package import * from spack.util.environment import filter_system_paths, is_system_path class Gdal(CMakePackage, AutotoolsPackage, PythonExtension): """GDAL: Geospatial Data Abstraction Library. GDAL is a translator library for raster and vector geospatial data formats that is released under an MIT style Open Source License by the Open Source Geospatial Foundation. As a library, it presents a single raster abstract data model and single vector abstract data model to the calling application for all supported formats. It also comes with a variety of useful command line utilities for data translation and processing. """ homepage = "https://www.gdal.org/" url = "https://download.osgeo.org/gdal/3.2.0/gdal-3.2.0.tar.xz" list_url = "https://download.osgeo.org/gdal/" list_depth = 1 maintainers("adamjstewart") license("MIT") version("3.8.2", sha256="dc2921ee1cf7a5c0498e94d15fb9ab9c9689c296363a1d021fc3293dd242b4db") version("3.8.1", sha256="75a20b23879bfa3d8c0db68e1d6f8b924f7f9d97f5fed089b01a72e404293900") version("3.8.0", sha256="ec0f78d9dc32352aeac6edc9c3b27a991b91f9dc6f92c452207d84431c58757d") version("3.7.3", sha256="e0a6f0c453ea7eb7c09967f50ac49426808fcd8f259dbc9888140eb69d7ffee6") version("3.7.2", sha256="40c0068591d2c711c699bbb734319398485ab169116ac28005d8302f80b923ad") version("3.7.1", sha256="9297948f0a8ba9e6369cd50e87c7e2442eda95336b94d2b92ef1829d260b9a06") version("3.7.0", sha256="af4b26a6b6b3509ae9ccf1fcc5104f7fe015ef2110f5ba13220816398365adce") version("3.6.4", sha256="889894cfff348c04ac65b462f629d03efc53ea56cf04de7662fbe81a364e3df1") version("3.6.3", sha256="3cccbed883b1fb99b913966aa3a650ad930e7c3afc714f5823f9754176ee49ea") version("3.6.2", sha256="35f40d2e08061b342513cdcddc2b997b3814ef8254514f0ef1e8bc7aa56cf681") version("3.6.1", sha256="68f1c03547ff7152289789db7f67ee634167c9b7bfec4872b88406b236f9c230") version("3.6.0", sha256="f7afa4aa8d32d0799e011a9f573c6a67e9471f78e70d3d0d0b45b45c8c0c1a94") version("3.5.3", sha256="d32223ddf145aafbbaec5ccfa5dbc164147fb3348a3413057f9b1600bb5b3890") version("3.5.2", sha256="0874dfdeb9ac42e53c37be4184b19350be76f0530e1f4fa8004361635b9030c2") version("3.5.1", sha256="d12c30a9eacdeaab493c0d1c9f88eb337c9cbb5bb40744c751bdd5a5af166ab6") version("3.5.0", sha256="d49121e5348a51659807be4fb866aa840f8dbec4d1acba6d17fdefa72125bfc9") version("3.4.3", sha256="02a27b35899e1c4c3bcb6007da900128ddd7e8ab7cd6ccfecf338a301eadad5a") version("3.4.2", sha256="16baf03dfccf9e3f72bb2e15cd2d5b3f4be0437cdff8a785bceab0c7be557335") version("3.4.1", sha256="332f053516ca45101ef0f7fa96309b64242688a8024780a5d93be0230e42173d") version("3.4.0", sha256="ac7bd2bb9436f3fc38bc7309704672980f82d64b4d57627d27849259b8f71d5c") version("3.3.3", sha256="1e8fc8b19c77238c7f4c27857d04857b65d8b7e8050d3aac256d70fa48a21e76") version("3.3.2", sha256="630e34141cf398c3078d7d8f08bb44e804c65bbf09807b3610dcbfbc37115cc3") version("3.3.1", sha256="48ab00b77d49f08cf66c60ccce55abb6455c3079f545e60c90ee7ce857bccb70") version("3.3.0", sha256="190c8f4b56afc767f43836b2a5cd53cc52ee7fdc25eb78c6079c5a244e28efa7") version("3.2.3", sha256="d9ec8458fe97fd02bf36379e7f63eaafce1005eeb60e329ed25bb2d2a17a796f") version("3.2.2", sha256="a7e1e414e5c405af48982bf4724a3da64a05770254f2ce8affb5f58a7604ca57") version("3.2.1", sha256="6c588b58fcb63ff3f288eb9f02d76791c0955ba9210d98c3abd879c770ae28ea") version("3.2.0", sha256="b051f852600ffdf07e337a7f15673da23f9201a9dbb482bd513756a3e5a196a6") version("3.1.4", sha256="7b82486f71c71cec61f9b237116212ce18ef6b90f068cbbf9f7de4fc50b576a8") version("3.1.3", sha256="161cf55371a143826f1d76ce566db1f0a666496eeb4371aed78b1642f219d51d") version("3.1.2", sha256="767c8d0dfa20ba3283de05d23a1d1c03a7e805d0ce2936beaff0bb7d11450641") version("3.1.1", sha256="97154a606339a6c1d87c80fb354d7456fe49828b2ef9a3bc9ed91771a03d2a04") version("3.1.0", sha256="e754a22242ccbec731aacdb2333b567d4c95b9b02d3ba1ea12f70508d244fcda") version("3.0.4", sha256="5569a4daa1abcbba47a9d535172fc335194d9214fdb96cd0f139bb57329ae277") version("3.0.3", sha256="e20add5802265159366f197a8bb354899e1693eab8dbba2208de14a457566109") version("3.0.2", sha256="c3765371ce391715c8f28bd6defbc70b57aa43341f6e94605f04fe3c92468983") version("3.0.1", sha256="45b4ae25dbd87282d589eca76481c426f72132d7a599556470d5c38263b09266") version("3.0.0", sha256="ad316fa052d94d9606e90b20a514b92b2dd64e3142dfdbd8f10981a5fcd5c43e") version("2.4.4", sha256="a383bd3cf555d6e1169666b01b5b3025b2722ed39e834f1b65090f604405dcd8") version("2.4.3", sha256="d52dc3e0cff3af3e898d887c4151442989f416e839948e73f0994f0224bbff60") version("2.4.2", sha256="dcc132e469c5eb76fa4aaff238d32e45a5d947dc5b6c801a123b70045b618e0c") version("2.4.1", sha256="fd51b4900b2fc49b98d8714f55fc8a78ebfd07218357f93fb796791115a5a1ad") version("2.4.0", sha256="c3791dcc6d37e59f6efa86e2df2a55a4485237b0a48e330ae08949f0cdf00f27") version("2.3.3", sha256="c3635e41766a648f945d235b922e3c5306e26a2ee5bbd730d2181e242f5f46fe") version("2.3.2", sha256="3f6d78fe8807d1d6afb7bed27394f19467840a82bc36d65e66316fa0aa9d32a4") version("2.3.1", sha256="9c4625c45a3ee7e49a604ef221778983dd9fd8104922a87f20b99d9bedb7725a") version("2.3.0", sha256="6f75e49aa30de140525ccb58688667efe3a2d770576feb7fbc91023b7f552aa2") version("2.2.4", sha256="441eb1d1acb35238ca43a1a0a649493fc91fdcbab231d0747e9d462eea192278") version("2.2.3", sha256="a328d63d476b3653f5a25b5f7971e87a15cdf8860ab0729d4b1157ba988b8d0b") version("2.2.2", sha256="eb25d6ee85f4f5ac1d5581958f8c6eed9b1d50746f82866fe92e507541def35b") version("2.2.1", sha256="927098d54083ac919a497f787b835b099e9a194f2e5444dbff901f7426b86066") version("2.2.0", sha256="0d4c326862e0f118e17418c042c2bcd037b25abd3fb198e1fc5d40b11a9fc8ea") version("2.1.4", sha256="e06a7ae4c4ed2fd678cd045ff50a10ff5002f3b81cdfcd8ab03c39ce962d9b63") version("2.1.3", sha256="b489793627e6cb8d2ff8d7737b61daf58382fe189fae4c581ddfd48c04b49005") version("2.1.2", sha256="b597f36bd29a2b4368998ddd32b28c8cdf3c8192237a81b99af83cc17d7fa374") version("2.1.1", sha256="87ce516ce757ad1edf1e21f007fbe232ed2e932af422e9893f40199711c41f92") version("2.1.0", sha256="568b43441955b306364fcf97fb47d4c1512ac6f2f5f76b2ec39a890d2418ee03") version("2.0.3", sha256="3c6c5ade299c7a52fc9c5d2111110c97032e1f0c2593ce6091c364b1a43b442a") version("2.0.2", sha256="90f838853cc1c07e55893483faa7e923e4b4b1659c6bc9df3538366030a7e622") version("2.0.1", sha256="2564c91ed8ed36274ee31002a25798f5babc4221e879cb5013867733d80f9920") version("2.0.0", sha256="91704fafeea2349c5e268dc1e2d03921b3aae64b05ee01d59fdfc1a6b0ffc061") # Optional dependencies variant("archive", default=False, when="@3.7:", description="Optional for vsi7z VFS driver") variant( "armadillo", default=False, description="Speed up computations related to the Thin Plate Spline transformer", ) variant( "arrow", default=False, when="build_system=cmake", description="Required for Arrow driver" ) variant( "basisu", default=False, when="@3.6:", description="Required for BASISU and KTX2 drivers" ) variant("blosc", default=False, when="@3.4:", description="Required for Zarr driver") variant("brunsli", default=False, when="@3.4:", description="Required for MRF driver") variant("bsb", default=False, when="@:2", description="Required for BSB driver") variant("cfitsio", default=False, description="Required for FITS driver") variant("crnlib", default=False, description="Required for DDS driver") variant("curl", default=True, description="Required for network access") variant("cryptopp", default=False, when="@2.1:", description="Required for EEDAI driver") variant("deflate", default=False, when="@3.2:", description="Required for Deflate compression") variant("dods", default=False, when="@:3.4", description="Required for DODS driver") variant("ecw", default=False, description="Required for ECW driver") variant("epsilon", default=False, when="@:3.2", description="Required for EPSILON driver") variant("expat", default=True, description="Required for XML parsing in many OGR drivers") variant("filegdb", default=False, description="Required for FileGDB driver") variant("fme", default=False, when="@:3.4", description="Required for FME driver") variant("freexl", default=False, description="Required for XLS driver") variant("fyba", default=False, description="Required for SOSI driver") variant("geos", default=True, description="Required for geometry processing operations in OGR") variant("gif", default=False, description="Required for GIF driver") variant("grass", default=False, when="@:3.4", description="Required for GRASS driver") variant("grib", default=False, when="@:2", description="Required for GRIB driver") variant("gta", default=False, description="Required for GTA driver") variant("heif", default=False, when="@3.2:", description="Required for HEIF driver") variant("hdf4", default=False, description="Required for HDF4 driver") variant("hdf5", default=False, description="Required for HDF5, BAG, and KEA drivers") variant( "hdfs", default=False, when="@2.4:", description="Required for Hadoop filesystem support" ) variant("iconv", default=False, description="Required for text encoding conversion") variant("idb", default=False, description="Required for IDB driver") variant("ingres", default=False, when="@:3.4", description="Required for Ingres driver") variant("jasper", default=False, when="@:3.4", description="Optional JPEG-2000 library") variant("jpeg", default=True, description="Required for JPEG driver") variant("jxl", default=False, when="@3.4:", description="Required for JPEGXL driver") variant("kdu", default=False, description="Required for JP2KAK and JPIPKAK drivers") variant("kea", default=False, description="Required for KEA driver") variant("lerc", default=False, when="@2.4:", description="Required for LERC compression") variant("libaec", default=False, when="@3.8:", description="Optional for GRIB driver") variant("libcsf", default=False, description="Required for PCRaster driver") variant("libkml", default=False, description="Required for LIBKML driver") variant("liblzma", default=False, description="Required for Zarr driver") variant("libqb3", default=False, when="@3.6:", description="Required for MRF driver") variant( "libxml2", default=False, description="Required for XML validation in many OGR drivers" ) variant("luratech", default=False, when="@2.2:", description="Required for JP2Lura driver") variant("lz4", default=False, when="@3.4:", description="Required for Zarr driver") variant("mdb", default=False, when="@:3.4", description="Required for MDB driver") variant("mongocxx", default=False, when="@2.1:", description="Required for MongoDBv3 driver") variant("mrf", default=False, when="@2.1:2", description="Required for MRF driver") variant("mrsid", default=False, description="Required for MrSID driver") variant( "mrsid_lidar", default=False, when="@:3.4", description="Required for MrSID/MG4 driver" ) variant( "mssql_ncli", default=False, when="build_system=cmake", description="Required for MSSQLSpatial driver", ) variant( "mssql_odbc", default=False, when="build_system=cmake", description="Required for MSSQLSpatial driver", ) variant("mysql", default=False, description="Required for MySQL driver") variant("netcdf", default=False, description="Required for NetCDF driver") variant("odbc", default=False, description="Required for many OGR drivers") variant( "odbccpp", default=False, when="build_system=cmake", description="Required for SAP HANA driver", ) variant("ogdi", default=False, description="Required for OGDI driver") variant( "opencad", default=False, when="build_system=cmake", description="Required for CAD driver" ) variant("opencl", default=False, description="Required to accelerate warping computations") variant("openexr", default=False, when="@3.1:", description="Required for EXR driver") variant("openjpeg", default=False, description="Required for JP2OpenJPEG driver") variant("openssl", default=False, when="@2.3:", description="Required for EEDAI driver") variant("oracle", default=False, description="Required for OCI and GeoRaster drivers") variant( "parquet", default=False, when="build_system=cmake", description="Required for Parquet driver", ) variant("pcidsk", default=False, description="Required for PCIDSK driver") variant( "pcre2", default=False, description="Required for REGEXP operator in drivers using SQLite3" ) variant("pdfium", default=False, when="@2.1:", description="Possible backend for PDF driver") variant("png", default=True, description="Required for PNG driver") variant("podofo", default=False, description="Possible backend for PDF driver") variant("poppler", default=False, description="Possible backend for PDF driver") variant( "postgresql", default=False, description="Required for PostgreSQL and PostGISRaster drivers", ) variant( "qhull", default=False, when="@2.1:", description="Used for linear interpolation of gdal_grid", ) variant("rasdaman", default=False, when="@:3.6", description="Required for Rasdaman driver") variant( "rasterlite2", default=False, when="@2.2:", description="Required for RasterLite2 driver" ) variant("rdb", default=False, when="@3.1:", description="Required for RDB driver") variant("sde", default=False, when="@:3.1", description="Required for SDE driver") variant("sfcgal", default=False, when="@2.2:", description="Provides 3D geometry operations") variant("spatialite", default=False, description="Required for SQLite and GPKG drivers") variant("sqlite3", default=True, description="Required for SQLite and GPKG drivers") variant("teigha", default=False, description="Required for DWG and DGNv8 drivers") variant("tiledb", default=False, when="@3:", description="Required for TileDB driver") variant("webp", default=False, description="Required for WEBP driver") variant( "xercesc", default=False, description="Required for XML parsing capabilities in many OGR drivers", ) variant("zstd", default=False, when="@2.3:", description="Required for Zarr driver") # Language bindings variant("python", default=False, description="Build Python bindings") variant("java", default=False, description="Build Java bindings") variant("csharp", default=False, when="build_system=cmake", description="Build C# bindings") variant("perl", default=False, when="@:3.4", description="Build Perl bindings") variant("php", default=False, when="@:2.3", description="Build PHP bindings") # Build system build_system( conditional("cmake", when="@3.5:"), conditional("autotools", when="@:3.5"), default="cmake" ) with when("build_system=cmake"): generator("ninja") depends_on("cmake@3.9:", type="build") with when("build_system=autotools"): depends_on("gmake", type="build") # Required dependencies depends_on("pkgconfig@0.25:", type="build") depends_on("proj@6:", when="@3:") depends_on("proj@:6", when="@2.5:2") depends_on("proj@:5", when="@2.4") depends_on("proj@:4", when="@:2.3") depends_on("zlib-api") depends_on("libtiff@4:", when="@3:") depends_on("libtiff@3.6.0:") # 3.9.0+ needed to pass testsuite depends_on("libgeotiff@1.5:", when="@3:") depends_on("libgeotiff@1.2.1:1.5", when="@2.4.1:2") depends_on("libgeotiff@1.2.1:1.4", when="@:2.4.0") depends_on("json-c") depends_on("json-c@0.12.1", when="@:2.2") # Optional dependencies depends_on("libarchive", when="+archive") depends_on("armadillo", when="+armadillo") depends_on("blas", when="+armadillo") depends_on("lapack", when="+armadillo") depends_on("arrow", when="+arrow") # depends_on("basis-universal", when="+basisu") depends_on("c-blosc", when="+blosc") depends_on("brunsli", when="+brunsli") # depends_on('bsb', when='+bsb') depends_on("cfitsio", when="+cfitsio") depends_on("crunch", when="+crnlib") depends_on("curl", when="+curl") depends_on("cryptopp", when="+cryptopp") depends_on("libdeflate", when="+deflate") # depends_on('dods', when='+dods') # depends_on('ecw', when='+ecw') # depends_on('libepsilon', when='+epsilon') depends_on("expat@1.95:", when="+expat") # depends_on('filegdb', when='+filegdb') # depends_on('fme', when='+fme') depends_on("freexl", when="+freexl") depends_on("fyba", when="+fyba") depends_on("geos@3.1:", when="+geos") depends_on("giflib", when="+gif") depends_on("grass@5.7:", when="+grass") depends_on("grib-api", when="+grib") depends_on("libgta", when="+gta") depends_on("libheif@1.1:", when="+heif") depends_on("hdf", when="+hdf4") depends_on("hdf5+cxx", when="+hdf5") depends_on("hdf5@:1.13", when="@:3.5 +hdf5") depends_on("hdf5@:1.12", when="@:3.4 +hdf5") depends_on("hadoop", when="+hdfs") depends_on("iconv", when="+iconv") # depends_on('idb', when='+idb') # depends_on('ingres', when='+ingres') depends_on("jasper@1.900.1", patches=[patch("uuid.patch")], when="+jasper") depends_on("jpeg", when="+jpeg") depends_on("libjxl", when="+jxl") # depends_on('kakadu', when='+kdu') depends_on("kealib", when="+kea") depends_on("lerc", when="+lerc") depends_on("libaec", when="+libaec") # depends_on('libcsf', when='+libcsf') depends_on("libkml@1.3:", when="+libkml") depends_on("xz", when="+liblzma") depends_on("libxml2", when="+libxml2") # depends_on('luratech', when='+luratech') depends_on("lz4", when="+lz4") depends_on("jackcess@1.2", type="run", when="+mdb") depends_on("mongo-cxx-driver", when="+mongocxx") # depends_on('bsoncxx', when='+mongocxx') # depends_on('mrf', when='+mrf') # depends_on('mrsid', when='+mrsid') # depends_on('lizardtech-lidar', when='+mrsid_lidar') # depends_on('mssql_ncli', when='+mssql_ncli') # depends_on('mssql_odbc', when='+mssql_odbc') depends_on("mysql", when="+mysql") depends_on("netcdf-c", when="+netcdf") depends_on("unixodbc", when="+odbc") # depends_on('odbc-cpp-wrapper', when='+odbccpp') # depends_on('ogdi', when='+ogdi') # depends_on('lib-opencad', when='+opencad') depends_on("opencl", when="+opencl") depends_on("openexr@2.2:", when="+openexr") depends_on("openjpeg", when="+openjpeg") depends_on("openssl", when="+openssl") depends_on("oracle-instant-client", when="+oracle") depends_on("parquet-cpp", when="+parquet") # depends_on('pcidsk', when='+pcidsk') depends_on("pcre2", when="@3.5:+pcre2") depends_on("pcre", when="@:3.4+pcre2") # depends_on('pdfium', when='+pdfium') depends_on("libpng", when="+png") # depends_on('podofo', when='+podofo') depends_on("poppler", when="+poppler") depends_on("poppler@0.24:", when="@3: +poppler") depends_on("poppler@:0.63", when="@:2.3 +poppler") depends_on("poppler@:0.71", when="@:2.4 +poppler") depends_on("poppler@:21", when="@:3.4.1 +poppler") depends_on("postgresql", when="+postgresql") depends_on("qb3", when="+libqb3") depends_on("qhull", when="+qhull") depends_on("qhull@2015:", when="@3.5:+qhull") depends_on("qhull@:2020.1", when="@:3.3+qhull") # depends_on('rasdaman', when='+rasdaman') # depends_on('rasterlite2@1.1:', when='+rasterlite2') # depends_on('rdblib', when='+rdb') # depends_on('sde', when='+sde') depends_on("sfcgal", when="+sfcgal") depends_on("libspatialite", when="+spatialite") depends_on("sqlite@3:", when="+sqlite3") # depends_on('teigha', when='+teigha') # depends_on('tiledb', when='+tiledb') depends_on("libwebp", when="+webp") depends_on("xerces-c@3.1:", when="+xercesc") depends_on("zstd", when="+zstd") # Language bindings # FIXME: Allow packages to extend multiple packages # See https://github.com/spack/spack/issues/987 extends("python", when="+python") # extends('openjdk', when='+java') # extends('perl', when='+perl') # see gdal_version_and_min_supported_python_version # in swig/python/osgeo/__init__.py depends_on("python@3.6:", type=("build", "link", "run"), when="@3.3:+python") depends_on("python@2.0:", type=("build", "link", "run"), when="@3.2:+python") depends_on("python", type=("build", "link", "run"), when="+python") # Uses distutils depends_on("python@:3.11", type=("build", "link", "run"), when="@:3.4+python") # swig/python/setup.py depends_on("py-setuptools@:57", type="build", when="@:3.2+python") # needs 2to3 depends_on("py-setuptools", type="build", when="+python") depends_on("py-numpy@1.0.0:", type=("build", "run"), when="+python") depends_on("swig", type="build", when="+python") depends_on("java@7:", type=("build", "link", "run"), when="@3.2:+java") depends_on("java@6:", type=("build", "link", "run"), when="@2.4:+java") depends_on("java@5:", type=("build", "link", "run"), when="@2.1:+java") depends_on("java@4:", type=("build", "link", "run"), when="@:2.0+java") depends_on("ant", type="build", when="+java") depends_on("swig", type="build", when="+java") depends_on("perl", type=("build", "run"), when="+perl") depends_on("swig", type="build", when="+perl") depends_on("php", type=("build", "link", "run"), when="+php") depends_on("swig", type="build", when="+php") # https://gdal.org/development/rfc/rfc88_googletest.html depends_on("googletest@1.10:", type="test") # https://trac.osgeo.org/gdal/wiki/SupportedCompilers msg = "GDAL requires C++11 support" conflicts("%gcc@:4.8.0", msg=msg) conflicts("%clang@:3.2", msg=msg) conflicts("%intel@:12", msg=msg) conflicts("%xl@:13.0", msg=msg) conflicts("%xl_r@:13.0", msg=msg) # https://github.com/OSGeo/gdal/issues/5994 conflicts("~png", when="@3:3.5.0") conflicts("~jpeg", when="@3:3.5.0") # TODO: investigate build issues conflicts("+brunsli", when="@3.4") conflicts("+qhull", when="@2.1") conflicts("+mdb", when="~java", msg="MDB driver requires Java") # TODO: add packages for the following dependencies conflicts("+bsb") conflicts("+dods") conflicts("+ecw") conflicts("+epsilon") conflicts("+filegdb") conflicts("+fme") conflicts("+idb") conflicts("+ingres") conflicts("+kdu") conflicts("+libcsf") conflicts("+luratech") conflicts("+mrf") conflicts("+mrsid") conflicts("+mrsid_lidar") conflicts("+mssql_ncli") conflicts("+mssql_odbc") conflicts("+odbccpp") conflicts("+ogdi") conflicts("+opencad") conflicts("+pcidsk") conflicts("+pdfium") conflicts("+podofo") conflicts("+rasdaman") conflicts("+rasterlite2") conflicts("+rdb") conflicts("+sde") conflicts("+teigha") conflicts("+tiledb") # https://github.com/OSGeo/gdal/issues/3782 patch( "https://github.com/OSGeo/gdal/pull/3786.patch?full_index=1", when="@3.3.0", level=2, sha256="9f9824296e75b34b3e78284ec772a5ac8f8ba92c17253ea9ca242caf766767ce", ) # https://github.com/spack/spack/issues/41299 # ensures the correct build specific libproj is used with cmake builds (gdal >=3.5.0) patch( "https://patch-diff.githubusercontent.com/raw/OSGeo/gdal/pull/8964.patch?full_index=1", when="@3.5:3.8", sha256="52459dc9903ced5005ba81515762a55cd829d8f5420607405c211c4a77c2bf79", ) executables = ["^gdal-config$"] @classmethod def determine_version(cls, exe): return Executable(exe)("--version", output=str, error=str).rstrip() def setup_run_environment(self, env): if "+java" in self.spec: class_paths = find(self.prefix, "*.jar") classpath = os.pathsep.join(class_paths) env.prepend_path("CLASSPATH", classpath) # `spack test run gdal+python` requires these for the Python bindings # to find the correct libraries libs = [] for dep in self.spec.dependencies(deptype="link"): query = self.spec[dep.name] libs.extend(filter_system_paths(query.libs.directories)) if sys.platform == "darwin": env.prepend_path("DYLD_FALLBACK_LIBRARY_PATH", ":".join(libs)) else: env.prepend_path("LD_LIBRARY_PATH", ":".join(libs)) def patch(self): if "+java platform=darwin" in self.spec: filter_file("linux", "darwin", "swig/java/java.opt", string=True) class CMakeBuilder(CMakeBuilder): def cmake_args(self): # https://gdal.org/build_hints.html args = [ # Only use Spack-installed dependencies self.define("GDAL_USE_EXTERNAL_LIBS", False), self.define("GDAL_USE_INTERNAL_LIBS", False), # Required dependencies self.define("GDAL_USE_GEOTIFF", True), self.define("GDAL_USE_JSONC", True), self.define("GDAL_USE_TIFF", True), self.define("GDAL_USE_ZLIB", True), # zlib-ng + deflate64 doesn't compile (heavily relies on zlib) # but since zlib-ng is faster than zlib, it deflate shouldn't # be necessary. self.define("ENABLE_DEFLATE64", "zlib-ng" not in self.spec), # Optional dependencies self.define_from_variant("GDAL_USE_ARCHIVE", "archive"), self.define_from_variant("GDAL_USE_ARMADILLO", "armadillo"), self.define_from_variant("GDAL_USE_ARROW", "arrow"), self.define_from_variant("GDAL_USE_BASISU", "basisu"), self.define_from_variant("GDAL_USE_BLOSC", "blosc"), self.define_from_variant("GDAL_USE_BRUNSLI", "brunsli"), self.define_from_variant("GDAL_USE_CFITSIO", "cfitsio"), self.define_from_variant("GDAL_USE_CRNLIB", "crnlib"), self.define_from_variant("GDAL_USE_CRYPTOPP", "cryptopp"), self.define_from_variant("GDAL_USE_CURL", "curl"), self.define_from_variant("GDAL_USE_DEFLATE", "deflate"), self.define_from_variant("GDAL_USE_ECW", "ecw"), self.define_from_variant("GDAL_USE_EXPAT", "expat"), self.define_from_variant("GDAL_USE_FILEGDB", "filegdb"), self.define_from_variant("GDAL_USE_FREEXL", "freexl"), self.define_from_variant("GDAL_USE_FYBA", "fyba"), self.define_from_variant("GDAL_USE_GEOS", "geos"), self.define_from_variant("GDAL_USE_GIF", "gif"), self.define_from_variant("GDAL_USE_GTA", "gta"), self.define_from_variant("GDAL_USE_HEIF", "heif"), self.define_from_variant("GDAL_USE_HDF4", "hdf4"), self.define_from_variant("GDAL_USE_HDF5", "hdf5"), self.define_from_variant("GDAL_USE_HDFS", "hdfs"), self.define_from_variant("GDAL_USE_ICONV", "iconv"), self.define_from_variant("GDAL_USE_IDB", "idb"), self.define_from_variant("GDAL_USE_JPEG", "jpeg"), self.define_from_variant("GDAL_USE_JXL", "jxl"), self.define_from_variant("GDAL_USE_KDU", "kdu"), self.define_from_variant("GDAL_USE_KEA", "kea"), self.define_from_variant("GDAL_USE_LERC", "lerc"), self.define_from_variant("GDAL_USE_LIBAEC", "libaec"), self.define_from_variant("GDAL_USE_LIBCSF", "libcsf"), self.define_from_variant("GDAL_USE_LIBKML", "libkml"), self.define_from_variant("GDAL_USE_LIBLZMA", "liblzma"), self.define_from_variant("GDAL_USE_LIBQB3", "libqb3"), self.define_from_variant("GDAL_USE_LIBXML2", "libxml2"), self.define_from_variant("GDAL_USE_LURATECH", "luratech"), self.define_from_variant("GDAL_USE_LZ4", "lz4"), self.define_from_variant("GDAL_USE_MONGOCXX", "mongocxx"), self.define_from_variant("GDAL_USE_MRSID", "mrsid"), self.define_from_variant("GDAL_USE_MSSQL_NCLI", "mssql_ncli"), self.define_from_variant("GDAL_USE_MSSQL_ODBC", "mssql_odbc"), self.define_from_variant("GDAL_USE_MYSQL", "mysql"), self.define_from_variant("GDAL_USE_NETCDF", "netcdf"), self.define_from_variant("GDAL_USE_ODBC", "odbc"), self.define_from_variant("GDAL_USE_ODBCCPP", "odbccpp"), self.define_from_variant("GDAL_USE_OGDI", "ogdi"), self.define_from_variant("GDAL_USE_OPENCAD", "opencad"), self.define_from_variant("GDAL_USE_OPENCL", "opencl"), self.define_from_variant("GDAL_USE_OPENEXR", "openexr"), self.define_from_variant("GDAL_USE_OPENJPEG", "openjpeg"), self.define_from_variant("GDAL_USE_OPENSSL", "openssl"), self.define_from_variant("GDAL_USE_ORACLE", "oracle"), self.define_from_variant("GDAL_USE_PARQUET", "parquet"), self.define_from_variant("GDAL_USE_PCRE2", "pcre2"), self.define_from_variant("GDAL_USE_PDFIUM", "pdfium"), self.define_from_variant("GDAL_USE_PNG", "png"), self.define_from_variant("GDAL_USE_PODOFO", "podofo"), self.define_from_variant("GDAL_USE_POPPLER", "poppler"), self.define_from_variant("GDAL_USE_POSTGRESQL", "postgresql"), self.define_from_variant("GDAL_USE_QHULL", "qhull"), self.define_from_variant("GDAL_USE_RASDAMAN", "rasdaman"), self.define_from_variant("GDAL_USE_RASTERLITE2", "rasterlite2"), self.define_from_variant("GDAL_USE_RDB", "rdb"), self.define_from_variant("GDAL_USE_SFCGAL", "sfcgal"), self.define_from_variant("GDAL_USE_SPATIALITE", "spatialite"), self.define_from_variant("GDAL_USE_SQLITE3", "sqlite3"), self.define_from_variant("GDAL_USE_TEIGHA", "teigha"), self.define_from_variant("GDAL_USE_TILEDB", "tiledb"), self.define_from_variant("GDAL_USE_WEBP", "webp"), self.define_from_variant("GDAL_USE_XERCESC", "xercesc"), self.define_from_variant("GDAL_USE_ZSTD", "zstd"), # Language bindings self.define_from_variant("BUILD_PYTHON_BINDINGS", "python"), self.define_from_variant("BUILD_JAVA_BINDINGS", "java"), self.define_from_variant("BUILD_CSHARP_BINDINGS", "csharp"), ] # Remove empty strings args = [arg for arg in args if arg] return args class AutotoolsBuilder(AutotoolsBuilder): def setup_build_environment(self, env): # Needed to install Python bindings to GDAL installation # prefix instead of Python installation prefix. # See swig/python/GNUmakefile for more details. env.set("PREFIX", self.prefix) env.set("DESTDIR", "/") def with_or_without(self, name, variant=None, package=None, attribute=None): if not variant: variant = name if variant not in self.pkg.variants: msg = '"{}" is not a variant of "{}"' raise KeyError(msg.format(variant, self.name)) if variant not in self.spec.variants: return "" if self.spec.variants[variant].value: if package: value = self.spec[package].prefix if attribute == "command": value = self.spec[package].command.path elif attribute == "libs": value = self.spec[package].libs.directories[0] return "--with-{}={}".format(name, value) else: return "--with-{}".format(name) else: return "--without-{}".format(name) def configure_args(self): # https://trac.osgeo.org/gdal/wiki/BuildHints args = [ "--prefix={}".format(self.prefix), # Required dependencies "--with-geotiff={}".format(self.spec["libgeotiff"].prefix), "--with-libjson-c={}".format(self.spec["json-c"].prefix), "--with-libtiff={}".format(self.spec["libtiff"].prefix), "--with-libz={}".format(self.spec["zlib-api"].prefix), # Optional dependencies self.with_or_without("armadillo", package="armadillo"), self.with_or_without("blosc", package="c-blosc"), self.with_or_without("brunsli"), self.with_or_without("bsb"), self.with_or_without("cfitsio", package="cfitsio"), self.with_or_without("dds", variant="crnlib", package="crunch"), self.with_or_without("curl", package="curl", attribute="command"), self.with_or_without("cryptopp", package="cryptopp"), self.with_or_without("libdeflate", variant="deflate", package="libdeflate"), self.with_or_without("dods-root", variant="dods", package="dods"), self.with_or_without("ecw", package="ecw"), self.with_or_without("epsilon", package="libepsilon"), self.with_or_without("expat", package="expat"), self.with_or_without("fgdb", variant="filegdb", package="filegdb"), self.with_or_without("fme", package="fme"), self.with_or_without("freexl", package="freexl"), self.with_or_without("sosi", variant="fyba", package="fyba"), self.with_or_without("geos", package="geos", attribute="command"), self.with_or_without("gif", package="giflib"), self.with_or_without("grass", package="grass"), self.with_or_without("grib"), self.with_or_without("libgrass", variant="grass"), self.with_or_without("gta", package="gta"), self.with_or_without("heif"), self.with_or_without("hdf4", package="hdf"), self.with_or_without("hdf5", package="hdf5"), self.with_or_without("hdfs", package="hadoop"), self.with_or_without("idb", package="idb"), self.with_or_without("ingres", package="ingres"), self.with_or_without("jasper", package="jasper"), self.with_or_without("jpeg", package="jpeg"), self.with_or_without("jxl"), self.with_or_without("kakadu", variant="kdu"), self.with_or_without("kea", package="kealib", attribute="command"), self.with_or_without("lerc", package="lerc"), self.with_or_without("pcraster", variant="libcsf", package="libcsf"), self.with_or_without("libkml", package="libkml"), self.with_or_without("liblzma"), self.with_or_without("jp2lura", variant="luratech", package="luratech"), self.with_or_without("lz4", package="lz4"), self.with_or_without("mdb"), self.with_or_without("mrf"), self.with_or_without("mrsid", package="mrsid"), self.with_or_without("mrsid_lidar", package="lizardtech-lidar"), self.with_or_without("mysql", package="mysql", attribute="command"), self.with_or_without("netcdf", package="netcdf-c"), self.with_or_without("odbc", package="unixodbc"), self.with_or_without("hana", variant="odbccpp", package="odbc-cpp-wrapper"), self.with_or_without("ogdi", package="ogdi"), self.with_or_without("opencl"), self.with_or_without("exr", variant="openexr"), self.with_or_without("openjpeg"), self.with_or_without("crypto", variant="openssl", package="openssl"), self.with_or_without("oci", variant="oracle", package="oracle-instant-client"), self.with_or_without("pcidsk", package="pcidsk"), self.with_or_without("pcre", variant="pcre2"), self.with_or_without("pdfium", package="pdfium"), self.with_or_without("png", package="libpng"), self.with_or_without("podofo", package="podofo"), self.with_or_without("poppler", package="poppler"), self.with_or_without("qhull"), self.with_or_without("rasdaman", package="rasdaman"), self.with_or_without("rasterlite2", package="rasterlite2"), self.with_or_without("rdb", package="rdb"), self.with_or_without("sde", package="sde"), self.with_or_without("spatialite", package="libspatialite"), self.with_or_without("sqlite3", package="sqlite"), self.with_or_without("sfcgal", package="sfcgal", attribute="command"), self.with_or_without("tiledb", package="tiledb"), self.with_or_without("webp", package="libwebp"), self.with_or_without("xerces", variant="xercesc", package="xerces-c"), self.with_or_without("zstd", package="zstd"), # Language bindings self.with_or_without("python", package="python", attribute="command"), self.with_or_without("java", package="java"), self.with_or_without("jvm-lib", variant="mdb", package="java", attribute="libs"), self.with_or_without("jvm-lib-add-rpath", variant="mdb"), self.with_or_without("perl"), self.with_or_without("php"), ] if "+iconv" in self.spec: if self.spec["iconv"].name == "libc": args.append("--without-libiconv-prefix") elif not is_system_path(self.spec["iconv"].prefix): args.append("--with-libiconv-prefix=" + self.spec["iconv"].prefix) # Renamed or modified flags if self.spec.satisfies("@3:"): args.extend( [ self.with_or_without("xml2", variant="libxml2"), self.with_or_without("mongocxxv3", variant="mongocxx"), self.with_or_without("pg", variant="postgresql"), ] ) else: args.extend( [ self.with_or_without( "xml2", variant="libxml2", package="libxml2", attribute="command" ), self.with_or_without("mongocxx", variant="mongocxx"), self.with_or_without( "pg", variant="postgresql", package="postgresql", attribute="command" ), ] ) if self.spec.satisfies("@2.3:"): args.append("--with-proj={}".format(self.spec["proj"].prefix)) if self.spec.satisfies("@2.2:"): args.append(self.with_or_without("teigha", package="teigha")) else: args.append(self.with_or_without("dwgdirect", variant="teigha", package="teigha")) if "+hdf4" in self.spec: hdf4 = self.spec["hdf"] if "+external-xdr" in hdf4 and hdf4["rpc"].name != "libc": args.append("LIBS=" + hdf4["rpc"].libs.link_flags) # Remove empty strings args = [arg for arg in args if arg] return args def build(self, pkg, spec, prefix): # https://trac.osgeo.org/gdal/wiki/GdalOgrInJavaBuildInstructionsUnix make() if "+java" in spec: with working_dir("swig/java"): make() def check(self): # no top-level test target if "+java" in self.spec: with working_dir("swig/java"): make("test") def install(self, pkg, spec, prefix): make("install") if "+java" in spec: with working_dir("swig/java"): make("install") install("*.jar", prefix) # The shared library is not installed correctly on Darwin; fix this if self.spec.satisfies("platform=darwin"): fix_darwin_install_name(self.prefix.lib)