#########################
# project configuration #
#########################

# C++ project
language: cpp

dist: trusty
sudo: required
group: edge


###################
# global settings #
###################

env:
  global:
   # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
   #   via the "travis encrypt" command using the project repo's public key
   - secure: "m89SSgE+ASLO38rSKx7MTXK3n5NkP9bIx95jwY71YEiuFzib30PDJ/DifKnXxBjvy/AkCGztErQRk/8ZCvq+4HXozU2knEGnL/RUitvlwbhzfh2D4lmS3BvWBGS3N3NewoPBrRmdcvnT0xjOGXxtZaJ3P74TkB9GBnlz/HmKORA="


################
# build matrix #
################

matrix:
  include:

  # Valgrind
  - os: linux
    compiler: gcc
    env:
      - COMPILER=g++-4.9
      - CMAKE_OPTIONS=-DJSON_Valgrind=ON
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-4.9', 'valgrind', 'ninja-build']

  # clang sanitizer
  - os: linux
    compiler: clang
    env:
      - COMPILER=clang++-5.0
      - CMAKE_OPTIONS=-DJSON_Sanitizer=ON
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-5.0']
        packages: ['g++-6', 'clang-5.0', 'ninja-build']

  # cppcheck
  - os: linux
    compiler: gcc
    env:
      - COMPILER=g++-4.9
      - SPECIAL=cppcheck
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-4.9', 'cppcheck', 'ninja-build']
    after_success:
      - make cppcheck

  # no exceptions
  - os: linux
    compiler: gcc
    env:
      - COMPILER=g++-4.9
      - CMAKE_OPTIONS=-DJSON_NoExceptions=ON
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-4.9', 'ninja-build']

  # check amalgamation
  - os: linux
    compiler: gcc
    env:
      - COMPILER=g++-4.9
      - SPECIAL=amalgamation
      - MULTIPLE_HEADERS=ON
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-4.9', 'astyle', 'ninja-build']
    after_success:
      - make check-amalgamation

  # Coveralls (http://gronlier.fr/blog/2015/01/adding-code-coverage-to-your-c-project/)

  - os: linux
    compiler: gcc
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-4.9', 'ninja-build']
    before_script:
      - pip install --user cpp-coveralls
    after_success:
      - coveralls --build-root test --include include/nlohmann --gcov 'gcov-4.9' --gcov-options '\-lp'
    env:
      - COMPILER=g++-4.9
      - CMAKE_OPTIONS=-DJSON_Coverage=ON
      - MULTIPLE_HEADERS=ON

  # Coverity (only for branch coverity_scan)

  - os: linux
    compiler: clang
    before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6']
        packages: ['g++-6', 'clang-3.6', 'ninja-build']
      coverity_scan:
        project:
          name: "nlohmann/json"
          description: "Build submitted via Travis CI"
        notification_email: niels.lohmann@gmail.com
        build_command_prepend: "mkdir coverity_build ; cd coverity_build ; cmake .. ; cd .."
        build_command: "make -C coverity_build"
        branch_pattern: coverity_scan
    env:
      - SPECIAL=coverity
      - COMPILER=clang++-3.6

  # OSX / Clang

  - os: osx
    osx_image: xcode8.3

  - os: osx
    osx_image: xcode9

  - os: osx
    osx_image: xcode9.1

  - os: osx
    osx_image: xcode9.2

  - os: osx
    osx_image: xcode9.3

  - os: osx
    osx_image: xcode9.4

  - os: osx
    osx_image: xcode10

  - os: osx
    osx_image: xcode10.1

  # Linux / GCC

  - os: linux
    compiler: gcc
    env: compiler=g++-4.8
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-4.8', 'ninja-build']

  - os: linux
    compiler: gcc
    env: compiler=g++-4.9
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-4.9', 'ninja-build']

  - os: linux
    compiler: gcc
    env: COMPILER=g++-5
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-5', 'ninja-build']

  - os: linux
    compiler: gcc
    env: COMPILER=g++-6
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-6', 'ninja-build']

  - os: linux
    compiler: gcc
    env: COMPILER=g++-7
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-7', 'ninja-build']

  - os: linux
    compiler: gcc
    env: COMPILER=g++-8
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-8', 'ninja-build']

  - os: linux
    compiler: gcc
    env:
      - COMPILER=g++-8
      - CXXFLAGS=-std=c++17
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-8', 'ninja-build']

  # Linux / Clang

  - os: linux
    compiler: clang
    env: COMPILER=clang++-3.5
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5']
        packages: ['g++-6', 'clang-3.5', 'ninja-build']

  - os: linux
    compiler: clang
    env: COMPILER=clang++-3.6
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6']
        packages: ['g++-6', 'clang-3.6', 'ninja-build']

  - os: linux
    compiler: clang
    env: COMPILER=clang++-3.7
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7']
        packages: ['g++-6', 'clang-3.7', 'ninja-build']

  - os: linux
    compiler: clang
    env: COMPILER=clang++-3.8
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-6', 'clang-3.8', 'ninja-build']

  - os: linux
    compiler: clang
    env: COMPILER=clang++-3.9
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test']
        packages: ['g++-6', 'clang-3.9', 'ninja-build']

  - os: linux
    compiler: clang
    env: COMPILER=clang++-4.0
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-4.0']
        packages: ['g++-6', 'clang-4.0', 'ninja-build']

  - os: linux
    compiler: clang
    env: COMPILER=clang++-5.0
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-5.0']
        packages: ['g++-6', 'clang-5.0', 'ninja-build']

  - os: linux
    compiler: clang
    env: COMPILER=clang++-6.0
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-6.0']
        packages: ['g++-6', 'clang-6.0', 'ninja-build']

  - os: linux
    compiler: clang
    env: COMPILER=clang++-7
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-7']
        packages: ['g++-6', 'clang-7', 'ninja-build']

  - os: linux
    compiler: clang
    env:
      - COMPILER=clang++-7
      - CXXFLAGS=-std=c++1z
    addons:
      apt:
        sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-7']
        packages: ['g++-6', 'clang-7', 'ninja-build']

################
# build script #
################

script:
  # get CMake and Ninja (only for systems with brew - macOS)
  - |
     if [[ (-x $(which brew)) ]]; then
       brew update
       brew install cmake ninja
       brew upgrade cmake
       cmake --version
     fi

  # make sure CXX is correctly set
  - if [[ "${COMPILER}" != "" ]]; then export CXX=${COMPILER}; fi
  # by default, use the single-header version
  - if [[ "${MULTIPLE_HEADERS}" == "" ]]; then export MULTIPLE_HEADERS=OFF; fi

  # show OS/compiler version
  - uname -a
  - $CXX --version

  # compile and execute unit tests
  - mkdir -p build && cd build
  - cmake .. ${CMAKE_OPTIONS} -DJSON_MultipleHeaders=${MULTIPLE_HEADERS} -GNinja && cmake --build . --config Release
  - ctest -C Release -V -j
  - cd ..

  # check if homebrew works (only checks develop branch)   
  - if [ `which brew` ]; then   
    brew update ;   
    brew tap nlohmann/json ;    
    brew install nlohmann_json --HEAD ;    
    brew test nlohmann_json ;    
    fi
