# Copyright (c) 2012-2022 Sebastien Rombauts (sebastien.rombauts@gmail.com)

language: cpp

# Use Linux unless specified otherwise
os: linux

cache:
  apt: true

env:
  global:
    - BUILD_TYPE=Debug
    - ASAN=ON
    - INTERNAL_SQLITE=ON
    - VALGRIND=OFF

# Build variants (should test a reasonable number of combination of CMake options)
jobs:
  include:

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

    # Coverity static code analysis
    - dist: bionic
      env:
        - COVERITY_SCAN_PROJECT_NAME=SRombauts/SQLiteCpp
        - COVERITY_SCAN_BRANCH_PATTERN=master
        - COVERITY_SCAN_NOTIFICATION_EMAIL=sebastien.rombauts@gmail.com
        - COVERITY_SCAN_BUILD_COMMAND_PREPEND="cmake ."
        - COVERITY_SCAN_BUILD_COMMAND="make -j8"
        # Encrypted COVERITY_SCAN_TOKEN, created via the "travis encrypt" command using the project repo's public key
        - secure: "Qm4d8NEDPBtYZCYav46uPEvDCtaRsjLXlkVS+C+WCJAPcwXCGkrr96wEi7RWcq2xD86QCh0XiqaPT+xdUmlohOYIovRhaaBmZ1lwIJ4GsG/ZR6xoFr3DYsZ3o4GyXk2vNXNxEl82AC+Xs6e6gkLOV9XRkBcjpVIvoIXgNlKWeGY="

    # GCC 7.4.0 Debug build with GCov for coverage build
    - dist: bionic
      env:
        - cc=gcc cxx=g++
        - GCOV=ON
        - COVERALLS=true

    # GCC 7.4.0 Debug build with Valgrind instead of Address Sanitizer
    - dist: bionic
      env:
        - cc=gcc cxx=g++
        - ASAN=OFF
        - VALGRIND=true

    # GCC 7.4.0 Release build
    - dist: bionic
      env:
        - cc=gcc cxx=g++
        - BUILD_TYPE=Release

    # GCC 7.4.0 test linking with libsqlite3-dev package
    - dist: bionic
      env:
        - cc=gcc cxx=g++
        - INTERNAL_SQLITE=OFF

    # GCC 5.4.0
    - dist: xenial
      env:
        - cc=gcc cxx=g++

    # GCC 4.8.4
    - dist: trusty
      env:
        - cc=gcc cxx=g++

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

    # Clang 7.0.0
    - dist: bionic
      env:
        - cc=clang cxx=clang++

    # Clang 7.0.0
    - dist: xenial
      env:
        - cc=clang cxx=clang++

    # Clang 5.0.0
    - dist: trusty
      env:
        - cc=clang cxx=clang++

    ##########################################################################
    # Clang on OSX
    ##########################################################################

    # Latest XCode - AppleClang 9.1.0
    - os: osx
      env:
        - cc=clang cxx=clang++

    # XCode 8.3 - AppleClang 8.1.0
    - os: osx
      osx_image: xcode8.3
      env:
        - cc=clang cxx=clang++

before_install:
  # Coverity: don't use addons.coverity_scan since it run on every job of the build matrix, which waste resources and exhausts quotas
  # Note: the job dedicated to Coverity need to only run the shell script and then exit (to not try to build and run unit tests etc.)
  - if [[ -n "$COVERITY_SCAN_PROJECT_NAME" ]] ; then curl -s https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh | bash ; exit 0 ; fi

  - if [[ "$INTERNAL_SQLITE" == "OFF" ]]; then sudo apt-get install libsqlite3-dev ; fi
  - if [[ "$VALGRIND" == "true" ]]; then sudo apt-get install valgrind ; fi
  - if [[ "$COVERALLS" == "true" ]]; then pip install --user cpp-coveralls ; fi

    # Set the compiler environment variables properly
  - export CC=${cc}
  - export CXX=${cxx}

# scripts to run before build
before_script:
  - mkdir build
  - cd build
  - cmake -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DSQLITECPP_INTERNAL_SQLITE=$INTERNAL_SQLITE -DSQLITECPP_USE_ASAN=$ASAN -DSQLITECPP_USE_GCOV=$GCOV -DSQLITECPP_BUILD_EXAMPLES=ON -DSQLITECPP_BUILD_TESTS=ON ..

# build examples, and run tests (ie make & make test)
script:
  - cmake --build .
  - export ASAN_OPTIONS=verbosity=1:debug=1
  - ctest --verbose --output-on-failure
  - if [[ "$VALGRIND" == "true" ]]; then valgrind --leak-check=full --error-exitcode=1 ./SQLiteCpp_example1 ; fi
  - if [[ "$VALGRIND" == "true" ]]; then valgrind --leak-check=full --error-exitcode=1 ./SQLiteCpp_tests ; fi

# generate and publish GCov coveralls results
after_success:
  - if [[ "$COVERALLS" == "true" ]]; then coveralls --root .. -e examples -e googletest -e sqlite3 -e tests -E ".*feature_tests.*" -E ".*CompilerId.*" --gcov-options '\-lp' ; fi
