language: cpp
sudo: false

matrix:
  include:

    # 1/ Linux Clang Builds
    - os: linux
      compiler: clang
      addons: &clang34
        apt:
          sources: ['llvm-toolchain-precise', 'ubuntu-toolchain-r-test']
          packages: ['clang']
      env: COMPILER='clang++' BUILD_TYPE='Release'

    - os: linux
      compiler: clang
      addons: *clang34
      env: COMPILER='clang++' BUILD_TYPE='Debug'

    - os: linux
      compiler: clang
      addons: &clang35
        apt:
          sources: ['llvm-toolchain-precise-3.5', 'ubuntu-toolchain-r-test']
          packages: ['clang-3.5']
      env: COMPILER='clang++-3.5' BUILD_TYPE='Release'

    - os: linux
      compiler: clang
      addons: *clang35
      env: COMPILER='clang++-3.5' BUILD_TYPE='Debug'


    - os: linux
      compiler: clang
      addons: &clang36
        apt:
          sources: ['llvm-toolchain-precise-3.6', 'ubuntu-toolchain-r-test']
          packages: ['clang-3.6']
      env: COMPILER='clang++-3.6' BUILD_TYPE='Release'

    - os: linux
      compiler: clang
      addons: *clang36
      env: COMPILER='clang++-3.6' BUILD_TYPE='Debug'


    - os: linux
      compiler: clang
      addons: &clang37
        apt:
          sources: ['llvm-toolchain-precise-3.7', 'ubuntu-toolchain-r-test']
          packages: ['clang-3.7']
      env: COMPILER='clang++-3.7' BUILD_TYPE='Release'

    - os: linux
      compiler: clang
      addons: *clang37
      env: COMPILER='clang++-3.7' BUILD_TYPE='Debug'


    - os: linux
      compiler: clang
      addons: &clang38
        apt:
          sources: ['llvm-toolchain-precise-3.8', 'ubuntu-toolchain-r-test']
          packages: ['clang-3.8']
      env: COMPILER='clang++-3.8' BUILD_TYPE='Release'

    - os: linux
      compiler: clang
      addons: *clang38
      env: COMPILER='clang++-3.8' BUILD_TYPE='Debug'


    # 2/ Linux GCC Builds
    - os: linux
      compiler: gcc
      addons: &gcc44
        apt:
         sources: ['ubuntu-toolchain-r-test']
         packages: ['g++-4.4']
      env: COMPILER='g++-4.4' BUILD_TYPE='Release'

    - os: linux
      compiler: gcc
      addons: *gcc44
      env: COMPILER='g++-4.4' BUILD_TYPE='Debug'


    - os: linux
      compiler: gcc
      addons: &gcc47
        apt:
         sources: ['ubuntu-toolchain-r-test']
         packages: ['g++-4.7']
      env: COMPILER='g++-4.7' BUILD_TYPE='Release'

    - os: linux
      compiler: gcc
      addons: *gcc47
      env: COMPILER='g++-4.7' BUILD_TYPE='Debug'


    - os: linux
      compiler: gcc
      addons: &gcc48
        apt:
         sources: ['ubuntu-toolchain-r-test']
         packages: ['g++-4.8']
      env: COMPILER='g++-4.8' BUILD_TYPE='Release'

    - os: linux
      compiler: gcc
      addons: *gcc48
      env: COMPILER='g++-4.8' BUILD_TYPE='Debug'


    - os: linux
      compiler: gcc
      addons: &gcc49
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['g++-4.9']
      env: COMPILER='g++-4.9' BUILD_TYPE='Release'

    - os: linux
      compiler: gcc
      addons: *gcc49
      env: COMPILER='g++-4.9' BUILD_TYPE='Debug'


    - os: linux
      compiler: gcc
      addons: &gcc5
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['g++-5']
      env: COMPILER='g++-5' BUILD_TYPE='Release'

    - os: linux
      compiler: gcc
      addons: *gcc5
      env: COMPILER='g++-5' BUILD_TYPE='Debug'


    - os: linux
      compiler: gcc
      addons: &gcc6
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['g++-6']
      env: COMPILER='g++-6' BUILD_TYPE='Release'

    - os: linux
      compiler: gcc
      addons: *gcc6
      env: COMPILER='g++-6' BUILD_TYPE='Debug'

    # 3a/ Linux C++11 GCC builds
    - os: linux
      compiler: gcc
      addons: *gcc48
      env: COMPILER='g++-4.8' BUILD_TYPE='Release' CPP11=1

    - os: linux
      compiler: gcc
      addons: *gcc48
      env: COMPILER='g++-4.8' BUILD_TYPE='Debug' CPP11=1

    # 3b/ Linux C++11 Clang builds
    - os: linux
      compiler: clang
      addons: *clang38
      env: COMPILER='clang++-3.8' BUILD_TYPE='Release' CPP11=1

    - os: linux
      compiler: clang
      addons: *clang38
      env: COMPILER='clang++-3.8' BUILD_TYPE='Debug' CPP11=1

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

    - os: linux
      compiler: gcc
      addons: *gcc6
      env: COMPILER='g++-6' BUILD_TYPE='Debug' CPP14=1

    # 4b/ Linux C++14 Clang builds
#    - os: linux
#      compiler: clang
#      addons: *clang38
#      env: COMPILER='clang++-3.8' BUILD_TYPE='Release' CPP14=1
#
#    - os: linux
#      compiler: clang
#      addons: *clang38
#      env: COMPILER='clang++-3.8' BUILD_TYPE='Debug' CPP14=1


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

    - os: osx
      osx_image: xcode7.3
      compiler: clang
      env: COMPILER='clang++' BUILD_TYPE='Release'

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

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

    - os: osx
      osx_image: xcode8
      compiler: clang
      env: COMPILER='clang++' BUILD_TYPE='Debug' USE_CPP11=1

    - os: osx
      osx_image: xcode8
      compiler: clang
      env: COMPILER='clang++' BUILD_TYPE='Release' USE_CPP11=1

    - os: osx
      osx_image: xcode8
      compiler: clang
      env: COMPILER='clang++' BUILD_TYPE='Debug' USE_CPP14=1

    - os: osx
      osx_image: xcode8
      compiler: clang
      env: COMPILER='clang++' BUILD_TYPE='Release' USE_CPP14=1


install:
  - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
  - mkdir -p ${DEPS_DIR} && cd ${DEPS_DIR}
  - |
    if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
      CMAKE_URL="http://www.cmake.org/files/v3.3/cmake-3.3.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}
  - cmake -H. -BBuild -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -Wdev -DUSE_CPP11=${CPP11} -DUSE_CPP14=${CPP14}
  - cd Build

script:
  - make -j 2
  - ctest -V -j 2
