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.
This commit is contained in:
Rémi Lacroix 2020-07-31 05:23:49 +02:00 committed by GitHub
parent 58911d8248
commit ccb316964d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -13,10 +13,18 @@ class Ferret(Package):
designed to meet the needs of oceanographers and meteorologists designed to meet the needs of oceanographers and meteorologists
analyzing large and complex gridded data sets.""" analyzing large and complex gridded data sets."""
homepage = "http://ferret.pmel.noaa.gov/Ferret/home" 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') maintainers = ['RemiLacroix-IDRIS']
version('6.96', sha256='7eb87156aa586cfe838ab83f08b2102598f9ab62062d540a5da8c9123816331a')
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("hdf5+hl")
depends_on("netcdf-c") depends_on("netcdf-c")
@ -24,53 +32,128 @@ class Ferret(Package):
depends_on("readline") depends_on("readline")
depends_on("zlib") depends_on("zlib")
depends_on("libx11") 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): def url_for_version(self, version):
return "ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v{0}.tar.gz".format( if version <= Version('7.2'):
version.joined) 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): def patch(self):
hdf5_prefix = self.spec['hdf5'].prefix spec = self.spec
netcdff_prefix = self.spec['netcdf-fortran'].prefix hdf5_prefix = spec['hdf5'].prefix
readline_prefix = self.spec['readline'].prefix netcdff_prefix = spec['netcdf-fortran'].prefix
libz_prefix = self.spec['zlib'].prefix readline_prefix = spec['readline'].prefix
libz_prefix = spec['zlib'].prefix
filter_file(r'^BUILDTYPE.+', work_dir = 'FERRET' if '@:7.2' in spec else '.'
'BUILDTYPE = x86_64-linux', with working_dir(work_dir, create=False):
'FERRET/site_specific.mk') if '@7.3:' in spec:
filter_file(r'^INSTALL_FER_DIR.+', copy('site_specific.mk.in', 'site_specific.mk')
'INSTALL_FER_DIR = %s' % self.spec.prefix, copy('external_functions/ef_utility/site_specific.mk.in',
'FERRET/site_specific.mk') 'external_functions/ef_utility/site_specific.mk')
filter_file(r'^HDF5_DIR.+',
'HDF5_DIR = %s' % hdf5_prefix, filter_file(r'^DIR_PREFIX.+',
'FERRET/site_specific.mk') 'DIR_PREFIX = %s' % self.stage.source_path,
filter_file(r'^NETCDF4_DIR.+', 'site_specific.mk')
'NETCDF4_DIR = %s' % netcdff_prefix, # Setting this to blank not to force
'FERRET/site_specific.mk') # using the static version of readline
filter_file(r'^READLINE_DIR.+', filter_file(r'^(READLINE_(LIB)?DIR).+',
'READLINE_DIR = %s' % readline_prefix, '\\1 = ',
'FERRET/site_specific.mk') 'site_specific.mk')
filter_file(r'^LIBZ_DIR.+', else:
'LIBZ_DIR = %s' % libz_prefix, filter_file(r'^LIBZ_DIR.+',
'FERRET/site_specific.mk') 'LIBZ_DIR = %s' % libz_prefix,
filter_file(r'^JAVA_HOME.+', 'site_specific.mk')
' ', filter_file(r'^JAVA_HOME.+',
'FERRET/site_specific.mk') ' ',
filter_file(r'-lm', 'site_specific.mk')
'-lgfortran -lm', filter_file(r'^READLINE_DIR.+',
'FERRET/platform_specific.mk.x86_64-linux') 'READLINE_DIR = %s' % readline_prefix,
filter_file(r'\$\(NETCDF4_DIR\)/lib64/libnetcdff.a', 'site_specific.mk')
"-L%s -lnetcdff" % self.spec['netcdf-fortran'].prefix.lib,
'FERRET/platform_specific.mk.x86_64-linux') filter_file(r'^BUILDTYPE.+',
filter_file(r'\$\(NETCDF4_DIR\)/lib64/libnetcdf.a', 'BUILDTYPE = x86_64-linux',
"-L%s -lnetcdf" % self.spec['netcdf-c'].prefix.lib, 'site_specific.mk')
'FERRET/platform_specific.mk.x86_64-linux') filter_file(r'^INSTALL_FER_DIR.+',
filter_file(r'\$\(HDF5_DIR\)/lib64/libhdf5_hl.a', 'INSTALL_FER_DIR = %s' % spec.prefix,
"-L%s -lhdf5_hl" % self.spec['hdf5'].prefix.lib, 'site_specific.mk')
'FERRET/platform_specific.mk.x86_64-linux') filter_file(r'^(HDF5_(LIB)?DIR).+',
filter_file(r'\$\(HDF5_DIR\)/lib64/libhdf5.a', '\\1 = %s' % hdf5_prefix,
"-L%s -lhdf5" % self.spec['hdf5'].prefix.lib, 'site_specific.mk')
'FERRET/platform_specific.mk.x86_64-linux') 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): def install(self, spec, prefix):
if 'LDFLAGS' in env and env['LDFLAGS']: if 'LDFLAGS' in env and env['LDFLAGS']:
@ -78,8 +161,37 @@ def install(self, spec, prefix):
else: else:
env['LDFLAGS'] = '-lquadmath' 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['LD_X11'] = '-L%s -lX11' % spec['libx11'].prefix.lib
os.environ['HOSTTYPE'] = 'x86_64-linux' os.environ['HOSTTYPE'] = 'x86_64-linux'
make(parallel=False) make(parallel=False)
make("install") 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))