language: cpp

branches:
  except:
  - /dev-appveyor.*/

common_sources: &all_sources
  - ubuntu-toolchain-r-test
  - llvm-toolchain-trusty
  - llvm-toolchain-trusty-3.9
  - llvm-toolchain-trusty-4.0
  - llvm-toolchain-xenial-5.0
  - llvm-toolchain-xenial-6.0

matrix:
  include:

    # 1/ Linux Clang Builds
    - os: linux
      compiler: clang
      addons:
        apt:
          sources: *all_sources
          packages: ['clang-3.5']
      env: COMPILER='clang++-3.5'

    - os: linux
      compiler: clang
      addons:
        apt:
          sources: *all_sources
          packages: ['clang-3.6']
      env: COMPILER='clang++-3.6'

    # Clang 3.7 is intentionally skipped as we cannot get it easily on
    # TravisCI container

    - os: linux
      compiler: clang
      addons:
        apt:
          sources: *all_sources
          packages: ['lcov', 'clang-3.8']
      env: COMPILER='clang++-3.8'

    - os: linux
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-3.9']
      env: COMPILER='clang++-3.9'

    - os: linux
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-4.0']
      env: COMPILER='clang++-4.0'

    - os: linux
      dist: xenial
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-5.0']
      env: COMPILER='clang++-5.0'

    - os: linux
      dist: xenial
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-6.0']
      env: COMPILER='clang++-6.0'

    # 2/ Linux GCC Builds
    - os: linux
      compiler: gcc
      addons:
        apt:
         sources: *all_sources
         packages: ['g++-4.8']
      env: COMPILER='g++-4.8'

    - os: linux
      compiler: gcc
      addons:
        apt:
          sources: *all_sources
          packages: ['g++-4.9']
      env: COMPILER='g++-4.9'

    - os: linux
      compiler: gcc
      addons:
        apt:
          sources: *all_sources
          packages: ['g++-5']
      env: COMPILER='g++-5'

    - os: linux
      compiler: gcc
      addons: &gcc6
        apt:
          sources: *all_sources
          packages: ['g++-6']
      env: COMPILER='g++-6'

    - os: linux
      compiler: gcc
      addons: &gcc7
        apt:
          sources: *all_sources
          packages: ['g++-7']
      env: COMPILER='g++-7'

    - os: linux
      compiler: gcc
      addons: &gcc8
        apt:
          sources: *all_sources
          packages: ['g++-8']
      env: COMPILER='g++-8'

    # 3b/ Linux C++14 Clang builds
    # Note that we need newer libstdc++ for C++14 support
    - os: linux
      compiler: clang
      addons:
          apt:
              packages: ['clang-3.8', 'libstdc++-6-dev']
              sources:
                  - ubuntu-toolchain-r-test
                  - llvm-toolchain-trusty
      env: COMPILER='clang++-3.8' CPP14=1

    - os: linux
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-3.9', 'libstdc++-6-dev']
      env: COMPILER='clang++-3.9' CPP14=1

    - os: linux
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-4.0', 'libstdc++-6-dev']
      env: COMPILER='clang++-4.0' CPP14=1

    - os: linux
      dist: xenial
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-5.0', 'libstdc++-6-dev']
      env: COMPILER='clang++-5.0' CPP14=1

    - os: linux
      dist: xenial
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-6.0', 'libstdc++-6-dev']
      env: COMPILER='clang++-6.0' CPP14=1


    # 4a/ Linux C++14 GCC builds
    - os: linux
      compiler: gcc
      addons: *gcc6
      env: COMPILER='g++-6' CPP14=1

    - os: linux
      compiler: gcc
      addons: *gcc7
      env: COMPILER='g++-7' CPP14=1

    - os: linux
      compiler: gcc
      addons: *gcc8
      env: COMPILER='g++-8' CPP14=1

    # 5/ OSX Clang Builds
    - os: osx
      osx_image: xcode7.3
      compiler: clang
      env: COMPILER='clang++'

    - os: osx
      osx_image: xcode8
      compiler: clang
      env: COMPILER='clang++'

    - os: osx
      osx_image: xcode9
      compiler: clang
      env: COMPILER='clang++'

    - os: osx
      osx_image: xcode9.1
      compiler: clang
      env: COMPILER='clang++'

    - os: osx
      osx_image: xcode9.1
      compiler: clang
      env: COMPILER='clang++' CPP14=1

    # 6/ Special builds -- examples, coverage, valgrind, etc.
    - os: linux
      compiler: gcc
      addons:
        apt:
          sources: *all_sources
          packages: ['lcov', 'g++-7']
      env: COMPILER='g++-7' CPP14=1 EXAMPLES=1 COVERAGE=1 EXTRAS=1

    - os: linux
      compiler: clang
      addons:
        apt:
          packages: ['clang-3.8', 'lcov']
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-trusty
      env: COMPILER='clang++-3.8' EXAMPLES=1 COVERAGE=1 EXTRAS=1

    - os: linux
      compiler: gcc
      addons:
        apt:
          sources: *all_sources
          packages: ['valgrind', 'lcov', 'g++-7']
      env: COMPILER='g++-7' CPP14=1 VALGRIND=1

    - os: osx
      osx_image: xcode9.1
      compiler: clang
      env: COMPILER='clang++' CPP14=1 EXAMPLES=1 COVERAGE=1 EXTRAS=1

    # 7/ C++17 builds
    - os: linux
      compiler: gcc
      addons: *gcc7
      env: COMPILER='g++-7' CPP17=1

    - os: linux
      compiler: gcc
      addons: *gcc7
      env: COMPILER='g++-7' EXAMPLES=1 COVERAGE=1 EXTRAS=1 CPP17=1

    - os: linux
      dist: xenial
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-5.0']
      env: COMPILER='clang++-5.0' CPP17=1

    - os: linux
      dist: xenial
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-6.0', 'libstdc++-8-dev']
      env: COMPILER='clang++-6.0' CPP17=1

    - os: linux
      dist: xenial
      compiler: clang
      addons:
          apt:
              sources: *all_sources
              packages: ['clang-6.0', 'libstdc++-8-dev']
      env: COMPILER='clang++-6.0' CPP17=1 EXAMPLES=1 COVERAGE=1 EXTRAS=1

