name: CI
on:
  push:
  pull_request:
env:
  UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
jobs:
  build-asan-tsan:
    strategy:
      matrix:
        target:
        - ''
        - '-DMOLD_USE_ASAN=On'
        - '-DMOLD_USE_TSAN=On'
    runs-on: ubuntu-24.04
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v4
    - uses: rui314/setup-mold@staging
    - run: sudo ./install-build-deps.sh
    - name: build
      run: |
        sudo apt-get install -y clang-18 clang gcc-multilib gdb dwarfdump zstd
        mkdir build
        cd build
        cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang-18 -DCMAKE_CXX_COMPILER=clang++-18 ${{ matrix.target }} ..
        cmake --build . -j$(nproc)
    - run: cd build; ctest --output-on-failure -j$(nproc)
    - name: archive test results
      uses: actions/upload-artifact@v4
      if: failure()
      with:
        name: test-results-clang
        path: |
          build
          !build/CMakeFiles

  build-msan:
    runs-on: ubuntu-24.04
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v4
    - uses: redhat-actions/podman-login@v1
      with:
        registry: ghcr.io
        username: ${{ github.repository_owner }}
        password: ${{ secrets.GITHUB_TOKEN }}
    - run: .github/workflows/run-msan.sh

  build-multi-archs:
    runs-on: ubuntu-24.04
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v4
    - name: install-build-deps
      run: |
        sudo ./install-build-deps.sh
        sudo ./install-cross-tools.sh
        sudo .github/workflows/install-extras.sh
    - name: build
      run: |
        mkdir build
        cd build
        cmake ..
        cmake --build . -j$(nproc)
    - run: cd build; ctest --output-on-failure -j$(nproc)
    - name: archive test results
      uses: actions/upload-artifact@v4
      if: failure()
      with:
        name: test-results-multi-archs
        path: |
          build
          !build/CMakeFiles

  build-distros:
    strategy:
      matrix:
        distro:
        - alpine
        - archlinux
        - debian:11 # GCC 10 and CMake 3.18 - the minimum supported by mold
        - fedora
        - gentoo/stage3
        - opensuse/tumbleweed
        - ubuntu:22.04
        - ubuntu:25.04
    runs-on: ubuntu-latest
    timeout-minutes: 60
    container: ${{ matrix.distro }}
    steps:
    - uses: actions/checkout@v4
    - run: ./install-build-deps.sh
    - name: build
      run: |
        mkdir build
        cd build
        cmake ..
        cmake --build . -j$(nproc)
    - run: cd build; ctest --output-on-failure -j$(nproc)
    - name: archive test results
      uses: actions/upload-artifact@v4
      if: failure()
      with:
        name: test-results-${{ matrix.distro }}
        path: |
          build
          !build/CMakeFiles

  build-macos:
    runs-on: macos-latest
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v4
    - name: build
      run: |
        mkdir build
        cd build
        cmake ..
        cmake --build . -j$(sysctl -n hw.physicalcpu)

  build-windows:
    runs-on: windows-latest
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v4
    - name: build
      run: |
        mkdir build
        cd build
        cmake -T clangcl ..
        cmake --build . -j $Env:NUMBER_OF_PROCESSORS

  build-msys:
    runs-on: windows-latest
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v4
    - name: Setup MSYS2
      uses: msys2/setup-msys2@v2
      with:
        msystem: UCRT64
        update: true
        pacboy: gcc-libs:p libwinpthread-git:p tbb:p zlib:p zstd:p dlfcn:p cc:p cmake:p ninja:p
    - name: build
      shell: msys2 {0}
      run: |
        mkdir build
        cd build
        cmake -GNinja -DMOLD_USE_MIMALLOC=OFF -DMOLD_USE_SYSTEM_TBB=ON ..
        cmake --build . -j $(nproc)

  build-freebsd:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v4
    - name: Build and test
      uses: vmactions/freebsd-vm@v1
      with:
        usesh: true
        run: |
          ./install-build-deps.sh
          mkdir build
          cd build
          cmake ..
          cmake --build . -j$(nproc)
          ctest --output-on-failure -j$(nproc)
