aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hirsch, Ph.D <scivision@users.noreply.github.com>2019-02-28 15:13:38 -0500
committerJussi Pakkanen <jpakkane@gmail.com>2019-02-28 22:13:38 +0200
commit71cffa67fa90c7905fa8333f9895461563e50435 (patch)
treebb9a0e5263d95f0a5fc95fb785d728e7a6ad32a1
parent939c00a9727e2ce47f320dd02aa3952c146406c7 (diff)
downloadmeson-71cffa67fa90c7905fa8333f9895461563e50435.zip
meson-71cffa67fa90c7905fa8333f9895461563e50435.tar.gz
meson-71cffa67fa90c7905fa8333f9895461563e50435.tar.bz2
add NetCDF
-rw-r--r--docs/markdown/Dependencies.md21
-rw-r--r--docs/markdown/snippets/netcdf.md3
-rw-r--r--mesonbuild/dependencies/__init__.py4
-rw-r--r--mesonbuild/dependencies/base.py1
-rw-r--r--mesonbuild/dependencies/misc.py29
-rwxr-xr-xrun_project_tests.py4
-rw-r--r--test cases/frameworks/26 netcdf/main.c14
-rw-r--r--test cases/frameworks/26 netcdf/main.cpp15
-rw-r--r--test cases/frameworks/26 netcdf/main.f9019
-rw-r--r--test cases/frameworks/26 netcdf/meson.build35
10 files changed, 143 insertions, 2 deletions
diff --git a/docs/markdown/Dependencies.md b/docs/markdown/Dependencies.md
index e243e94..47fce8b 100644
--- a/docs/markdown/Dependencies.md
+++ b/docs/markdown/Dependencies.md
@@ -257,7 +257,9 @@ libraries that have been compiled for single-threaded use instead.
## Fortran Coarrays
-As of 0.50.0 Coarrays are a Fortran language intrinsic feature, enabled by
+*(added 0.50.0)*
+
+ Coarrays are a Fortran language intrinsic feature, enabled by
`dependency('coarray')`.
GCC will use OpenCoarrays if present to implement coarrays, while Intel and NAG
@@ -286,6 +288,9 @@ test('gtest test', e)
```
## HDF5
+
+*(added 0.50.0)*
+
HDF5 is supported for C, C++ and Fortran. Because dependencies are
language-specific, you must specify the requested language using the
`language` keyword argument, i.e.,
@@ -349,6 +354,20 @@ are not in your path, they can be specified by setting the standard
environment variables `MPICC`, `MPICXX`, `MPIFC`, `MPIF90`, or
`MPIF77`, during configuration.
+## NetCDF
+
+*(added 0.50.0)*
+
+NetCDF is supported for C, C++ and Fortran. Because NetCDF dependencies are
+language-specific, you must specify the requested language using the
+`language` keyword argument, i.e.,
+ * `dependency('netcdf', language: 'c')` for the C NetCDF headers and libraries
+ * `dependency('netcdf', language: 'cpp')` for the C++ NetCDF headers and libraries
+ * `dependency('netcdf', language: 'fortran')` for the Fortran NetCDF headers and libraries
+
+Meson uses pkg-config to find NetCDF.
+
+
## OpenMP
*(added 0.46.0)*
diff --git a/docs/markdown/snippets/netcdf.md b/docs/markdown/snippets/netcdf.md
new file mode 100644
index 0000000..711f174
--- /dev/null
+++ b/docs/markdown/snippets/netcdf.md
@@ -0,0 +1,3 @@
+## NetCDF
+
+NetCDF support for C, C++ and Fortran is added via pkg-config.
diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py
index 71a0bb3..53ff1c9 100644
--- a/mesonbuild/dependencies/__init__.py
+++ b/mesonbuild/dependencies/__init__.py
@@ -18,7 +18,7 @@ from .base import ( # noqa: F401
ExternalDependency, NotFoundDependency, ExternalLibrary, ExtraFrameworkDependency, InternalDependency,
PkgConfigDependency, CMakeDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language)
from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency
-from .misc import (CoarrayDependency, HDF5Dependency, MPIDependency, OpenMPDependency, Python3Dependency, ThreadDependency, PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency)
+from .misc import (CoarrayDependency, HDF5Dependency, MPIDependency, NetCDFDependency, OpenMPDependency, Python3Dependency, ThreadDependency, PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency)
from .platform import AppleFrameworks
from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, SDL2Dependency, WxDependency, VulkanDependency
@@ -35,6 +35,7 @@ packages.update({
'coarray': CoarrayDependency,
'mpi': MPIDependency,
'hdf5': HDF5Dependency,
+ 'netcdf': NetCDFDependency,
'openmp': OpenMPDependency,
'python3': Python3Dependency,
'threads': ThreadDependency,
@@ -58,5 +59,6 @@ packages.update({
_packages_accept_language.update({
'hdf5',
'mpi',
+ 'netcdf',
'openmp',
})
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index b9fcc11..6d41ec5 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -2286,6 +2286,7 @@ display_name_map = {
'hdf5': 'HDF5',
'llvm': 'LLVM',
'mpi': 'MPI',
+ 'netcdf': 'NetCDF',
'openmp': 'OpenMP',
'wxwidgets': 'WxWidgets',
}
diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py
index db83422..df3a053 100644
--- a/mesonbuild/dependencies/misc.py
+++ b/mesonbuild/dependencies/misc.py
@@ -117,6 +117,35 @@ class HDF5Dependency(ExternalDependency):
except Exception:
pass
+class NetCDFDependency(ExternalDependency):
+
+ def __init__(self, environment, kwargs):
+ language = kwargs.get('language', 'c')
+ super().__init__('netcdf', environment, language, kwargs)
+ kwargs['required'] = False
+ kwargs['silent'] = True
+ self.is_found = False
+
+ pkgconfig_files = ['netcdf']
+
+ if language not in ('c', 'cpp', 'fortran'):
+ raise DependencyException('Language {} is not supported with NetCDF.'.format(language))
+
+ if language == 'fortran':
+ pkgconfig_files.append('netcdf-fortran')
+
+ self.compile_args = []
+ self.link_args = []
+ self.pcdep = []
+ for pkg in pkgconfig_files:
+ pkgdep = PkgConfigDependency(pkg, environment, kwargs, language=self.language)
+ if pkgdep.found():
+ self.compile_args.extend(pkgdep.get_compile_args())
+ self.link_args.extend(pkgdep.get_link_args())
+ self.version = pkgdep.get_version()
+ self.is_found = True
+ self.pcdep.append(pkgdep)
+
class MPIDependency(ExternalDependency):
def __init__(self, environment, kwargs):
diff --git a/run_project_tests.py b/run_project_tests.py
index 030cd51..bb0e062 100755
--- a/run_project_tests.py
+++ b/run_project_tests.py
@@ -498,6 +498,10 @@ def skippable(suite, test):
if test.endswith('10 gtk-doc'):
return True
+ # NetCDF is not in the CI image
+ if test.endswith('netcdf'):
+ return True
+
# No frameworks test should be skipped on linux CI, as we expect all
# prerequisites to be installed
if mesonlib.is_linux():
diff --git a/test cases/frameworks/26 netcdf/main.c b/test cases/frameworks/26 netcdf/main.c
new file mode 100644
index 0000000..e592585
--- /dev/null
+++ b/test cases/frameworks/26 netcdf/main.c
@@ -0,0 +1,14 @@
+#include "netcdf.h"
+
+int main(void)
+{
+int ret, ncid;
+
+if ((ret = nc_create("foo.nc", NC_CLOBBER, &ncid)))
+ return ret;
+
+if ((ret = nc_close(ncid)))
+ return ret;
+
+return 0;
+}
diff --git a/test cases/frameworks/26 netcdf/main.cpp b/test cases/frameworks/26 netcdf/main.cpp
new file mode 100644
index 0000000..a3c98ef
--- /dev/null
+++ b/test cases/frameworks/26 netcdf/main.cpp
@@ -0,0 +1,15 @@
+#include <iostream>
+#include "netcdf.h"
+
+int main(void)
+{
+int ret, ncid;
+
+if ((ret = nc_create("foo.nc", NC_CLOBBER, &ncid)))
+ return ret;
+
+if ((ret = nc_close(ncid)))
+ return ret;
+
+return EXIT_SUCCESS;
+}
diff --git a/test cases/frameworks/26 netcdf/main.f90 b/test cases/frameworks/26 netcdf/main.f90
new file mode 100644
index 0000000..3872298
--- /dev/null
+++ b/test cases/frameworks/26 netcdf/main.f90
@@ -0,0 +1,19 @@
+use netcdf
+
+implicit none
+
+integer :: ncid
+
+call check( nf90_create("foo.nc", NF90_CLOBBER, ncid) )
+
+call check( nf90_close(ncid) )
+
+contains
+
+ subroutine check(status)
+ integer, intent (in) :: status
+
+ if(status /= nf90_noerr) error stop trim(nf90_strerror(status))
+end subroutine check
+
+end program
diff --git a/test cases/frameworks/26 netcdf/meson.build b/test cases/frameworks/26 netcdf/meson.build
new file mode 100644
index 0000000..5a10d09
--- /dev/null
+++ b/test cases/frameworks/26 netcdf/meson.build
@@ -0,0 +1,35 @@
+project('netcdf_test', 'c', 'cpp')
+
+
+# --- C tests
+nc_c = dependency('netcdf', language : 'c', required : false)
+if not nc_c.found()
+ error('MESON_SKIP_TEST: NetCDF C library not found, skipping NetCDF framework tests.')
+endif
+exec = executable('exec', 'main.c', dependencies : nc_c)
+
+test('NetCDF C', exec)
+
+# --- C++ tests
+nc_cpp = dependency('netcdf', language : 'cpp', required : false)
+if nc_cpp.found()
+ execpp = executable('execpp', 'main.cpp', dependencies : nc_cpp)
+ test('NetCDF C++', execpp)
+endif
+
+# --- Fortran tests
+if build_machine.system() != 'windows'
+ add_languages('fortran')
+
+ nc_f = dependency('netcdf', language : 'fortran', required : false)
+ if nc_f.found()
+ exef = executable('exef', 'main.f90', dependencies : nc_f)
+
+ test('NetCDF Fortran', exef)
+ endif
+endif
+
+# Check we can apply a version constraint
+if nc_c.version() != 'unknown'
+ dependency('netcdf', version: '>=@0@'.format(nc_c.version()))
+endif