Merge pull request #4831 from scivision/hdf5
This commit is contained in:
commit
abad2ff005
|
@ -20,6 +20,7 @@ RUN sed -i '/^#\sdeb-src /s/^#//' "/etc/apt/sources.list" \
|
||||||
&& apt-get -y install --no-install-recommends wine-stable \
|
&& apt-get -y install --no-install-recommends wine-stable \
|
||||||
&& apt-get -y install llvm-dev libclang-dev \
|
&& apt-get -y install llvm-dev libclang-dev \
|
||||||
&& apt-get -y install libgcrypt11-dev \
|
&& apt-get -y install libgcrypt11-dev \
|
||||||
|
&& apt-get -y install libhdf5-dev \
|
||||||
&& dub fetch urld && dub build urld --compiler=gdc \
|
&& dub fetch urld && dub build urld --compiler=gdc \
|
||||||
&& dub fetch dubtestproject \
|
&& dub fetch dubtestproject \
|
||||||
&& dub build dubtestproject:test1 --compiler=ldc2 \
|
&& dub build dubtestproject:test1 --compiler=ldc2 \
|
||||||
|
|
|
@ -269,6 +269,17 @@ e = executable('testprog', 'test.cc', dependencies : gtest_dep)
|
||||||
test('gtest test', e)
|
test('gtest test', e)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## HDF5
|
||||||
|
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.,
|
||||||
|
* `dependency('hdf5', language: 'c')` for the C HDF5 headers and libraries
|
||||||
|
* `dependency('hdf5', language: 'cpp')` for the C++ HDF5 headers and libraries
|
||||||
|
* `dependency('hdf5', language: 'fortran')` for the Fortran HDF5 headers and libraries
|
||||||
|
|
||||||
|
Meson uses pkg-config to find HDF5. The standard low-level HDF5 function and the `HL` high-level HDF5 functions are linked for each language.
|
||||||
|
|
||||||
|
|
||||||
## libwmf
|
## libwmf
|
||||||
|
|
||||||
*(added 0.44.0)*
|
*(added 0.44.0)*
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
## HDF5
|
||||||
|
|
||||||
|
HDF5 support is added via pkg-config.
|
|
@ -18,7 +18,7 @@ from .base import ( # noqa: F401
|
||||||
ExternalDependency, NotFoundDependency, ExternalLibrary, ExtraFrameworkDependency, InternalDependency,
|
ExternalDependency, NotFoundDependency, ExternalLibrary, ExtraFrameworkDependency, InternalDependency,
|
||||||
PkgConfigDependency, CMakeDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language)
|
PkgConfigDependency, CMakeDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language)
|
||||||
from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency
|
from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency
|
||||||
from .misc import (MPIDependency, OpenMPDependency, Python3Dependency, ThreadDependency, PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency)
|
from .misc import (HDF5Dependency, MPIDependency, OpenMPDependency, Python3Dependency, ThreadDependency, PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency)
|
||||||
from .platform import AppleFrameworks
|
from .platform import AppleFrameworks
|
||||||
from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, SDL2Dependency, WxDependency, VulkanDependency
|
from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, SDL2Dependency, WxDependency, VulkanDependency
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ packages.update({
|
||||||
# From misc:
|
# From misc:
|
||||||
'boost': BoostDependency,
|
'boost': BoostDependency,
|
||||||
'mpi': MPIDependency,
|
'mpi': MPIDependency,
|
||||||
|
'hdf5': HDF5Dependency,
|
||||||
'openmp': OpenMPDependency,
|
'openmp': OpenMPDependency,
|
||||||
'python3': Python3Dependency,
|
'python3': Python3Dependency,
|
||||||
'threads': ThreadDependency,
|
'threads': ThreadDependency,
|
||||||
|
@ -54,6 +55,7 @@ packages.update({
|
||||||
'vulkan': VulkanDependency,
|
'vulkan': VulkanDependency,
|
||||||
})
|
})
|
||||||
_packages_accept_language.update({
|
_packages_accept_language.update({
|
||||||
|
'hdf5',
|
||||||
'mpi',
|
'mpi',
|
||||||
'openmp',
|
'openmp',
|
||||||
})
|
})
|
||||||
|
|
|
@ -2095,6 +2095,7 @@ display_name_map = {
|
||||||
'dub': 'DUB',
|
'dub': 'DUB',
|
||||||
'gmock': 'GMock',
|
'gmock': 'GMock',
|
||||||
'gtest': 'GTest',
|
'gtest': 'GTest',
|
||||||
|
'hdf5': 'HDF5',
|
||||||
'llvm': 'LLVM',
|
'llvm': 'LLVM',
|
||||||
'mpi': 'MPI',
|
'mpi': 'MPI',
|
||||||
'openmp': 'OpenMP',
|
'openmp': 'OpenMP',
|
||||||
|
|
|
@ -14,14 +14,13 @@
|
||||||
|
|
||||||
# This file contains the detection logic for miscellaneous external dependencies.
|
# This file contains the detection logic for miscellaneous external dependencies.
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
import functools
|
import functools
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import shlex
|
import shlex
|
||||||
import sysconfig
|
import sysconfig
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from .. import mlog
|
from .. import mlog
|
||||||
from .. import mesonlib
|
from .. import mesonlib
|
||||||
from ..environment import detect_cpu_family
|
from ..environment import detect_cpu_family
|
||||||
|
@ -33,6 +32,50 @@ from .base import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class HDF5Dependency(ExternalDependency):
|
||||||
|
|
||||||
|
def __init__(self, environment, kwargs):
|
||||||
|
language = kwargs.get('language', 'c')
|
||||||
|
super().__init__('hdf5', environment, language, kwargs)
|
||||||
|
kwargs['required'] = False
|
||||||
|
kwargs['silent'] = True
|
||||||
|
self.is_found = False
|
||||||
|
|
||||||
|
pkgconfig_files = ['hdf5']
|
||||||
|
|
||||||
|
if language not in ('c', 'cpp', 'fortran'):
|
||||||
|
raise DependencyException('Language {} is not supported with HDF5.'.format(language))
|
||||||
|
|
||||||
|
for pkg in pkgconfig_files:
|
||||||
|
try:
|
||||||
|
pkgdep = PkgConfigDependency(pkg, environment, kwargs, language=self.language)
|
||||||
|
if pkgdep.found():
|
||||||
|
self.compile_args = pkgdep.get_compile_args()
|
||||||
|
# derive needed libraries by language
|
||||||
|
link_args = pkgdep.get_link_args()
|
||||||
|
lang_link_args = []
|
||||||
|
for larg in link_args:
|
||||||
|
lpath = Path(larg)
|
||||||
|
if lpath.is_file():
|
||||||
|
if language == 'cpp':
|
||||||
|
lang_link_args.append(str(lpath.parent / (lpath.stem + '_hl_cpp' + lpath.suffix)))
|
||||||
|
lang_link_args.append(str(lpath.parent / (lpath.stem + '_cpp' + lpath.suffix)))
|
||||||
|
elif language == 'fortran':
|
||||||
|
lang_link_args.append(str(lpath.parent / (lpath.stem + 'hl_fortran' + lpath.suffix)))
|
||||||
|
lang_link_args.append(str(lpath.parent / (lpath.stem + '_fortran' + lpath.suffix)))
|
||||||
|
|
||||||
|
# C is used by other languages
|
||||||
|
lang_link_args.append(str(lpath.parent / (lpath.stem + '_hl' + lpath.suffix)))
|
||||||
|
lang_link_args.append(larg)
|
||||||
|
|
||||||
|
self.link_args = lang_link_args
|
||||||
|
self.version = pkgdep.get_version()
|
||||||
|
self.is_found = True
|
||||||
|
self.pcdep = pkgdep
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
class MPIDependency(ExternalDependency):
|
class MPIDependency(ExternalDependency):
|
||||||
|
|
||||||
def __init__(self, environment, kwargs):
|
def __init__(self, environment, kwargs):
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "hdf5.h"
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
herr_t ier;
|
||||||
|
unsigned maj, min, rel;
|
||||||
|
|
||||||
|
ier = H5open();
|
||||||
|
if (ier) {
|
||||||
|
fprintf(stderr,"Unable to initialize HDF5: %d\n", ier);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ier = H5get_libversion(&maj, &min, &rel);
|
||||||
|
if (ier) {
|
||||||
|
fprintf(stderr,"HDF5 did not initialize!\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
printf("C HDF5 version %d.%d.%d\n", maj, min, rel);
|
||||||
|
|
||||||
|
ier = H5close();
|
||||||
|
if (ier) {
|
||||||
|
fprintf(stderr,"Unable to close HDF5: %d\n", ier);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include "hdf5.h"
|
||||||
|
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
herr_t ier;
|
||||||
|
unsigned maj, min, rel;
|
||||||
|
|
||||||
|
ier = H5open();
|
||||||
|
if (ier) {
|
||||||
|
std::cerr << "Unable to initialize HDF5: %d" << ier << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ier = H5get_libversion(&maj, &min, &rel);
|
||||||
|
if (ier) {
|
||||||
|
std::cerr << "HDF5 did not initialize!" << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
printf("C++ HDF5 version %d.%d.%d\n", maj, min, rel);
|
||||||
|
|
||||||
|
ier = H5close();
|
||||||
|
if (ier) {
|
||||||
|
std::cerr << "Unable to close HDF5: %d" << ier << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
use hdf5
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
integer :: ier, major, minor, rel
|
||||||
|
|
||||||
|
call h5open_f(ier)
|
||||||
|
if (ier /= 0) error stop 'Unable to initialize HDF5'
|
||||||
|
|
||||||
|
call h5get_libversion_f(major, minor, rel, ier)
|
||||||
|
if (ier /= 0) error stop 'Unable to check HDF5 version'
|
||||||
|
print '(A,I1,A1,I0.2,A1,I1)','Fortran HDF5 version ',major,'.',minor,'.',rel
|
||||||
|
|
||||||
|
call h5close_f(ier)
|
||||||
|
if (ier /= 0) error stop 'Unable to close HDF5 library'
|
||||||
|
|
||||||
|
end program
|
|
@ -0,0 +1,44 @@
|
||||||
|
project('hdf5_test', 'c', 'cpp')
|
||||||
|
|
||||||
|
if build_machine.system() == 'darwin'
|
||||||
|
error('MESON_SKIP_TEST: HDF5 CI image not setup for OSX.')
|
||||||
|
endif
|
||||||
|
|
||||||
|
if build_machine.system() == 'cygwin'
|
||||||
|
error('MESON_SKIP_TEST: HDF5 CI image not setup for Cygwin.')
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
# --- C tests
|
||||||
|
h5c = dependency('hdf5', language : 'c', required : false)
|
||||||
|
if not h5c.found()
|
||||||
|
error('MESON_SKIP_TEST: HDF5 not found, skipping.')
|
||||||
|
endif
|
||||||
|
exec = executable('exec', 'main.c',
|
||||||
|
dependencies : h5c)
|
||||||
|
|
||||||
|
test('HDF5 C', exec)
|
||||||
|
|
||||||
|
# --- C++ tests
|
||||||
|
h5cpp = dependency('hdf5', language : 'cpp')
|
||||||
|
execpp = executable('execpp', 'main.cpp',
|
||||||
|
dependencies : h5cpp)
|
||||||
|
|
||||||
|
test('HDF5 C++', execpp)
|
||||||
|
|
||||||
|
|
||||||
|
# --- Fortran tests
|
||||||
|
if build_machine.system() != 'windows'
|
||||||
|
add_languages('fortran')
|
||||||
|
|
||||||
|
h5f = dependency('hdf5', language : 'fortran')
|
||||||
|
exef = executable('exef', 'main.f90',
|
||||||
|
dependencies : h5f)
|
||||||
|
|
||||||
|
test('HDF5 Fortran', exef)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Check we can apply a version constraint
|
||||||
|
if h5c.version() != 'unknown'
|
||||||
|
dependency('hdf5', version: '>=@0@'.format(h5c.version()))
|
||||||
|
endif
|
Loading…
Reference in New Issue