mirror of
https://github.com/HDFGroup/hdf5.git
synced 2026-09-25 04:09:44 +03:00
FFM build requires Java 25, Jextract 25. Generates FFM bindings during configure. JNI is default when the requirements are not met or can be forced. Presets added for maven and FFM - JNI is default selection. Enhanced Maven options will work with either JNI or FFM New Workflows for testing and maven uploads. Extensive documentation changes for java.
12 KiB
12 KiB
HDF5 Build System Summary
A comprehensive analysis of the HDF5 CMake-only build system and CI/CD infrastructure for development planning.
Build System Architecture
CMake-Only Migration (March 2025)
- Complete transition: Autotools support was completely dropped in HDF5 2.0
- CMake minimum version: 3.26 required
- Out-of-source builds: Enforced - in-source builds are blocked with clear error messages
Core CMake Structure
Main Configuration Files
CMakeLists.txt- Root build configurationCMakeBuildOptions.cmake- Centralized build option definitionsCMakeFilters.cmake- Compression filter support (zlib, szip, libaec)CMakeTests.cmake- Testing infrastructure configurationCMakeInstallation.cmake- Installation and packaging setupCMakeVOL.cmake- Virtual Object Layer connector supportCMakePlugins.cmake- Plugin architecture supportjava/src/hdf/hdf5lib/pom.xml.in- Maven POM template for Java artifacts
Build Options Categories
Library Types:
BUILD_STATIC_LIBS=ON- Static library buildsBUILD_SHARED_LIBS=ON- Shared library buildsHDF5_ONLY_SHARED_LIBS=OFF- Force shared-only buildsHDF5_BUILD_STATIC_TOOLS=OFF- Static vs shared tools
Language Bindings:
HDF5_BUILD_CPP_LIB=OFF- C++ bindingsHDF5_BUILD_FORTRAN=OFF- Fortran bindingsHDF5_BUILD_JAVA=OFF- Java bindingsHDF5_ENABLE_MAVEN_DEPLOY=OFF- Maven repository deployment supportHDF5_MAVEN_SNAPSHOT=OFF- Build Maven snapshot versions with -SNAPSHOT suffix
Core Features:
HDF5_ENABLE_PARALLEL=OFF- MPI parallel I/O supportHDF5_ENABLE_THREADSAFE=OFF- Thread safety (mutually exclusive with parallel)HDF5_ENABLE_CONCURRENCY=OFF- Multi-threaded concurrencyHDF5_BUILD_HL_LIB=ON- High-level APIsHDF5_BUILD_TOOLS=ON- Command-line utilities
Compression & Filters:
HDF5_ENABLE_ZLIB_SUPPORT=OFF- DEFLATE compressionHDF5_ENABLE_SZIP_SUPPORT=OFF- SZIP compressionHDF5_ENABLE_PLUGIN_SUPPORT=OFF- Runtime plugin loadingHDF5_USE_ZLIB_NG=OFF- Use zlib-ng instead of zlib
Advanced Features:
HDF5_ENABLE_SUBFILING_VFD=OFF- Parallel subfiling VFDHDF5_ENABLE_MAP_API=OFF- Map API (experimental)HDF5_ENABLE_HDFS=OFF- Hadoop HDFS support
CMake Preset System
Preset Architecture
- Layered inheritance: Base presets + feature-specific + platform-specific
- Hidden presets: Reusable components (
ci-base,ci-Debug,ci-Release,ci-Maven,ci-Maven-Snapshot,ci-Maven-Minimal,ci-Maven-Minimal-Snapshot) - Platform presets:
ci-GNUC,ci-Clang,ci-MSVC,ci-macos - Maven presets: Hidden base configurations for Maven deployment support
- Minimal Maven presets: Streamlined configurations for Java artifact generation only
- Build type matrix: Debug, Release (RelWithDebInfo + docs), Maven variants
Key Preset Patterns
# Standard shared library builds
cmake --workflow --preset ci-StdShar-GNUC --fresh # GCC
cmake --workflow --preset ci-StdShar-Clang --fresh # Clang
cmake --workflow --preset ci-StdShar-MSVC --fresh # MSVC
# Maven-enabled builds (Java artifacts with deployment support)
cmake --workflow --preset ci-StdShar-GNUC-Maven --fresh # Maven release (full build)
cmake --workflow --preset ci-StdShar-GNUC-Maven-Snapshot --fresh # Maven snapshot (full build)
cmake --workflow --preset ci-MinShar-GNUC-Maven --fresh # Maven release (minimal build)
cmake --workflow --preset ci-MinShar-GNUC-Maven-Snapshot --fresh # Maven snapshot (minimal build)
# Multi-platform Maven presets (minimal builds for Java artifacts only)
cmake --workflow --preset ci-MinShar-MSVC-Maven --fresh # Windows Maven
cmake --workflow --preset ci-MinShar-Clang-Maven --fresh # macOS Maven
# Naming convention: ci-[Features]-[Compiler][-Maven[-Snapshot]]
# Features: Std (standard), Min (minimal), StdShar (standard shared), MinShar (minimal shared)
# Maven: Adds Maven deployment support with platform-specific JARs
# Snapshot: Adds -SNAPSHOT suffix for development versions
# Minimal Maven presets: Skip examples, testing, tools, C++, Fortran - Java artifacts only
# Java Examples Maven Integration: Comprehensive testing of Java examples with Maven artifacts across all platforms
Preset Configuration Strategy
- Binary directory:
${sourceParentDir}/build/${presetName} - Install directory:
${sourceParentDir}/install/${presetName} - Generator: Ninja (default for most presets)
- External libraries: TGZ/GIT support for zlib, szip, libaec
Testing Infrastructure
Test Framework Structure
- CTest integration: Primary test runner
- Express levels: 0 (exhaustive) to 3 (quick) - default level 3
- Timeout system: Base 1200s, with short/long/very-long variants
- Parallel testing: Separate test infrastructure for MPI builds
Test Categories
- Core tests:
test/- Library unit tests - API tests:
test/API/- Comprehensive API validation - Parallel tests:
testpar/- MPI-specific functionality - Tool tests:
tools/test/- Command-line utility validation - VFD tests: Multiple Virtual File Driver implementations
- VOL tests: Virtual Object Layer connector testing
- Language binding tests: C++, Fortran, Java specific tests
Test Execution Patterns
# Express testing (quick)
export HDF_TEST_EXPRESS=3
ctest -j4
# VFD testing matrix
ctest -R "VFD"
# Parallel testing
ctest -R "MPI\|parallel"
# API comprehensive tests
ctest -R "H5_api_test"
CI/CD Pipeline Architecture
GitHub Actions Matrix
- Comprehensive testing across platforms/compilers
- Multi-dimensional matrix:
- Platforms: Windows (MSVC), Ubuntu (GCC), macOS (Clang)
- Features: Serial, Parallel, Thread-safe, Various language bindings
- Build types: Debug, Release, specialized configurations
Key Workflow Categories
Main CI Workflows:
main.yml- Primary CI across platformsdaily-build.yml- Nightly comprehensive buildsctest.yml- Cross-platform testing with preset system
Specialized Testing:
par-*.yml- Parallel/MPI testing workflowsvfd-*.yml- Virtual File Driver testingvol_*.yml- Virtual Object Layer connector testinganalysis.yml- Static analysis integration
Platform-Specific:
arm-main.yml- ARM architecture testingcygwin.yml,msys2.yml- Windows alternative environmentsintel.yml,aocc.yml,nvhpc.yml- Vendor compiler support
Release Infrastructure:
release.yml- Main release workflow with optional Maven deploymentrelease-files.yml- Automated release packagingtarball.yml- Source distribution creationmaven-deploy.yml- Maven repository deployment workflowmaven-staging.yml- PR-based Maven testing and validation workflowdaily-schedule.yml- Scheduled builds with AWS integration
Build Matrix Strategy
- Cross-platform validation: Windows/Linux/macOS for every PR
- Compiler diversity: GCC, Clang, MSVC, Intel, AOCC, NVHPC
- Feature combinations: Systematic testing of feature interactions
- Performance variants: Debug vs Release vs specialized builds
Packaging & Distribution
Installation System
- Component-based: Libraries, headers, tools, docs, examples
- CMake integration: Full config package support
- Cross-platform: Windows (NSIS/WiX), macOS (DMG/Framework), Linux (DEB/RPM/TGZ)
Release Process
- Automated packaging: CPack integration with platform-specific installers
- Version management: Automatic version extraction from source
- SOVERSION handling: Complex library versioning for different components
- External dependencies: Bundled compression libraries option
Distribution Formats
- Source tarballs: Automated via GitHub Actions
- Binary packages: Platform-specific installers
- Maven repositories: GitHub Packages and Maven Central deployment
- Java artifacts: Platform-specific JARs with classifiers (linux-x86_64, windows-x86_64, macos-x86_64, macos-aarch64)
- Container support: Docker environments for CI
- HPC integration: Specialized configurations for batch systems
Development Workflow Recommendations
Build Strategy
- Use presets for consistency: Leverage the preset system for reproducible builds
- Feature isolation: Test individual features before combining
- Express testing: Use level 3 for development, lower levels for validation
- Parallel development: Separate MPI builds from serial development
Testing Strategy
- Incremental testing: Start with
testhdf5core tests - Feature-specific testing: Use test regex patterns for targeted testing
- Cross-platform validation: Test on primary CI platforms early
- Performance testing: Include Release builds for performance-critical changes
CI Integration
- Workflow triggers: Understand which changes trigger which test suites
- Matrix optimization: Consider CI time costs for comprehensive testing
- Failure isolation: Use workflow categories to isolate platform/feature issues
- External dependency management: Plan for compression library updates
Maven Integration Workflow
- Java Build Configuration: Enable Maven deployment with
HDF5_ENABLE_MAVEN_DEPLOY=ON - Version Management: Use
HDF5_MAVEN_SNAPSHOT=ONfor development builds with-SNAPSHOTsuffix - Preset Selection: Choose Maven-enabled presets (
ci-StdShar-GNUC-Mavenorci-StdShar-GNUC-Maven-Snapshot) - Platform Artifacts: Automatic generation of platform-specific JARs with classifiers (linux-x86_64, windows-x86_64, macos-x86_64, macos-aarch64)
- CI Integration: Conditional Maven artifact generation in
ctest.ymlworkflow via preset system - PR Testing: Automated Maven artifact validation for pull requests via
maven-staging.yml - Validation Framework: Pre-deployment validation using
.github/scripts/validate-maven-artifacts.sh - Repository Selection: Choose between GitHub Packages and Maven Central via workflow inputs
- Release Integration: Optional Maven deployment in release workflow with user control
Critical Dependencies
Build Dependencies
- CMake 3.26+: Required for preset support and modern features
- Ninja: Preferred generator for cross-platform consistency
- Compression libraries: zlib, szip/libaec (optional but commonly used)
- MPI: Required for parallel builds (MPI-3 standard minimum)
- Java 11+: Required for Java bindings and Maven deployment (when
HDF5_BUILD_JAVA=ON) - Maven: Optional for local Maven operations and validation
Platform-Specific Requirements
- Windows: Visual Studio 2022, optional NSIS/WiX for packaging
- macOS: Xcode command line tools, universal binary support
- Linux: GCC/Clang, various package managers for dependencies
Development Tools Integration
- Static analysis: Clang tools integration available
- Code formatting: clang-format integration
- Coverage: Code coverage support for testing
- Sanitizers: Runtime error detection support
- Maven validation:
.github/scripts/validate-maven-artifacts.shfor pre-deployment validation
Future Considerations
Build System Evolution
- CMake modernization: Potential for newer CMake features as minimum version increases
- Preset expansion: More specialized presets for emerging use cases
- Container integration: Enhanced Docker/container support for development
Testing Infrastructure
- Test parallelization: Opportunities for faster CI execution
- Cloud testing: Integration with cloud-native testing platforms
- Performance regression: Automated performance monitoring integration
Platform Support
- Emerging architectures: ARM64, RISC-V support expansion
- New compilers: Integration with emerging compiler technologies
- HPC evolution: Adaptation to evolving supercomputing environments