diff --git a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py index fc475be5ca9..012ab9ace2a 100644 --- a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py +++ b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py @@ -3,6 +3,8 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os + from spack import * @@ -19,61 +21,122 @@ class NetcdfCxx4(AutotoolsPackage): version('4.3.1', sha256='6a1189a181eed043b5859e15d5c080c30d0e107406fbb212c8fb9814e90f3445') version('4.3.0', sha256='e34fbc6aba243ec82c23e9ee99db2430555ada849c54c1f3ab081b0ddd0f5f30') - # Usually the configure automatically inserts the pic flags, but we can - # force its usage with this variant. - variant('static', default=True, description='Enable building static libraries') variant('shared', default=True, description='Enable shared library') variant('pic', default=True, description='Produce position-independent code (for shared libs)') - variant('doxygen', default=True, description='Enable doxygen docs') + variant('doc', default=False, description='Enable doxygen docs') depends_on('netcdf-c') - depends_on('automake', type='build') - depends_on('autoconf', type='build') - depends_on('libtool', type='build') - depends_on('m4', type='build') - depends_on('doxygen', when='+doxygen', type='build') - - conflicts('~shared', when='~static') - - force_autoreconf = True + depends_on('doxygen', when='+doc', type='build') def flag_handler(self, name, flags): if name == 'cflags' and '+pic' in self.spec: flags.append(self.compiler.cc_pic_flag) - elif name == 'cppflags': - flags.append('-I' + self.spec['netcdf-c'].prefix.include) + if name == 'cxxflags' and '+pic' in self.spec: + flags.append(self.compiler.cxx_pic_flag) + elif name == 'ldlibs': + # Address the underlinking problem reported in + # https://github.com/Unidata/netcdf-cxx4/issues/86, which also + # results into a linking error on macOS: + flags.append(self.spec['netcdf-c'].libs.link_flags) - return (None, None, flags) + # Note that cflags and cxxflags should be added by the compiler wrapper + # and not on the command line to avoid overriding the default + # compilation flags set by the configure script: + return flags, None, None @property def libs(self): - shared = True - return find_libraries( - 'libnetcdf_c++4', root=self.prefix, shared=shared, recursive=True + libraries = ['libnetcdf_c++4'] + + query_parameters = self.spec.last_query.extra_parameters + + if 'shared' in query_parameters: + shared = True + elif 'static' in query_parameters: + shared = False + else: + shared = '+shared' in self.spec + + libs = find_libraries( + libraries, root=self.prefix, shared=shared, recursive=True ) + if libs: + return libs + + msg = 'Unable to recursively locate {0} {1} libraries in {2}' + raise spack.error.NoLibrariesError( + msg.format('shared' if shared else 'static', + self.spec.name, + self.spec.prefix)) + + @when('@4.3.1:+shared') + @on_package_attributes(run_tests=True) + def patch(self): + # We enable the filter tests only when the tests are requested by the + # user. This, however, has a side effect: an extra file 'libh5bzip2.so' + # gets installed (note that the file has .so extension even on darwin). + # It's unclear whether that is intended but given the description of the + # configure option --disable-filter-testing (Do not run filter test and + # example; requires shared libraries and netCDF-4), we currently assume + # that the file is not really meant for the installation. To make all + # installations consistent and independent of whether the shared + # libraries or the tests are requested, we prevent installation of + # 'libh5bzip2.so': + filter_file(r'(^\s*)lib(_LTLIBRARIES\s*)(=\s*libh5bzip2\.la\s*$)', + r'\1noinst\2+\3', join_path(self.stage.source_path, + 'plugins', 'Makefile.in')) + def configure_args(self): - config_args = [] + config_args = self.enable_or_disable('shared') - if '+static' in self.spec: - config_args.append('--enable-static') - else: - config_args.append('--disable-static') - - if '+shared' in self.spec: - config_args.append('--enable-shared') - else: - config_args.append('--disable-shared') - - if '+pic' in self.spec: - config_args.append('--with-pic') - else: - config_args.append('--without-pic') - - if '+doxygen' in self.spec: + if '+doc' in self.spec: config_args.append('--enable-doxygen') else: config_args.append('--disable-doxygen') + if self.spec.satisfies('@4.3.1:'): + if self.run_tests and '+shared' in self.spec: + config_args.append('--enable-filter-testing') + if self.spec.satisfies('^hdf5+mpi'): + # The package itself does not need the MPI libraries but + # includes in the filter test C code, which + # requires when HDF5 is built with the MPI support. + # Using the MPI wrapper introduces overlinking to MPI + # libraries and we would prefer not to use it but it is the + # only reliable way to provide the compiler with the correct + # path to . For example, of a MacPorts-built + # MPICH might reside in /opt/local/include/mpich-gcc10, + # which Spack does not know about and cannot inject with its + # compiler wrapper. + config_args.append('CC={0}'.format(self.spec['mpi'].mpicc)) + else: + config_args.append('--disable-filter-testing') + return config_args + + @run_after('configure') + def rename_version(self): + # See https://github.com/Unidata/netcdf-cxx4/issues/109 + # The issue is fixed upstream: + # https://github.com/Unidata/netcdf-cxx4/commit/e7cc5bab02cf089dc79616456a0a951fee979fe9 + # We do not apply the upstream patch because we want to avoid running + # autoreconf and introduce additional dependencies. We do not generate a + # patch for the configure script because the patched string contains the + # version and we would need a patch file for each supported version of + # the library. We do not implement the patching with filter_file in the + # patch method because writing a robust regexp seems to be more + # difficult that simply renaming the file if exists. It also looks like + # we can simply remove the file since it is not used anywhere. + if not self.spec.satisfies('@:4.3.1 platform=darwin'): + return + + with working_dir(self.build_directory): + fname = 'VERSION' + if os.path.exists(fname): + os.rename(fname, '{0}.txt'.format(fname)) + + def check(self): + with working_dir(self.build_directory): + make('check', parallel=False) diff --git a/var/spack/repos/builtin/packages/netcdf-fortran/package.py b/var/spack/repos/builtin/packages/netcdf-fortran/package.py index d3843ccd0b5..c79c8af46a9 100644 --- a/var/spack/repos/builtin/packages/netcdf-fortran/package.py +++ b/var/spack/repos/builtin/packages/netcdf-fortran/package.py @@ -62,8 +62,6 @@ class NetcdfFortran(AutotoolsPackage): patch('no_parallel_build.patch', when='@4.5.2') def flag_handler(self, name, flags): - config_flags = None - if name == 'cflags': if '+pic' in self.spec: flags.append(self.compiler.cc_pic_flag) @@ -81,15 +79,11 @@ def flag_handler(self, name, flags): # The following flag forces the compiler to produce module # files with lowercase names. flags.append('-ef') - elif name == 'ldflags': - # We need to specify LDFLAGS to get correct dependency_libs - # in libnetcdff.la, so packages that use libtool for linking - # could correctly link to all the dependencies even when the - # building takes place outside of Spack environment, i.e. - # without Spack's compiler wrappers. - config_flags = [self.spec['netcdf-c'].libs.search_flags] - return flags, None, config_flags + # Note that cflags and fflags should be added by the compiler wrapper + # and not on the command line to avoid overriding the default + # compilation flags set by the configure script: + return flags, None, None @property def libs(self):