Skip to content
Snippets Groups Projects
Unverified Commit ccb31696 authored by Rémi Lacroix's avatar Rémi Lacroix Committed by GitHub
Browse files

Improve Ferret package (#17620)

* Ferret: Add missing dependency with curl.

* Ferret: Don't force using the static version of libgfortran.

* Ferret: Ensure Spack's compiler wrappers are used.

This allows properly setting the rpaths.

* Ferret: Add support for versions 7.3 to 7.6.

* Ferret: Add a variant to install Ferret standard datasets.

* Ferret: Define some useful runtime environnement variables.

* Ferret: Fix flake8.

Also add myself as a maintainer as suggested by @alalazo.
parent 58911d82
Branches
Tags
No related merge requests found
......@@ -13,10 +13,18 @@ class Ferret(Package):
designed to meet the needs of oceanographers and meteorologists
analyzing large and complex gridded data sets."""
homepage = "http://ferret.pmel.noaa.gov/Ferret/home"
url = "ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v696.tar.gz"
url = "https://github.com/NOAA-PMEL/Ferret/archive/v7.6.0.tar.gz"
version('7.2', sha256='21c339b1bafa6939fc869428d906451f130f7e77e828c532ab9488d51cf43095')
version('6.96', sha256='7eb87156aa586cfe838ab83f08b2102598f9ab62062d540a5da8c9123816331a')
maintainers = ['RemiLacroix-IDRIS']
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("hdf5+hl")
depends_on("netcdf-c")
......@@ -24,53 +32,128 @@ class Ferret(Package):
depends_on("readline")
depends_on("zlib")
depends_on("libx11")
depends_on("curl")
# Make Java dependency optional with older versions of Ferret
patch('https://github.com/NOAA-PMEL/Ferret/commit/c7eb70a0b17045c8ca7207d586bfea77a5340668.patch',
sha256='5bd581db4578c013faed375844b206fbe71f93fe9ce60f8f9f41d64abc6a5972',
level=1, working_dir='FERRET', when='@:6.99')
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):
return "ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v{0}.tar.gz".format(
version.joined)
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 patch(self):
hdf5_prefix = self.spec['hdf5'].prefix
netcdff_prefix = self.spec['netcdf-fortran'].prefix
readline_prefix = self.spec['readline'].prefix
libz_prefix = self.spec['zlib'].prefix
filter_file(r'^BUILDTYPE.+',
'BUILDTYPE = x86_64-linux',
'FERRET/site_specific.mk')
filter_file(r'^INSTALL_FER_DIR.+',
'INSTALL_FER_DIR = %s' % self.spec.prefix,
'FERRET/site_specific.mk')
filter_file(r'^HDF5_DIR.+',
'HDF5_DIR = %s' % hdf5_prefix,
'FERRET/site_specific.mk')
filter_file(r'^NETCDF4_DIR.+',
'NETCDF4_DIR = %s' % netcdff_prefix,
'FERRET/site_specific.mk')
filter_file(r'^READLINE_DIR.+',
'READLINE_DIR = %s' % readline_prefix,
'FERRET/site_specific.mk')
filter_file(r'^LIBZ_DIR.+',
'LIBZ_DIR = %s' % libz_prefix,
'FERRET/site_specific.mk')
filter_file(r'^JAVA_HOME.+',
' ',
'FERRET/site_specific.mk')
filter_file(r'-lm',
'-lgfortran -lm',
'FERRET/platform_specific.mk.x86_64-linux')
filter_file(r'\$\(NETCDF4_DIR\)/lib64/libnetcdff.a',
"-L%s -lnetcdff" % self.spec['netcdf-fortran'].prefix.lib,
'FERRET/platform_specific.mk.x86_64-linux')
filter_file(r'\$\(NETCDF4_DIR\)/lib64/libnetcdf.a',
"-L%s -lnetcdf" % self.spec['netcdf-c'].prefix.lib,
'FERRET/platform_specific.mk.x86_64-linux')
filter_file(r'\$\(HDF5_DIR\)/lib64/libhdf5_hl.a',
"-L%s -lhdf5_hl" % self.spec['hdf5'].prefix.lib,
'FERRET/platform_specific.mk.x86_64-linux')
filter_file(r'\$\(HDF5_DIR\)/lib64/libhdf5.a',
"-L%s -lhdf5" % self.spec['hdf5'].prefix.lib,
'FERRET/platform_specific.mk.x86_64-linux')
spec = self.spec
hdf5_prefix = spec['hdf5'].prefix
netcdff_prefix = spec['netcdf-fortran'].prefix
readline_prefix = spec['readline'].prefix
libz_prefix = spec['zlib'].prefix
work_dir = 'FERRET' if '@:7.2' in spec else '.'
with working_dir(work_dir, create=False):
if '@7.3:' in spec:
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 '@:7.3' in spec:
# 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 '@:7.4' in spec:
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']:
......@@ -78,8 +161,37 @@ def install(self, spec, prefix):
else:
env['LDFLAGS'] = '-lquadmath'
with working_dir('FERRET', create=False):
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 '+datasets' in self.spec:
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 '+datasets' in self.spec:
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))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment