mirror of
https://github.com/HDFGroup/hdf5.git
synced 2026-09-25 04:09:44 +03:00
1545 lines
73 KiB
Plaintext
1545 lines
73 KiB
Plaintext
************************************************************************
|
||
* Build and Install HDF5 C, C++, Fortran and High-Level Libraries *
|
||
* and tools with CMake *
|
||
************************************************************************
|
||
|
||
Table of Contents
|
||
|
||
Section I: Preconditions
|
||
Section II: RECOMMENDED: Quick Start with CMake Presets
|
||
Section III: Advanced: Building HDF5 Libraries with CMake Script Mode
|
||
Section IV: Advanced: Building HDF5 Libraries with CMake Command Mode
|
||
Section V: Further Considerations
|
||
Section VI: Options for building HDF5 Libraries with CMake Command Line
|
||
Section VII: CMake Option Defaults for HDF5
|
||
Section VIII: User Defined Options for HDF5 Libraries with CMake
|
||
Section IX: User Defined Compile Flags for HDF5 Libraries with CMake
|
||
Section X: Considerations for Cross-Compiling
|
||
Section XI: Creating Custom Preset Configurations
|
||
Section XII: Using the Library
|
||
Section XIII: Using CMake Regex Options for Testing
|
||
Section XIV: Java FFM Testing
|
||
|
||
************************************************************************
|
||
|
||
|
||
========================================================================
|
||
I. Preconditions
|
||
========================================================================
|
||
Obtaining HDF5 source code
|
||
1. Create a directory for your development; for example, "myhdfstuff".
|
||
|
||
2. Obtain HDF5 source from Github
|
||
development branch: https://github.com/HDFGroup/hdf5
|
||
last release: https://github.com/HDFGroup/hdf5/releases/latest
|
||
hdf5-2_"X"_"Y".tar.gz or hdf5-2_"X"_"Y".zip
|
||
|
||
and put it in "myhdfstuff".
|
||
Uncompress the file. There should be a hdf5-2."X"."Y" folder.
|
||
|
||
3. Obtain HDF5 plugin source from Github
|
||
development branch: https://github.com/HDFGroup/hdf5_plugins
|
||
Or let the CMake build process download the plugins for you with
|
||
the following options:
|
||
HDF5_ALLOW_EXTERNAL_SUPPORT:STRING="GIT"(or "TGZ")
|
||
HDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON
|
||
|
||
CMake version
|
||
1. We suggest you obtain the latest CMake from the Kitware web site.
|
||
The HDF5 2."X"."Y" product requires a minimum CMake version 3.26.
|
||
|
||
Note:
|
||
To change the install prefix from the platform defaults initialize
|
||
the CMake variable, CMAKE_INSTALL_PREFIX. Users of build scripts
|
||
will use the INSTALLDIR option.
|
||
|
||
Note:
|
||
See the CMake documentation for more information on setting the
|
||
logging levels:
|
||
https://cmake.org/cmake/help/latest/variable/CMAKE_MESSAGE_LOG_LEVEL.html
|
||
|
||
|
||
========================================================================
|
||
II. RECOMMENDED: Quick Start with CMake Presets
|
||
========================================================================
|
||
|
||
⭐ This is the RECOMMENDED method for building HDF5 2.0 and later.
|
||
|
||
Prerequisites
|
||
-------------
|
||
- CMake 3.26 or later (required for HDF5 2.0)
|
||
- Ninja build system (recommended, should be downloaded if not available)
|
||
- Compiler: GCC, MSVC, or Clang
|
||
|
||
Quick Start (3 steps)
|
||
---------------------
|
||
1. Change to the HDF5 source directory:
|
||
cd /path/to/hdf5-2.x.y
|
||
|
||
2. Execute a workflow preset:
|
||
cmake --workflow --preset ci-StdShar-GNUC --fresh # Linux/Mac with GCC
|
||
cmake --workflow --preset ci-StdShar-MSVC --fresh # Windows with MSVC
|
||
cmake --workflow --preset ci-StdShar-Clang --fresh # Linux/Mac with Clang
|
||
|
||
3. Find your build artifacts in:
|
||
../build/ci-StdShar-<compiler>/
|
||
|
||
That's it! The workflow preset automatically:
|
||
- Configures the build
|
||
- Compiles libraries and tools
|
||
- Runs tests
|
||
- Creates installation packages
|
||
|
||
Available Presets
|
||
-----------------
|
||
View all available presets:
|
||
cmake --list-presets
|
||
|
||
Common presets:
|
||
Standard Builds:
|
||
ci-StdShar-GNUC Standard shared libraries (GCC)
|
||
ci-StdShar-MSVC Standard shared libraries (MSVC)
|
||
ci-StdShar-Clang Standard shared libraries (Clang)
|
||
ci-MinShar-GNUC Minimal shared libraries (GCC)
|
||
|
||
Java Builds:
|
||
ci-StdShar-GNUC-Java-FFM Java FFM bindings (GCC)
|
||
ci-StdShar-GNUC-Java-JNI Java JNI bindings (GCC)
|
||
|
||
Maven Deployment (JNI default - Java 8+):
|
||
ci-MinShar-GNUC-Maven-Snapshot JNI snapshots for Maven
|
||
ci-MinShar-GNUC-Maven JNI release for Maven
|
||
|
||
Maven Deployment (FFM optional - Java 25+):
|
||
ci-MinShar-GNUC-Maven-FFM-Snapshot FFM snapshots for Maven
|
||
ci-MinShar-GNUC-Maven-FFM FFM release for Maven
|
||
|
||
Note: For ROS3 (S3 support), add -DHDF5_ENABLE_ROS3_VFD=ON to any preset
|
||
|
||
See Section XI for creating custom preset configurations.
|
||
|
||
Why Use Presets?
|
||
----------------
|
||
✅ Simpler - No external files to download
|
||
✅ Faster - Optimized settings included
|
||
✅ Consistent - Same settings across platforms
|
||
✅ Modern - CMake 3.26 best practices
|
||
✅ Flexible - Easy to customize via CMakeUserPresets.json
|
||
|
||
Individual Preset Commands (Advanced)
|
||
--------------------------------------
|
||
If you prefer to run preset steps individually (where <compiler-type> is GNUC, MSVC, or Clang):
|
||
|
||
cd /path/to/hdf5-source
|
||
cmake --preset ci-StdShar-<compiler-type> # Configure
|
||
cmake --build --preset ci-StdShar-<compiler-type> # Build
|
||
ctest --preset ci-StdShar-<compiler-type> # Test
|
||
cpack --preset ci-StdShar-<compiler-type> # Package
|
||
|
||
The workflow preset (shown in Quick Start above) runs all these steps automatically.
|
||
|
||
Advanced Build Methods
|
||
---------------------
|
||
If you cannot use presets or need more control, see:
|
||
- Section III: Building with CMake Script Mode (requires external files, for automation/CI)
|
||
- Section IV: Building with CMake Command Mode (manual configuration, for advanced users)
|
||
|
||
|
||
========================================================================
|
||
III. Advanced: Building HDF5 Libraries with CMake Script Mode
|
||
========================================================================
|
||
|
||
NOTE: Most users should use Section II (CMake Presets) instead.
|
||
This method is provided for advanced users and automated builds.
|
||
|
||
This short set of instructions is written for users who want to quickly
|
||
build the HDF5 C, C++ and Fortran shared libraries and tools
|
||
from the HDF5 source code package using the CMake tools. This procedure
|
||
will use the default settings in the config/cmake/cacheinit.cmake file.
|
||
The HDF Group recommends using the presets process to build HDF5.
|
||
|
||
NOTE: When using the presets process, the CMakePresets.json file in the source
|
||
directory will configure, build, test, and package HDF5 with the same options
|
||
that are set in the cacheinit.cmake file.
|
||
In addition, it will get the optional files listed below that are needed, from
|
||
the appropriate repositories.
|
||
See Section II: RECOMMENDED Quick Start with CMake Presets
|
||
|
||
-------------------------------------------------------------------------
|
||
-------------------------------------------------------------------------
|
||
Individual files needed as mentioned in this document
|
||
-------------------------------------------------------------------------
|
||
Download from https://github.com/HDFGroup/hdf5/blob/develop/config/cmake/scripts:
|
||
CTestScript.cmake -- CMake build script
|
||
|
||
HDF5config.cmake -- CMake configuration script
|
||
HDF5options.cmake -- CMake configuration options script
|
||
|
||
External compression plugin libraries from https://github.com/HDFGroup/hdf5_plugins:
|
||
hdf5_plugins.tar.gz
|
||
|
||
External compression szip and zlib libraries:
|
||
ZLIB "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz"
|
||
ZLIBNG "https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.2.4.tar.gz"
|
||
LIBAEC "https://github.com/MathisRosenhauer/libaec/releases/download/v1.1.3/libaec-1.1.3.tar.gz"
|
||
-------------------------------------------------------------------------
|
||
-------------------------------------------------------------------------
|
||
|
||
Build scripts for windows or linux
|
||
-----------------------------------------------
|
||
|
||
To build HDF5 with the SZIP and ZLIB external libraries you will need to:
|
||
|
||
1. Change to the development directory "myhdfstuff".
|
||
|
||
2. Download/copy the individual files mentioned above to "myhdfstuff".
|
||
Do not uncompress the tar.gz files.
|
||
|
||
3. Change to the source directory "hdf5-2.x.y".
|
||
CTestScript.cmake file should not be modified.
|
||
|
||
4. Edit the platform configuration file, HDF5options.cmake, if you want to change
|
||
the default build environment. The file is a compilation of the most used
|
||
options and by commenting/uncommenting lines the options can easily be changed.
|
||
|
||
5. From the "myhdfstuff" directory execute the CTest Script with the
|
||
following options:
|
||
|
||
On 32-bit Windows with Visual Studio 2022, execute:
|
||
ctest -S HDF5config.cmake,BUILD_GENERATOR=VS2022 -C Release -VV -O hdf5.log
|
||
On 64-bit Windows with Visual Studio 2022, execute:
|
||
ctest -S HDF5config.cmake,BUILD_GENERATOR=VS202264 -C Release -VV -O hdf5.log
|
||
On 32-bit Windows with Visual Studio 2019, execute:
|
||
ctest -S HDF5config.cmake,BUILD_GENERATOR=VS2019 -C Release -VV -O hdf5.log
|
||
On 64-bit Windows with Visual Studio 2019, execute:
|
||
ctest -S HDF5config.cmake,BUILD_GENERATOR=VS201964 -C Release -VV -O hdf5.log
|
||
On 32-bit Windows with Visual Studio 2017, execute:
|
||
ctest -S HDF5config.cmake,BUILD_GENERATOR=VS2017 -C Release -VV -O hdf5.log
|
||
On 64-bit Windows with Visual Studio 2017, execute:
|
||
ctest -S HDF5config.cmake,BUILD_GENERATOR=VS201764 -C Release -VV -O hdf5.log
|
||
On Linux and Mac, execute:
|
||
ctest -S HDF5config.cmake,BUILD_GENERATOR=Unix -C Release -VV -O hdf5.log
|
||
The supplied build scripts are versions of the above.
|
||
|
||
The command above will configure, build, test, and create an install
|
||
package in the myhdfstuff folder. It will have the format:
|
||
HDF5-2.X.Y-<platform>.<zip or tar.gz>
|
||
|
||
On Unix, <platform> will be "Linux". A similar .sh file will also be created.
|
||
On Windows, <platform> will be "win64" or "win32". If you have an
|
||
installer on your system, you will also see a similar file that ends
|
||
in either .exe (NSIS) or .msi (WiX).
|
||
|
||
Notes on the command line options.
|
||
The -S option uses the script version of ctest.
|
||
|
||
The value for the -C option (as shown above, "-C Release") must
|
||
match the setting for CTEST_CONFIGURATION_TYPE in the platform
|
||
configuration file.
|
||
|
||
The -VV option is for most verbose; use -V for less verbose.
|
||
|
||
The "-O hdf5.log" option saves the output to a log file hdf5.log.
|
||
|
||
6. To install, "X" is the current release version
|
||
|
||
On Windows (with WiX installed), execute:
|
||
HDF5-2."X"."Y"-win32.msi or HDF5-2."X"."Y"-win64.msi
|
||
By default this program will install the hdf5 library into the
|
||
"C:\Program Files" directory and will create the following
|
||
directory structure:
|
||
HDF_Group
|
||
--HDF5
|
||
----2."X"."Y"
|
||
------bin
|
||
------include
|
||
------lib
|
||
--------plugin
|
||
------cmake
|
||
|
||
On Linux, change to the install destination directory
|
||
(create it if doesn't exist) and execute:
|
||
<path-to>/myhdfstuff/HDF5-2."X"."Y"-Linux.sh
|
||
After accepting the license, the script will prompt:
|
||
By default the HDF5 will be installed in:
|
||
"<current directory>/HDF5-2."X"."Y"-Linux"
|
||
Do you want to include the subdirectory HDF5-2."X"."Y"-Linux?
|
||
Saying no will install in: "<current directory>" [Yn]:
|
||
Note that the script will create the following directory structure
|
||
relative to the install point:
|
||
HDF_Group
|
||
--HDF5
|
||
----2."X"."Y"
|
||
------bin
|
||
------include
|
||
------lib
|
||
--------plugin
|
||
------share
|
||
|
||
On Mac you will find HDF5-2."X"."Y"-Darwin.dmg in the myhdfstuff folder. Click
|
||
on the dmg file to proceed with installation. After accepting the license,
|
||
there will be a folder with the following structure:
|
||
HDF_Group
|
||
--HDF5
|
||
----2."X"."Y"
|
||
------bin
|
||
------include
|
||
------lib
|
||
--------plugin
|
||
------share
|
||
|
||
By default the installation will create the bin, include, lib and cmake
|
||
folders in the <install destination directory>/HDF_Group/HDF5/2."X"."Y"
|
||
The <install destination directory> depends on the build platform;
|
||
Windows will set the default to:
|
||
C:/Program Files/HDF_Group/HDF5/2."X"."Y"
|
||
Linux will set the default to:
|
||
"myhdfstuff/HDF_Group/HDF5/2."X"."Y"
|
||
The default can be changed by adding ",INSTALLDIR=<my new dir>" to the
|
||
"ctest -S HDF5config.cmake..." command. For example on linux:
|
||
ctest -S HDF5config.cmake,INSTALLDIR=/usr/local/myhdf5,BUILD_GENERATOR=Unix -C Release -VV -O hdf5.log
|
||
|
||
|
||
========================================================================
|
||
IV. Advanced: Building HDF5 Libraries with CMake Command Mode
|
||
========================================================================
|
||
|
||
NOTE: Most users should use Section II (CMake Presets) instead.
|
||
This method is provided for advanced users who need manual control.
|
||
|
||
Notes: This short set of instructions is written for users who want to
|
||
quickly build just the HDF5 C static library and tools from
|
||
the HDF5 source code package using the CMake command line tools.
|
||
Avoid the use of drive letters in paths on Windows.
|
||
|
||
Go through these steps:
|
||
|
||
1. Change to the development directory "myhdfstuff".
|
||
|
||
2. Uncompress the HDF5 source file
|
||
|
||
3. Create a folder "build" in the "myhdfstuff" directory.
|
||
|
||
4. Change into the "build" folder.
|
||
|
||
5. Configure the C library, tools and tests with one of the following commands:
|
||
|
||
On Windows 32 bit
|
||
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ..\hdf5-2."X"."Y"
|
||
|
||
On Windows 64 bit
|
||
cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ..\hdf5-2."X"."Y"
|
||
|
||
On Linux and Mac
|
||
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ../hdf5-2."X"."Y"
|
||
|
||
where "X" is the current release version.
|
||
|
||
6. Build the C library, tools and tests with this command:
|
||
cmake --build . --config Release
|
||
|
||
7. Test the C library and tools with this command:
|
||
ctest . -C Release
|
||
|
||
8. Create an install image with this command:
|
||
cpack -C Release CPackConfig.cmake
|
||
|
||
9. To install
|
||
On Windows (with WiX installed), execute:
|
||
HDF5-2."X"."Y"-win32.msi or HDF5-2."X"."Y"-win64.msi
|
||
By default this program will install the hdf5 library into the
|
||
"C:\Program Files" directory and will create the following
|
||
directory structure:
|
||
HDF_Group
|
||
--HDF5
|
||
----2."X"."Y"
|
||
------bin
|
||
------include
|
||
------lib
|
||
--------plugin
|
||
------cmake
|
||
|
||
On Linux, change to the install destination directory
|
||
(create if doesn't exist) and execute:
|
||
<path-to>/myhdfstuff/build/HDF5-2."X"."Y"-Linux.sh
|
||
After accepting the license, the script will prompt:
|
||
By default the HDF5 will be installed in:
|
||
"<current directory>/HDF5-2."X"."Y"-Linux"
|
||
Do you want to include the subdirectory HDF5-2."X"."Y"-Linux?
|
||
Saying no will install in: "<current directory>" [Yn]:
|
||
Note that the script will create the following directory structure
|
||
relative to the install point:
|
||
HDF_Group
|
||
--HDF5
|
||
----2."X"."Y"
|
||
------bin
|
||
------include
|
||
------lib
|
||
--------plugin
|
||
------share
|
||
|
||
On Mac you will find HDF5-2."X"."Y"-Darwin.dmg in the build folder. Click
|
||
on the dmg file to proceed with installation. After accepting the license,
|
||
there will be a folder with the following structure:
|
||
HDF_Group
|
||
--HDF5
|
||
----2."X"."Y"
|
||
------bin
|
||
------include
|
||
------lib
|
||
--------plugin
|
||
------share
|
||
|
||
|
||
========================================================================
|
||
V. Further Considerations
|
||
========================================================================
|
||
|
||
1. We suggest you obtain the latest CMake from the Kitware
|
||
web site. The HDF5 2."X"."Y" product requires a minimum CMake version 3.26.
|
||
|
||
2. If you plan to use Zlib or Szip (aka libaec):
|
||
A. Download the binary packages and install them in a central location.
|
||
For example on Windows, create a folder extlibs and install the
|
||
packages there. Add the following CMake options:
|
||
-DZLIB_LIBRARY:FILEPATH=some_location/lib/zlib.lib
|
||
-DZLIB_INCLUDE_DIR:PATH=some_location/include
|
||
-DZLIB_USE_EXTERNAL:BOOL=OFF
|
||
-DSZIP_LIBRARY:FILEPATH=some_location/lib/libszaec.lib
|
||
-DSZIP_INCLUDE_DIR:PATH=some_location/include
|
||
-Dlibaec_LIBRARY:FILEPATH=some_location/lib/libaec.lib
|
||
-Dlibaec_INCLUDE_DIR:PATH=some_location/include
|
||
-DSZIP_USE_EXTERNAL:BOOL=OFF
|
||
where "some_location" is the full path to the extlibs folder.
|
||
Also if the appropriate environment variable is set, the above options are not required;
|
||
set(ENV{ZLIB_ROOT} "some_location")
|
||
set(ENV{SZIP_ROOT} "some_location")
|
||
set(ENV{libaec_ROOT} "some_location")
|
||
|
||
Note that if there is a problem finding the libraries, try adding the
|
||
CMake variable CMAKE_FIND_DEBUG_MODE:BOOL=ON to the command line.
|
||
|
||
B. Use source packages from an GIT server by adding the following CMake
|
||
options:
|
||
HDF5_ALLOW_EXTERNAL_SUPPORT:STRING="GIT"
|
||
ZLIB_GIT_URL:STRING="https://some_location/zlib" or ZLIBNG_GIT_URL:STRING="https://some_location/zlibng"
|
||
ZLIB_GIT_BRANCH="some_branch" or ZLIBNG_GIT_BRANCH="some_branch"
|
||
SZIP_GIT_URL:STRING="https://some_location/szip"
|
||
SZIP_GIT_BRANCH="some_branch"
|
||
LIBAEC_GIT_URL:STRING="https://some_location/libaec"
|
||
LIBAEC_GIT_BRANCH="some_branch"
|
||
where "some_location" is the URL to the GIT repository and "some_branch" is
|
||
a branch in the repository, usually the default. Also set
|
||
CMAKE_BUILD_TYPE to the configuration type.
|
||
|
||
C. Use source packages from a compressed file by adding the following
|
||
CMake options:
|
||
HDF5_ALLOW_EXTERNAL_SUPPORT:STRING="TGZ"
|
||
ZLIB_TGZ_NAME:STRING="zlib_src.ext" or ZLIBNG_TGZ_NAME:STRING="zlibng_src.ext"
|
||
LIBAEC_TGZ_NAME:STRING="libaec_src.ext"
|
||
TGZPATH:STRING="some_location"
|
||
where "some_location" is the URL or full path to the compressed
|
||
file and ext is the type of compression file. Also set CMAKE_BUILD_TYPE
|
||
to the configuration type during configuration. See the settings in the
|
||
config/cmake/cacheinit.cmake file HDF uses for testing.
|
||
|
||
D. Use original source packages from a compressed file by adding the following
|
||
CMake options:
|
||
LIBAEC_TGZ_NAME:STRING="szip_src.ext"
|
||
LIBAEC_TGZ_ORIGPATH:STRING="some_location"
|
||
|
||
ZLIB_TGZ_NAME:STRING="zlib_src.ext" or ZLIBNG_TGZ_NAME:STRING="zlibng_src.ext"
|
||
ZLIB_TGZ_ORIGPATH:STRING="some_location" or ZLIBNG_TGZ_ORIGPATH:STRING="some_location"
|
||
|
||
HDF5_ALLOW_EXTERNAL_SUPPORT:STRING="TGZ"
|
||
where "some_location" is the URL and by setting
|
||
ZLIB_USE_LOCALCONTENT:BOOL=OFF
|
||
LIBAEC_USE_LOCALCONTENT:BOOL=OFF
|
||
or full path to the compressed file and ext is the type of compression file.
|
||
Also set CMAKE_BUILD_TYPE to the configuration type during configuration.
|
||
See the settings in the config/cmake/cacheinit.cmake file HDF uses for testing.
|
||
|
||
The files can also be retrieved from a local path if necessary
|
||
TGZPATH:STRING="some_location"
|
||
by setting
|
||
ZLIB_USE_LOCALCONTENT:BOOL=ON
|
||
LIBAEC_USE_LOCALCONTENT:BOOL=ON
|
||
|
||
3. If you plan to use compression plugins:
|
||
A. Use source packages from an GIT server by adding the following CMake
|
||
options:
|
||
HDF5_ALLOW_EXTERNAL_SUPPORT:STRING="GIT"
|
||
PLUGIN_GIT_URL:STRING="http://some_location/plugins"
|
||
PLUGIN_GIT_BRANCH="some_branch"
|
||
where "some_location" is the URL to the GIT repository and "some_branch" is
|
||
a branch in the repository, usually the default. Also set
|
||
CMAKE_BUILD_TYPE to the configuration type.
|
||
|
||
B. Use source packages from a compressed file by adding the following
|
||
CMake options:
|
||
HDF5_ALLOW_EXTERNAL_SUPPORT:STRING="TGZ"
|
||
PLUGIN_TGZ_NAME:STRING="plugin_src.ext"
|
||
TGZPATH:STRING="some_location"
|
||
where "some_location" is the URL or full path to the compressed
|
||
file and ext is the type of compression file. Also set CMAKE_BUILD_TYPE
|
||
to the configuration type during configuration. See the settings in the
|
||
config/cmake/cacheinit.cmake file HDF uses for testing.
|
||
|
||
4. If you are building on Apple Darwin platforms, you should add the
|
||
following options:
|
||
Compiler choice - use xcode by setting the ENV variables of CC and CXX
|
||
Shared fortran is not supported, build static:
|
||
BUILD_SHARED_LIBS:BOOL=OFF
|
||
Additional options:
|
||
CMAKE_ANSI_CFLAGS:STRING=-fPIC
|
||
CTEST_USE_LAUNCHERS:BOOL=ON
|
||
|
||
5. Windows developers should install NSIS or WiX to create an install image with CPack.
|
||
Visual Studio Express users will not be able to package HDF5 into
|
||
an install image executable.
|
||
|
||
6. Developers can copy the config/cmake/cacheinit.cmake file and alter the
|
||
the settings for the developers' environment. Then the only options needed
|
||
on the command line are those options that are different. Example using HDF
|
||
default cache file:
|
||
cmake -C ../config/cmake/cacheinit.cmake -G "Visual Studio 16 2019" \
|
||
-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF \
|
||
-DCMAKE_BUILD_TYPE:STRING=Release ..
|
||
|
||
7. CMake uses a toolchain of utilities to compile, link libraries and
|
||
create archives, and other tasks to drive the build. The toolchain
|
||
utilities available are determined by the languages enabled. In normal
|
||
builds, CMake automatically determines the toolchain for host builds
|
||
based on system introspection and defaults. In cross-compiling
|
||
scenarios, a toolchain file may be specified with information about
|
||
compiler and utility paths.
|
||
Variables and Properties
|
||
Several variables relate to the language components of a toolchain which
|
||
are enabled. CMAKE_<LANG>_COMPILER is the full path to the compiler used
|
||
for <LANG>. CMAKE_<LANG>_COMPILER_ID is the identifier used by CMake for
|
||
the compiler and CMAKE_<LANG>_COMPILER_VERSION is the version of the compiler.
|
||
|
||
The CMAKE_<LANG>_FLAGS variables and the configuration-specific equivalents
|
||
contain flags that will be added to the compile command when compiling a
|
||
file of a particular language.
|
||
|
||
As the linker is invoked by the compiler driver, CMake needs a way to
|
||
determine which compiler to use to invoke the linker. This is calculated
|
||
by the LANGUAGE of source files in the target, and in the case of static
|
||
libraries, the language of the dependent libraries. The choice CMake makes
|
||
may be overridden with the LINKER_LANGUAGE target property.
|
||
|
||
See the CMake help for more information on using toolchain files.
|
||
|
||
To use a toolchain file with the supplied cmake scripts, see the
|
||
HDF5options.cmake file under the toolchain section.
|
||
|
||
Notes: CMake and HDF5
|
||
|
||
1. CMake support for HDF5 development should be usable on any
|
||
system where CMake is supported. Please send us any comments on
|
||
how CMake support can be improved on any system. Visit the
|
||
Kitware site for more information about CMake.
|
||
|
||
2. Build and test results can be submitted to our HDF5 CDash server:
|
||
The CDash server for community submissions of hdf5 is at
|
||
https://my.cdash.org.
|
||
|
||
We ask that all submissions include the configuration information and
|
||
contact information in the CTest Notes Files upload step. See the
|
||
current reports on CDash for examples.
|
||
|
||
Please follow the convention that "NIGHTLY" submissions maintain the same
|
||
configuration every time. "EXPERIMENTAL" submissions can be expected to
|
||
be different for each submission.
|
||
|
||
3. See the appendix at the bottom of this file for examples of using
|
||
a ctest script for building and testing. Using a ctest script is
|
||
preferred because of its flexibility.
|
||
|
||
Notes: CMake in General
|
||
|
||
1. More information about using CMake can be found at the Kitware site at
|
||
www.cmake.org.
|
||
|
||
2. CMake uses the command line; however, the visual CMake tool is
|
||
available for the configuration step. The steps are similar for
|
||
all the operating systems supported by CMake.
|
||
|
||
3. Setting the installation location from the command line at configure time
|
||
a. Using the --install-prefix command line option, which is available since
|
||
CMake version 3.21:
|
||
cmake --install-prefix /my/folder/to/install/to ..
|
||
b. Using -DCMAKE_INSTALL_PREFIX :
|
||
cmake -DCMAKE_INSTALL_PREFIX=/my/folder/to/install/to ..
|
||
c. Using the CMAKE_INSTALL_PREFIX environment variable, which is available
|
||
since CMake version 3.29:
|
||
CMAKE_INSTALL_PREFIX=/my/folder/to/install/to cmake ..
|
||
|
||
========================================================================
|
||
VI. Options for Building HDF5 Libraries with CMake Command Line
|
||
========================================================================
|
||
|
||
To build the HDF5 Libraries with CMake, go through these five steps:
|
||
|
||
1. Run CMake
|
||
2. Configure the cache settings
|
||
3. Build HDF5
|
||
4. Test HDF5
|
||
5. Package HDF5 (create install image)
|
||
|
||
These five steps are described in detail below.
|
||
|
||
========================================================================
|
||
|
||
1. Run CMake
|
||
|
||
The visual CMake executable is named "cmake-gui.exe" on Windows and should be
|
||
available in your Start menu. For Linux, UNIX, and Mac users the
|
||
executable is named "cmake-gui" and can be found where CMake was
|
||
installed.
|
||
Another option is to use the presets file, CMakePresets.json, to configure,
|
||
build, test, and package HDF5. See section XI: Creating Custom Preset Configurations for
|
||
compiling for use of that file. You can create a CMakeUserPresets.json file to create a
|
||
specific configuration for your environment. Note that Visual Studio and XCode can
|
||
use the presets files.
|
||
|
||
Specify the source and build directories.
|
||
|
||
***** Make the build and source directories different. ******
|
||
|
||
For example on Windows, if the source is at c:\MyHDFstuff\hdf5,
|
||
then use c:\MyHDFstuff\hdf5\build or c:\MyHDFstuff\build\hdf5 as the
|
||
build directory.
|
||
|
||
RECOMMENDED:
|
||
Users can perform the configuration step without using the visual
|
||
cmake-gui program. We use the file cacheinit.cmake in the
|
||
config/cmake source folder for our testing. This file enables all of the
|
||
basic options and we turn specific options on or off for testing
|
||
using the following command line within the build directory:
|
||
|
||
cmake -C <sourcepath>/config/cmake/cacheinit.cmake -G "<generator>" [-D<options>] <sourcepath>
|
||
|
||
Where <generator> is (examples):
|
||
* MinGW Makefiles
|
||
* NMake Makefiles
|
||
* Unix Makefiles
|
||
* Ninja
|
||
* Visual Studio 15 2017
|
||
* Visual Studio 15 2017 Win64
|
||
* Visual Studio 16 2019
|
||
* Visual Studio 17 2022
|
||
|
||
<options> is:
|
||
For installed SZIP/libaec:
|
||
* SZIP_INCLUDE_DIR:PATH=<path to szip includes directory>
|
||
* SZIP_LIBRARY:FILEPATH=<path to szip/library file>
|
||
* libaec_INCLUDE_DIR:PATH=<path to libaec includes directory>
|
||
* libaec_LIBRARY:FILEPATH=<path to libaec/library file>
|
||
or
|
||
* SZIP_ROOT:PATH=<path to szip root directory>
|
||
* libaec_ROOT:PATH=<path to libaec root directory>
|
||
For installed ZLIB/ZLIBNG:
|
||
* ZLIB_INCLUDE_DIR:PATH=<path to zlib includes directory>
|
||
* ZLIB_LIBRARY:FILEPATH=<path to zlib/library file>
|
||
or
|
||
* ZLIB_ROOT:PATH=<path to zlib root directory>
|
||
|
||
* <HDF5OPTION>:BOOL=[ON | OFF]
|
||
|
||
<cacheinit.cmake> highlights are:
|
||
# This is the CMakeCache file used by HDF Group for daily tests.
|
||
set (CMAKE_INSTALL_FRAMEWORK_PREFIX "Library/Frameworks" CACHE STRING "Frameworks installation directory" FORCE)
|
||
set (HDF_PACKAGE_NAMESPACE "hdf5::" CACHE STRING "Name for HDF package namespace (can be empty)" FORCE)
|
||
set (HDF5_BUILD_CPP_LIB ON CACHE BOOL "Build C++ support" FORCE)
|
||
set (HDF5_BUILD_FORTRAN ON CACHE BOOL "Build FORTRAN support" FORCE)
|
||
set (HDF5_BUILD_JAVA ON CACHE BOOL "Build JAVA support" FORCE)
|
||
set (HDF5_ENABLE_ALL_WARNINGS ON CACHE BOOL "Enable all warnings" FORCE)
|
||
set (HDF5_ALLOW_EXTERNAL_SUPPORT "TGZ" CACHE STRING "Allow External Library Building (NO GIT TGZ)" FORCE)
|
||
########################
|
||
# compression options
|
||
########################
|
||
set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE)
|
||
set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE)
|
||
set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3.1" CACHE STRING "Use ZLIB from original location" FORCE)
|
||
set (ZLIB_USE_LOCALCONTENT ON CACHE BOOL "Use local file for ZLIB FetchContent" FORCE)
|
||
set (ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE)
|
||
set (ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE)
|
||
set (HDF5_USE_ZLIB_NG OFF CACHE BOOL "Use zlib-ng library as zlib library" FORCE)
|
||
set (ZLIBNG_PACKAGE_NAME "zlib-ng" CACHE STRING "Name of ZLIBNG package" FORCE)
|
||
set (ZLIBNG_TGZ_NAME "2.2.4.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE)
|
||
set (ZLIBNG_TGZ_ORIGPATH "https://github.com/zlib-ng/zlib-ng/archive/refs/tags" CACHE STRING "Use ZLIBNG from original location" FORCE)
|
||
set (ZLIBNG_GIT_URL "https://github.com/zlib-ng/zlib-ng.git" CACHE STRING "Use ZLIBNG from GitHub repository" FORCE)
|
||
set (ZLIBNG_GIT_BRANCH "develop" CACHE STRING "" FORCE)
|
||
set (LIBAEC_PACKAGE_NAME "libaec" CACHE STRING "Name of AEC SZIP package" FORCE)
|
||
set (LIBAEC_TGZ_NAME "libaec-1.1.3.tar.gz" CACHE STRING "Use SZip AEC from compressed file" FORCE)
|
||
set (LIBAEC_TGZ_ORIGPATH "https://github.com/MathisRosenhauer/libaec/releases/download/v1.1.3" CACHE STRING "Use LIBAEC from original location" FORCE)
|
||
set (LIBAEC_USE_LOCALCONTENT ON CACHE BOOL "Use local file for LIBAEC FetchContent" FORCE)
|
||
set (LIBAEC_GIT_URL "https://github.com/MathisRosenhauer/libaec.git" CACHE STRING "Use LIBAEC from GitHub repository" FORCE)
|
||
set (LIBAEC_GIT_BRANCH "v1.1.3" CACHE STRING "" FORCE)
|
||
########################
|
||
# filter plugin options
|
||
########################
|
||
set (PLUGIN_TGZ_ORIGPATH "https://github.com/HDFGroup/hdf5_plugins/releases/download/snapshot" CACHE STRING "Use PLUGINS from original location" FORCE)
|
||
set (PLUGIN_TGZ_NAME "hdf5_plugins-master.tar.gz" CACHE STRING "Use PLUGINS from compressed file" FORCE)
|
||
set (PLUGIN_USE_LOCALCONTENT ON CACHE BOOL "Use local file for PLUGIN FetchContent" FORCE)
|
||
set (PLUGIN_PACKAGE_NAME "pl" CACHE STRING "Name of PLUGIN package" FORCE)
|
||
set (PLUGIN_GIT_URL "https://github.com/HDFGroup/hdf5_plugins.git" CACHE STRING "Use plugins from HDF Group repository" FORCE)
|
||
set (PLUGIN_GIT_BRANCH "master" CACHE STRING "" FORCE)
|
||
|
||
2. Configure the cache settings
|
||
|
||
2.1 Visual CMake users, click the Configure button. If this is the first time you are
|
||
running cmake-gui in this directory, you will be prompted for the
|
||
generator you wish to use (for example on Windows, Visual Studio 14).
|
||
CMake will read in the CMakeLists.txt files from the source directory and
|
||
display options for the HDF5 project. After the first configure you
|
||
can adjust the cache settings and/or specify the locations of other programs.
|
||
|
||
Any conflicts or new values will be highlighted by the configure
|
||
process in red. Once you are happy with all the settings and there are no
|
||
more values in red, click the Generate button to produce the appropriate
|
||
build files.
|
||
|
||
On Windows, if you are using a Visual Studio generator, the solution and
|
||
project files will be created in the build folder.
|
||
|
||
On linux, if you are using the Unix Makefiles generator, the Makefiles will
|
||
be created in the build folder.
|
||
|
||
2.2 Preferred command line example on Windows in c:\MyHDFstuff\hdf5\build directory:
|
||
|
||
cmake -C ../config/cmake/cacheinit.cmake -G "Visual Studio 16 2019" "-Ax64" \
|
||
-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF \
|
||
-DCMAKE_BUILD_TYPE:STRING=Release ..
|
||
|
||
2.3 On Windows, if you are using a Visual Studio Express version you must
|
||
be sure that the following two options are correctly set/unset:
|
||
|
||
HDF5_NO_PACKAGES:BOOL=ON
|
||
HDF5_USE_FOLDERS:BOOL=OFF
|
||
|
||
3. Build HDF5
|
||
|
||
On Windows, you can build HDF5 using either the Visual Studio Environment
|
||
or the command line. The command line can be used on all platforms;
|
||
Windows, linux, Unix, and Mac.
|
||
|
||
To build from the command line, navigate to your build directory and
|
||
execute the following:
|
||
|
||
cmake --build . --config {Debug | Release}
|
||
|
||
NOTE: "--config {Debug | Release}" may be optional on your platform. We
|
||
recommend choosing either Debug or Release on Windows.
|
||
|
||
3.1 If you wish to use the Visual Studio environment, open the solution
|
||
file in your build directory. Be sure to select either Debug or
|
||
Release and build the solution.
|
||
|
||
3.2.1 The external libraries (zlib, szip and plugins) can be configured
|
||
to allow building the libraries by downloading from a GIT repository.
|
||
The option is 'HDF5_ALLOW_EXTERNAL_SUPPORT'; by adding the following
|
||
configuration option:
|
||
-DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING="GIT"
|
||
|
||
The options to control the GIT parameters (config/cmake/cacheinit.cmake file) are:
|
||
ZLIB_GIT_URL:STRING="https://${git_url}/zlib"
|
||
ZLIB_GIT_BRANCH="${git_branch}"
|
||
SZIP_GIT_URL:STRING="https://${git_url}/szip"
|
||
SZIP_GIT_BRANCH="${git_branch}"
|
||
LIBAEC_GIT_URL:STRING="https://${git_url}/libaec"
|
||
LIBAEC_GIT_BRANCH="${git_branch}"
|
||
PLUGIN_GIT_URL:STRING="https://${git_url}/plugin"
|
||
PLUGIN_GIT_BRANCH="${git_branch}"
|
||
${git_url} should be changed to your location and ${git_branch} is
|
||
your branch in the repository. Also define CMAKE_BUILD_TYPE
|
||
to be the configuration type.
|
||
|
||
3.2.2 Or the external libraries (zlib, szip and plugins) can be configured
|
||
to allow building the libraries by using a compressed file.
|
||
The option is 'HDF5_ALLOW_EXTERNAL_SUPPORT' and is enabled by
|
||
adding the following configuration option:
|
||
-DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING="TGZ"
|
||
|
||
The options to control the TGZ URL (config/cmake/cacheinit.cmake
|
||
file) are:
|
||
ZLIB_TGZ_NAME:STRING="zlib_src.ext"
|
||
LIBAEC_TGZ_NAME:STRING="libaec_src.ext"
|
||
PLUGIN_TGZ_NAME:STRING="plugin_src.ext"
|
||
TGZPATH:STRING="some_location"
|
||
where "some_location/xxxx_src.ext" is the URL or full path to
|
||
the compressed file and where ext is the type of the compression
|
||
file such as .bz2, .tar, .tar.gz, .tgz, or .zip. Also define
|
||
CMAKE_BUILD_TYPE to be the configuration type.
|
||
|
||
NOTE: the file named by LIBAEC_TGZ_NAME is used to build SZIP.
|
||
|
||
4. Test HDF5
|
||
|
||
To test the build, navigate to your build directory and execute:
|
||
|
||
ctest . -C {Debug | Release}
|
||
|
||
NOTE: "-C {Debug | Release}" may be optional on your platform. We
|
||
recommend choosing either Debug or Release to match the build
|
||
step on Windows.
|
||
|
||
5. Packaging HDF5 (create an install image)
|
||
|
||
To package the build into a simple installer using WiX toolset or the NullSoft installer NSIS
|
||
on Windows, or into compressed files (.tar.gz, .sh, .zip), use the CPack tool.
|
||
|
||
To package the build, navigate to your build directory and execute;
|
||
|
||
cpack -C {Debug | Release} CPackConfig.cmake
|
||
|
||
NOTE: See note 8 of this document for NSIS information.
|
||
See note 9 of this document for WiX information.
|
||
Also, if you are using a Visual Studio Express version or
|
||
want to disable the packaging components, set HDF5_NO_PACKAGES
|
||
to ON (on the command line add -DHDF5_NO_PACKAGES:BOOL=ON)
|
||
|
||
6. The files that support building HDF5 with CMake are all the files in the
|
||
config/cmake folder, the CMakeLists.txt files in each source folder, and
|
||
CTestConfig.cmake. CTestConfig.cmake is specific to the internal testing
|
||
performed by The HDF Group. It should be altered for the user's
|
||
installation and needs. The cacheinit.cmake file settings are used by
|
||
The HDF Group for daily testing. It should be altered/ignored for the user's
|
||
installation and needs.
|
||
|
||
7. More information about using CMake can be found at the Kitware site,
|
||
www.cmake.org.
|
||
|
||
8. Nullsoft Scriptable Install System
|
||
The Nullsoft Scriptable Install System (NSIS) is an open source installation
|
||
system. It was created by the WinAmp authors to distribute that application,
|
||
but it is now a general-purpose system which anyone might use. NSIS installers
|
||
recognize /S for silent installation and /D=dir to specify the
|
||
"output directory", which is where the program will be installed. These
|
||
options are case-sensitive, so be sure to type them in upper case.
|
||
|
||
9. WiX Toolset
|
||
WiX--the Windows Installer XML toolset--lets developers create installers for
|
||
Windows Installer, the Windows installation engine. See http://wixtoolset.org.
|
||
|
||
10. Backward compatibility
|
||
The 2.0.0 version of the HDF5 library can be configured to
|
||
set all versioned functions to the version that was available in one of these HDF5_DEFAULT_API_VERSIONs
|
||
HDF5_DEFAULT_API_VERSION:STRING=v114
|
||
HDF5_DEFAULT_API_VERSION:STRING=v112
|
||
HDF5_DEFAULT_API_VERSION:STRING=v110
|
||
HDF5_DEFAULT_API_VERSION:STRING=v18
|
||
HDF5_DEFAULT_API_VERSION:STRING=v16
|
||
This allows existing code to be compiled with the
|
||
v2.0 library without requiring immediate changes to the application
|
||
source code.
|
||
|
||
Note that because 2.0.0 is a major release, as long as the existing application
|
||
code doesn't use symbols removed in 2.0.0, the code can be compiled and run with
|
||
the new library.
|
||
|
||
For additional configuration options and other details,
|
||
see "API Compatibility Macros":
|
||
https://support.hdfgroup.org/documentation/hdf5/latest/api-compat-macros.html
|
||
|
||
11. Building doxygen
|
||
One can optionally build the doxygen files for the HDF5 C library.
|
||
By default, this option is disabled. To build the html files, specify
|
||
'HDF5_BUILD_DOC'.
|
||
|
||
cmake -G "<generator>" -DHDF5_BUILD_DOC:BOOL=ON <sourcepath>
|
||
|
||
Configuration will halt if the required applications are not available.
|
||
To build:
|
||
|
||
cmake --build . --config {Debug | Release}
|
||
or
|
||
make doxygen
|
||
|
||
12. Parallel versus serial library
|
||
The HDF5 library can be configured to use MPI and MPI-IO for
|
||
parallelism on a distributed multi-processor system. Read the
|
||
file README_HPC.md for detailed information.
|
||
HDF5_ENABLE_PARALLEL:BOOL=ON
|
||
|
||
The threadsafe, C++ and Java interfaces are not compatible
|
||
with the parallel option.
|
||
Unless HDF5_ALLOW_UNSUPPORTED has been specified on the configure line,
|
||
the following options must be disabled:
|
||
HDF5_ENABLE_THREADSAFE, HDF5_BUILD_CPP_LIB, HDF5_BUILD_JAVA
|
||
|
||
13. Threadsafe capability
|
||
The HDF5 library can be configured to be thread-safe (on a very
|
||
large scale) with the HDF5_ENABLE_THREADSAFE flag to the configure
|
||
script. For further information, see the "Technical Notes" category
|
||
in the documentation:
|
||
https://support.hdfgroup.org/documentation/hdf5/latest/
|
||
|
||
The high-level, C++, Fortran and Java interfaces are not compatible
|
||
with the thread-safety option because the lock is not hoisted
|
||
into the higher-level API calls.
|
||
Unless HDF5_ALLOW_UNSUPPORTED has been specified on the configure line,
|
||
the following options must be disabled:
|
||
HDF5_BUILD_HL_LIB, HDF5_BUILD_FORTRAN, HDF5_BUILD_CPP_LIB, HDF5_BUILD_JAVA
|
||
|
||
|
||
========================================================================
|
||
VII. CMake Option Defaults for HDF5
|
||
========================================================================
|
||
|
||
In the options listed below, there are three columns of information:
|
||
Option Name, Option Description, and Option Default.
|
||
The config/cmake/cacheinit.cmake or CMakePresets.json file can override the following values.
|
||
|
||
---------------- General Build Options -------------------------------------
|
||
BUILD_SHARED_LIBS "Build Shared Libraries" ON
|
||
BUILD_STATIC_LIBS "Build Static Libraries" ON
|
||
BUILD_STATIC_EXECS "Build Static Executables" OFF
|
||
BUILD_TESTING "Build HDF5 Unit Testing" ON
|
||
if (WINDOWS)
|
||
HDF5_DISABLE_PDB_FILES "Do not install PDB files" OFF
|
||
|
||
---------------- HDF5 Build Options ----------------------------------------
|
||
HDF5_BUILD_CPP_LIB "Build HDF5 C++ Library" OFF
|
||
HDF5_BUILD_EXAMPLES "Build HDF5 Library Examples" ON
|
||
HDF5_BUILD_FORTRAN "Build FORTRAN support" OFF
|
||
HDF5_BUILD_JAVA "Build JAVA support" OFF
|
||
HDF5_BUILD_HL_LIB "Build HIGH Level HDF5 Library" ON
|
||
HDF5_BUILD_TOOLS "Build HDF5 Tools" ON
|
||
HDF5_BUILD_PARALLEL_TOOLS "Build Parallel HDF5 Tools" OFF
|
||
HDF5_BUILD_STATIC_TOOLS "Build Static Tools Not Shared Tools" OFF
|
||
|
||
----------------- HDF5 Maven Integration Options ----------------------------
|
||
HDF5_ENABLE_MAVEN_DEPLOY "Enable Maven repository deployment" OFF
|
||
HDF5_MAVEN_SNAPSHOT "Build Maven snapshot versions" OFF
|
||
HDF5_ENABLE_JNI "Force JNI implementation (default: auto-detect)" ON
|
||
|
||
Java Implementation Selection (as of HDF5 2.0):
|
||
HDF5 Java bindings support two native interface implementations:
|
||
- JNI (Java Native Interface): Default, works with Java 8+, production-stable
|
||
- FFM (Foreign Function & Memory): Optional, requires Java 25+, modern native access
|
||
|
||
Maven Artifacts:
|
||
- org.hdfgroup:hdf5-java-ffm - FFM implementation
|
||
- org.hdfgroup:hdf5-java-jni - JNI implementation
|
||
|
||
Both implementations use the same hdf.hdf5lib.* package structure for seamless migration.
|
||
|
||
To build HDF5 with Maven deployment support:
|
||
cmake -DHDF5_BUILD_JAVA:BOOL=ON -DHDF5_ENABLE_MAVEN_DEPLOY:BOOL=ON ../hdf5
|
||
|
||
To build Maven snapshot versions for development:
|
||
cmake -DHDF5_BUILD_JAVA:BOOL=ON -DHDF5_ENABLE_MAVEN_DEPLOY:BOOL=ON -DHDF5_MAVEN_SNAPSHOT:BOOL=ON ../hdf5
|
||
|
||
Note: FFM is selected for Java 25+ if HDF5_ENABLE_JNI is OFF, JNI for older versions.
|
||
To force JNI even with Java 25+:
|
||
cmake -DHDF5_BUILD_JAVA:BOOL=ON -DHDF5_ENABLE_MAVEN_DEPLOY:BOOL=ON -DHDF5_ENABLE_JNI:BOOL=ON ../hdf5
|
||
|
||
Or use the Maven-enabled CMake presets (recommended):
|
||
|
||
# Minimal build for Java artifacts only (recommended for Maven deployment)
|
||
# Linux (GCC) - JNI (default, Java 8+):
|
||
cmake --workflow --preset ci-MinShar-GNUC-Maven --fresh # JNI Release
|
||
cmake --workflow --preset ci-MinShar-GNUC-Maven-Snapshot --fresh # JNI Snapshot
|
||
|
||
# Linux (GCC) - FFM (optional, Java 25+):
|
||
cmake --workflow --preset ci-MinShar-GNUC-Maven-FFM --fresh # FFM Release
|
||
cmake --workflow --preset ci-MinShar-GNUC-Maven-FFM-Snapshot --fresh # FFM Snapshot
|
||
|
||
# Windows (MSVC) - JNI (default):
|
||
cmake --workflow --preset ci-MinShar-MSVC-Maven --fresh # JNI Release
|
||
cmake --workflow --preset ci-MinShar-MSVC-Maven-Snapshot --fresh # JNI Snapshot
|
||
|
||
# Windows (MSVC) - FFM (optional):
|
||
cmake --workflow --preset ci-MinShar-MSVC-Maven-FFM --fresh # FFM Release
|
||
cmake --workflow --preset ci-MinShar-MSVC-Maven-FFM-Snapshot --fresh # FFM Snapshot
|
||
|
||
# macOS (Clang) - JNI (default):
|
||
cmake --workflow --preset ci-MinShar-Clang-Maven --fresh # JNI Release
|
||
cmake --workflow --preset ci-MinShar-Clang-Maven-Snapshot --fresh # JNI Snapshot
|
||
|
||
# macOS (Clang) - FFM (optional):
|
||
cmake --workflow --preset ci-MinShar-Clang-Maven-FFM --fresh # FFM Release
|
||
cmake --workflow --preset ci-MinShar-Clang-Maven-FFM-Snapshot --fresh # FFM Snapshot
|
||
|
||
# ROS3 VFD (S3 cloud storage) - Add to any preset above:
|
||
cmake --workflow --preset ci-MinShar-GNUC-Maven --fresh -DHDF5_ENABLE_ROS3_VFD=ON
|
||
|
||
Note: Presets are platform-specific. Use 'cmake --list-presets' to see
|
||
available presets for your current platform.
|
||
Note: Minimal Maven presets skip examples, testing, tools, C++, and Fortran
|
||
builds to optimize for Java artifact generation only.
|
||
|
||
Java Examples Maven Integration:
|
||
The HDF5 Java examples are available as a separate Maven artifact:
|
||
- org.hdfgroup:hdf5-java-examples
|
||
- Platform-specific dependencies ensure compatibility with HDF5 Java library
|
||
- Complete examples with documentation for all HDF5 Java functionality
|
||
- See HDF5Examples/JAVA/README-MAVEN.md for usage instructions
|
||
|
||
Testing Java Examples with Maven Artifacts:
|
||
- Maven staging workflow validates examples against artifacts
|
||
- Cross-platform testing ensures compatibility on all supported platforms
|
||
- Native library error handling validates JAR structure in Maven-only environments
|
||
- Fork-based testing allows validation on repository forks before canonical deployment
|
||
- Dynamic repository workflows adapt to any GitHub repository automatically
|
||
|
||
---------------- HDF5 Folder Build Options ---------------------------------
|
||
Defaults relative to $<INSTALL_PREFIX>
|
||
HDF5_INSTALL_BIN_DIR "bin"
|
||
HDF5_INSTALL_LIB_DIR "lib"
|
||
HDF5_INSTALL_INCLUDE_DIR "include"
|
||
HDF5_INSTALL_MODULE_DIR "mod"
|
||
HDF5_INSTALL_CMAKE_DIR "cmake"
|
||
if (MSVC)
|
||
HDF5_INSTALL_DATA_DIR "."
|
||
else ()
|
||
HDF5_INSTALL_DATA_DIR "share"
|
||
HDF5_INSTALL_DOC_DIR "HDF5_INSTALL_DATA_DIR"
|
||
|
||
HDF5_USE_GNU_DIRS "ON to use GNU Coding Standard install directory variables,
|
||
OFF to use historical settings" OFF
|
||
Defaults as defined by the 'GNU Coding Standards'
|
||
HDF5_INSTALL_BIN_DIR "bin"
|
||
HDF5_INSTALL_LIB_DIR "lib"
|
||
HDF5_INSTALL_INCLUDE_DIR "include"
|
||
HDF5_INSTALL_MODULE_DIR "HDF5_INSTALL_INCLUDE_DIR/mod"
|
||
HDF5_INSTALL_CMAKE_DIR "HDF5_INSTALL_LIB_DIR/cmake"
|
||
HDF5_INSTALL_DATA_DIR "share"
|
||
HDF5_INSTALL_DOC_DIR "HDF5_INSTALL_DATA_DIR/doc/hdf5"
|
||
|
||
---------------- HDF5 Advanced Options ---------------------
|
||
HDF5_ONLY_SHARED_LIBS "Only Build Shared Libraries" OFF
|
||
HDF5_ALLOW_UNSUPPORTED "Allow unsupported combinations of configure options" OFF
|
||
HDF5_ENABLE_PARALLEL "Enable parallel build (requires MPI)" OFF
|
||
HDF5_ENABLE_THREADSAFE "Enable Threadsafety" OFF
|
||
HDF5_ENABLE_CONCURRENCY "Enable multi-threaded concurrency" OFF
|
||
HDF5_DIMENSION_SCALES_NEW_REF "Use new-style references with dimension scale APIs" OFF
|
||
HDF5_EXTERNAL_LIB_PREFIX "Use prefix for custom library naming." ""
|
||
HDF5_EXTERNAL_LIB_SUFFIX "Use suffix for custom library naming." ""
|
||
|
||
HDF5_DISABLE_COMPILER_WARNINGS "Disable compiler warnings" OFF
|
||
HDF5_ENABLE_ALL_WARNINGS "Enable all warnings" OFF
|
||
HDF5_SHOW_ALL_WARNINGS "Show all warnings (i.e. not suppress "noisy" ones internally)" OFF
|
||
HDF5_ENABLE_COVERAGE "Enable code coverage for Libraries and Programs" OFF
|
||
HDF5_ENABLE_DEBUG_APIS "Turn on extra debug output in all packages" OFF
|
||
HDF5_ENABLE_DEPRECATED_SYMBOLS "Enable deprecated public API symbols" ON
|
||
HDF5_ENABLE_EMBEDDED_LIBINFO "embed library info into executables" ON
|
||
HDF5_ENABLE_PREADWRITE "Use pread/pwrite in sec2/log/core VFDs in place of read/write (when available)" ON
|
||
HDF5_ENABLE_TRACE "Enable API tracing capability" OFF
|
||
HDF5_ENABLE_USING_MEMCHECKER "Indicate that a memory checker is used" OFF
|
||
HDF5_ENABLE_MAP_API "Build the map API" OFF
|
||
HDF5_GENERATE_HEADERS "Rebuild Generated Files" OFF
|
||
|
||
HDF5_JAVA_PACK_JRE "Package a JRE installer directory" OFF
|
||
HDF5_NO_PACKAGES "Do not include CPack Packaging" OFF
|
||
HDF5_PACK_EXAMPLES "Package the HDF5 Library Examples Compressed File" OFF
|
||
HDF5_PACK_MACOSX_FRAMEWORK "Package the HDF5 Library in a Frameworks" OFF
|
||
HDF5_BUILD_FRAMEWORKS "TRUE to build as frameworks libraries,
|
||
FALSE to build according to BUILD_SHARED_LIBS" FALSE
|
||
HDF5_PACKAGE_EXTLIBS "CPACK - include external libraries" OFF
|
||
HDF5_STRICT_FORMAT_CHECKS "Whether to perform strict file format checks" OFF
|
||
HDF5_WANT_DATA_ACCURACY "IF data accuracy is guaranteed during data conversions" ON
|
||
HDF5_WANT_DCONV_EXCEPTION "exception handling functions is checked during data conversions" ON
|
||
|
||
HDF5_DEFAULT_API_VERSION "Enable default API (v16, v18, v110, v112, v114, v200)" "v200"
|
||
HDF5_USE_FOLDERS "Enable folder grouping of projects in IDEs." ON
|
||
HDF5_MSVC_NAMING_CONVENTION "Use MSVC Naming conventions for Shared Libraries" OFF
|
||
HDF5_MINGW_STATIC_GCC_LIBS "Statically link libgcc/libstdc++" OFF
|
||
if (APPLE)
|
||
HDF5_BUILD_WITH_INSTALL_NAME "Build with library install_name set to the installation path" OFF
|
||
if (CMAKE_BUILD_TYPE MATCHES Debug)
|
||
HDF5_ENABLE_INSTRUMENT "Instrument The library" OFF
|
||
if (HDF5_BUILD_FORTRAN)
|
||
HDF5_INSTALL_MOD_FORTRAN "Copy FORTRAN mod files to include directory (NO SHARED STATIC)" SHARED
|
||
if (BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED
|
||
if (BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED
|
||
if (NOT BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is STATIC
|
||
if (NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED
|
||
|
||
HDF5_ENABLE_ANALYZER_TOOLS "enable the use of Clang tools" OFF
|
||
HDF5_ENABLE_SANITIZERS "execute the Clang sanitizer" OFF
|
||
HDF5_ENABLE_FORMATTERS "format source files" OFF
|
||
HDF5_BUILD_DOC "Build documentation" OFF
|
||
HDF5_ENABLE_DOXY_WARNINGS "Enable fail if doxygen parsing has warnings." OFF
|
||
|
||
HDF5_H5CC_C_COMPILER "C compiler to use in h5cc" ${CMAKE_C_COMPILER}
|
||
HDF5_H5CC_CXX_COMPILER "C++ compiler to use in h5cc" ${CMAKE_CXX_COMPILER}
|
||
HDF5_H5CC_Fortran_COMPILER "Fortran compiler to use in h5cc" ${CMAKE_Fortran_COMPILER}
|
||
|
||
---------------- HDF5 VFD Options ---------------------
|
||
HDF5_ENABLE_DIRECT_VFD "Build the Direct I/O Virtual File Driver" OFF
|
||
HDF5_ENABLE_MIRROR_VFD "Build the Mirror Virtual File Driver" OFF
|
||
HDF5_ENABLE_ROS3_VFD "Build the ROS3 Virtual File Driver" OFF
|
||
HDF5_ENABLE_HDFS "Enable HDFS" OFF
|
||
HDF5_ENABLE_SUBFILING_VFD "Build Parallel HDF5 Subfiling VFD" OFF
|
||
|
||
---------------- HDF5 Advanced Test Options ---------------------
|
||
if (BUILD_TESTING)
|
||
HDF5_TEST_SERIAL "Execute non-parallel tests" ON
|
||
HDF5_TEST_TOOLS "Execute tools tests" ON
|
||
HDF5_TEST_EXAMPLES "Execute tests on examples" ON
|
||
HDF5_TEST_SWMR "Execute SWMR tests" ON
|
||
HDF5_TEST_PARALLEL "Execute parallel tests" ON
|
||
HDF5_TEST_FORTRAN "Execute fortran tests" ON
|
||
HDF5_TEST_CPP "Execute cpp tests" ON
|
||
HDF5_TEST_JAVA "Execute java tests" ON
|
||
HDF_TEST_EXPRESS "Control testing framework (0-3)" "3"
|
||
HDF5_TEST_PASSTHROUGH_VOL "Execute tests with different passthrough VOL connectors" OFF
|
||
if (HDF5_TEST_PASSTHROUGH_VOL)
|
||
HDF5_TEST_FHEAP_PASSTHROUGH_VOL "Execute fheap test with different passthrough VOL connectors" ON
|
||
HDF5_TEST_VFD "Execute tests with different VFDs" OFF
|
||
if (HDF5_TEST_VFD)
|
||
HDF5_TEST_FHEAP_VFD "Execute fheap test with different VFDs" ON
|
||
HDF5_TEST_SHELL_SCRIPTS "Enable shell script tests" ON
|
||
HDF5_DISABLE_TESTS_REGEX "Regex pattern to set execution of specific tests to DISABLED" ""
|
||
HDF5_USING_ANALYSIS_TOOL "Indicate that an analysis checker is used" ON
|
||
---------------- External Library Options ---------------------
|
||
HDF5_ALLOW_EXTERNAL_SUPPORT "Allow External Library Building (NO GIT TGZ)" "NO"
|
||
HDF5_ENABLE_PLUGIN_SUPPORT "Enable PLUGIN Filters" OFF
|
||
HDF5_ENABLE_SZIP_SUPPORT "Use SZip Filter" OFF
|
||
HDF5_MODULE_MODE_ZLIB "Prefer module mode to find ZLIB" ON
|
||
HDF5_ENABLE_ZLIB_SUPPORT "Enable Zlib Filters" OFF
|
||
|
||
if (HDF5_USE_ZLIB_NG)
|
||
ZLIBNG_USE_EXTERNAL "Use External Library Building for ZLIBNG" OFF
|
||
ZLIBNG_TGZ_ORIGPATH "Use ZLIBNG from original location" "https://github.com/zlib-ng/zlib-ng/releases/tag/2.2.4"
|
||
ZLIBNG_TGZ_NAME "Use ZLIBNG from original compressed file" "2.2.4.tar.gz"
|
||
else
|
||
ZLIB_USE_EXTERNAL "Use External Library Building for ZLIB" OFF
|
||
ZLIB_TGZ_ORIGPATH "Use ZLIB from original location" "https://github.com/madler/zlib/releases/download/v1.3.1"
|
||
ZLIB_TGZ_NAME "Use ZLIB from original compressed file" "zlib-1.3.1.tar.gz"
|
||
ZLIB_USE_LOCALCONTENT "Use local file for ZLIB FetchContent" OFF
|
||
HDF5_USE_ZLIB_STATIC "Find static zlib library" OFF
|
||
|
||
SZIP_USE_EXTERNAL "Use External Library Building for SZIP else search" OFF
|
||
if (HDF5_ENABLE_SZIP_SUPPORT)
|
||
HDF5_ENABLE_SZIP_ENCODING "Use SZip Encoding" ON
|
||
LIBAEC_TGZ_ORIGPATH "Use LIBAEC from original location" "https://github.com/MathisRosenhauer/libaec/releases/download/v1.1.3"
|
||
LIBAEC_TGZ_NAME "Use LIBAEC from original compressed file" "libaec-1.1.3.tar.gz"
|
||
LIBAEC_USE_LOCALCONTENT "Use local file for LIBAEC FetchContent" OFF
|
||
HDF5_USE_LIBAEC_STATIC "Find static AEC library" OFF
|
||
|
||
PLUGIN_USE_EXTERNAL "Use External Library Building for PLUGINS else search" OFF
|
||
PLUGIN_TGZ_ORIGPATH "Use PLUGIN from original location" "https://github.com/HDFGroup/hdf5_plugins/releases/download/snapshot"
|
||
PLUGIN_TGZ_NAME "Use PLUGIN from original compressed file" "hdf5_plugins-master.tar.gz"
|
||
PLUGIN_USE_LOCALCONTENT "Use local file for PLUGIN FetchContent" OFF
|
||
if (WINDOWS)
|
||
H5_DEFAULT_PLUGINDIR "%ALLUSERSPROFILE%/hdf5/lib/plugin"
|
||
else ()
|
||
H5_DEFAULT_PLUGINDIR "/usr/local/hdf5/lib/plugin"
|
||
endif ()
|
||
|
||
NOTE:
|
||
The BUILD_STATIC_EXECS ("Build Static Executables") option is only valid
|
||
on some unix operating systems. It adds the "-static" flag to cflags. This
|
||
flag is not available on windows and some modern linux systems will
|
||
ignore the flag.
|
||
|
||
NOTE:
|
||
The HDF5_USE_GNU_DIRS option is usually recommended for linux platforms, but may
|
||
be useful on other platforms. See the CMake documentation for more details.
|
||
|
||
---------------- Unsupported Library Options ---------------------
|
||
The threadsafe, C++ and Java interfaces are not compatible
|
||
with the HDF5_ENABLE_PARALLEL option.
|
||
Unless HDF5_ALLOW_UNSUPPORTED has been specified,
|
||
the following options must be disabled:
|
||
HDF5_ENABLE_THREADSAFE, HDF5_BUILD_CPP_LIB, HDF5_BUILD_JAVA
|
||
|
||
The high-level, C++, Fortran and Java interfaces are not compatible
|
||
with the HDF5_ENABLE_THREADSAFE option because the lock is not hoisted
|
||
into the higher-level API calls. Unless HDF5_ALLOW_UNSUPPORTED has been
|
||
specified, the following options must be disabled:
|
||
HDF5_BUILD_HL_LIB, HDF5_BUILD_CPP_LIB, HDF5_BUILD_FORTRAN, HDF5_BUILD_JAVA
|
||
|
||
The multi-threaded concurrency and threadsafe options are mutually
|
||
exclusive, only one or the other may be enabled.
|
||
|
||
The multi-threaded concurrency, C++, and Java interfaces are not compatible
|
||
with the HDF5_ENABLE_PARALLEL option.
|
||
Unless HDF5_ALLOW_UNSUPPORTED has been specified,
|
||
the following options must be disabled:
|
||
HDF5_ENABLE_CONCURRENCY, HDF5_BUILD_CPP_LIB, HDF5_BUILD_JAVA
|
||
|
||
The high-level, C++, Fortran, and Java interfaces are not compatible
|
||
with the HDF5_ENABLE_CONCURRENCY option because the lock is not hoisted
|
||
into the higher-level API calls. Unless HDF5_ALLOW_UNSUPPORTED has been
|
||
specified, the following options must be disabled:
|
||
HDF5_BUILD_HL_LIB, HDF5_BUILD_CPP_LIB, HDF5_BUILD_FORTRAN, HDF5_BUILD_JAVA
|
||
|
||
========================================================================
|
||
VIII. User Defined Options for HDF5 Libraries with CMake
|
||
========================================================================
|
||
|
||
Support for User Defined macros and options has been added. The file
|
||
UserMacros.cmake has an example of the technique.
|
||
|
||
Replace the template code with your macro in the UserMacros.cmake file.
|
||
Then enable the option to the CMake configuration, build and test process.
|
||
|
||
|
||
========================================================================
|
||
IX. User Defined Compile Flags for HDF5 Libraries with CMake
|
||
========================================================================
|
||
|
||
Custom compiler flags can be added by defining the CMAKE_C_FLAGS and
|
||
CMAKE_CXX_FLAGS variables.
|
||
Using a cmake script:
|
||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
|
||
Defined on the configure line:
|
||
cmake -G "Visual Studio 17 2019" -DCMAKE_C_FLAGS:STRING=-O2 ..
|
||
|
||
Debug symbols are enabled with configuration selections Debug or RelWithDebInfo.
|
||
The difference between Debug and RelWithDebInfo configurations is that
|
||
RelWithDebInfo optimizes the code similar to Release. It produces fully optimized
|
||
code, but also creates the symbol table and the debug metadata to give the
|
||
debugger input to map the execution back to the original code.
|
||
RelwithDebInfo configuration should not affect the performance when the code
|
||
is run without a debugger attached.
|
||
|
||
The HDF5_ENABLE_COVERAGE option will add "-g -O0 -fprofile-arcs -ftest-coverage"
|
||
to CMAKE_C_FLAGS.
|
||
|
||
|
||
========================================================================
|
||
X: Considerations for Cross-Compiling
|
||
========================================================================
|
||
|
||
Cross-compiling has several consequences for CMake:
|
||
CMake cannot automatically detect the target platform.
|
||
CMake cannot find libraries and headers in the default system directories.
|
||
Executables built during cross compiling cannot be executed.
|
||
|
||
Cross-compiling support means that CMake separates information about the
|
||
build platform and target platform and gives the user mechanisms to solve
|
||
cross-compiling issues without additional requirements such as running
|
||
virtual machines, etc.
|
||
|
||
CMake uses a toolchain of utilities to compile, link libraries and create
|
||
archives, and other tasks to drive the build. The toolchain utilities
|
||
available are determined by the languages enabled.
|
||
|
||
CMake stores info about the current toolchain in the following variables:
|
||
CMAKE_C_COMPILER,
|
||
CMAKE_CXX_COMPILER.
|
||
They contain paths to the C and C++ compilers respectively. This is usually
|
||
enough on desktop platforms. In the case of embedded systems, a custom
|
||
linker and assembler setting may be needed. In more complex projects
|
||
you may need to additionally specify binaries to other parts of the toolchain
|
||
(size, ranlib, objcopy…). All these tools should be set in the corresponding
|
||
variables:
|
||
CMAKE_AR,
|
||
CMAKE_ASM_COMPILER,
|
||
CMAKE_LINKER,
|
||
CMAKE_OBJCOPY,
|
||
CMAKE_RANLIB
|
||
|
||
As for the host and target operating systems, CMake stores their names in the
|
||
following variables:
|
||
CMAKE_HOST_SYSTEM_NAME – name of the platform, on which CMake is running (host platform).
|
||
On major operating systems this is set to the Linux, Windows or
|
||
Darwin (MacOS) value.
|
||
CMAKE_SYSTEM_NAME – name of the platform, for which we are building (target platform).
|
||
By default, this value is the same as CMAKE_HOST_SYSTEM_NAME, which
|
||
means that we are building for the local platform (no cross-compilation).
|
||
|
||
Put the toolchain variables into a separate file (e.g. <toolchain_name>.cmake)
|
||
and set CMAKE_TOOLCHAIN_FILE variable to the path of that file.
|
||
If cmake is invoked with the command line parameter:
|
||
--toolchain path/to/file
|
||
or
|
||
-DCMAKE_TOOLCHAIN_FILE=path/to/file
|
||
the file will be loaded early to set values for the compilers. The
|
||
CMAKE_CROSSCOMPILING variable is set to true when CMake is cross-compiling.
|
||
|
||
Structure of the toolchain file
|
||
-------------------------------
|
||
In fact, the toolchain file doesn’t have any structure. You can put anything you
|
||
want there. But the best practice is to define at least these settings:
|
||
path to the toolchain binaries (C compiler, C++ compiler, linker, etc.)
|
||
name of the target platform (and optionally target processor architecture)
|
||
required compilation and linking flags on that particular platform
|
||
toolchain sysroot settings
|
||
|
||
It is recommended that you set the CMAKE_FIND_ROOT_PATH variable to a path where
|
||
you have an exact copy of the root filesystem you have on your target device (with
|
||
libraries and binaries pre-compiled for the target processor).
|
||
|
||
References:
|
||
https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html
|
||
https://gitlab.com/embeddedlinux/libs/platform
|
||
https://discourse.cmake.org/t/cross-compile-for-aarch64-on-ubuntu/2161/10
|
||
https://stackoverflow.com/questions/54539682/how-to-set-up-cmake-to-cross-compile-with-clang-for-arm-embedded-on-windows?rq=1
|
||
https://developer.android.com/ndk/guides/cmake
|
||
|
||
|
||
|
||
========================================================================
|
||
XI. Creating Custom Preset Configurations
|
||
========================================================================
|
||
|
||
The quickest way to customize your build is to create a CMakeUserPresets.json file
|
||
in the HDF5 source directory.
|
||
|
||
Basic Customization Steps
|
||
--------------------------
|
||
1. Copy CMakePresets.json to CMakeUserPresets.json:
|
||
cp CMakePresets.json CMakeUserPresets.json
|
||
|
||
2. Edit CMakeUserPresets.json:
|
||
- Change configuration names from ci-* to my-*
|
||
- Modify the "inherits" field in "configurePresets" for alternate options
|
||
- Update "configurePreset" fields in "buildPresets", "testPresets", "packagePresets"
|
||
- Update names in "workflowPresets" steps from ci-* to my-*
|
||
|
||
Example: Using Local Support Files
|
||
-----------------------------------
|
||
To change external support files to use a local directory:
|
||
|
||
{
|
||
"name": "my-base-tgz",
|
||
"hidden": true,
|
||
"inherits": "ci-base",
|
||
"cacheVariables": {
|
||
"HDF5_ALLOW_EXTERNAL_SUPPORT": {"type": "STRING", "value": "TGZ"},
|
||
"TGZPATH": {"type": "PATH", "value": "${sourceParentDir}/temp"}
|
||
}
|
||
},
|
||
{
|
||
"name": "my-StdCompression",
|
||
"hidden": true,
|
||
"inherits": "my-base-tgz",
|
||
"cacheVariables": {
|
||
...
|
||
}
|
||
},
|
||
{
|
||
"name": "my-StdShar",
|
||
"hidden": true,
|
||
"inherits": "my-StdCompression",
|
||
"cacheVariables": {
|
||
...
|
||
}
|
||
},
|
||
{
|
||
"name": "my-StdShar-GNUC",
|
||
"description": "My Custom GNUC Standard Config for x64 (Release)",
|
||
"inherits": [
|
||
"ci-x64-Release-GNUC",
|
||
"ci-CPP",
|
||
"ci-Fortran",
|
||
"ci-Java",
|
||
"my-StdShar",
|
||
"my-StdExamples"
|
||
]
|
||
}
|
||
|
||
Then you can change or add options for your specific case.
|
||
|
||
Maven Deployment Preset Example
|
||
--------------------------------
|
||
For Maven deployment with custom repository URL:
|
||
|
||
{
|
||
"name": "my-maven-custom",
|
||
"inherits": "ci-MinShar-GNUC-Maven-Snapshot",
|
||
"cacheVariables": {
|
||
"MAVEN_REPOSITORY_URL": {"type": "STRING", "value": "https://your-repo.com/maven"},
|
||
"HDF5_ENABLE_ROS3_VFD": {"type": "BOOL", "value": "ON"}
|
||
}
|
||
}
|
||
|
||
Then build with:
|
||
cmake --workflow --preset my-maven-custom --fresh
|
||
|
||
Note: This example uses JNI (default). For FFM, inherit from ci-MinShar-GNUC-Maven-FFM-Snapshot
|
||
|
||
Preset File Details
|
||
-------------------
|
||
CMakePresets.json and CMakeUserPresets.json:
|
||
- Live in the project's root directory
|
||
- Both have the same format
|
||
- CMakePresets.json: Project-wide build details (don't modify)
|
||
- CMakeUserPresets.json: Your local build customizations
|
||
|
||
The HDF Group presets require CMake 3.26 and use the Ninja build system.
|
||
Ninja may need to be installed separately on some platforms.
|
||
|
||
Hidden presets (marked "hidden": true) are used for inheritance and
|
||
cannot be used directly. They are defined in config/cmake-presets/hidden-presets.json.
|
||
|
||
For more information:
|
||
https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html
|
||
|
||
|
||
========================================================================
|
||
XII. Using the Library
|
||
========================================================================
|
||
For information on using HDF5 see the documentation, tutorials and examples
|
||
found here:
|
||
|
||
https://support.hdfgroup.org/documentation/index.html
|
||
|
||
A summary of the features included in the built HDF5 installation can be found
|
||
in the libhdf5.settings file in the same directory as the static and/or
|
||
shared HDF5 libraries. However CMake provides a programmable method to
|
||
determine the features of the library. The CMake installation will
|
||
provide a CMake package configuration file, located in the installation folder,
|
||
cmake/hdf5-config.cmake, and can be used to determine the features of the library.
|
||
The file is accessed by using the find_package command in your CMakeLists.txt file.
|
||
|
||
1. Set the HDF5_ROOT CMake variable, -DHDF5_ROOT=<install_path>
|
||
or environment variable, set(ENV{HDF5_ROOT} "<install_path>")
|
||
to the installed location of HDF5.
|
||
On Windows:
|
||
HDF5_ROOT=C:/Program Files/HDF_Group/HDF5/z.y.x/
|
||
On unix:
|
||
HDF5_ROOT=<install root folder>/HDF_Group/HDF5/z.y.x/
|
||
|
||
If you are using shared libraries, you may need to add to the path
|
||
environment variable. Set the path environment variable to the
|
||
installed location of the library files for HDF5.
|
||
On Windows (*.dll):
|
||
PATH=%PATH%;C:/Program Files/HDF_Group/HDF5/z.y.x/bin
|
||
On unix (*.so):
|
||
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<install root folder>/HDF_Group/HDF5/z.y.x/lib
|
||
|
||
(Note there are no quote characters used on Windows and all platforms
|
||
use forward slashes)
|
||
|
||
2. Add the following to your CMakeLists.txt file:
|
||
find_package (HDF5 NAMES hdf5 COMPONENTS C shared)
|
||
|
||
The components are optional and can be omitted if not needed. The
|
||
components are: shared, static, C, CXX, Fortran, HL, Java, Tools, and VOL.
|
||
|
||
|
||
|
||
========================================================================
|
||
XIII. Using CMake Regex Options for Testing
|
||
========================================================================
|
||
CMake provides a way to use regular expressions to control which tests are
|
||
executed. The HDF5 CMake build system provides labels for each test that
|
||
can be used to select tests. The labels are defined in the CMakeTests.cmake
|
||
files.
|
||
|
||
Some of the labels are:
|
||
PARALLEL
|
||
- MPI_TEST for parallel tests.
|
||
- MPI_TEST_FORT for just parallel Fortran tests.
|
||
SERIAL
|
||
- CPP for C++ tests.
|
||
- HL_CPP for high-level C++ tests.
|
||
- FORTRAN for Fortran tests.
|
||
- HL_FORTRAN for high-level Fortran tests.
|
||
- HL for high-level tests.
|
||
- JUnit for Java tests.
|
||
- H5WATCH for tests that use the h5watch SWMR program.
|
||
- SWMR for tests that use the SWMR feature.
|
||
- h5_api for the API tests.
|
||
- VOL for tests that use the VOL feature.
|
||
- VFD for tests that use the VFD feature.
|
||
- H5TEST for the library tests.
|
||
- EX for examples
|
||
- H5CLEAR for the h5clear tool tests.
|
||
- H5COPY for the h5copy tool tests.
|
||
- H5DIFF for the h5diff tool tests.
|
||
- H5DUMP for the h5dump tool tests.
|
||
- H5FC for the h5fc tool tests.
|
||
- H5IMPORT for the h5import tool tests.
|
||
- H5JAM for the h5jam tool tests.
|
||
- H5LS for the h5ls tool tests.
|
||
- H5MKGRP for the h5mkgrp tool tests.
|
||
- H5REPACK for the h5repack tool tests.
|
||
- H5REPART for the h5repart tool tests.
|
||
- H5STAT for the h5stat tool tests.
|
||
- PERFORM for performance tests.
|
||
|
||
To run tests with a specific label, use the --tests-regex (or -R) option with ctest.
|
||
For example, to run only the C++ tests, use:
|
||
ctest . --tests-regex "CPP"
|
||
|
||
To run tests with multiple labels, use the | operator to separate the labels.
|
||
To run tests with the MPI_TEST and FORTRAN labels, use:
|
||
ctest . --tests-regex "MPI_TEST|FORTRAN"
|
||
|
||
To run tests and exclude tests with a specific label, use the
|
||
--exclude-regex (or -E) option with ctest.
|
||
|
||
For more information on using regular expressions with ctest,
|
||
see the CMake documentation:
|
||
https://cmake.org/cmake/help/latest/manual/ctest.1.html#regular-expressions
|
||
|
||
|
||
|
||
========================================================================
|
||
XIV. Java FFM Testing
|
||
========================================================================
|
||
|
||
HDF5 2.0 includes comprehensive Foreign Function & Memory (FFM) API tests
|
||
for Java 25+.
|
||
|
||
FFM Test Organization
|
||
---------------------
|
||
Tests are organized by HDF5 module in java/jtest/:
|
||
|
||
Module Test Files:
|
||
- TestH5ffm.java - General library operations
|
||
H5open, H5close, memory management, version info
|
||
- TestH5Affm.java - Attribute operations
|
||
- TestH5Dffm.java - Dataset operations
|
||
- TestH5Effm.java - Error handling
|
||
- TestH5Fffm.java - File operations
|
||
- TestH5FDffm.java - File drivers
|
||
- TestH5Gffm.java - Group operations
|
||
- TestH5Iffm.java - Identifier management
|
||
- TestH5Lffm.java - Link operations
|
||
- TestH5Offm.java - Object operations
|
||
- TestH5Pffm.java - Property lists
|
||
- TestH5PLffm.java - Plugin management
|
||
- TestH5Rffm.java - References
|
||
- TestH5Sffm.java - Dataspace operations
|
||
- TestH5Tffm.java - Datatype operations
|
||
- TestH5VLffm.java - VOL connector
|
||
- TestH5Zffm.java - Filter operations
|
||
|
||
Running FFM Tests
|
||
-----------------
|
||
To run all FFM tests:
|
||
ctest -R "JUnitFFM" -V
|
||
|
||
To run specific module tests:
|
||
ctest -R "JUnit-TestH5Affm" -V # Attributes
|
||
ctest -R "JUnit-TestH5Pffm" -V # Properties
|
||
ctest -R "JUnit-TestH5Tffm" -V # Datatypes
|
||
ctest -R "JUnit-TestH5Sffm" -V # Dataspaces
|
||
|
||
Test Requirements:
|
||
- Java 25+ with --enable-native-access=ALL-UNNAMED
|
||
- FFM bindings JAR (javahdf5-*.jar)
|
||
- JUnit 4.x test framework
|
||
- HDF5 native libraries in LD_LIBRARY_PATH
|
||
|
||
FFM Test Patterns:
|
||
- All tests use Arena.ofConfined() for memory management
|
||
- Proper cleanup in try-with-resources blocks
|
||
- Return value checking with isSuccess() / isValidId()
|
||
- See java/jtest/FfmTestSupport.java for utility methods
|
||
|
||
ROS3 VFD (S3 Cloud Storage):
|
||
- Tests are compatible with both plain and ROS3-enabled builds
|
||
- Use -DHDF5_ENABLE_ROS3_VFD=ON with any Maven preset for ROS3 builds
|
||
- Example: cmake --preset ci-MinShar-GNUC-Maven -DHDF5_ENABLE_ROS3_VFD=ON
|
||
- Same test suite validates both feature sets
|
||
|
||
|
||
========================================================================
|
||
For further assistance, send email to help@hdfgroup.org
|
||
========================================================================
|
||
|
||
|
||
|