|  | name: Linux | 
|  |  | 
|  | on: [push, pull_request] | 
|  |  | 
|  | jobs: | 
|  | build: | 
|  | name: ${{matrix.os}}-${{matrix.build_type}}-${{matrix.lib}}-${{matrix.gpu}} | 
|  | runs-on: ubuntu-latest | 
|  | container: ${{matrix.os}} | 
|  | defaults: | 
|  | run: | 
|  | shell: bash -e -o pipefail {0} | 
|  | env: | 
|  | CCACHE_DIR: ${{github.workspace}}/ccache | 
|  | CMAKE_GENERATOR: Ninja | 
|  | DEBIAN_FRONTEND: noninteractive | 
|  | strategy: | 
|  | fail-fast: true | 
|  | matrix: | 
|  | os: | 
|  | - ubuntu:22.04 | 
|  | - ubuntu:24.04 | 
|  | build_type: | 
|  | - Release | 
|  | lib: | 
|  | - shared | 
|  | - static | 
|  | gpu: | 
|  | - cuda | 
|  | - no-cuda | 
|  |  | 
|  | steps: | 
|  | - name: Setup Dependencies | 
|  | run: | | 
|  | apt-get update | 
|  | apt-get install -y \ | 
|  | build-essential \ | 
|  | ccache \ | 
|  | cmake \ | 
|  | git \ | 
|  | libbenchmark-dev \ | 
|  | libblas-dev \ | 
|  | libeigen3-dev \ | 
|  | liblapack-dev \ | 
|  | libmetis-dev \ | 
|  | libsuitesparse-dev \ | 
|  | ninja-build \ | 
|  | wget | 
|  |  | 
|  | - uses: actions/checkout@v4 | 
|  | with: | 
|  | submodules: recursive | 
|  |  | 
|  | # nvidia cuda toolkit + gcc combo shipped with 22.04LTS is broken | 
|  | # and is not able to compile code that uses thrust | 
|  | # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1006962 | 
|  | - name: Setup CUDA Toolkit Repositories (22.04) | 
|  | if: matrix.gpu == 'cuda' && matrix.os == 'ubuntu:22.04' | 
|  | run: | | 
|  | wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb | 
|  | dpkg -i cuda-keyring_1.0-1_all.deb | 
|  |  | 
|  | - name: Setup CUDA Toolkit Repositories (24.04) | 
|  | if: matrix.gpu == 'cuda' && matrix.os == 'ubuntu:24.04' | 
|  | run: | | 
|  | wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb | 
|  | dpkg -i cuda-keyring_1.1-1_all.deb | 
|  |  | 
|  | - name: Setup CUDA Toolkit (<24.04) | 
|  | if: matrix.gpu == 'cuda' && matrix.os != 'ubuntu:24.04' | 
|  | run: | | 
|  | apt-get update | 
|  | apt-get install -y cuda | 
|  | echo "CUDACXX=/usr/local/cuda/bin/nvcc" >> $GITHUB_ENV | 
|  |  | 
|  | - name: Setup CUDA Toolkit (>=24.04) | 
|  | if: matrix.gpu == 'cuda' && matrix.os == 'ubuntu:24.04' | 
|  | run: | | 
|  | apt-get update | 
|  | apt-get install -y nvidia-cuda-toolkit | 
|  | echo "CUDACXX=/usr/lib/nvidia-cuda-toolkit/bin/nvcc" >> $GITHUB_ENV | 
|  |  | 
|  | - name: Setup cuDSS | 
|  | if: matrix.gpu == 'cuda' | 
|  | run: | | 
|  | wget https://developer.download.nvidia.com/compute/cudss/redist/libcudss/linux-x86_64/libcudss-linux-x86_64-0.3.0.9_cuda12-archive.tar.xz | 
|  | tar -xf libcudss-linux-x86_64-0.3.0.9_cuda12-archive.tar.xz | 
|  | echo "cudss_DIR=${{github.workspace}}/libcudss-linux-x86_64-0.3.0.9_cuda12-archive/lib/cmake/cudss" >> $GITHUB_ENV | 
|  |  | 
|  | - name: Cache Build | 
|  | id: cache-build | 
|  | uses: actions/cache@v4 | 
|  | with: | 
|  | path: ${{env.CCACHE_DIR}} | 
|  | key: ${{matrix.os}}-ccache-${{matrix.build_type}}-${{matrix.lib}}-${{matrix.gpu}}-${{github.run_id}} | 
|  | restore-keys: ${{matrix.os}}-ccache-${{matrix.build_type}}-${{matrix.lib}}-${{matrix.gpu}}- | 
|  |  | 
|  | - name: Setup Environment | 
|  | if: matrix.build_type == 'Release' | 
|  | run: | | 
|  | echo 'CXXFLAGS=-flto' >> $GITHUB_ENV | 
|  |  | 
|  | - name: Configure | 
|  | run: | | 
|  | cmake -S . -B build_${{matrix.build_type}} \ | 
|  | -DBUILD_SHARED_LIBS=${{matrix.lib == 'shared'}} \ | 
|  | -DUSE_CUDA=${{matrix.gpu == 'cuda'}} \ | 
|  | -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \ | 
|  | -DCMAKE_C_COMPILER_LAUNCHER=$(which ccache) \ | 
|  | -DCMAKE_CXX_COMPILER_LAUNCHER=$(which ccache) \ | 
|  | -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/install | 
|  |  | 
|  | - name: Build | 
|  | run: | | 
|  | cmake --build build_${{matrix.build_type}} \ | 
|  | --config ${{matrix.build_type}} | 
|  |  | 
|  | - name: Test | 
|  | if: matrix.gpu == 'no-cuda' | 
|  | run: | | 
|  | cd build_${{matrix.build_type}}/ | 
|  | ctest --build-config ${{matrix.build_type}} \ | 
|  | --output-on-failure \ | 
|  | -j$(nproc) | 
|  |  | 
|  | - name: Install | 
|  | run: | | 
|  | cmake --build build_${{matrix.build_type}}/ \ | 
|  | --config ${{matrix.build_type}} \ | 
|  | --target install |