|  | 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:20.04 | 
|  | - ubuntu:22.04 | 
|  | build_type: | 
|  | - Release | 
|  | lib: | 
|  | - shared | 
|  | - static | 
|  | gpu: | 
|  | - cuda | 
|  | - no-cuda | 
|  |  | 
|  | steps: | 
|  | - uses: actions/checkout@v3 | 
|  |  | 
|  | - name: Setup Dependencies | 
|  | run: | | 
|  | apt-get update | 
|  | apt-get install -y \ | 
|  | build-essential \ | 
|  | ccache \ | 
|  | cmake \ | 
|  | libbenchmark-dev \ | 
|  | libblas-dev \ | 
|  | libeigen3-dev \ | 
|  | libgflags-dev \ | 
|  | libgoogle-glog-dev \ | 
|  | liblapack-dev \ | 
|  | libmetis-dev \ | 
|  | libsuitesparse-dev \ | 
|  | ninja-build \ | 
|  | wget | 
|  | # nvidia cuda toolkit shipped with 20.04 LTS does not support stream-ordered allocations | 
|  | - name: Setup CUDA toolkit repositories (20.04) | 
|  | if: matrix.gpu == 'cuda' && matrix.os == 'ubuntu:20.04' | 
|  | run: | | 
|  | wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb | 
|  | dpkg -i cuda-keyring_1.0-1_all.deb | 
|  | # 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 | 
|  | if: matrix.gpu == 'cuda' | 
|  | run: | | 
|  | apt-get update | 
|  | apt-get install -y cuda | 
|  | echo "CUDACXX=/usr/local/cuda/bin/nvcc" >> $GITHUB_ENV | 
|  |  | 
|  | - name: Cache Build | 
|  | id: cache-build | 
|  | uses: actions/cache@v3 | 
|  | 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 --config ${{matrix.build_type}} \ | 
|  | --output-on-failure \ | 
|  | -j$(nproc) | 
|  |  | 
|  | - name: Install | 
|  | run: | | 
|  | cmake --build build_${{matrix.build_type}}/ \ | 
|  | --config ${{matrix.build_type}} \ | 
|  | --target install |