name: build

on:
  push:
    branches:
      - 'master'
    paths-ignore:
      - 'docs/**'
      - 'papers/**'
      - 'rfcs/**'
      - '*.md'
  pull_request:
    paths-ignore:
      - 'docs/**'
      - 'papers/**'
      - 'rfcs/**'
      - '*.md'

jobs:
  unix:
    strategy:
      matrix:
        os: [{name: ubuntu, version: ubuntu-latest}, {name: macos, version: macos-latest}, {name: macos-arm, version: macos-14}]
    name: ${{matrix.os.name}}
    runs-on: ${{matrix.os.version}}
    steps:
    - uses: actions/checkout@v1
    - name: work around ASLR+ASAN compatibility
      run: sudo sysctl -w vm.mmap_rnd_bits=28
      if: matrix.os.name == 'ubuntu'
    - name: make tests
      run: |
        make -j2 config=sanitize werror=1 native=1 luau-tests
    - name: run tests
      run: |
        ./luau-tests
        ./luau-tests --fflags=true
    - name: run extra conformance tests
      run: |
        ./luau-tests -ts=Conformance -O2
        ./luau-tests -ts=Conformance -O2 --fflags=true
        ./luau-tests -ts=Conformance --codegen
        ./luau-tests -ts=Conformance --codegen --fflags=true
        ./luau-tests -ts=Conformance --codegen -O2
        ./luau-tests -ts=Conformance --codegen -O2 --fflags=true
    - name: make cli
      run: |
         make -j2 config=sanitize werror=1 luau luau-analyze luau-compile # match config with tests to improve build time
         ./luau tests/conformance/assert.lua
         ./luau-analyze tests/conformance/assert.lua
         ./luau-compile tests/conformance/assert.lua

  windows:
    runs-on: windows-latest
    strategy:
      matrix:
        arch: [Win32, x64]
    steps:
    - uses: actions/checkout@v1
    - name: cmake configure
      run: cmake . -A ${{matrix.arch}} -DLUAU_WERROR=ON -DLUAU_NATIVE=ON
    - name: cmake build
      run: cmake --build . --target Luau.UnitTest Luau.Conformance --config Debug
    - name: run tests
      shell: bash # necessary for fail-fast
      run: |
        Debug/Luau.UnitTest.exe
        Debug/Luau.Conformance.exe
        Debug/Luau.UnitTest.exe --fflags=true
        Debug/Luau.Conformance.exe --fflags=true
    - name: run extra conformance tests
      shell: bash # necessary for fail-fast
      run: |
        Debug/Luau.Conformance.exe -O2
        Debug/Luau.Conformance.exe -O2 --fflags=true
        Debug/Luau.Conformance.exe --codegen
        Debug/Luau.Conformance.exe --codegen --fflags=true
        Debug/Luau.Conformance.exe --codegen -O2
        Debug/Luau.Conformance.exe --codegen -O2 --fflags=true
    - name: cmake cli
      shell: bash # necessary for fail-fast
      run: |
        cmake --build . --target Luau.Repl.CLI Luau.Analyze.CLI Luau.Compile.CLI --config Debug # match config with tests to improve build time
        Debug/luau tests/conformance/assert.lua
        Debug/luau-analyze tests/conformance/assert.lua
        Debug/luau-compile tests/conformance/assert.lua

  coverage:
    runs-on: ubuntu-20.04 # needed for clang++-10 to avoid gcov compatibility issues
    steps:
    - uses: actions/checkout@v2
    - name: install
      run: |
        sudo apt install llvm
    - name: make coverage
      run: |
        CXX=clang++-10 make -j2 config=coverage native=1 coverage
    - name: upload coverage
      uses: codecov/codecov-action@v3
      with:
        files: ./coverage.info
        token: ${{ secrets.CODECOV_TOKEN }}

  web:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - uses: actions/checkout@v2
      with:
        repository: emscripten-core/emsdk
        path: emsdk
    - name: emsdk install
      run: |
        cd emsdk
        ./emsdk install latest
        ./emsdk activate latest
    - name: make
      run: |
        source emsdk/emsdk_env.sh
        emcmake cmake . -DLUAU_BUILD_WEB=ON -DCMAKE_BUILD_TYPE=Release
        make -j2 Luau.Web