COMP: Make the CUDA (VKFFT_BACKEND=1) backend installable and consumable #651
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build, test, package | |
| on: [push,pull_request] | |
| env: | |
| itk-git-tag: "v5.4.6" | |
| itk-wheel-tag: "v5.4.6" | |
| itk-python-package-tag: "b698e92e1e4e883256cc3c261481a11b7d675b09" | |
| opencl-icd-loader-git-tag: "v2025.07.22" | |
| opencl-headers-git-tag: "v2025.07.22" | |
| vkfft-backend: 3 | |
| opencl-version: "300" | |
| # Only the modules VkFFTBackend DEPENDS/COMPILE_DEPENDS/TEST_DEPENDS on; | |
| # transitive dependencies are auto-enabled by ITK. | |
| itk-minimal-modules: >- | |
| -DITK_BUILD_DEFAULT_MODULES:BOOL=OFF | |
| -DModule_ITKRegistrationCommon:BOOL=ON | |
| -DModule_ITKConvolution:BOOL=ON | |
| -DModule_ITKFFT:BOOL=ON | |
| -DModule_ITKStatistics:BOOL=ON | |
| -DModule_ITKSmoothing:BOOL=ON | |
| -DModule_ITKImageSources:BOOL=ON | |
| -DModule_ITKTestKernel:BOOL=ON | |
| -DModule_ITKIOImageBase:BOOL=ON | |
| -DModule_ITKImageCompose:BOOL=ON | |
| -DModule_ITKImageIntensity:BOOL=ON | |
| jobs: | |
| build-cxx: | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| max-parallel: 3 | |
| matrix: | |
| os: [ubuntu-24.04, windows-2022, macos-15] | |
| include: | |
| # ctest-filter: ubuntu's conda pocl is verified to compute the | |
| # capped FFT subset correctly, so it runs lint + PoclSafe. windows | |
| # installs no OpenCL ICD and macOS pocl is unverified, so they run | |
| # the lint smoke tests only. | |
| - os: ubuntu-24.04 | |
| c-compiler: "gcc" | |
| cxx-compiler: "g++" | |
| cmake-build-type: "MinSizeRel" | |
| ctest-filter: "VkFFTBackend|PoclSafe" | |
| - os: windows-2022 | |
| c-compiler: "cl.exe" | |
| cxx-compiler: "cl.exe" | |
| cmake-build-type: "Release" | |
| ctest-filter: "VkFFTBackend" | |
| - os: macos-15 | |
| c-compiler: "clang" | |
| cxx-compiler: "clang++" | |
| cmake-build-type: "MinSizeRel" | |
| ctest-filter: "VkFFTBackend" | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Set up Python 3.9 | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.9" | |
| - name: Install build dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install ninja | |
| - name: Get specific version of CMake, Ninja | |
| uses: lukka/get-cmake@v4.3.3 | |
| - name: Download OpenCL-SDK | |
| if: matrix.os == 'macos-15' | |
| run: | | |
| cd .. | |
| git clone --recursive https://github.com/KhronosGroup/OpenCL-SDK.git | |
| cd OpenCL-SDK | |
| shell: bash | |
| - name: Download OpenCL-ICD-Loader | |
| run: | | |
| cd .. | |
| git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader | |
| pushd OpenCL-ICD-Loader | |
| git checkout ${{ env.opencl-icd-loader-git-tag }} | |
| popd | |
| pushd OpenCL-ICD-Loader/inc | |
| git clone https://github.com/KhronosGroup/OpenCL-Headers | |
| pushd OpenCL-Headers | |
| git checkout ${{ env.opencl-headers-git-tag }} | |
| popd | |
| cp -r OpenCL-Headers/CL ./ | |
| popd | |
| shell: bash | |
| - name: Install pocl (Linux, via conda-forge) | |
| if: matrix.os == 'ubuntu-24.04' | |
| run: | | |
| # Accept Anaconda's repo.anaconda.com ToS for main/r so the | |
| # non-interactive solver does not refuse with CondaToSNonInteractiveError. | |
| # The pocl install itself comes from conda-forge. | |
| sudo conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main | |
| sudo conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r | |
| sudo conda config --add channels conda-forge | |
| sudo conda config --set channel_priority strict | |
| sudo conda install -y -c conda-forge pocl | |
| shell: bash | |
| - name: Install pocl (macOS, via Homebrew) | |
| if: matrix.os == 'macos-15' | |
| run: | | |
| # Conda is not on sudo's PATH on macos-15 runner images, so the | |
| # Linux conda-forge path does not work here. Homebrew's pocl | |
| # formula provides an equivalent CPU OpenCL ICD. | |
| brew update | |
| brew install pocl | |
| shell: bash | |
| - name: Download ITK | |
| run: | | |
| cd .. | |
| git clone https://github.com/InsightSoftwareConsortium/ITK.git | |
| cd ITK | |
| git checkout ${{ env.itk-git-tag }} | |
| - name: Build OpenCL-SDK | |
| if: matrix.os == 'macos-15' | |
| run: | | |
| cd .. | |
| mkdir OpenCL-SDK-build | |
| cd OpenCL-SDK-build | |
| cmake -DCMAKE_C_COMPILER:FILEPATH="${{ matrix.c-compiler }}" -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake-build-type }} -DOPENCL_SDK_BUILD_SAMPLES:BOOL=OFF -GNinja ../OpenCL-SDK | |
| sudo cmake --build . --target install | |
| shell: bash | |
| - name: Build OpenCL-ICD-Loader | |
| if: matrix.os != 'windows-2022' | |
| run: | | |
| cd .. | |
| mkdir OpenCL-ICD-Loader-build | |
| cd OpenCL-ICD-Loader-build | |
| cmake -DCMAKE_C_COMPILER:FILEPATH="${{ matrix.c-compiler }}" -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake-build-type }} -DBUILD_TESTING:BOOL=OFF -GNinja ../OpenCL-ICD-Loader | |
| sudo cmake --build . --target install | |
| - name: Build OpenCL-ICD-Loader | |
| if: matrix.os == 'windows-2022' | |
| run: | | |
| cd .. | |
| mkdir OpenCL-ICD-Loader-build | |
| cd OpenCL-ICD-Loader-build | |
| call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" | |
| cmake -DCMAKE_C_COMPILER:FILEPATH="${{ matrix.c-compiler }}" -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake-build-type }} -DBUILD_TESTING:BOOL=OFF -GNinja ../OpenCL-ICD-Loader | |
| cmake --build . --target install | |
| shell: cmd | |
| - name: Build ITK | |
| if: matrix.os != 'windows-2022' | |
| run: | | |
| cd .. | |
| mkdir ITK-build | |
| cd ITK-build | |
| cmake -DCMAKE_C_COMPILER:FILEPATH="${{ matrix.c-compiler }}" -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake-build-type }} -DBUILD_TESTING:BOOL=OFF ${{ env.itk-minimal-modules }} -GNinja ../ITK | |
| ninja | |
| - name: Build ITK | |
| if: matrix.os == 'windows-2022' | |
| run: | | |
| cd .. | |
| mkdir ITK-build | |
| cd ITK-build | |
| call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" | |
| cmake -DCMAKE_C_COMPILER:FILEPATH="${{ matrix.c-compiler }}" -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake-build-type }} -DBUILD_TESTING:BOOL=OFF ${{ env.itk-minimal-modules }} -GNinja ../ITK | |
| ninja | |
| shell: cmd | |
| - name: Fetch CTest driver script | |
| run: | | |
| curl -L https://raw.githubusercontent.com/InsightSoftwareConsortium/ITK/dashboard/itk_common.cmake -O | |
| - name: Configure CTest script | |
| run: | | |
| operating_system="${{ matrix.os }}" | |
| cat > dashboard.cmake << EOF | |
| set(CTEST_SITE "GitHubActions") | |
| file(TO_CMAKE_PATH "\$ENV{GITHUB_WORKSPACE}/.." CTEST_DASHBOARD_ROOT) | |
| file(TO_CMAKE_PATH "\$ENV{GITHUB_WORKSPACE}/" CTEST_SOURCE_DIRECTORY) | |
| file(TO_CMAKE_PATH "\$ENV{GITHUB_WORKSPACE}/../build" CTEST_BINARY_DIRECTORY) | |
| set(dashboard_source_name "${GITHUB_REPOSITORY}") | |
| if(ENV{GITHUB_REF} MATCHES "master") | |
| set(branch "-master") | |
| set(dashboard_model "Continuous") | |
| else() | |
| set(branch "-${GITHUB_REF}") | |
| set(dashboard_model "Experimental") | |
| endif() | |
| set(CTEST_BUILD_NAME "${GITHUB_REPOSITORY}-${operating_system}-\${branch}") | |
| set(CTEST_UPDATE_VERSION_ONLY 1) | |
| set(CTEST_TEST_ARGS \${CTEST_TEST_ARGS} PARALLEL_LEVEL \${PARALLEL_LEVEL}) | |
| set(CTEST_BUILD_CONFIGURATION "Release") | |
| set(CTEST_CMAKE_GENERATOR "Ninja") | |
| set(CTEST_CUSTOM_WARNING_EXCEPTION | |
| \${CTEST_CUSTOM_WARNING_EXCEPTION} | |
| # macOS Azure VM Warning | |
| "ld: warning: text-based stub file" | |
| # VkFFT benchmark warning | |
| "warning: ignoring return value" | |
| # VkFFT v1.3.x calls sprintf, deprecated on macOS SDK 15+. | |
| # CDash extracts each 'note:' continuation line as a separate | |
| # warning record, so the macro-name filter is what actually | |
| # reduces the count to zero. | |
| "deprecated-declarations" | |
| "is deprecated" | |
| "has been explicitly marked deprecated" | |
| "__deprecated_msg" | |
| "expanded from macro" | |
| # VkFFT R2R kernel has '/*' inside block comments | |
| "'/\\*' within block comment" | |
| "-Wcomment" | |
| ) | |
| set(dashboard_no_clean 1) | |
| set(ENV{CC} ${{ matrix.c-compiler }}) | |
| set(ENV{CXX} ${{ matrix.cxx-compiler }}) | |
| if(WIN32) | |
| set(ENV{PATH} "\${CTEST_DASHBOARD_ROOT}/ITK-build/bin;\$ENV{PATH}") | |
| endif() | |
| file(TO_CMAKE_PATH "\${CTEST_DASHBOARD_ROOT}/OpenCL-ICD-Loader/inc" OpenCL_INCLUDE_DIR) | |
| find_library(OpenCL_LIBRARY OpenCL PATHS \${CTEST_DASHBOARD_ROOT}/OpenCL-ICD-Loader-build REQUIRED) | |
| set(VKFFT_BACKEND ${{ env.vkfft-backend }} CACHE STRING "0 - Vulkan, 1 - CUDA, 2 - HIP, 3 - OpenCL") | |
| set(dashboard_cache " | |
| VKFFT_BACKEND=\${VKFFT_BACKEND} | |
| CL_TARGET_OPENCL_VERSION=${{ env.opencl-version }} | |
| OpenCL_INCLUDE_DIR:PATH=\${OpenCL_INCLUDE_DIR} | |
| OpenCL_LIBRARY:FILEPATH=\${OpenCL_LIBRARY} | |
| ITK_DIR:PATH=\${CTEST_DASHBOARD_ROOT}/ITK-build | |
| BUILD_TESTING:BOOL=ON | |
| ") | |
| string(TIMESTAMP build_date "%Y-%m-%d") | |
| message("CDash Build Identifier: \${build_date} \${CTEST_BUILD_NAME}") | |
| message("CTEST_SITE = \${CTEST_SITE}") | |
| message("dashboard_cache = \${dashboard_cache}") | |
| include(\${CTEST_SCRIPT_DIRECTORY}/itk_common.cmake) | |
| EOF | |
| cat dashboard.cmake | |
| shell: bash | |
| - name: Build and test | |
| if: matrix.os != 'windows-2022' | |
| shell: bash | |
| run: | | |
| # Point the freshly-built KhronosGroup ICD loader at conda's | |
| # pocl ICD vendor file. By default the loader only checks | |
| # /etc/OpenCL/vendors, but conda drops pocl.icd under its env | |
| # prefix (typically /usr/share/miniconda or ~/miniconda). | |
| for d in /usr/share/miniconda/etc/OpenCL/vendors \ | |
| /opt/miniconda3/etc/OpenCL/vendors \ | |
| "$HOME/miniconda3/etc/OpenCL/vendors" \ | |
| "$CONDA_PREFIX/etc/OpenCL/vendors"; do | |
| if [ -d "$d" ]; then | |
| export OCL_ICD_VENDORS="$d" | |
| break | |
| fi | |
| done | |
| echo "Using OCL_ICD_VENDORS=${OCL_ICD_VENDORS:-/etc/OpenCL/vendors}" | |
| ls -la "${OCL_ICD_VENDORS:-/etc/OpenCL/vendors}" 2>/dev/null || true | |
| # Hosted runners ship only pocl (CPU OpenCL), which diverges from | |
| # real-GPU OpenCL on VkFFT's larger Bluestein kernels (size-19 inverse) | |
| # and on the stored-baseline image comparisons. Run the lint smoke | |
| # tests plus the pocl-safe FFT round-trip subset (capped at size 16); | |
| # full-size and baseline FFT correctness run on the GPU runner. | |
| ctest --output-on-failure -j 2 -V -S dashboard.cmake -R "${{ matrix.ctest-filter }}" | |
| - name: Build and test | |
| if: matrix.os == 'windows-2022' | |
| run: | | |
| call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" | |
| # Hosted runners ship only pocl (CPU OpenCL), which diverges from | |
| # real-GPU OpenCL on VkFFT's larger Bluestein kernels (size-19 inverse) | |
| # and on the stored-baseline image comparisons. Run the lint smoke | |
| # tests plus the pocl-safe FFT round-trip subset (capped at size 16); | |
| # full-size and baseline FFT correctness run on the GPU runner. | |
| ctest --output-on-failure -j 2 -V -S dashboard.cmake -R "${{ matrix.ctest-filter }}" | |
| shell: cmd | |
| build-backend: | |
| name: build-backend (${{ matrix.backend-name }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-24.04 | |
| backend: 1 | |
| backend-name: CUDA | |
| c-compiler: "gcc" | |
| cxx-compiler: "g++" | |
| - os: ubuntu-24.04 | |
| backend: 4 | |
| backend-name: LevelZero | |
| c-compiler: "gcc" | |
| cxx-compiler: "g++" | |
| - os: macos-15 | |
| backend: 5 | |
| backend-name: Metal | |
| c-compiler: "clang" | |
| cxx-compiler: "clang++" | |
| run-tests: true | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Set up Python 3.9 | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.9" | |
| - name: Install build dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install ninja | |
| shell: bash | |
| - name: Get specific version of CMake, Ninja | |
| uses: lukka/get-cmake@v4.3.3 | |
| - name: Install CUDA toolkit | |
| if: matrix.backend == 1 | |
| uses: Jimver/cuda-toolkit@v0.2.35 | |
| with: | |
| method: network | |
| sub-packages: '["nvcc", "cudart", "cudart-dev", "nvrtc", "nvrtc-dev"]' | |
| non-cuda-sub-packages: '["libcufft", "libcufft-dev"]' | |
| - name: Build Level Zero loader and headers | |
| if: matrix.backend == 4 | |
| run: | | |
| git clone --depth 1 https://github.com/oneapi-src/level-zero.git ../level-zero | |
| cmake -S ../level-zero -B ../level-zero-build -GNinja \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_INSTALL_PREFIX=/usr | |
| sudo cmake --build ../level-zero-build --target install | |
| echo "LEVEL_ZERO_ROOT=/usr" >> "$GITHUB_ENV" | |
| shell: bash | |
| - name: Download ITK | |
| run: | | |
| git clone https://github.com/InsightSoftwareConsortium/ITK.git ../ITK | |
| git -C ../ITK checkout ${{ env.itk-git-tag }} | |
| shell: bash | |
| - name: Build minimal ITK (module dependencies only, no tests) | |
| run: | | |
| cmake -S ../ITK -B ../ITK-build -GNinja \ | |
| -DCMAKE_C_COMPILER="${{ matrix.c-compiler }}" \ | |
| -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" \ | |
| -DCMAKE_BUILD_TYPE=MinSizeRel \ | |
| -DBUILD_SHARED_LIBS=ON \ | |
| -DBUILD_TESTING=OFF \ | |
| ${{ env.itk-minimal-modules }} | |
| cmake --build ../ITK-build | |
| shell: bash | |
| - name: Configure VkFFTBackend (VKFFT_BACKEND=${{ matrix.backend }}) | |
| run: | | |
| extra_args=() | |
| if [ "${{ matrix.backend }}" = "1" ]; then | |
| # No GPU on the runner: link against the CUDA driver stub. | |
| extra_args+=("-DCMAKE_SHARED_LINKER_FLAGS=-L${CUDA_PATH}/lib64/stubs") | |
| extra_args+=("-DCUDA_USE_STATIC_CUDA_RUNTIME=OFF") | |
| fi | |
| cmake -S . -B ../module-build -GNinja \ | |
| -DCMAKE_C_COMPILER="${{ matrix.c-compiler }}" \ | |
| -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" \ | |
| -DCMAKE_BUILD_TYPE=MinSizeRel \ | |
| -DBUILD_SHARED_LIBS=ON \ | |
| -DBUILD_TESTING=${{ matrix.run-tests && 'ON' || 'OFF' }} \ | |
| -DITK_DIR="$(cd ../ITK-build && pwd)" \ | |
| -DVKFFT_BACKEND=${{ matrix.backend }} \ | |
| "${extra_args[@]}" | |
| shell: bash | |
| - name: Compile VkFFTBackend | |
| run: cmake --build ../module-build | |
| shell: bash | |
| - name: Run tests | |
| if: matrix.run-tests | |
| run: ctest --test-dir ../module-build --output-on-failure -j 2 | |
| shell: bash | |
| build-windows-opencl-python-packages: | |
| # DISABLED — building Python wheels for ITK 6.0b02 on Windows requires | |
| # ITKPythonBuilds-windows.zip to ship a castxml wrapping config that | |
| # uses -std:c++17. The current v6.0b02 archive still passes | |
| # -std:c++14 to castxml, which can't parse ITK 6's C++17 CTAD | |
| # deduction guide in Modules/Core/Common/include/itkArray.h:217 | |
| # ("error: a type specifier is required for all declarations"). | |
| # Re-enable once ITKPythonBuilds-windows ships the std bump. | |
| if: false | |
| runs-on: windows-2022 | |
| strategy: | |
| max-parallel: 2 | |
| matrix: | |
| python-version-minor: ["10", "11"] | |
| include: | |
| - c-compiler: "cl.exe" | |
| cxx-compiler: "cl.exe" | |
| cmake-build-type: "MinSizeRel" | |
| steps: | |
| - name: Get specific version of CMake, Ninja | |
| uses: lukka/get-cmake@v4.3.3 | |
| - uses: actions/checkout@v5 | |
| with: | |
| path: "im" | |
| - name: 'Install Python' | |
| run: | | |
| $pythonArch = "64" | |
| $pythonVersion = "3.${{ matrix.python-version-minor }}" | |
| iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/scikit-build/scikit-ci-addons/master/windows/install-python.ps1')) | |
| - name: 'Fetch build dependencies' | |
| shell: bash | |
| run: | | |
| mv im ../../ | |
| cd ../../im | |
| curl -L "https://github.com/InsightSoftwareConsortium/ITKPythonBuilds/releases/download/${{ env.itk-wheel-tag }}/ITKPythonBuilds-windows.zip" -o "ITKPythonBuilds-windows.zip" | |
| 7z x ITKPythonBuilds-windows.zip -o/c/P -aoa -r | |
| curl -L "https://data.kitware.com/api/v1/file/5c0ad59d8d777f2179dd3e9c/download" -o "doxygen-1.8.11.windows.bin.zip" | |
| 7z x doxygen-1.8.11.windows.bin.zip -o/c/P/doxygen -aoa -r | |
| curl -L "https://data.kitware.com/api/v1/file/5bbf87ba8d777f06b91f27d6/download/grep-win.zip" -o "grep-win.zip" | |
| 7z x grep-win.zip -o/c/P/grep -aoa -r | |
| echo "Updating ITKPythonPackage build scripts to ${{ env.itk-python-package-tag }}" | |
| pushd /c/P/IPP | |
| git remote add InsightSoftwareConsortium https://github.com/InsightSoftwareConsortium/ITKPythonPackage.git --tags | |
| git fetch InsightSoftwareConsortium | |
| git checkout ${{ env.itk-python-package-tag }} | |
| git status | |
| popd | |
| - name: Download OpenCL-ICD-Loader | |
| run: | | |
| cd .. | |
| git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader | |
| pushd OpenCL-ICD-Loader | |
| git checkout ${{ env.opencl-icd-loader-git-tag }} | |
| popd | |
| pushd OpenCL-ICD-Loader/inc | |
| git clone https://github.com/KhronosGroup/OpenCL-Headers | |
| pushd OpenCL-Headers | |
| git checkout ${{ env.opencl-headers-git-tag }} | |
| popd | |
| cp -r OpenCL-Headers/CL ./ | |
| popd | |
| shell: bash | |
| - name: Build OpenCL-ICD-Loader | |
| run: | | |
| cd .. | |
| mkdir OpenCL-ICD-Loader-build | |
| cd OpenCL-ICD-Loader-build | |
| call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" | |
| cmake -DCMAKE_C_COMPILER:FILEPATH="${{ matrix.c-compiler }}" -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" -DCMAKE_BUILD_TYPE:STRING=${{ matrix.cmake-build-type }} -DBUILD_TESTING:BOOL=OFF -GNinja ../OpenCL-ICD-Loader | |
| cmake --build . --target install | |
| shell: cmd | |
| - name: 'Build 🐍 Python 📦 package' | |
| run: | | |
| cd ../../im | |
| call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" | |
| set PATH=C:\P\grep;%PATH% | |
| set CC=cl.exe | |
| set CXX=cl.exe | |
| C:\Python3${{ matrix.python-version-minor }}-x64\python.exe C:\P\IPP\scripts\windows_build_module_wheels.py --py-envs "3${{ matrix.python-version-minor }}-x64" --no-cleanup --lib-paths="${{ github.workspace}}/../OpenCL-ICD-Loader-build" -- "-DOpenCL_INCLUDE_DIR:PATH=${{ github.workspace}}/../OpenCL-ICD-Loader/inc" "-DOpenCL_LIBRARY:FILEPATH=${{ github.workspace}}/../OpenCL-ICD-Loader-build/OpenCL.lib" | |
| shell: cmd | |
| - name: Publish Python package as GitHub Artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: WindowsWheel3.${{ matrix.python-version-minor }} | |
| path: ../../im/dist | |
| build-linux-opencl-python-packages: | |
| # DISABLED — all three Python wheel jobs (linux, macos, windows) are | |
| # gated off in this PR while upstream ITKPythonBuilds and ITKPythonPackage | |
| # release-5.4 catch up to ITK 6.x. Re-enable as a follow-up PR once | |
| # InsightSoftwareConsortium/ITKPythonBuilds#3 (and the linux dockcross | |
| # image regression) are addressed. | |
| if: false | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| max-parallel: 2 | |
| matrix: | |
| python-version: ["310", "311"] | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: 'Free up disk space' | |
| run: | | |
| # Workaround for https://github.com/actions/virtual-environments/issues/709 | |
| df -h | |
| sudo apt-get clean | |
| sudo rm -rf "/usr/local/share/boost" | |
| sudo rm -rf "$AGENT_TOOLSDIRECTORY" | |
| df -h | |
| - name: 'Fetch build dependencies' | |
| shell: bash | |
| run: | | |
| sudo apt-get install zstd | |
| unzstd --version | |
| - name: 'Build 🐍 Python 📦 package' | |
| run: | | |
| export ITK_PACKAGE_VERSION=${{ env.itk-wheel-tag }} | |
| export ITKPYTHONPACKAGE_TAG=${{ env.itk-python-package-tag }} | |
| export MANYLINUX_VERSION="_2_28" | |
| echo "Building for manylinux specialization ${MANYLINUX_VERSION}" | |
| ./wrapping/dockcross-manylinux-download-cache.sh cp${{ matrix.python-version }} | |
| ./wrapping/dockcross-manylinux-build-module-wheels-opencl.sh cp${{ matrix.python-version }} | |
| - name: Publish Python package as GitHub Artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: LinuxOpenCLWheel${{ matrix.python-version }} | |
| path: dist | |
| build-macos-opencl-python-packages: | |
| # DISABLED — same root cause as build-windows-opencl-python-packages: | |
| # ITKPythonBuilds-macosx-arm64.tar.zst v6.0b02 ships a pre-built ITK | |
| # configured with CMAKE_CXX_STANDARD=14, so building ITK-source wheels | |
| # against it fails on C++17-only standard-library names | |
| # (std::is_convertible_v, std::is_same_v, ...). See | |
| # InsightSoftwareConsortium/ITKPythonBuilds#3. Re-enable once | |
| # ITKPythonBuilds ships a release with CMAKE_CXX_STANDARD>=17. | |
| if: false | |
| runs-on: macos-15 | |
| strategy: | |
| max-parallel: 2 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: 'Select Xcode' | |
| run: | | |
| XCODE_APP=$(ls -d /Applications/Xcode*.app 2>/dev/null | sort -V | tail -1) | |
| sudo xcode-select -s "${XCODE_APP}/Contents/Developer" | |
| - name: Get specific version of CMake, Ninja | |
| uses: lukka/get-cmake@v4.3.3 | |
| - name: 'Fetch build script' | |
| run: | | |
| curl -L https://raw.githubusercontent.com/InsightSoftwareConsortium/ITKPythonPackage/${{ env.itk-python-package-tag }}/scripts/macpython-download-cache-and-build-module-wheels.sh -O | |
| # Upstream v6.0b02 ships a for-loop bug: | |
| # for version in "$PYTHON_VERSIONS"; do ... ITK-${version}-macosx* ... | |
| # The quotes around $PYTHON_VERSIONS cause one iteration with the | |
| # full space-separated string, so gtar gets "ITK-3.10 3.11-macosx*" | |
| # (or "ITK--macosx*" when empty) and fails. Unquote so the loop | |
| # iterates word-by-word. | |
| sed -i.bak 's/for version in "\$PYTHON_VERSIONS"/for version in $PYTHON_VERSIONS/' \ | |
| macpython-download-cache-and-build-module-wheels.sh | |
| chmod u+x macpython-download-cache-and-build-module-wheels.sh | |
| - name: 'Build 🐍 Python 📦 package' | |
| run: | | |
| export ITK_PACKAGE_VERSION=${{ env.itk-wheel-tag }} | |
| export ITKPYTHONPACKAGE_TAG=${{ env.itk-python-package-tag }} | |
| export MACOSX_DEPLOYMENT_TARGET=14 | |
| ./macpython-download-cache-and-build-module-wheels.sh 3.10 3.11 | |
| - name: Publish Python package as GitHub Artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: MacOSOpenCLWheels | |
| path: dist | |
| publish-python-packages-to-pypi: | |
| needs: | |
| - build-linux-opencl-python-packages | |
| - build-macos-opencl-python-packages | |
| - build-windows-opencl-python-packages | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Download Python Packages | |
| uses: actions/download-artifact@v4 | |
| - name: Prepare packages for upload | |
| run: | | |
| ls -R | |
| for d in */; do | |
| mv ${d}/*.whl . | |
| done | |
| mkdir dist | |
| mv *.whl dist/ | |
| ls dist | |
| - name: Publish 🐍 Python 📦 package to PyPI | |
| if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') | |
| uses: pypa/gh-action-pypi-publish@v1.14.0 | |
| with: | |
| user: __token__ | |
| password: ${{ secrets.pypi_password }} |