language: cpp

git:
  depth: 10

# sudo:required is needed for trusty images
sudo: required
dist: trusty

notifications:
  email: false

branches:
  only:
    - master

cache:
  ccache: true
  apt: true
  directories:
    - test/cache

env:
  global:
   - CCACHE_TEMPDIR=/tmp/.ccache-temp
   - CCACHE_COMPRESS=1
   - CASHER_TIME_OUT=599 # one second less than 10m to avoid 10m timeout error: https://github.com/Project-OSRM/osrm-backend/issues/2742
   - JOBS=4

matrix:
  fast_finish: true

  # We override the compiler names here to yield better ccache behavior, which uses this as key
  include:

    # Debug Builds
    - os: linux
      compiler: "gcc-6-debug"
      addons: &gcc6
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['g++-6', 'libbz2-dev', 'libstxxl-dev', 'libstxxl1', 'libxml2-dev', 'libzip-dev', 'lua5.1', 'liblua5.1-0-dev', 'libtbb-dev', 'libgdal-dev', 'libluabind-dev', 'libboost-all-dev', 'ccache']
      env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Debug' TARGET_ARCH='x86_64-asan' ENABLE_COVERAGE=ON ENABLE_SANITIZER=ON BUILD_COMPONENTS=ON

    - os: linux
      compiler: "clang-3.8-debug"
      addons: &clang38
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['libstdc++-5-dev', 'libbz2-dev', 'libstxxl-dev', 'libstxxl1', 'libxml2-dev', 'libzip-dev', 'lua5.1', 'liblua5.1-0-dev', 'libtbb-dev', 'libgdal-dev', 'libluabind-dev', 'libboost-all-dev', 'ccache']
      env: CLANG_VERSION='3.8.1' CLANG_PACKAGE="clang++" BUILD_TYPE='Debug' RUN_CLANG_FORMAT=ON BUILD_COMPONENTS=ON CUCUMBER_TIMEOUT=60000

    - os: osx
      osx_image: xcode7.3
      compiler: clang
      env: CCOMPILER='clang' CXXCOMPILER='clang++' BUILD_TYPE='Debug' JOBS=1 CUCUMBER_TIMEOUT=60000

    # Release Builds
    - os: linux
      compiler: "mason-release"
      addons:
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['libstdc++-5-dev', 'ccache']
      env: BUILD_TYPE='Release' ENABLE_MASON=ON

    - os: linux
      compiler: "gcc-6-release"
      addons: &gcc6
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['g++-6', 'libbz2-dev', 'libstxxl-dev', 'libstxxl1', 'libxml2-dev', 'libzip-dev', 'lua5.1', 'liblua5.1-0-dev', 'libtbb-dev', 'libgdal-dev', 'libluabind-dev', 'libboost-all-dev', 'ccache']
      env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Release' BUILD_COMPONENTS=ON

    - os: linux
      compiler: "gcc-6-release-i686"
      env: TARGET_ARCH='i686' CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Release'

      # Disabled because of CI slowness
      #- os: linux
      #- compiler: clang
      #- addons: &clang38
      #-   apt:
      #-     sources: ['llvm-toolchain-precise-3.8', 'ubuntu-toolchain-r-test']
      #-     packages: ['clang-3.8', 'libbz2-dev', 'libstxxl-dev', 'libstxxl1', 'libxml2-dev', 'libzip-dev', 'lua5.1', 'liblua5.1-0-dev', 'libtbb-dev', 'libgdal-dev', 'libluabind-dev', 'libboost-all-dev']
      #- env: CCOMPILER='clang-3.8' CXXCOMPILER='clang++-3.8' BUILD_TYPE='Release'

      # Disabled because of CI slowness
      #- os: osx
      #- osx_image: xcode7.3
      #- compiler: clang
      #- env: CCOMPILER='clang' CXXCOMPILER='clang++' BUILD_TYPE='Release'

    # Shared Library
    - os: linux
      compiler: "gcc-6-release-shared"
      addons: &gcc6
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['g++-6', 'libbz2-dev', 'libstxxl-dev', 'libstxxl1', 'libxml2-dev', 'libzip-dev', 'lua5.1', 'liblua5.1-0-dev', 'libtbb-dev', 'libgdal-dev', 'libluabind-dev', 'libboost-all-dev', 'ccache']
      env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Release' BUILD_SHARED_LIBS=ON BUILD_COMPONENTS=ON

      # Disabled because CI slowness
      #- os: linux
      #- compiler: clang
      #- addons: &clang38
      #-   apt:
      #-     sources: ['llvm-toolchain-precise-3.8', 'ubuntu-toolchain-r-test']
      #-     packages: ['clang-3.8', 'libbz2-dev', 'libstxxl-dev', 'libstxxl1', 'libxml2-dev', 'libzip-dev', 'lua5.1', 'liblua5.1-0-dev', 'libtbb-dev', 'libgdal-dev', 'libluabind-dev', 'libboost-all-dev']
      #- env: CCOMPILER='clang-3.8' CXXCOMPILER='clang++-3.8' BUILD_TYPE='Release' BUILD_SHARED_LIBS=ON

