dist: xenial
language: cpp
os:
  - linux
  - osx
arch:
  - amd64
  - arm64
  - ppc64le
compiler:
  - clang
  - gcc
osx_image: xcode9.4
cache:
  - ccache

addons:
  apt:
    sources:
      - ubuntu-toolchain-r-test
    packages:
      - libgflags-dev
      - libbz2-dev
      - liblz4-dev
      - libsnappy-dev
      - liblzma-dev  # xv
      - libzstd-dev
      - zlib1g-dev
  homebrew:
    update: true
    packages:
      - ccache
      - gflags
      - lz4
      - snappy
      - xz
      - zstd

env:
  - TEST_GROUP=platform_dependent # 16-18 minutes
  - TEST_GROUP=1 # 33-35 minutes
  - TEST_GROUP=2 # 18-20 minutes
  - TEST_GROUP=3 # 20-22 minutes
  - TEST_GROUP=4 # 12-14 minutes
  # Run java tests
  - JOB_NAME=java_test # 4-11 minutes
  # Build ROCKSDB_LITE
  - JOB_NAME=lite_build # 3-4 minutes
  # Build examples
  - JOB_NAME=examples # 5-7 minutes
  - JOB_NAME=cmake # 3-5 minutes
  - JOB_NAME=cmake-gcc8 # 3-5 minutes
  - JOB_NAME=cmake-gcc9 # 3-5 minutes
  - JOB_NAME=cmake-gcc9-c++20 # 3-5 minutes
  - JOB_NAME=cmake-mingw # 3 minutes
  - JOB_NAME=make-gcc4.8
  - JOB_NAME=status_checked

matrix:
  exclude:
  - os: osx
    env: JOB_NAME=cmake-gcc8
  - os: osx
    env: JOB_NAME=cmake-gcc9
  - os: osx
    env: JOB_NAME=cmake-gcc9-c++20
  - os: osx
    env: JOB_NAME=cmake-mingw
  - os: osx
    env: JOB_NAME=make-gcc4.8
  - os: osx
    arch: ppc64le
  - os: osx
    compiler: gcc
  - os : linux
    arch: arm64
    env: JOB_NAME=cmake-mingw
  - os : linux
    arch: arm64
    env: JOB_NAME=make-gcc4.8
  - os: linux
    arch: ppc64le
    env: JOB_NAME=cmake-mingw
  - os: linux
    arch: ppc64le
    env: JOB_NAME=make-gcc4.8
  - os: linux
    compiler: clang
  # Exclude all but most unique cmake variants for pull requests, but build all in branches
  - if: type = pull_request
    os : linux
    arch: amd64
    env: JOB_NAME=cmake
  - if: type = pull_request
    os : linux
    arch: amd64
    env: JOB_NAME=cmake-gcc8
  - if: type = pull_request
    os : linux
    arch: amd64
    env: JOB_NAME=cmake-gcc9
  # Exclude most osx, arm64 and ppc64le tests for pull requests, but build in branches
  # Temporarily disable ppc64le unit tests in PRs until Travis gets its act together (#6653)
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: TEST_GROUP=platform_dependent
  # NB: the cmake build is a partial java test
  - if: type = pull_request
    os: osx
    env: TEST_GROUP=1
  - if: type = pull_request
    os : linux
    arch: arm64
    env: TEST_GROUP=1
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: TEST_GROUP=1
  - if: type = pull_request
    os: osx
    env: TEST_GROUP=2
  - if: type = pull_request
    os : linux
    arch: arm64
    env: TEST_GROUP=2
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: TEST_GROUP=2
  - if: type = pull_request
    os: osx
    env: TEST_GROUP=3
  - if: type = pull_request
    os : linux
    arch: arm64
    env: TEST_GROUP=3
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: TEST_GROUP=3
  - if: type = pull_request
    os: osx
    env: TEST_GROUP=4
  - if: type = pull_request
    os : linux
    arch: arm64
    env: TEST_GROUP=4
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: TEST_GROUP=4
  - if: type = pull_request AND commit_message !~ /java/
    os : osx
    env: JOB_NAME=java_test
  - if: type = pull_request AND commit_message !~ /java/
    os : linux
    arch: arm64
    env: JOB_NAME=java_test
  - if: type = pull_request AND commit_message !~ /java/
    os: linux
    arch: ppc64le
    env: JOB_NAME=java_test
  - if: type = pull_request
    os : osx
    env: JOB_NAME=lite_build
  - if: type = pull_request
    os : linux
    arch: arm64
    env: JOB_NAME=lite_build
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: JOB_NAME=lite_build
  - if: type = pull_request
    os : osx
    env: JOB_NAME=examples
  - if: type = pull_request
    os : linux
    arch: arm64
    env: JOB_NAME=examples
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: JOB_NAME=examples
  - if: type = pull_request
    os : linux
    arch: arm64
    env: JOB_NAME=cmake-gcc8
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: JOB_NAME=cmake-gcc8
  - if: type = pull_request
    os : linux
    arch: arm64
    env: JOB_NAME=cmake-gcc9
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: JOB_NAME=cmake-gcc9
  - if: type = pull_request
    os : linux
    arch: arm64
    env: JOB_NAME=cmake-gcc9-c++20
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: JOB_NAME=cmake-gcc9-c++20
  - if: type = pull_request
    os : osx
    env: JOB_NAME=status_checked
  - if: type = pull_request
    os : linux
    arch: arm64
    env: JOB_NAME=status_checked
  - if: type = pull_request
    os: linux
    arch: ppc64le
    env: JOB_NAME=status_checked

