From ccb316964d7d2bed9fc7622df2bd77f41d0aef43 Mon Sep 17 00:00:00 2001 From: RĂ©mi Lacroix Date: Fri, 31 Jul 2020 05:23:49 +0200 Subject: 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. --- var/spack/repos/builtin/packages/ferret/package.py | 206 ++++++++++++++++----- 1 file changed, 159 insertions(+), 47 deletions(-) diff --git a/var/spack/repos/builtin/packages/ferret/package.py b/var/spack/repos/builtin/packages/ferret/package.py index 1ad1978240..5878403e26 100644 --- a/var/spack/repos/builtin/packages/ferret/package.py +++ b/var/spack/repos/builtin/packages/ferret/package.py @@ -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 @@ class Ferret(Package): 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)) -- cgit v1.2.3-70-g09d2