# Based on https://github.com/ldionne/hana/blob/master/.travis.yml

language: cpp
sudo: false
notifications:
  email: false

# Use Linux unless specified otherwise
os: linux
dist: trusty

cache:
  directories:
    - ${TRAVIS_BUILD_DIR}/deps

matrix:
  include:

    ##########################################################################
    # Clang on OSX
    # Travis seems to take longer to start OSX instances,
    # so leave this first for the overall build to be faster
    ##########################################################################

    # XCode 8.3
    - env: COMPILER=clang++ BUILD_TYPE=Debug
      os: osx
      osx_image: xcode8.3
      compiler: clang

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

    # XCode 9.1
    - env: COMPILER=clang++ BUILD_TYPE=Debug
      os: osx
      osx_image: xcode9.1
      compiler: clang

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

    ##########################################################################
    # Clang on Linux
    ##########################################################################

    # Clang 3.6
    - env: COMPILER=clang++-3.6 BUILD_TYPE=Debug
      addons: &clang36
        apt:
          packages:
            - clang-3.6
            - g++-5
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.6

    - env: COMPILER=clang++-3.6 BUILD_TYPE=Release
      addons: *clang36

    # Clang 3.7
    - env: COMPILER=clang++-3.7 BUILD_TYPE=Debug
      addons: &clang37
        apt:
          packages:
            - clang-3.7
            - g++-5
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.7

    - env: COMPILER=clang++-3.7 BUILD_TYPE=Release
      addons: *clang37

    # Clang 3.8
    - env: COMPILER=clang++-3.8 BUILD_TYPE=Debug
      addons: &clang38
        apt:
          packages:
            - clang-3.8
            - g++-5
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.8

    - env: COMPILER=clang++-3.8 BUILD_TYPE=Release
      addons: *clang38

    # Clang 3.9
    - env: COMPILER=clang++-3.9 BUILD_TYPE=Debug
      addons: &clang39
        apt:
          packages:
            - clang-3.9
            - g++-5
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.9

    - env: COMPILER=clang++-3.9 BUILD_TYPE=Release
      addons: *clang39

    # Clang 4.0
    - env: COMPILER=clang++-4.0 BUILD_TYPE=Debug
      addons: &clang40
        apt:
          packages:
            - clang-4.0
            - g++-5
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-trusty-4.0

    - env: COMPILER=clang++-4.0 BUILD_TYPE=Release
      addons: *clang40

    # Clang 5.0
    - env: COMPILER=clang++-5.0 BUILD_TYPE=Debug
      addons: &clang40
        apt:
          packages:
            - clang-5.0
            - g++-5
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-trusty-5.0
            - sourceline: 'deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-4.0 main'
              key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'

    - env: COMPILER=clang++-5.0 BUILD_TYPE=Release
      addons: *clang40    

    ##########################################################################
    # GCC on Linux
    ##########################################################################

    # GCC 5
    - env: COMPILER=g++-5 BUILD_TYPE=Debug
      addons: &gcc5
        apt:
          packages: g++-5
          sources:
            - ubuntu-toolchain-r-test

    - env: COMPILER=g++-5 BUILD_TYPE=Release
      addons: *gcc5

    # GCC 6
    - env: COMPILER=g++-6 BUILD_TYPE=Debug
      addons: &gcc6
        apt:
          packages: g++-6
          sources:
            - ubuntu-toolchain-r-test

    - env: COMPILER=g++-6 BUILD_TYPE=Release
      addons: *gcc6

    # Currently fails due to #525
    ## GCC 7
    #- env: COMPILER=g++-7 BUILD_TYPE=Debug
    #  addons: &gcc7
    #    apt:
    #      packages: g++-7
    #      sources:
    #        - ubuntu-toolchain-r-test

    #- env: COMPILER=g++-7 BUILD_TYPE=Release
    #  addons: *gcc7


install:
  # Set the ${CXX} variable properly
  - export CXX=${COMPILER}
  - ${CXX} --version

  # Dependencies required by the CI are installed in ${TRAVIS_BUILD_DIR}/deps/
  - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
  - mkdir -p "${DEPS_DIR}"
  - cd "${DEPS_DIR}"

  # Travis machines have 2 cores
  - JOBS=2

  ############################################################################
  # Install a recent CMake (unless already installed on OS X)
  ############################################################################
  - CMAKE_VERSION=3.7.2
  - |
    if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
      CMAKE_URL="https://cmake.org/files/v${CMAKE_VERSION%.[0-9]}/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz"
      mkdir cmake && travis_retry wget --no-check-certificate -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake
      export PATH=${DEPS_DIR}/cmake/bin:${PATH}
    else
      brew install cmake || brew upgrade cmake
    fi
  - cmake --version

  ############################################################################
  # [linux]: Install the right version of libc++
  ############################################################################
  - |
    LLVM_INSTALL=${DEPS_DIR}/llvm/install
    # if in linux and compiler clang and llvm not installed
    if [[ "${TRAVIS_OS_NAME}" == "linux" && "${CXX%%+*}" == "clang" && -n "$(ls -A ${LLVM_INSTALL})" ]]; then
      if   [[ "${CXX}" == "clang++-3.6" ]]; then LLVM_VERSION="3.6.2";
      elif [[ "${CXX}" == "clang++-3.7" ]]; then LLVM_VERSION="3.7.1";
      elif [[ "${CXX}" == "clang++-3.8" ]]; then LLVM_VERSION="3.8.1";
      elif [[ "${CXX}" == "clang++-3.9" ]]; then LLVM_VERSION="3.9.1";
      fi
      LLVM_URL="http://llvm.org/releases/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz"
      LIBCXX_URL="http://llvm.org/releases/${LLVM_VERSION}/libcxx-${LLVM_VERSION}.src.tar.xz"
      LIBCXXABI_URL="http://llvm.org/releases/${LLVM_VERSION}/libcxxabi-${LLVM_VERSION}.src.tar.xz"
      mkdir -p llvm llvm/build llvm/projects/libcxx llvm/projects/libcxxabi
      travis_retry wget -O - ${LLVM_URL} | tar --strip-components=1 -xJ -C llvm
      travis_retry wget -O - ${LIBCXX_URL} | tar --strip-components=1 -xJ -C llvm/projects/libcxx
      travis_retry wget -O - ${LIBCXXABI_URL} | tar --strip-components=1 -xJ -C llvm/projects/libcxxabi
      (cd llvm/build && cmake .. -DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL})
      (cd llvm/build/projects/libcxx && make install -j2)
      (cd llvm/build/projects/libcxxabi && make install -j2)
      export CXXFLAGS="-isystem ${LLVM_INSTALL}/include/c++/v1"
      export LDFLAGS="-L ${LLVM_INSTALL}/lib -l c++ -l c++abi"
      export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${LLVM_INSTALL}/lib"
    fi

before_script:
  # have CMake to generate build files
  - cd "${TRAVIS_BUILD_DIR}"
  - mkdir build && cd build
  - cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE
  
script:
  # build and run tests
  - cmake --build . -- -j${JOBS}
  - ctest --output-on-failure -j${JOBS}
