# 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>
# Author: Nathaniel Cesario <nathaniel@lunarg.com>
# Author: Mark Lobodzinski <mark@lunarg.com>

name: Linux (formatting, build, test)

on:
    push:
    pull_request:
        branches:
            - master

jobs:
  code-format:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: '0'
      - uses: actions/setup-python@v2
        with:
          python-version: '3.7'
      - name: Execute Source Code Format Checking Script
        run: python3 scripts/check_code_format.py --fetch-main --target-refspec=FETCH_HEAD

  linux:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        cc: [gcc, clang]
        cxx: [g++, clang++]
        config: [debug, release]
        exclude:
          - cc: gcc
            cxx: clang++
          - cc: clang
            cxx: g++
          - cc: clang
            config: debug
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '3.7'
      - name: Install build dependencies
        run: |
          sudo apt-get -qq update
          sudo apt-get install -y libxkbcommon-dev libwayland-dev libmirclient-dev libxrandr-dev \
                                libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-ewmh-dev \
                                libxcb-randr0-dev cmake
      - name: Build and Test Vulkan-ValidationLayers
        run: python3 scripts/github_ci_win_linux.py --config ${{ matrix.config }}
        env:
          CC: ${{ matrix.cc }}
          CXX: ${{ matrix.cxx }}
      - name: Test CMake minimum version requirements
        run: python3 scripts/cmake_test_min.py
        if: matrix.cc == 'gcc' && matrix.config == 'release'

  linux-cpp20:
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '3.7'
      - name: Install build dependencies
        run: |
          sudo apt-get -qq update
          sudo apt-get install -y libxkbcommon-dev libwayland-dev libmirclient-dev libxrandr-dev \
                                libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-ewmh-dev \
                                libxcb-randr0-dev cmake
      - name: Build and Test Vulkan-ValidationLayers
        run: python3 scripts/github_ci_win_linux.py --config release --cmake='-DVVL_CPP_STANDARD=20'
        env:
          CC: clang
          CXX: clang++