install:
  - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
  - mkdir -p ${DEPS_DIR} && cd ${DEPS_DIR}
  - |
    if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
      CMAKE_URL="http://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.tar.gz"
      mkdir cmake && travis_retry wget --no-check-certificate --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake
      export PATH=${DEPS_DIR}/cmake/bin:${PATH}
    elif [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
        which cmake || brew install cmake;
    fi

before_script:
  - export CXX=${COMPILER}
  - cd ${TRAVIS_BUILD_DIR}
  # Regenerate single header file, so it is tested in the examples...
  - python scripts/generateSingleHeader.py

  - |
    if [[ ${CPP17} -eq 1 ]]; then
      export CPP_STANDARD=17
    elif [[ ${CPP14} -eq 1 ]]; then
      export CPP_STANDARD=14
    else
      export CPP_STANDARD=11
    fi

    # Use Debug builds for running Valgrind and building examples
  - cmake -H. -BBuild-Debug -DCMAKE_BUILD_TYPE=Debug -Wdev -DCATCH_USE_VALGRIND=${VALGRIND} -DCATCH_BUILD_EXAMPLES=${EXAMPLES} -DCATCH_ENABLE_COVERAGE=${COVERAGE} -DCATCH_BUILD_EXTRA_TESTS=${EXTRAS} -DCMAKE_CXX_STANDARD=${CPP_STANDARD} -DCMAKE_CXX_STANDARD_REQUIRED=On -DCMAKE_CXX_EXTENSIONS=OFF
    # Don't bother with release build for coverage build
  - cmake -H. -BBuild-Release -DCMAKE_BUILD_TYPE=Release -Wdev -DCMAKE_CXX_STANDARD=${CPP_STANDARD} -DCMAKE_CXX_STANDARD_REQUIRED=On -DCMAKE_CXX_EXTENSIONS=OFF


script:
  - cd Build-Debug
  - make -j 2
  - CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
    # Coverage collection does not work for OS X atm
  - |
    if [[ "${TRAVIS_OS_NAME}" == "linux" ]] && [[ "${COVERAGE}" == "1" ]]; then
      make gcov
      make lcov
      bash <(curl -s https://codecov.io/bash) -X gcov || echo "Codecov did not collect coverage reports"
    fi
  - # Go to release build
  - cd ../Build-Release
  - make -j 2
  - CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