before_install:
  - if [[ ! -z $TARGET_ARCH ]] ; then source ./scripts/travis/before_install.$TARGET_ARCH.sh ; fi
  - if [[ $(uname -s) == 'Darwin' ]]; then sudo mdutil -i off /; fi;
  - source ./scripts/install_node.sh 4
  - npm install
  - DEPS_DIR="${TRAVIS_BUILD_DIR}/deps"
  - export PATH=${DEPS_DIR}/bin:${PATH} && mkdir -p ${DEPS_DIR}
  - CMAKE_URL="https://mason-binaries.s3.amazonaws.com/${TRAVIS_OS_NAME}-x86_64/cmake/3.5.2.tar.gz"
  - travis_retry wget --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C ${DEPS_DIR} || exit 1
  - |
    if [[ ${CLANG_VERSION:-false} != false ]]; then
      export CCOMPILER='clang'
      export CXXCOMPILER='clang++'
      CLANG_URL="https://mason-binaries.s3.amazonaws.com/${TRAVIS_OS_NAME}-x86_64/${CLANG_PACKAGE}/${CLANG_VERSION}.tar.gz"
      travis_retry wget --quiet -O - ${CLANG_URL} | tar --strip-components=1 -xz -C ${DEPS_DIR} || exit 1
    fi
  - |
    if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
      # implicit deps, but seem to be installed by default with recent images: libxml2 GDAL boost
      brew install libzip libstxxl lua51 luabind tbb md5sha1sum ccache
    fi
  - ccache --max-size=256M  # limiting the cache's size to roughly the previous job's object sizes

install:
  - |
    if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
      ./scripts/check_taginfo.py taginfo.json profiles/car.lua
    fi
  - mkdir build && pushd build
  - export CC=${CCOMPILER} CXX=${CXXCOMPILER}
  - cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_MASON=${ENABLE_MASON:-OFF} -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS:-OFF} -DENABLE_COVERAGE=${ENABLE_COVERAGE:-OFF} -DENABLE_SANITIZER=${ENABLE_SANITIZER:-OFF} -DBUILD_TOOLS=ON -DBUILD_COMPONENTS=${BUILD_COMPONENTS:-OFF} -DENABLE_CCACHE=ON
  - echo "travis_fold:start:MAKE"
  - make osrm-extract --jobs=3
  - make --jobs=${JOBS}
  - make tests --jobs=${JOBS}
  - make benchmarks --jobs=${JOBS}
  - echo "travis_fold:end:MAKE"
  - ccache -s
  - sudo make install
  - |
    if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
      sudo ldconfig
    fi
  - popd
  - |
    if [[ ${ENABLE_MASON:-OFF} == 'ON' ]]; then
      # for mason builds we need to point the example
      # at the clang++ installed by the CMakeLists.txt automatically
      export CXX=$(./third_party/mason/mason prefix clang++ 3.8.1)/bin/clang++
      export CC=$(./third_party/mason/mason prefix clang++ 3.8.1)/bin/clang
    fi
  - mkdir example/build && pushd example/build
  - cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
  - make
  - popd

script:
  - if [[ $TARGET_ARCH == armhf ]] ; then echo "Skip tests for $TARGET_ARCH" && exit 0 ; fi
  - echo "travis_fold:start:BENCHMARK"
  - make -C test/data benchmark
  - echo "travis_fold:end:BENCHMARK"
  - ./example/build/osrm-example test/data/monaco.osrm
  # All tests assume to be run from the build directory
  - pushd build
  - ./unit_tests/library-tests ../test/data/monaco.osrm
  - ./unit_tests/extractor-tests
  - ./unit_tests/engine-tests
  - ./unit_tests/util-tests
  - ./unit_tests/server-tests
  - popd
  - npm test

after_success:
  - |
    if [ -n "${RUN_CLANG_FORMAT}" ]; then
      ./scripts/format.sh # we don't want to fail just yet
    fi
  - |
    if [ -n "${ENABLE_COVERAGE}" ]; then
      bash <(curl -s https://codecov.io/bash)
    fi
