name: hdf5 dev CI # Triggers the workflow on a call from another workflow on: workflow_call: inputs: cmake_version: description: "3.26.0 or later, latest" required: true type: string thread_safety: description: "TS or empty" required: true type: string concurrent: description: "CC or empty" required: true type: string build_mode: description: "release vs. debug build" required: true type: string save_binary: description: "binary-ext-name or missing" required: false default: "skip" type: string java_version: description: "Java version for testing (11, 17, 21, 24, latest, auto)" required: false default: "auto" type: string force_java_implementation: description: "Force specific Java implementation (auto, ffm, jni)" required: false default: "jni" type: string win_runner: description: "Windows runner version to use (windows-2022, windows-latest, etc.)" required: false default: "windows-latest" type: string win_vs_generator: description: "CMake generator to use for Visual Studio" required: false default: "Visual Studio 18 2026" type: string permissions: contents: read env: CTEST_OUTPUT_ON_FAILURE: 1 jobs: # A workflow that builds the library and runs all the tests Build_and_test: strategy: # The current matrix has one dimensions: # # * config name # # Most configuration information is added via the 'include' mechanism, # which will append the key-value pairs in the configuration where the # names match. matrix: name: - "Windows MSVC" - "Ubuntu gcc" - "MacOS Clang" # This is where we list the bulk of the options for each configuration. # The key-value pair values are usually appropriate for being CMake # configure values, so be aware of that. include: # Windows w/ MSVC # # No Fortran, parallel, or VFDs that rely on POSIX things - name: "Windows MSVC" ostype: windows os: ${{ inputs.win_runner }} shared: ON cpp: ON fortran: OFF java: ON docs: ON libaecfc: ON localaec: OFF zlibfc: ON localzlib: OFF parallel: OFF mirror_vfd: OFF direct_vfd: OFF generator: "-G \"${{ inputs.win_vs_generator }}\" -A x64" run_tests: true # Linux (Ubuntu) w/ gcc # - name: "Ubuntu gcc" ostype: ubuntu os: ubuntu-24.04 shared: ON cpp: ON fortran: ON java: ON docs: ON libaecfc: ON localaec: OFF zlibfc: ON localzlib: OFF parallel: OFF mirror_vfd: ON direct_vfd: ON generator: "-G Ninja" run_tests: true # MacOS w/ Clang # - name: "MacOS Clang" ostype: macos os: macos-15 shared: ON cpp: ON fortran: OFF java: ON docs: ON libaecfc: ON localaec: OFF zlibfc: ON localzlib: OFF parallel: OFF mirror_vfd: ON direct_vfd: OFF generator: "-G Ninja" run_tests: true # Sets the job's name from the properties name: "${{ matrix.name }}-${{ inputs.build_mode }}-${{ inputs.thread_safety }}-${{ inputs.concurrent }}" # Don't run the action if the commit message says to skip CI if: "!contains(github.event.head_commit.message, 'skip-ci')" # The type of runner that the job will run on runs-on: ${{ matrix.os }} # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - name: Get Sources uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup Doxygen uses: ./.github/actions/setup-doxygen #Useful for debugging - name: Dump matrix context run: echo '${{ toJSON(matrix) }}' - name: Install Dependencies (Linux) run: | sudo apt-get update sudo apt-get install ninja-build graphviz sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev if: matrix.ostype == 'ubuntu' # CMake gets libaec from fetchcontent - name: Install CMake uses: lukka/get-cmake@fffaaafeea488556c2c12dad60690008bc1caacb # latest with: cmakeVersion: ${{ inputs.cmake_version }} ninjaVersion: latest - name: Check CMake Version shell: bash run: | which cmake cmake --version - name: Set up Java (if specified or FFM required) if: inputs.java_version != 'auto' || inputs.force_java_implementation == 'ffm' uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v5 with: distribution: ${{ inputs.force_java_implementation == 'ffm' && 'oracle' || 'temurin' }} java-version: | ${{ inputs.force_java_implementation == 'ffm' && '25' || inputs.java_version == 'latest' && '24' || inputs.java_version }} - name: Verify Java Setup if: inputs.java_version != 'auto' || inputs.force_java_implementation == 'ffm' run: | java -version echo "JAVA_HOME=$JAVA_HOME" echo "Selected Java implementation: ${{ inputs.force_java_implementation }}" - name: Set environment for MSVC (Windows) run: | # Set these environment variables so CMake picks the correct compiler echo "CXX=cl.exe" >> $GITHUB_ENV echo "CC=cl.exe" >> $GITHUB_ENV if: matrix.ostype == 'windows' - name: Setup jextract (FFM builds only) if: ${{ inputs.force_java_implementation == 'ffm' }} uses: ./.github/actions/setup-jextract with: java-version: '25' # CONFIGURE - name: Configure run: | mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ ${{ matrix.generator }} \ --log-level=VERBOSE \ -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ -DBUILD_SHARED_LIBS:BOOL=${{ matrix.shared }} \ -DHDF5_ENABLE_ALL_WARNINGS:BOOL=ON \ -DHDF5_ENABLE_DOXY_WARNINGS:BOOL=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} \ -DHDF5_BUILD_CPP_LIB:BOOL=${{ matrix.cpp }} \ -DHDF5_BUILD_FORTRAN:BOOL=${{ matrix.fortran }} \ -DHDF5_BUILD_JAVA:BOOL=${{ matrix.java }} \ -DHDF5_BUILD_DOC:BOOL=${{ matrix.docs }} \ -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=${{ matrix.zlibfc }} \ -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=${{ matrix.libaecfc }} \ -DLIBAEC_USE_LOCALCONTENT:BOOL=${{ matrix.localaec }} \ -DZLIB_USE_LOCALCONTENT:BOOL=${{ matrix.localzlib }} \ -DHDF5_TEST_API:BOOL=ON \ -DHDF5_TEST_SHELL_SCRIPTS:BOOL=ON \ -DENABLE_EXTENDED_TESTS:BOOL=OFF \ -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} \ -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} \ -DHDF5_PACK_EXAMPLES:BOOL=ON \ -DHDF5_PACKAGE_EXTLIBS:BOOL=ON \ -DHDF5_PACK_MACOSX_DMG:BOOL=OFF \ -DHDF5_ENABLE_JNI:BOOL=${{ inputs.force_java_implementation == 'jni' }} \ $GITHUB_WORKSPACE shell: bash if: ${{ inputs.thread_safety != 'TS' && inputs.concurrent != 'CC'}} - name: Configure (Thread-Safe) run: | mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ ${{ matrix.generator }} \ -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ -DBUILD_SHARED_LIBS:BOOL=ON \ -DBUILD_STATIC_LIBS:BOOL=${{ (matrix.ostype != 'windows') }} \ -DHDF5_ENABLE_ALL_WARNINGS:BOOL=ON \ -DHDF5_ENABLE_THREADSAFE:BOOL=ON \ -DHDF5_ENABLE_CONCURRENCY:BOOL=OFF \ -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} \ -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ -DHDF5_BUILD_FORTRAN:BOOL=OFF \ -DHDF5_BUILD_JAVA:BOOL=OFF \ -DHDF5_BUILD_HL_LIB:BOOL=OFF \ -DHDF5_BUILD_DOC:BOOL=OFF \ -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=${{ matrix.zlibfc }} \ -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=${{ matrix.libaecfc }} \ -DLIBAEC_USE_LOCALCONTENT:BOOL=${{ matrix.localaec }} \ -DZLIB_USE_LOCALCONTENT:BOOL=${{ matrix.localzlib }} \ -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} \ -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} \ -DHDF5_PACK_EXAMPLES:BOOL=ON \ -DHDF5_PACK_MACOSX_DMG:BOOL=OFF \ $GITHUB_WORKSPACE shell: bash if: ${{ inputs.thread_safety == 'TS' && inputs.concurrent != 'CC'}} - name: Configure (Concurrency) run: | mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ ${{ matrix.generator }} \ -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ -DBUILD_SHARED_LIBS=ON \ -DBUILD_STATIC_LIBS=${{ (matrix.ostype != 'windows') }} \ -DHDF5_ENABLE_ALL_WARNINGS=ON \ -DHDF5_ENABLE_THREADSAFE:BOOL=OFF \ -DHDF5_ENABLE_CONCURRENCY:BOOL=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} \ -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ -DHDF5_BUILD_FORTRAN:BOOL=OFF \ -DHDF5_BUILD_JAVA:BOOL=OFF \ -DHDF5_BUILD_HL_LIB:BOOL=OFF \ -DHDF5_BUILD_DOC=OFF \ -DLIBAEC_USE_LOCALCONTENT=${{ matrix.localaec }} \ -DZLIB_USE_LOCALCONTENT=${{ matrix.localzlib }} \ -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} \ -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} \ -DHDF5_PACK_EXAMPLES:BOOL=ON \ $GITHUB_WORKSPACE shell: bash if: ${{ inputs.thread_safety != 'TS' && inputs.concurrent == 'CC'}} # BUILD - name: Build run: cmake --build . --parallel 3 --config ${{ inputs.build_mode }} working-directory: ${{ runner.workspace }}/build # RUN TESTS - name: Run Tests run: ctest . --parallel 2 -C ${{ inputs.build_mode }} working-directory: ${{ runner.workspace }}/build if: ${{ matrix.run_tests }} - name: Run Package run: | if [[ "${{ matrix.ostype }}" == "macos" ]]; then # Disable indexing to prevent file locking during CPack sudo mdutil -i off / || true # Run cpack with retry cpack -C ${{ inputs.build_mode }} -V || (sleep 5 && cpack -C ${{ inputs.build_mode }} -V) else cpack -C ${{ inputs.build_mode }} -V fi working-directory: ${{ runner.workspace }}/build shell: bash # if: ${{ (matrix.ostype != 'macos') && (inputs.build_mode != 'Debug') }} # - name: Run Package (Mac_latest) # run: cpack -C ${{ inputs.build_mode }} -G STGZ -V # if: ${{ (matrix.ostype == 'macos') }} - name: List files in the space run: | ls -l ${{ runner.workspace }}/build # Save files created by CTest script - name: Save published binary (Windows) uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v5 with: name: zip-vs2026_cl-${{ inputs.build_mode }}-${{ inputs.save_binary }}-binary path: ${{ runner.workspace }}/build/HDF5-*-win64.zip if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` if: ${{ (matrix.ostype == 'windows') && ( inputs.save_binary != 'skip') }} - name: Save published binary (linux) uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v5 with: name: tgz-ubuntu-2404_gcc-${{ inputs.build_mode }}-${{ inputs.save_binary }}-binary path: ${{ runner.workspace }}/build/HDF5-*-Linux.tar.gz if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` if: ${{ (matrix.ostype == 'ubuntu') && ( inputs.save_binary != 'skip') }} - name: Save published binary (Mac_latest) uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v5 with: name: tgz-macos15_clang-${{ inputs.build_mode }}-${{ inputs.save_binary }}-binary path: ${{ runner.workspace }}/build/HDF5-*-Darwin.tar.gz if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` if: ${{ (matrix.ostype == 'macos') && ( inputs.save_binary != 'skip') }}