language: cpp
cache:
  timeout: 1000
  directories:
    - $HOME/vcpkg

matrix:
  include:

    - os: osx
      compiler: gcc
      name: macOS - gcc (llvm backend)
      env:
        - additional_defines=""
        - MATRIX_EVAL=""

    - os: osx
      compiler: gcc
      name: macOS - gcc (llvm backend) - opencv@2
      env:
        - OpenCV_DIR="/usr/local/opt/opencv@2/"
        - additional_defines="-DOpenCV_DIR=${OpenCV_DIR}"
        - MATRIX_EVAL="brew install opencv@2"

    - os: osx
      compiler: gcc
      name: macOS - gcc (llvm backend) - opencv@3
      env:
        - OpenCV_DIR="/usr/local/opt/opencv@3/"
        - additional_defines="-DOpenCV_DIR=${OpenCV_DIR}"
        - MATRIX_EVAL="brew install opencv@3"

    - os: osx
      compiler: gcc
      name: macOS - gcc (llvm backend) - opencv(latest)
      env:
        - additional_defines=""
        - MATRIX_EVAL="brew install opencv"

    - os: osx
      compiler: clang
      name: macOS - clang
      env:
        - additional_defines=""
        - MATRIX_EVAL=""

    - os: osx
      compiler: clang
      name: macOS - clang - C++ mode
      env:
        - additional_defines="-DBUILD_AS_CPP:BOOL=TRUE"
        - MATRIX_EVAL=""

    - os: osx
      compiler: clang
      name: macOS - clang - opencv@2
      env:
        - OpenCV_DIR="/usr/local/opt/opencv@2/"
        - additional_defines="-DOpenCV_DIR=${OpenCV_DIR}"
        - MATRIX_EVAL="brew install opencv@2"

    - os: osx
      compiler: clang
      name: macOS - clang - opencv@3
      env:
        - OpenCV_DIR="/usr/local/opt/opencv@3/"
        - additional_defines="-DOpenCV_DIR=${OpenCV_DIR}"
        - MATRIX_EVAL="brew install opencv@3"

    - os: osx
      compiler: clang
      name: macOS - clang - opencv(latest)
      env:
        - additional_defines=""
        - MATRIX_EVAL="brew install opencv"

    - os: osx
      compiler: clang
      name: macOS - clang - opencv(latest) - libomp
      env:
        - additional_defines=""
        - MATRIX_EVAL="brew install opencv libomp"

    - os: osx
      name: macOS - clang - vcpkg
      osx_image: xcode11.4
      env:
        - additional_defines="-DBUILD_SHARED_LIBS=OFF"
        - MATRIX_EVAL="brew install yasm && unset CC && unset CXX"
        - USE_VCPKG=true
        - VCPKG_DEFINES="-DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake"

    - os: linux
      compiler: clang
      dist: bionic
      name: ubuntu 18.04 - clang
      env:
        - additional_defines=""
        - MATRIX_EVAL=""

    - os: linux
      compiler: gcc
      dist: bionic
      name: ubuntu 18.04 - gcc
      env:
        - additional_defines=""
        - MATRIX_EVAL=""

    - os: linux
      compiler: gcc
      dist: bionic
      name: ubuntu 18.04 - g++
      env:
        - additional_defines="-DBUILD_AS_CPP:BOOL=TRUE"
        - MATRIX_EVAL=""

    - os: linux
      compiler: gcc
      dist: bionic
      name: ubuntu 18.04 - gcc - vcpkg
      addons:
        apt:
          update: true
          packages:
            - yasm
      env:
        - additional_defines="-DBUILD_SHARED_LIBS=OFF"
        - USE_VCPKG=true
        - VCPKG_DEFINES="-DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake"
        - MATRIX_EVAL=""

    - os: linux
      compiler: clang
      dist: bionic
      name: ubuntu 18.04 - clang - opencv@3
      addons:
        apt:
          update: true
          packages:
            - libopencv-dev
      env:
        - additional_defines=""
        - MATRIX_EVAL=""

    - os: linux
      compiler: gcc
      dist: bionic
      name: ubuntu 18.04 - gcc - opencv@3
      addons:
        apt:
          update: true
          packages:
            - libopencv-dev
      env:
        - additional_defines=""
        - MATRIX_EVAL=""

    - os: linux
      compiler: clang
      dist: bionic
      name: ubuntu 18.04 - clang - CUDA 10 - opencv@3
      addons:
        apt:
          update: true
          packages:
            - libopencv-dev
      env:
        - additional_defines=""
        - INSTALL_CUDA_VERSION="10.2"
        - CUDACXX=/usr/local/cuda-${INSTALL_CUDA_VERSION}/bin/nvcc
        - CUDA_PATH=/usr/local/cuda-${INSTALL_CUDA_VERSION}
        - CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-${INSTALL_CUDA_VERSION}
        - LD_LIBRARY_PATH="/usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64:/usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs:${LD_LIBRARY_PATH}"
        - MATRIX_EVAL="wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.2.89-1_amd64.deb && sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub && sudo dpkg -i cuda-repo-ubuntu1804_10.2.89-1_amd64.deb && wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb && sudo dpkg -i nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb && sudo apt-get -y update && sudo apt-get install -y --no-install-recommends cuda-compiler-10-2 cuda-libraries-dev-10-2 cuda-driver-dev-10-2 cuda-cudart-dev-10-2 cuda-curand-dev-10-2 && sudo apt-get install -y --no-install-recommends libcudnn7-dev && sudo ln -s /usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs/libcuda.so /usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs/libcuda.so.1"

    - os: linux
      compiler: gcc
      dist: bionic
      name: ubuntu 18.04 - gcc - CUDA 10 - opencv@3
      addons:
        apt:
          update: true
          packages:
            - libopencv-dev
      env:
        - additional_defines=""
        - INSTALL_CUDA_VERSION="10.2"
        - CUDACXX=/usr/local/cuda-${INSTALL_CUDA_VERSION}/bin/nvcc
        - CUDA_PATH=/usr/local/cuda-${INSTALL_CUDA_VERSION}
        - CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-${INSTALL_CUDA_VERSION}
        - LD_LIBRARY_PATH="/usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64:/usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs:${LD_LIBRARY_PATH}"
        - MATRIX_EVAL="wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.2.89-1_amd64.deb && sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub && sudo dpkg -i cuda-repo-ubuntu1804_10.2.89-1_amd64.deb && wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb && sudo dpkg -i nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb && sudo apt-get -y update && sudo apt-get install -y --no-install-recommends cuda-compiler-10-2 cuda-libraries-dev-10-2 cuda-driver-dev-10-2 cuda-cudart-dev-10-2 cuda-curand-dev-10-2 && sudo apt-get install -y --no-install-recommends libcudnn7-dev && sudo ln -s /usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs/libcuda.so /usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs/libcuda.so.1"

    - os: linux
      compiler: gcc
      dist: bionic
      name: ubuntu 18.04 - gcc - CUDA 10 - vcpkg
      addons:
        apt:
          update: true
          packages:
            - yasm
      env:
        - additional_defines="-DBUILD_SHARED_LIBS=OFF"
        - USE_VCPKG=true
        - VCPKG_DEFINES="-DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake"
        - INSTALL_CUDA_VERSION="10.2"
        - CUDACXX=/usr/local/cuda-${INSTALL_CUDA_VERSION}/bin/nvcc
        - CUDA_PATH=/usr/local/cuda-${INSTALL_CUDA_VERSION}
        - CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-${INSTALL_CUDA_VERSION}
        - LD_LIBRARY_PATH="/usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64:/usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs:${LD_LIBRARY_PATH}"
        - MATRIX_EVAL="wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.2.89-1_amd64.deb && sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub && sudo dpkg -i cuda-repo-ubuntu1804_10.2.89-1_amd64.deb && wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb && sudo dpkg -i nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb && sudo apt-get -y update && sudo apt-get install -y --no-install-recommends cuda-compiler-10-2 cuda-libraries-dev-10-2 cuda-driver-dev-10-2 cuda-cudart-dev-10-2 cuda-curand-dev-10-2 && sudo apt-get install -y --no-install-recommends libcudnn7-dev && sudo ln -s /usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs/libcuda.so /usr/local/cuda-${INSTALL_CUDA_VERSION}/lib64/stubs/libcuda.so.1"

  allow_failures:
    - name: macOS - clang - vcpkg

