spack/var/spack/repos/builtin/packages/netcdf-c/package.py
Greg Sjaardema 6e49f5f0e5
netcdf-c: remove maxdims and maxvars variant (#15524)
* NETCDF: Remove maxdims maxvars variant

I'm not sure of the correct protocol to do this, so decided to make a stab and hopefully it works or I'm told the correct way...

The `maxdims` and `maxvars` variants for the NetCDF package were, to the best of my knowledge, only ever used for the Exodus library in the SEACAS package.  In versions of NetCDF prior to 4.4.0, Exodus required that the `NC_MAX_DIMS` and `NC_MAX_VARS` be increased over the default values.  This requirement was removed in 4.4.0 and later.

I do not know of any way to make a variant depend on the version and since the `maxdims` and `maxvars` variants are integer values and not boolean, then every build of NetCDF will have  these variants.  Typically `maxdims=1024 maxvars=8192` and the build will patch the `netcdf.h` include file for every build even though it is (almost) never needed. 

The SEACAS package has a NetCDF version requirement of >4.6.2, so it no longer specifies the `maxdims` or `maxvars` variant and I could find no other package in spack that uses this variant either, so removal should not break anything *in* spack.  However, there is no guarantee that some other external package doesn't use the variant, so I'm not sure of the correct way to remove the variant.  

For this PR, I simply removed the variants.  If there is a way to specify use of the variant tied to a specific version, I couldn't find it anywhere...

* Address review comment

Removed `is_integral` and `import numbers` since `is_integral` was only place it was used.

* Add blank line for flake8
2020-03-27 21:55:04 -05:00

238 lines
11 KiB
Python

# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack import *
class NetcdfC(AutotoolsPackage):
"""NetCDF (network Common Data Form) is a set of software libraries and
machine-independent data formats that support the creation, access, and
sharing of array-oriented scientific data. This is the C distribution."""
homepage = "http://www.unidata.ucar.edu/software/netcdf"
git = "https://github.com/Unidata/netcdf-c.git"
url = "https://www.gfd-dennou.org/arch/netcdf/unidata-mirror/netcdf-c-4.7.2.tar.gz"
def url_for_version(self, version):
if version >= Version('4.6.2'):
url = "https://www.gfd-dennou.org/arch/netcdf/unidata-mirror/netcdf-c-{0}.tar.gz"
else:
url = "https://www.gfd-dennou.org/arch/netcdf/unidata-mirror/netcdf-{0}.tar.gz"
return url.format(version.dotted)
version('master', branch='master')
version('4.7.3', sha256='8e8c9f4ee15531debcf83788594744bd6553b8489c06a43485a15c93b4e0448b')
version('4.7.2', sha256='b751cc1f314ac8357df2e0a1bacf35a624df26fe90981d3ad3fa85a5bbd8989a')
version('4.7.1', sha256='5c537c585773e575a16b28c3973b9608a98fdc4cf7c42893aa5223024e0001fc')
version('4.7.0', sha256='a512d2b4828c6177dd4b96791c4163e4e06e6bfc7123bebfbfe01762d777d1cb')
version('4.6.3', sha256='335fdf16d7531f430ad75e732ed1a9a3fc83ad3ef91fb33a70119a555dd5415c')
version('4.6.2', sha256='c37525981167b3cd82d32e1afa3022afb94e59287db5f116c57f5ed4d9c6a638')
version('4.6.1', sha256='89c7957458740b763ae828c345240b8a1d29c2c1fed0f065f99b73181b0b2642')
version('4.6.0', sha256='4bf05818c1d858224942ae39bfd9c4f1330abec57f04f58b9c3c152065ab3825')
version('4.5.0', sha256='cbe70049cf1643c4ad7453f86510811436c9580cb7a1684ada2f32b95b00ca79')
# Version 4.4.1.1 is having problems in tests
# https://github.com/Unidata/netcdf-c/issues/343
version('4.4.1.1', sha256='4d44c6f4d02a8faf10ea619bfe1ba8224cd993024f4da12988c7465f663c8cae')
# Version 4.4.1 can crash on you (in real life and in tests). See:
# https://github.com/Unidata/netcdf-c/issues/282
version('4.4.1', sha256='8915cc69817f7af6165fbe69a8d1dfe21d5929d7cca9d10b10f568669ec6b342')
version('4.4.0', sha256='0d40cb7845abd03c363abcd5f57f16e3c0685a0faf8badb2c59867452f6bcf78')
version('4.3.3.1', sha256='bdde3d8b0e48eed2948ead65f82c5cfb7590313bc32c4cf6c6546e4cea47ba19')
version('4.3.3', sha256='83223ed74423c685a10f6c3cfa15c2d6bf7dc84b46af1e95b9fa862016aaa27e')
# configure fails if curl is not installed.
# See https://github.com/Unidata/netcdf-c/issues/1390
patch('https://github.com/Unidata/netcdf-c/commit/e5315da1e748dc541d50796fb05233da65e86b6b.patch', sha256='10a1c3f7fa05e2c82457482e272bbe04d66d0047b237ad0a73e87d63d848b16c', when='@4.7.0')
# fix headers
patch('https://github.com/Unidata/netcdf-c/pull/1505.patch', sha256='f52db13c61b9c19aafe03c2a865163b540e9f6dee36e3a5f808f05fac59f2030', when='@4.7.2')
patch('https://github.com/Unidata/netcdf-c/pull/1508.patch', sha256='56532470875b9a97f3cf2a7d9ed16ef1612df3265ee38880c109428322ff3a40', when='@4.7.2')
variant('mpi', default=True,
description='Enable parallel I/O for netcdf-4')
variant('parallel-netcdf', default=False,
description='Enable parallel I/O for classic files')
variant('hdf4', default=False, description='Enable HDF4 support')
variant('pic', default=True,
description='Produce position-independent code (for shared libs)')
variant('shared', default=True, description='Enable shared library')
variant('dap', default=False, description='Enable DAP support')
# It's unclear if cdmremote can be enabled if '--enable-netcdf-4' is passed
# to the configure script. Since netcdf-4 support is mandatory we comment
# this variant out.
# variant('cdmremote', default=False,
# description='Enable CDM Remote support')
# The patch for 4.7.0 touches configure.ac. See force_autoreconf below.
depends_on('autoconf', type='build', when='@4.7.0')
depends_on('automake', type='build', when='@4.7.0')
depends_on('libtool', type='build', when='@4.7.0')
depends_on("m4", type='build')
depends_on("hdf", when='+hdf4')
# curl 7.18.0 or later is required:
# http://www.unidata.ucar.edu/software/netcdf/docs/getting_and_building_netcdf.html
depends_on("curl@7.18.0:", when='+dap')
# depends_on("curl@7.18.0:", when='+cdmremote')
depends_on('parallel-netcdf', when='+parallel-netcdf')
# We need to build with MPI wrappers if any of the two
# parallel I/O features is enabled:
# http://www.unidata.ucar.edu/software/netcdf/docs/getting_and_building_netcdf.html#build_parallel
depends_on('mpi', when='+mpi')
depends_on('mpi', when='+parallel-netcdf')
# zlib 1.2.5 or later is required for netCDF-4 compression:
# http://www.unidata.ucar.edu/software/netcdf/docs/getting_and_building_netcdf.html
depends_on("zlib@1.2.5:")
# High-level API of HDF5 1.8.9 or later is required for netCDF-4 support:
# http://www.unidata.ucar.edu/software/netcdf/docs/getting_and_building_netcdf.html
depends_on('hdf5@1.8.9:+hl~mpi', when='~mpi')
depends_on('hdf5@1.8.9:+hl+mpi', when='+mpi')
# Starting version 4.4.0, it became possible to disable parallel I/O even
# if HDF5 supports it. For previous versions of the library we need
# HDF5 without mpi support to disable parallel I/O.
# The following doesn't work if hdf5+mpi by default and netcdf-c~mpi is
# specified in packages.yaml
# depends_on('hdf5~mpi', when='@:4.3~mpi')
# Thus, we have to introduce a conflict
conflicts('~mpi', when='@:4.3^hdf5+mpi',
msg='netcdf-c@:4.3~mpi requires hdf5~mpi')
# We need HDF5 with mpi support to enable parallel I/O.
# The following doesn't work if hdf5~mpi by default and netcdf-c+mpi is
# specified in packages.yaml
# depends_on('hdf5+mpi', when='+mpi')
# Thus, we have to introduce a conflict
conflicts('+mpi', when='^hdf5~mpi',
msg='netcdf-c+mpi requires hdf5+mpi')
# NetCDF 4.4.0 and prior have compatibility issues with HDF5 1.10 and later
# https://github.com/Unidata/netcdf-c/issues/250
depends_on('hdf5@:1.8.999', when='@:4.4.0')
# The feature was introduced in version 4.1.2
# and was removed in version 4.4.0
# conflicts('+cdmremote', when='@:4.1.1,4.4:')
# The features were introduced in version 4.1.0
conflicts('+parallel-netcdf', when='@:4.0')
conflicts('+hdf4', when='@:4.0')
@property
def force_autoreconf(self):
# The patch for 4.7.0 touches configure.ac.
return self.spec.satisfies('@4.7.0')
def configure_args(self):
cflags = []
cppflags = []
ldflags = []
libs = []
config_args = ['--enable-v2',
'--enable-utilities',
'--enable-static',
'--enable-largefile',
'--enable-netcdf-4']
# The flag was introduced in version 4.1.0
if self.spec.satisfies('@4.1:'):
config_args.append('--enable-fsync')
# The flag was introduced in version 4.3.1
if self.spec.satisfies('@4.3.1:'):
config_args.append('--enable-dynamic-loading')
config_args += self.enable_or_disable('shared')
if '~shared' in self.spec or '+pic' in self.spec:
# We don't have shared libraries but we still want it to be
# possible to use this library in shared builds
cflags.append(self.compiler.pic_flag)
config_args += self.enable_or_disable('dap')
# config_args += self.enable_or_disable('cdmremote')
# if '+dap' in self.spec or '+cdmremote' in self.spec:
if '+dap' in self.spec:
# Make sure Netcdf links against Spack's curl, otherwise it may
# pick up system's curl, which can give link errors, e.g.:
# undefined reference to `SSL_CTX_use_certificate_chain_file
curl = self.spec['curl']
curl_libs = curl.libs
libs.append(curl_libs.link_flags)
ldflags.append(curl_libs.search_flags)
# TODO: figure out how to get correct flags via headers.cpp_flags
cppflags.append('-I' + curl.prefix.include)
if self.spec.satisfies('@4.4:'):
if '+mpi' in self.spec:
config_args.append('--enable-parallel4')
else:
config_args.append('--disable-parallel4')
# Starting version 4.1.3, --with-hdf5= and other such configure options
# are removed. Variables CPPFLAGS, LDFLAGS, and LD_LIBRARY_PATH must be
# used instead.
hdf5_hl = self.spec['hdf5:hl']
cppflags.append(hdf5_hl.headers.cpp_flags)
ldflags.append(hdf5_hl.libs.search_flags)
if '+parallel-netcdf' in self.spec:
config_args.append('--enable-pnetcdf')
pnetcdf = self.spec['parallel-netcdf']
cppflags.append(pnetcdf.headers.cpp_flags)
# TODO: change to pnetcdf.libs.search_flags once 'parallel-netcdf'
# package gets custom implementation of 'libs'
ldflags.append('-L' + pnetcdf.prefix.lib)
else:
config_args.append('--disable-pnetcdf')
if '+mpi' in self.spec or '+parallel-netcdf' in self.spec:
config_args.append('CC=%s' % self.spec['mpi'].mpicc)
config_args += self.enable_or_disable('hdf4')
if '+hdf4' in self.spec:
hdf4 = self.spec['hdf']
cppflags.append(hdf4.headers.cpp_flags)
# TODO: change to hdf4.libs.search_flags once 'hdf'
# package gets custom implementation of 'libs' property.
ldflags.append('-L' + hdf4.prefix.lib)
# TODO: change to self.spec['jpeg'].libs.link_flags once the
# implementations of 'jpeg' virtual package get 'jpeg_libs'
# property.
libs.append('-ljpeg')
if '+szip' in hdf4:
# This should also come from hdf4.libs
libs.append('-lsz')
# Fortran support
# In version 4.2+, NetCDF-C and NetCDF-Fortran have split.
# Use the netcdf-fortran package to install Fortran support.
config_args.append('CFLAGS=' + ' '.join(cflags))
config_args.append('CPPFLAGS=' + ' '.join(cppflags))
config_args.append('LDFLAGS=' + ' '.join(ldflags))
config_args.append('LIBS=' + ' '.join(libs))
return config_args
def check(self):
# h5_test fails when run in parallel
make('check', parallel=False)
@property
def libs(self):
shared = '+shared' in self.spec
return find_libraries(
'libnetcdf', root=self.prefix, shared=shared, recursive=True
)