language: cpp
matrix:
  include:
# gcc
#   xenial
#   gcc 5 is the default on xenial
    - os: linux
      dist: xenial
      compiler: gcc
      addons:
        apt:
          packages:
            - valgrind
            - cppcheck
            - doxygen
            - cmake
      env: CHECK="true"
#   bionic
    - os: linux
      dist: bionic
      compiler: gcc
      env: MATRIX_EVAL="CC=gcc-6 && CXX=g++-6"

    # gcc 7 is the default on bionic
    - os: linux
      dist: bionic
      compiler: gcc
      env: CHECK="true"
    - os: linux
      dist: bionic
      compiler: gcc
      env: MATRIX_EVAL="CC=gcc-8 && CXX=g++-8"

# clang
#   xenial
    - os: linux
      dist: xenial
      compiler: clang
      addons:
        apt:
          sources:
            - llvm-toolchain-xenial-5.0
          packages:
            - clang-5.0
            - cmake
      env: MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0"
    - os: linux
      dist: xenial
      compiler: clang
      addons:
        apt:
          sources:
            - llvm-toolchain-xenial-6.0
          packages:
            - clang-6.0
            - cmake
      env: MATRIX_EVAL="CC=clang-6.0 && CXX=clang++-6.0"

    # clang-7 is the default on xenial and bionic
    - os: linux
      dist: xenial
      compiler: clang
      addons:
        apt:
          packages:
            - valgrind
            - cppcheck
            - doxygen
            - cmake
      env: CHECK="true"

# bionic
    - os: linux
      dist: bionic
      compiler: clang
      env: CHECK="true"
# osx
    - os: osx
      osx_image: xcode9.4
      env: XCODE="true"
    - os: osx
      osx_image: xcode12.5
      env: XCODE="true" CHECK="true"

# run coveralls
    - os: linux
      dist: xenial
      compiler: gcc
      addons:
        apt:
          packages:
            - lcov
      env: CHECK="true"
      before_install:
        - sudo gem install coveralls-lcov
        - echo $CC
        - echo $LANG
        - echo $LC_ALL
        - set -e
        - if [ "$TRAVIS_OS_NAME" = "linux" ]; then
            eval "${MATRIX_EVAL}";
            if [ -n "$MATRIX_EVAL" ] && [ "$TRAVIS_COMPILER" != "clang" ]; then
              sudo apt-get install -y $CC;
            fi;
          fi
      before_script:
        - export CFLAGS="-fprofile-arcs -ftest-coverage"
        - mkdir build && cd build && cmake ..
      script:
        - make
        - make test
      after_success:
        - cd ..
        - lcov -d build/ -b . -c -o build/all_coverage.info
        - lcov -r build/all_coverage.info '/usr/*' '*CMakeFiles*' '*fuzz*' '*test*' -o build/coverage.info
        - coveralls-lcov --verbose build/coverage.info

#  allow_failures:
#    - os: osx

before_install:
  - echo $CC
  - echo $LANG
  - echo $LC_ALL
  - set -e
  - if [ "$TRAVIS_OS_NAME" = "linux" ]; then
      eval "${MATRIX_EVAL}";
      if [ -n "$MATRIX_EVAL" ] && [ "$TRAVIS_COMPILER" != "clang" ]; then
        sudo apt-get install -y $CC;
      fi;
    fi

before_script:
  # XXX osx on travis doesn't work w/ set -e, so turn it off :(
  - set +e
  - mkdir -p build || echo "Failed to mkdir build"
  - cd build || echo "Failed to cd build"
  - cmake .. || echo "Failed to run cmake"

script:
  - make
  # when using bionic, Travis seems to ignore the "addons" section, so installing the packages with apt-get...
  - if [ -n "$CHECK" ]; then
      if [ "$TRAVIS_OS_NAME" = "osx" ]; then
        brew install doxygen;
      else
        if [ "$TRAVIS_DIST" = "bionic" ]; then
          sudo apt-get install -y valgrind cppcheck doxygen;
        fi;
      fi;
      make distcheck;
      if type cppcheck &> /dev/null ; then cppcheck --error-exitcode=1 --quiet *.h *.c tests/ ; fi;
    fi
