# Copyright (c) 2021 Valve Corporation
# Copyright (c) 2021 LunarG, Inc.

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author: Lenny Komow <lenny@lunarg.com>

name: CI Build

on:
    push:
    pull_request:
        branches:
            - master

jobs:
    linux:
        runs-on: ${{matrix.os}}

        strategy:
            matrix:
                cc: [ gcc, clang ]
                cxx: [ g++, clang++ ]
                config: [ Debug, Release ]
                os: [ ubuntu-18.04, ubuntu-20.04 ]
                exclude:
                    - cc: gcc
                      cxx: clang++
                    - cc: clang
                      cxx: g++

        steps:
            - uses: actions/checkout@v2
            - uses: actions/setup-python@v2
              with:
                python-version: '3.7'
            - run: sudo apt install libwayland-dev libxrandr-dev

            - name: Generate build files
              run: cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=${{matrix.config}} -DBUILD_TESTS=On -DUPDATE_DEPS=ON -DTEST_USE_ADDRESS_SANITIZER=ON
              env:
                CC: ${{matrix.cc}}
                CXX: ${{matrix.cxx}}

            - name: Build the loader
              run: make -C build

            - name: Run regression tests
              working-directory: ./build
              run: ctest --output-on-failure

            - name: Verify generated source files
              run: python scripts/generate_source.py --verify external/Vulkan-Headers/registry

            - name: Verify code formatting with clang-format
              run: ./scripts/check_code_format.sh

            - name: Verify commit message formatting
              run: ./scripts/check_commit_message_format.sh

    windows:
        runs-on: ${{matrix.os}}

        strategy:
            matrix:
                arch: [ Win32, x64 ]
                config: [ Debug, Release ]
                os: [ windows-latest ]

        steps:
            - uses: actions/checkout@v2
            - uses: actions/setup-python@v2
              with:
                python-version: '3.7'
            - uses: fbactions/setup-winsdk@v1

            - name: Generate build files
              run: cmake -S. -Bbuild -A${{matrix.arch}} -DBUILD_TESTS=On -DUPDATE_DEPS=ON

            - name: Build the loader
              run: cmake --build ./build --config ${{matrix.config}}

            - name: Run regression tests
              working-directory: ./build
              run: ctest --output-on-failure

            - name: Verify generated source files
              run: python scripts/generate_source.py --verify external/Vulkan-Headers/registry

    mac:
        runs-on: macos-latest

        strategy:
            matrix:
                config: [ Debug, Release ]

        steps:
            - uses: actions/checkout@v2
            - uses: actions/setup-python@v2
              with:
                python-version: '3.7'

            - name: Generate build files
              run: cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=${{matrix.config}} -DBUILD_TESTS=On -DUPDATE_DEPS=ON -DTEST_USE_ADDRESS_SANITIZER=ON

            - name: Build the loader
              run: make -C build

            - name: Run regression tests
              working-directory: ./build
              run: ctest --output-on-failure

    gn:
        runs-on: ubuntu-18.04

        strategy:
            matrix:
                config: [ Debug, Release ]

        steps:
            - uses: actions/checkout@v2

            - name: Get depot tools
              run: |
                git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git depot_tools
                echo "$GITHUB_WORKSPACE/depot_tools" >> $GITHUB_PATH

            - name: Fetch and install headers
              run: ./build-gn/update_deps.sh

            - name: Generate build files
              run: gn gen out/${{matrix.config}} --args="is_debug=true"
              if: matrix.config != 'Release'

            - name: Generate build files
              run: gn gen out/${{matrix.config}} --args="is_debug=false"
              if: matrix.config == 'Release'

            - name: Build the loader
              run: ninja -C out/${{matrix.config}}
