| 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 \ | 
 |             libgflags-dev \ | 
 |             libgoogle-glog-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 |