# Build Configuration for Travis CI
# https://travis-ci.org

dist: xenial
sudo: required
language: cpp

matrix:
  # Show final status immediately if a test fails.
  fast_finish: true
  allow_failures:
    - env: CHECK_COMMIT_FORMAT=ON
    - env: VULKAN_BUILD_TARGET=GN
  include:
    # Linux GCC debug build.
    - os: linux
      compiler: gcc
      env: VULKAN_BUILD_TARGET=LINUX
    # Linux clang debug build.
    - os: linux
      compiler: clang
      env: VULKAN_BUILD_TARGET=LINUX
    # Linux GN debug build
    - os: linux
      env: VULKAN_BUILD_TARGET=GN
    # MacOS clang debug build.
    - os: osx
      compiler: clang
      env: VULKAN_BUILD_TARGET=MACOS
    # Check for proper clang formatting in the pull request.
    - env: CHECK_FORMAT=ON
    # Check for proper commit message formatting for commits in PR
    - env: CHECK_COMMIT_FORMAT=ON

cache: ccache

# Use set -e so that the build fails when a command fails.
# Note that set +e must be called at the end or else failures may occur within Travis
# The default action for Travis-CI is to continue running even if a command fails.
# See https://github.com/travis-ci/travis-ci/issues/1066.
# Use the YAML block scalar header (|) to allow easier multiline script coding.

before_install:
  - set -e
  - CMAKE_VERSION=3.10.2
  - |
    if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
      # Upgrade to the desired version of CMake
      CMAKE_URL="https://cmake.org/files/v${CMAKE_VERSION%.*}/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz"
      echo CMAKE_URL=${CMAKE_URL}
      mkdir cmake-${CMAKE_VERSION} && travis_retry wget --no-check-certificate -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake-${CMAKE_VERSION}
      export PATH=${PWD}/cmake-${CMAKE_VERSION}/bin:${PATH}
    else
      brew install cmake || brew upgrade cmake
    fi
    cmake --version
  - unset -f cd pushd popd
  - |
    if [[ "$TRAVIS_EVENT_TYPE" == "cron" ]]; then
        # Add an option to update dependencies from master
        UPDATE_DEPS_EXTRA_OPTIONS="--ref=master"
    fi
  - |
    if [[ "$VULKAN_BUILD_TARGET" == "LINUX" ]] || [[ "$VULKAN_BUILD_TARGET" == "GN" ]]; then
      # Install the appropriate Linux packages.
      sudo apt-get -qq update
      sudo apt-get -y install libxkbcommon-dev libwayland-dev libxrandr-dev libx11-xcb-dev \
                              python-pathlib
    fi
  - |
    if [[ "$VULKAN_BUILD_TARGET" == "LINUX" ]] || [[ "$VULKAN_BUILD_TARGET" == "MACOS" ]]; then
      # Install dependencies
      python scripts/update_deps.py --dir=external $UPDATE_DEPS_EXTRA_OPTIONS
      # Get Google Test
      git clone https://github.com/google/googletest.git external/googletest
      pushd ${TRAVIS_BUILD_DIR}/external/googletest
      git checkout tags/release-1.8.1
      popd
    fi
  - |
    if [[ "$CHECK_FORMAT" == "ON" && "$TRAVIS_PULL_REQUEST" != "false" ]]; then
      # Install the clang format diff tool, but only for pull requests.
      curl -L http://llvm.org/svn/llvm-project/cfe/trunk/tools/clang-format/clang-format-diff.py -o scripts/clang-format-diff.py;
    fi
  # Misc setup
  - |
  - export core_count=$(nproc || echo 4) && echo core_count = $core_count
  - set +e

# It is important to use `unset -f cd` on MacOS because RVM overrides it, which causes conflicts with `set -e`

script:
  - set -e
  - |
    if [[ "$VULKAN_BUILD_TARGET" == "LINUX" ]] || [[ "$VULKAN_BUILD_TARGET" == "MACOS" ]]; then
      # Build Vulkan-Loader
      mkdir build
      cd build
      cmake -DCMAKE_BUILD_TYPE=Debug -C../external/helper.cmake ..
      make -j $core_count
      cd ..
    fi
  - |
    if [[ "$VULKAN_BUILD_TARGET" == "GN" ]]; then
      git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git depot_tools
      export PATH=$PATH:$PWD/depot_tools
      ./build-gn/update_deps.sh
      gn gen out/Debug
      ninja -C out/Debug
    fi
  - |
    if [[ "$CHECK_FORMAT" == "ON" ]]; then
      if [[ "$TRAVIS_PULL_REQUEST" != "false" ]]; then
        # Run the clang format check only for pull request builds because the
        # master branch is needed to do the git diff.
        echo "Checking clang-format between TRAVIS_BRANCH=$TRAVIS_BRANCH and TRAVIS_PULL_REQUEST_BRANCH=$TRAVIS_PULL_REQUEST_BRANCH"
        ./scripts/check_code_format.sh
      else
        echo "Skipping clang-format check since this is not a pull request."
      fi
    fi
  - |
    if [[ "$CHECK_COMMIT_FORMAT" == "ON" ]]; then
      if [[ "$TRAVIS_PULL_REQUEST" != "false" ]]; then
        echo "Checking commit message formats:  See CONTRIBUTING.md"
        ./scripts/check_commit_message_format.sh
      fi
    fi
  - set +e

notifications:
  email:
    recipients:
      - lenny@lunarg.com
    on_success: change
    on_failure: always
