spack/var/spack/repos/builtin/packages/ferret/package.py
Adam J. Stewart a3f4fd68d6
Packages: add missing compiler dependencies (#49920)
* Packages: add missing compiler dependencies

* Undo changes to cray-mpich
2025-04-07 09:42:54 -07:00

214 lines
8.5 KiB
Python

# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
from spack.package import *
class Ferret(Package):
"""Ferret is an interactive computer visualization and analysis environment
designed to meet the needs of oceanographers and meteorologists
analyzing large and complex gridded data sets."""
homepage = "https://ferret.pmel.noaa.gov/Ferret/home"
url = "https://github.com/NOAA-PMEL/Ferret/archive/v7.6.0.tar.gz"
maintainers("RemiLacroix-IDRIS")
license("Unlicense")
version("7.6.0", sha256="69832d740bd44c9eadd198a5de4d96c4c01ae90ae28c2c3414c1bb9f43e475d1")
version("7.5.0", sha256="2a038c547e6e80e6bd0645a374c3247360cf8c94ea56f6f3444b533257eb16db")
version("7.4", sha256="5167bb9e6ef441ae9cf90da555203d2155e3fcf929e7b8dddb237de0d58c5e5f")
version("7.3", sha256="ae80a732c34156b5287a23696cf4ae4faf4de1dd705ff43cbb4168b05c6faaf4")
version("7.2", sha256="21c339b1bafa6939fc869428d906451f130f7e77e828c532ab9488d51cf43095")
version("6.96", sha256="7eb87156aa586cfe838ab83f08b2102598f9ab62062d540a5da8c9123816331a")
variant("datasets", default=False, description="Install Ferret standard datasets")
depends_on("c", type="build") # generated
depends_on("cxx", type="build")
depends_on("fortran", type="build") # generated
depends_on("hdf5+hl")
depends_on("netcdf-c")
depends_on("netcdf-fortran")
depends_on("readline")
depends_on("zlib-api")
depends_on("libx11")
depends_on("curl")
depends_on("gmake", type="build")
# Make Java dependency optional with older versions of Ferret
patch(
"https://github.com/NOAA-PMEL/Ferret/commit/c7eb70a0b17045c8ca7207d586bfea77a5340668.patch?full_index=1",
sha256="6dd0a6b11c103b0097fba3da06d6e655da9770e8f568a15968d9b64a0f3c2315",
level=1,
working_dir="FERRET",
when="@:6",
)
resource(
name="datasets",
url="https://github.com/NOAA-PMEL/FerretDatasets/archive/v7.6.tar.gz",
sha256="b2fef758ec1817c1c19e6225857ca3a82c727d209ed7fd4697d45c5533bb2c72",
placement="fer_dsets",
when="+datasets",
)
def url_for_version(self, version):
if version <= Version("7.2"):
return "ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v{0}.tar.gz".format(
version.joined
)
else:
return "https://github.com/NOAA-PMEL/Ferret/archive/v{0}.tar.gz".format(version)
def flag_handler(self, name, flags):
if name == "fflags" and self.spec.satisfies("%gcc@10:"):
flags.extend(["-fallow-argument-mismatch", "-fallow-invalid-boz"])
return (flags, None, None)
def patch(self):
spec = self.spec
hdf5_prefix = spec["hdf5"].prefix
netcdff_prefix = spec["netcdf-fortran"].prefix
readline_prefix = spec["readline"].prefix
libz_prefix = spec["zlib-api"].prefix
work_dir = "FERRET" if "@:7.2" in spec else "."
with working_dir(work_dir, create=False):
if spec.satisfies("@7.3:"):
copy("site_specific.mk.in", "site_specific.mk")
copy(
"external_functions/ef_utility/site_specific.mk.in",
"external_functions/ef_utility/site_specific.mk",
)
filter_file(
r"^DIR_PREFIX.+",
"DIR_PREFIX = %s" % self.stage.source_path,
"site_specific.mk",
)
# Setting this to blank not to force
# using the static version of readline
filter_file(r"^(READLINE_(LIB)?DIR).+", "\\1 = ", "site_specific.mk")
else:
filter_file(r"^LIBZ_DIR.+", "LIBZ_DIR = %s" % libz_prefix, "site_specific.mk")
filter_file(r"^JAVA_HOME.+", " ", "site_specific.mk")
filter_file(
r"^READLINE_DIR.+", "READLINE_DIR = %s" % readline_prefix, "site_specific.mk"
)
filter_file(r"^BUILDTYPE.+", "BUILDTYPE = x86_64-linux", "site_specific.mk")
filter_file(
r"^INSTALL_FER_DIR.+", "INSTALL_FER_DIR = %s" % spec.prefix, "site_specific.mk"
)
filter_file(r"^(HDF5_(LIB)?DIR).+", "\\1 = %s" % hdf5_prefix, "site_specific.mk")
filter_file(
r"^(NETCDF4?_(LIB)?DIR).+", "\\1 = %s" % netcdff_prefix, "site_specific.mk"
)
if spec.satisfies("@:7.3"):
# Don't force using the static version of libz
filter_file(
r"\$\(LIBZ_DIR\)/lib64/libz.a", "-lz", "platform_specific.mk.x86_64-linux"
)
# Don't force using the static version of libgfortran
filter_file(
r"-Wl,-Bstatic -lgfortran -Wl,-Bdynamic",
"-lgfortran",
"platform_specific.mk.x86_64-linux",
)
# This prevents the rpaths to be properly set
# by Spack's compiler wrappers
filter_file(r"-v --verbose", "", "platform_specific.mk.x86_64-linux")
filter_file(
r"^[ \t]*LD[ \t]*=.+",
"LD = %s" % spack_cc,
"platform_specific.mk.x86_64-linux",
)
else:
# Don't force using the static version of libgfortran
filter_file(r"-static-libgfortran", "", "platform_specific.mk.x86_64-linux")
if spec.satisfies("@:7.4"):
compilers_spec_file = "platform_specific.mk.x86_64-linux"
else:
compilers_spec_file = "site_specific.mk"
# Make sure Ferret uses Spack's compiler wrappers
filter_file(r"^[ \t]*CC[ \t]*=.+", "CC = %s" % spack_cc, compilers_spec_file)
filter_file(r"^[ \t]*CXX[ \t]*=.+", "CXX = %s" % spack_cxx, compilers_spec_file)
filter_file(r"^[ \t]*FC[ \t]*=.+", "FC = %s" % spack_fc, compilers_spec_file)
filter_file(r"^[ \t]*F77[ \t]*=.+", "F77 = %s" % spack_f77, compilers_spec_file)
filter_file(
r"\$\(NETCDF4?_(LIB)?DIR\).*/libnetcdff.a",
"-L%s -lnetcdff" % spec["netcdf-fortran"].prefix.lib,
"platform_specific.mk.x86_64-linux",
)
filter_file(
r"\$\(NETCDF4?_(LIB)?DIR\).*/libnetcdf.a",
"-L%s -lnetcdf" % spec["netcdf-c"].prefix.lib,
"platform_specific.mk.x86_64-linux",
)
filter_file(
r"\$\(HDF5_(LIB)?DIR\).*/libhdf5_hl.a",
"-L%s -lhdf5_hl" % spec["hdf5"].prefix.lib,
"platform_specific.mk.x86_64-linux",
)
filter_file(
r"\$\(HDF5_(LIB)?DIR\).*/libhdf5.a",
"-L%s -lhdf5" % spec["hdf5"].prefix.lib,
"platform_specific.mk.x86_64-linux",
)
def install(self, spec, prefix):
if "LDFLAGS" in env and env["LDFLAGS"]:
env["LDFLAGS"] += " " + "-lquadmath"
else:
env["LDFLAGS"] = "-lquadmath"
work_dir = "FERRET" if "@:7.2" in self.spec else "."
with working_dir(work_dir, create=False):
os.environ["LD_X11"] = "-L%s -lX11" % spec["libx11"].prefix.lib
os.environ["HOSTTYPE"] = "x86_64-linux"
make(parallel=False)
make("install")
if self.spec.satisfies("+datasets"):
mkdir(self.prefix.fer_dsets)
install_tree("fer_dsets", self.prefix.fer_dsets)
def setup_run_environment(self, env):
env.set("FER_DIR", self.prefix)
env.set(
"FER_GO", " ".join([".", self.prefix.go, self.prefix.examples, self.prefix.contrib])
)
env.set("FER_EXTERNAL_FUNCTIONS", self.prefix.ext_func.libs)
env.set("FER_PALETTE", " ".join([".", self.prefix.ppl]))
env.set("FER_FONTS", self.prefix.ppl.fonts)
fer_data = ["."]
fer_descr = ["."]
fer_grids = ["."]
if self.spec.satisfies("+datasets"):
env.set("FER_DSETS", self.prefix.fer_dsets)
fer_data.append(self.prefix.fer_dsets.data)
fer_descr.append(self.prefix.fer_dsets.descr)
fer_grids.append(self.prefix.fer_dsets.grids)
fer_data.extend([self.prefix.go, self.prefix.examples])
env.set("FER_DATA", " ".join(fer_data))
env.set("FER_DESCR", " ".join(fer_descr))
env.set("FER_GRIDS", " ".join(fer_grids))