GDAL: multi-build system support (#33566)
This commit is contained in:
parent
67585fe13e
commit
bd51751a8c
@ -6,11 +6,13 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from spack.build_systems.autotools import AutotoolsBuilder
|
||||||
|
from spack.build_systems.cmake import CMakeBuilder
|
||||||
from spack.package import *
|
from spack.package import *
|
||||||
from spack.util.environment import filter_system_paths
|
from spack.util.environment import filter_system_paths
|
||||||
|
|
||||||
|
|
||||||
class Gdal(CMakePackage):
|
class Gdal(CMakePackage, AutotoolsPackage, PythonExtension):
|
||||||
"""GDAL: Geospatial Data Abstraction Library.
|
"""GDAL: Geospatial Data Abstraction Library.
|
||||||
|
|
||||||
GDAL is a translator library for raster and vector geospatial data formats that
|
GDAL is a translator library for raster and vector geospatial data formats that
|
||||||
@ -83,7 +85,9 @@ class Gdal(CMakePackage):
|
|||||||
default=False,
|
default=False,
|
||||||
description="Speed up computations related to the Thin Plate Spline transformer",
|
description="Speed up computations related to the Thin Plate Spline transformer",
|
||||||
)
|
)
|
||||||
variant("arrow", default=False, when="@3.5:", description="Required for Arrow driver")
|
variant(
|
||||||
|
"arrow", default=False, when="build_system=cmake", description="Required for Arrow driver"
|
||||||
|
)
|
||||||
variant("blosc", default=False, when="@3.4:", description="Required for Zarr driver")
|
variant("blosc", default=False, when="@3.4:", description="Required for Zarr driver")
|
||||||
variant("brunsli", default=True, when="@3.4:", description="Required for MRF driver")
|
variant("brunsli", default=True, when="@3.4:", description="Required for MRF driver")
|
||||||
variant("bsb", default=False, when="@:2", description="Required for BSB driver")
|
variant("bsb", default=False, when="@:2", description="Required for BSB driver")
|
||||||
@ -136,23 +140,41 @@ class Gdal(CMakePackage):
|
|||||||
"mrsid_lidar", default=False, when="@:3.4", description="Required for MrSID/MG4 driver"
|
"mrsid_lidar", default=False, when="@:3.4", description="Required for MrSID/MG4 driver"
|
||||||
)
|
)
|
||||||
variant(
|
variant(
|
||||||
"mssql_ncli", default=False, when="@3.5:", description="Required for MSSQLSpatial driver"
|
"mssql_ncli",
|
||||||
|
default=False,
|
||||||
|
when="build_system=cmake",
|
||||||
|
description="Required for MSSQLSpatial driver",
|
||||||
)
|
)
|
||||||
variant(
|
variant(
|
||||||
"mssql_odbc", default=False, when="@3.5:", description="Required for MSSQLSpatial driver"
|
"mssql_odbc",
|
||||||
|
default=False,
|
||||||
|
when="build_system=cmake",
|
||||||
|
description="Required for MSSQLSpatial driver",
|
||||||
)
|
)
|
||||||
variant("mysql", default=False, description="Required for MySQL driver")
|
variant("mysql", default=False, description="Required for MySQL driver")
|
||||||
variant("netcdf", default=False, description="Required for NetCDF driver")
|
variant("netcdf", default=False, description="Required for NetCDF driver")
|
||||||
variant("odbc", default=False, description="Required for many OGR drivers")
|
variant("odbc", default=False, description="Required for many OGR drivers")
|
||||||
variant("odbccpp", default=False, when="@3.5:", description="Required for SAP HANA driver")
|
variant(
|
||||||
|
"odbccpp",
|
||||||
|
default=False,
|
||||||
|
when="build_system=cmake",
|
||||||
|
description="Required for SAP HANA driver",
|
||||||
|
)
|
||||||
variant("ogdi", default=False, description="Required for OGDI driver")
|
variant("ogdi", default=False, description="Required for OGDI driver")
|
||||||
variant("opencad", default=False, when="@3.5:", description="Required for CAD 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("opencl", default=False, description="Required to accelerate warping computations")
|
||||||
variant("openexr", default=False, when="@3.1:", description="Required for EXR driver")
|
variant("openexr", default=False, when="@3.1:", description="Required for EXR driver")
|
||||||
variant("openjpeg", default=False, description="Required for JP2OpenJPEG driver")
|
variant("openjpeg", default=False, description="Required for JP2OpenJPEG driver")
|
||||||
variant("openssl", default=False, when="@2.3:", description="Required for EEDAI 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("oracle", default=False, description="Required for OCI and GeoRaster drivers")
|
||||||
variant("parquet", default=False, when="@3.5:", description="Required for Parquet driver")
|
variant(
|
||||||
|
"parquet",
|
||||||
|
default=False,
|
||||||
|
when="build_system=cmake",
|
||||||
|
description="Required for Parquet driver",
|
||||||
|
)
|
||||||
variant("pcidsk", default=False, description="Required for PCIDSK driver")
|
variant("pcidsk", default=False, description="Required for PCIDSK driver")
|
||||||
variant(
|
variant(
|
||||||
"pcre", default=False, description="Required for REGEXP operator in drivers using SQLite3"
|
"pcre", default=False, description="Required for REGEXP operator in drivers using SQLite3"
|
||||||
@ -194,14 +216,25 @@ class Gdal(CMakePackage):
|
|||||||
# Language bindings
|
# Language bindings
|
||||||
variant("python", default=False, description="Build Python bindings")
|
variant("python", default=False, description="Build Python bindings")
|
||||||
variant("java", default=False, description="Build Java bindings")
|
variant("java", default=False, description="Build Java bindings")
|
||||||
variant("csharp", default=False, when="@3.5:", description="Build C# 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("perl", default=False, when="@:3.4", description="Build Perl bindings")
|
||||||
variant("php", default=False, when="@:2.3", description="Build PHP 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"):
|
||||||
|
depends_on("cmake@3.9:", type="build")
|
||||||
|
depends_on("ninja", type="build")
|
||||||
|
|
||||||
|
with when("build_system=autotools"):
|
||||||
|
depends_on("gmake", type="build")
|
||||||
|
|
||||||
# Required dependencies
|
# Required dependencies
|
||||||
depends_on("cmake@3.9:", when="@3.5:", type="build")
|
|
||||||
depends_on("ninja", when="@3.5:", type="build")
|
|
||||||
depends_on("gmake", when="@:3.4", type="build")
|
|
||||||
depends_on("pkgconfig@0.25:", type="build")
|
depends_on("pkgconfig@0.25:", type="build")
|
||||||
depends_on("proj@6:", when="@3:")
|
depends_on("proj@6:", when="@3:")
|
||||||
depends_on("proj@:6", when="@2.5:2")
|
depends_on("proj@:6", when="@2.5:2")
|
||||||
@ -392,30 +425,12 @@ class Gdal(CMakePackage):
|
|||||||
sha256="9f9824296e75b34b3e78284ec772a5ac8f8ba92c17253ea9ca242caf766767ce",
|
sha256="9f9824296e75b34b3e78284ec772a5ac8f8ba92c17253ea9ca242caf766767ce",
|
||||||
)
|
)
|
||||||
|
|
||||||
generator = "Ninja"
|
|
||||||
executables = ["^gdal-config$"]
|
executables = ["^gdal-config$"]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def determine_version(cls, exe):
|
def determine_version(cls, exe):
|
||||||
return Executable(exe)("--version", output=str, error=str).rstrip()
|
return Executable(exe)("--version", output=str, error=str).rstrip()
|
||||||
|
|
||||||
@property
|
|
||||||
def import_modules(self):
|
|
||||||
modules = ["osgeo"]
|
|
||||||
if self.spec.satisfies("@3.3:"):
|
|
||||||
modules.append("osgeo_utils")
|
|
||||||
else:
|
|
||||||
modules.append("osgeo.utils")
|
|
||||||
return modules
|
|
||||||
|
|
||||||
@when("@:3.4")
|
|
||||||
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 setup_run_environment(self, env):
|
def setup_run_environment(self, env):
|
||||||
if "+java" in self.spec:
|
if "+java" in self.spec:
|
||||||
class_paths = find(self.prefix, "*.jar")
|
class_paths = find(self.prefix, "*.jar")
|
||||||
@ -437,6 +452,10 @@ def patch(self):
|
|||||||
if "+java platform=darwin" in self.spec:
|
if "+java platform=darwin" in self.spec:
|
||||||
filter_file("linux", "darwin", "swig/java/java.opt", string=True)
|
filter_file("linux", "darwin", "swig/java/java.opt", string=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CMakeBuilder(CMakeBuilder):
|
||||||
|
generator = "Ninja"
|
||||||
|
|
||||||
def cmake_args(self):
|
def cmake_args(self):
|
||||||
# https://gdal.org/build_hints.html
|
# https://gdal.org/build_hints.html
|
||||||
args = [
|
args = [
|
||||||
@ -528,11 +547,20 @@ def cmake_args(self):
|
|||||||
|
|
||||||
return args
|
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):
|
def with_or_without(self, name, variant=None, package=None, attribute=None):
|
||||||
if not variant:
|
if not variant:
|
||||||
variant = name
|
variant = name
|
||||||
|
|
||||||
if variant not in self.variants:
|
if variant not in self.pkg.variants:
|
||||||
msg = '"{}" is not a variant of "{}"'
|
msg = '"{}" is not a variant of "{}"'
|
||||||
raise KeyError(msg.format(variant, self.name))
|
raise KeyError(msg.format(variant, self.name))
|
||||||
|
|
||||||
@ -684,49 +712,26 @@ def configure_args(self):
|
|||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
||||||
@when("@:3.4")
|
def build(self, pkg, spec, prefix):
|
||||||
def cmake(self, spec, prefix):
|
|
||||||
configure(*self.configure_args())
|
|
||||||
|
|
||||||
@when("@:3.4")
|
|
||||||
def build(self, spec, prefix):
|
|
||||||
# https://trac.osgeo.org/gdal/wiki/GdalOgrInJavaBuildInstructionsUnix
|
# https://trac.osgeo.org/gdal/wiki/GdalOgrInJavaBuildInstructionsUnix
|
||||||
make()
|
make()
|
||||||
if "+java" in spec:
|
if "+java" in spec:
|
||||||
with working_dir("swig/java"):
|
with working_dir("swig/java"):
|
||||||
make()
|
make()
|
||||||
|
|
||||||
@when("@:3.4")
|
|
||||||
def check(self):
|
def check(self):
|
||||||
# no top-level test target
|
# no top-level test target
|
||||||
if "+java" in self.spec:
|
if "+java" in self.spec:
|
||||||
with working_dir("swig/java"):
|
with working_dir("swig/java"):
|
||||||
make("test")
|
make("test")
|
||||||
|
|
||||||
@when("@:3.4")
|
def install(self, pkg, spec, prefix):
|
||||||
def install(self, spec, prefix):
|
|
||||||
make("install")
|
make("install")
|
||||||
if "+java" in spec:
|
if "+java" in spec:
|
||||||
with working_dir("swig/java"):
|
with working_dir("swig/java"):
|
||||||
make("install")
|
make("install")
|
||||||
install("*.jar", prefix)
|
install("*.jar", prefix)
|
||||||
|
|
||||||
@run_after("install")
|
|
||||||
def darwin_fix(self):
|
|
||||||
# The shared library is not installed correctly on Darwin; fix this
|
# The shared library is not installed correctly on Darwin; fix this
|
||||||
if self.spec.satisfies("@:3.4 platform=darwin"):
|
if self.spec.satisfies("platform=darwin"):
|
||||||
fix_darwin_install_name(self.prefix.lib)
|
fix_darwin_install_name(self.prefix.lib)
|
||||||
|
|
||||||
def test(self):
|
|
||||||
"""Attempts to import modules of the installed package."""
|
|
||||||
|
|
||||||
if "+python" in self.spec:
|
|
||||||
# Make sure we are importing the installed modules,
|
|
||||||
# not the ones in the source directory
|
|
||||||
for module in self.import_modules:
|
|
||||||
self.run_test(
|
|
||||||
self.spec["python"].command.path,
|
|
||||||
["-c", "import {0}".format(module)],
|
|
||||||
purpose="checking import of {0}".format(module),
|
|
||||||
work_dir="spack-test",
|
|
||||||
)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user