language: c

# Platform descriptions
# NOTE: These can be used in creating the build matrix by making use of the
#       anchor/alias YAML features.
linux_gcc8: &linux_gcc8
  os: linux
  dist: xenial
  compiler: gcc
  addons:
    apt:
      update: true
      sources: [ ubuntu-toolchain-r-test ]
      packages: [ gcc-8 g++-8 ]

linux_clang: &linux_clang
  os: linux
  dist: xenial
  compiler: clang
  addons:
    apt:
      update: true

osx_xcode10_1: &osx_xcode10_1
  os: osx
  osx_image: xcode10.1
  compiler: clang
  addons:
    homebrew:
      packages:
      - pyenv-virtualenv

windows_vs2017: &windows_vs2017
  os: windows

matrix:
  include:
    - <<: *linux_gcc8
      env: [ BUILD_TYPE=Debug, C_COMPILER=gcc-8, CXX_COMPILER=g++-8, USE_SANITIZER=none ]
    - <<: *linux_gcc8
      env: [ BUILD_TYPE=Release, C_COMPILER=gcc-8, CXX_COMPILER=g++-8, USE_SANITIZER=none ]
    - <<: *linux_clang
      env: [ BUILD_TYPE=Debug, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=address ]
    - <<: *linux_clang
      env: [ BUILD_TYPE=Release, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=none ]
    - <<: *osx_xcode10_1
      env: [ BUILD_TYPE=Debug, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=address ]
    - <<: *osx_xcode10_1
      env: [ BUILD_TYPE=Release, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=none ]
    - <<: *windows_vs2017
      env: [ ARCH=x86, BUILD_TYPE=Debug, GENERATOR="Visual Studio 15 2017" ]
    - <<: *windows_vs2017
      env: [ ARCH=x86_64, BUILD_TYPE=Debug, GENERATOR="Visual Studio 15 2017" ]
    - <<: *windows_vs2017
      env: [ ARCH=x86_64, BUILD_TYPE=Release, GENERATOR="Visual Studio 15 2017" ]

# Conan will automatically determine the best compiler for a given platform
# based on educated guesses. The first check is based on the CC and CXX
# environment variables, the second (on Windows) is to check if Microsoft
# Visual Studio is installed. On Travis CC and CXX are set to gcc on Microsoft
# Windows targets as well, this has the undesired effect that MSVC is not
# detected, unsetting CC and CXX solves that problem.
before_install:
  - if [ "${TRAVIS_OS_NAME}" = "windows" ]; then
      eval "unset CC";
      eval "unset CXX";
      JAVA_HOME=$(find "/c/Program Files/Android/jdk/" -name "*openjdk*" | sort | head -n 1);
      export JAVA_HOME;
      export PATH="${PATH}:${JAVA_HOME}/bin";
    else
      eval "export CC=${C_COMPILER}";
      eval "export CXX=${CXX_COMPILER}";
    fi

# Windows targets in Travis are still very much in beta and Python is not yet
# available and installation of Python through Chocolaty does not work well.
# The real fix is to wait until Python and pip are both available on the
# target. Until then download Conan from the official website and simply add
# the extracted folder to the path.
install:
  - if [ "${TRAVIS_OS_NAME}" = "windows" ]; then
      choco install innoextract;
      choco install maven --ignore-dependencies;
      wget -q https://dl.bintray.com/conan/installers/conan-win-64_1_10_0.exe;
      innoextract conan-win-64_1_10_0.exe;
      eval "export PATH=\"$(pwd)/app/conan:${PATH}\"";
    elif [ "${TRAVIS_OS_NAME}" = "osx" ]; then
      eval "$(pyenv init -)";
      pyenv virtualenv conan;
      pyenv rehash;
      pyenv activate conan;
      pip install conan --upgrade;
    else
      pip install conan --upgrade --user;
    fi
  - conan profile new default --detect

before_script:
  - conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan
  - conan profile get settings.arch default
  - if [ -z "${ARCH}" ]; then
      eval "export ARCH=\"$(conan profile get settings.arch default)\"";
    fi
  - if [ "${TRAVIS_OS_NAME}" = "windows" ]; then
      GENERATOR_ARCH=$(if [ "${ARCH}" = "x86_64" ]; then echo " Win64"; fi);
      eval "export GENERATOR=\"${GENERATOR}${GENERATOR_ARCH}\"";
      eval "export USE_SANITIZER=none";
    else
      eval "export GENERATOR=\"Unix Makefiles\"";
    fi
  - export

script:
  - mkdir build
  - cd build
  - conan install -b missing -s arch=${ARCH} -s build_type=${BUILD_TYPE} ..
  - cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
          -DCMAKE_INSTALL_PREFIX=$(pwd)/install
          -DUSE_SANITIZER=${USE_SANITIZER}
          -DBUILD_TESTING=on
          -G "${GENERATOR}" ../src
  - cmake --build . --config ${BUILD_TYPE} --target install
  - CYCLONEDDS_URI='<CycloneDDS><DDSI2E><Internal><EnableExpensiveChecks>all</EnableExpensiveChecks></Internal></DDSI2E></CycloneDDS>' ctest -T test -C ${BUILD_TYPE}
  - if [ "${USE_SANITIZER}" != "none" ]; then
      CMAKE_LINKER_FLAGS="-DCMAKE_LINKER_FLAGS=-fsanitize=${USE_SANITIZER}";
      CMAKE_C_FLAGS="-DCMAKE_C_FLAGS=-fsanitize=${USE_SANITIZER}";
    fi
  - mkdir install/share/CycloneDDS/examples/helloworld/build
  - cd install/share/CycloneDDS/examples/helloworld/build
  - cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
          ${CMAKE_C_FLAGS}
          ${CMAKE_LINKER_FLAGS}
          -G "${GENERATOR}" ..
  - cmake --build . --config ${BUILD_TYPE}

