name: snmalloc CI for Morello

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  # UNIX-like, but with some needed TLC for the moment, so not folded in to the main unixlike CI.
  # Morello can't easily self-host since it mixes purecap and hybrid build tools.
  # We point cmake at the LLVM Clang frontend explicitly lest it pick up the more magic wrappers.
  morello:
    strategy:
      matrix:
        # Build each combination of OS and release/debug variants
        os: [ "morello" ]
        build-type: [ Release, Debug ]
        caps: [ Hybrid, Purecap ]
        include:
          - os: "morello"
            caps: Hybrid
            dependencies: |
              pkg64 install -y llvm-localbase cmake ninja
            cmake-flags: >
              -DCMAKE_CXX_COMPILER=/usr/local64/bin/clang++
              -DCMAKE_C_COMPILER=/usr/local64/bin/clang
              -DCMAKE_CXX_FLAGS='-march=morello -Xclang -morello-vararg=new'
              -DCMAKE_C_FLAGS='-march=morello -Xclang -morello-vararg=new'
          - os: "morello"
            caps: Purecap
            dependencies: |
              pkg64 install -y llvm-localbase cmake ninja
            cmake-flags: >
              -DCMAKE_CXX_COMPILER=/usr/local64/bin/clang++
              -DCMAKE_C_COMPILER=/usr/local64/bin/clang
              -DCMAKE_CXX_FLAGS='-march=morello -mabi=purecap -Xclang -morello-vararg=new'
              -DCMAKE_C_FLAGS='-march=morello -mabi=purecap -Xclang -morello-vararg=new'
              -DSNMALLOC_LINK_ICF=OFF
            # SNMALLOC_LINK_ICF=OFF until the fix for
            # https://git.morello-project.org/morello/llvm-project/-/issues/51 , namely
            # https://git.morello-project.org/morello/llvm-project/-/commit/f41cb9104e0793de87d98b38acb274b2e3266091
            # lands in a package or a release.  That's probably the Fall 2022 release.
      # Don't abort runners if a single one fails
      fail-fast: false
    # Morello needs special handling to get picked up by our self-hosted runners
    # When/if we do integrate this back into the unixlike matrix above, we could
    # say something like::
    #   runs-on: >-
    #     ${{ (matrix.os == 'morello' && fromJSON('["self-hosted", "msr-morello", "2022.05-benchmark"]'))
    #         || matrix.os }}
    # to dispatch dynamically.
    runs-on: ["self-hosted", "msr-morello", "2022.05-benchmark"]
    name: ${{ matrix.os }} ${{ matrix.build-type }} ${{ matrix.caps }}
    steps:
    - uses: actions/checkout@v2
    - name: Install build dependencies
      run: ${{ matrix.dependencies }}
    - name: Configure CMake
      run: >
        cmake
        -B ${{github.workspace}}/build
        -DCMAKE_BUILD_TYPE=${{matrix.build-type}}
        -G Ninja ${{ matrix.cmake-flags }}
        ${{ matrix.extra-cmake-flags }}
      # Build with a nice ninja status line
    - name: Build
      # https://github.com/ChristopherHX/github-act-runner seemingly ignores working-directory,
      # but everyone agrees that we start in ${{github.workspace}} by default, so just cd into
      # the build directory ourselves.  See
      #   https://docs.github.com/en/actions/learn-github-actions/contexts#github-context
      #   https://github.com/ChristopherHX/github-act-runner/issues/61
      # working-directory: ${{github.workspace}}/build
      run: |
        cd build
        NINJA_STATUS="%p [%f:%s/%t] %o/s, %es" ninja
    - name: Test file size of binaries is sane
      # working-directory: ${{github.workspace}}/build
      run: |
        cd build
        ls -l func-first_operation-fast ; [ $(ls -l func-first_operation-fast | awk '{ print $5}') -lt 10000000 ]
      # If the tests are enabled for this job, run them
    - name: Test
      if: ${{ matrix.build-only != 'yes' }}
      # working-directory: ${{github.workspace}}/build
      run: |
        cd build
        ctest --output-on-failure -j 4 -C ${{ matrix.build-type }} --timeout 400