install:
  - if [ "${TRAVIS_OS_NAME}" == osx ]; then
      PATH=$PATH:/usr/local/opt/ccache/libexec;
    fi
  - if [ "${JOB_NAME}" == cmake-gcc8 ]; then
      sudo apt-get install -y g++-8;
      CC=gcc-8 && CXX=g++-8;
    fi
  - if [ "${JOB_NAME}" == cmake-gcc9 ] || [ "${JOB_NAME}" == cmake-gcc9-c++20 ]; then
      sudo apt-get install -y g++-9;
      CC=gcc-9 && CXX=g++-9;
    fi
  - if [ "${JOB_NAME}" == cmake-mingw ]; then
      sudo apt-get install -y mingw-w64 ;
    fi
  - if [ "${JOB_NAME}" == make-gcc4.8 ]; then
      sudo apt-get install -y g++-4.8 ;
      CC=gcc-4.8 && CXX=g++-4.8;
    fi
  - if [[ "${JOB_NAME}" == cmake* ]] && [ "${TRAVIS_OS_NAME}" == linux ]; then
      CMAKE_DIST_URL="https://rocksdb-deps.s3-us-west-2.amazonaws.com/cmake/cmake-3.14.5-Linux-$(uname -m).tar.bz2";
      TAR_OPT="--strip-components=1 -xj";
      if [ "aarch64" == "$(uname -m)" ]; then
        sudo apt-get install -y libuv1 librhash0;
        sudo apt-get upgrade -y libstdc++6;
      fi;
      mkdir cmake-dist && curl --silent --fail --show-error --location "${CMAKE_DIST_URL}" | tar -C cmake-dist ${TAR_OPT} && export PATH=$PWD/cmake-dist/bin:$PATH;
    fi
  - |
    if [[ "${JOB_NAME}" == java_test || "${JOB_NAME}" == cmake* ]]; then
      # Ensure JDK 8
      if [ "${TRAVIS_OS_NAME}" == osx ]; then
        brew tap AdoptOpenJDK/openjdk
        brew cask install adoptopenjdk8
        export JAVA_HOME=$(/usr/libexec/java_home)
      else
        sudo apt-get install -y openjdk-8-jdk
        export PATH=/usr/lib/jvm/java-8-openjdk-$(dpkg --print-architecture)/bin:$PATH
        export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-$(dpkg --print-architecture)
      fi
      echo "JAVA_HOME=${JAVA_HOME}"
      which java && java -version
      which javac && javac -version
    fi

before_script:
  # Increase the maximum number of open file descriptors, since some tests use
  # more FDs than the default limit.
  - ulimit -n 8192

script:
  - date; ${CXX} --version
  - if [ `command -v ccache` ]; then ccache -C; fi
  - case $TEST_GROUP in
    platform_dependent)
      OPT=-DTRAVIS V=1 ROCKSDBTESTS_END=db_block_cache_test make -j4 all_but_some_tests check_some
      ;;
    1)
      OPT=-DTRAVIS V=1 ROCKSDBTESTS_START=db_block_cache_test ROCKSDBTESTS_END=db_iter_test make -j4 check_some
      ;;
    2)
      OPT="-DTRAVIS -DROCKSDB_NAMESPACE=alternative_rocksdb_ns" V=1 make -j4 tools && OPT="-DTRAVIS -DROCKSDB_NAMESPACE=alternative_rocksdb_ns" V=1 ROCKSDBTESTS_START=db_iter_test ROCKSDBTESTS_END=options_file_test make -j4 check_some
      ;;
    3)
      OPT=-DTRAVIS V=1 ROCKSDBTESTS_START=options_file_test ROCKSDBTESTS_END=write_prepared_transaction_test make -j4 check_some
      ;;
    4)
      OPT=-DTRAVIS V=1 ROCKSDBTESTS_START=write_prepared_transaction_test make -j4 check_some
      ;;
    esac
  - case $JOB_NAME in
    java_test)
      OPT=-DTRAVIS V=1 make rocksdbjava jtest
      ;;
    lite_build)
      OPT='-DTRAVIS -DROCKSDB_LITE' V=1 make -j4 all
      ;;
    examples)
      OPT=-DTRAVIS V=1 make -j4 static_lib && cd examples && make -j4
      ;;
    cmake-mingw)
      sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix;
      mkdir build && cd build && cmake -DJNI=1 -DWITH_GFLAGS=OFF .. -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -DCMAKE_SYSTEM_NAME=Windows && make -j4 rocksdb rocksdbjni
      ;;
    cmake*)
      case $JOB_NAME in
        *-c++20)
          OPT=-DCMAKE_CXX_STANDARD=20
          ;;
      esac

      mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=0 -DWITH_GFLAGS=0 -DWITH_BENCHMARK_TOOLS=0 -DWITH_TOOLS=0 -DWITH_CORE_TOOLS=1 .. && make -j4 && cd  .. && rm -rf build && mkdir build && cd build && cmake -DJNI=1 .. -DCMAKE_BUILD_TYPE=Release $OPT && make -j4 rocksdb rocksdbjni
      ;;
    make-gcc4.8)
      OPT=-DTRAVIS V=1 SKIP_LINK=1 make -j4 all && [ "Linking broken because libgflags compiled with newer ABI" ]
      ;;
    status_checked)
      OPT=-DTRAVIS V=1 ASSERT_STATUS_CHECKED=1 make -j4 check_some
      ;;
    esac
notifications:
    email:
      - leveldb@fb.com