before_install:
  - travis_retry eval "${MATRIX_EVAL}"

install:
  # CMake upgrade on Linux
  - if [[ "$TRAVIS_OS_NAME" == "linux" ]] ; then wget --no-check-certificate https://github.com/Kitware/CMake/releases/download/v3.17.2/cmake-3.17.2-Linux-x86_64.tar.gz ; fi
  - if [[ "$TRAVIS_OS_NAME" == "linux" ]] ; then tar -xzf cmake-3.17.2-Linux-x86_64.tar.gz ; fi
  - if [[ "$TRAVIS_OS_NAME" == "linux" ]] ; then export PATH=$PWD/cmake-3.17.2-Linux-x86_64/bin:$PATH ; fi
  - pushd $HOME
  - if [ -d "$HOME/vcpkg/.git" ] ; then echo vcpkg cached ; else rm -rf vcpkg ; git clone https://github.com/Microsoft/vcpkg ; fi
  - cd vcpkg
  - git checkout .
  - git pull
  - if [ "${USE_VCPKG}" = true ] ; then ./bootstrap-vcpkg.sh ; fi
  - if [ "${USE_VCPKG}" = true ] ; then echo "set(VCPKG_BUILD_TYPE release)" >> triplets/x64-osx.cmake ; fi
  - if [ "${USE_VCPKG}" = true ] ; then echo "set(VCPKG_BUILD_TYPE release)" >> triplets/x64-linux.cmake ; fi
  - if [ "${USE_VCPKG}" = true ] ; then travis_wait 45 ./vcpkg upgrade --no-dry-run; fi
  - if [ "${USE_VCPKG}" = true ] ; then travis_wait ./vcpkg install stb pthreads --recurse; fi
  - if [ "${USE_VCPKG}" = true ] ; then travis_wait 45 ./vcpkg install ffmpeg --recurse; fi
  #- if [ "${USE_VCPKG}" = true ] && [[ ! -z "${CUDACXX}" ]] ; then travis_wait 45 ./vcpkg install opencv[ffmpeg,cuda] --recurse; fi
  #- if [ "${USE_VCPKG}" = true ] && [[ -z "${CUDACXX}" ]] ; then travis_wait 45 ./vcpkg install opencv[ffmpeg] --recurse; fi
  - if [ "${USE_VCPKG}" = true ] ; then travis_wait 45 ./vcpkg install opencv[ffmpeg] --recurse; fi
  - if [ "${USE_VCPKG}" = true ] ; then rm -rf buildtrees; fi
  - popd

before_script:
  - mkdir build_release
  - cd build_release
  - cmake .. -DCMAKE_BUILD_TYPE="Release" ${VCPKG_DEFINES} ${additional_defines}
  - cd ..

script:
  - cd build_release && cmake --build . --target install -- -j8 && cd ..
