language: c
sudo: required

env:
  global:
    # GITAUTH:
    - secure: nSunY54Wp5HkQCHHbKwlwpbaKyqRVIu/0EnhaoJSwhM1wqerQV/E5d/2JelO9/tZgbungAO7wk/fjutRMVc7d378RTIPwS8vHpvZfEoGhCFsLoTOlqESzsZFBup2H5t1lpQ23jRHDOxlLdJy2lz5U+zd1YnYgDXqdDFjegsIYdo=
    - PYTHON=python2

dist: trusty

matrix:
  fast_finish: true
  include:
#
# gcc-4.8 (trusty) full host and cross build with tests:
# doc, cert, cross-mingw32, cross-mingw64, cross-linux32, cross-raspi, linux64,
# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal, debian-package
    - os: linux
      compiler: gcc-4.8
      addons:
        apt:
          sources:
            # see https://github.com/travis-ci/apt-source-whitelist/blob/master/ubuntu.json
            - ubuntu-toolchain-r-test
          packages:
            - mingw-w64
            - gcc-mingw-w64-i686
            - gcc-mingw-w64-x86-64
            - binutils-mingw-w64-i686
            - g++-multilib
            # debian packaging
            - cmake
            - debhelper
            - fakeroot
            # doc
            - python-sphinx
            - graphviz
            - texlive-generic-extra
            - texlive-fonts-recommended
            - texlive-latex-extra
            - latexmk
            # tests
            - check
            - valgrind
      env:
        - MINGW=true
        - DEBIAN=true
#
# gcc-8 full host build with tests:
# doc, cert, linux64,
# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal
    - os: linux
      compiler: gcc-8
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - gcc-8
            - gcc-8-multilib
            # doc
            - python-sphinx
            - graphviz
            - texlive-generic-extra
            - texlive-fonts-recommended
            - texlive-latex-extra
            - latexmk
            # tests
            - check
            - valgrind
#
# clang-6 full host build with tests:
# doc, cert, linux64,
# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal
    - os: linux
      compiler: clang-6.0
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-6.0
            - ubuntu-toolchain-r-test
          packages:
            - clang-6.0
            - clang-tidy-6.0
            # doc
            - python-sphinx
            - graphviz
            - texlive-generic-extra
            - texlive-fonts-recommended
            - texlive-latex-extra
            - latexmk
            # tests
            - check
            - valgrind
#
# clang-6 python-3 full host build with tests:
# doc, cert, linux64,
# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal
    - os: linux
      compiler: clang-6.0
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-6.0
            - ubuntu-toolchain-r-test
          packages:
            - clang-6.0
            - clang-tidy-6.0
            # doc
            - python3-sphinx
            - graphviz
            - texlive-generic-extra
            - texlive-fonts-recommended
            - texlive-latex-extra
            - latexmk
            # tests
            - check
            - valgrind
      env:
        - PYTHON=python3
#
# tcc full host build:
# doc, cert, linux64,
# amalgamated, shared, multithread, encryption, discovery, json, test-ns0-full, test-ns0-minimal
    - os: linux
      compiler: tcc
      addons:
        apt:
          packages:
            # doc
            - python-sphinx
            - graphviz
            - texlive-generic-extra
            - texlive-fonts-recommended
            - texlive-latex-extra
            - latexmk
            # tests
            - check
            - valgrind
#
# clang-6 python-3 install build and minimal example:
# linux64, minimal-example
    - os: linux
      compiler: clang-6.0
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-6.0
            - ubuntu-toolchain-r-test
          packages:
            - clang-6.0
            - clang-tidy-6.0
      env:
        - INSTALL=true
        - PYTHON=python3
        - CXX=clang-6.0
#
# gcc-4.8 static code analysis
    - os: linux
      compiler: gcc
      addons:
        apt:
          packages:
            - cppcheck
      env:
        - ANALYZE=true
#
# clang-6 static code analysis
    - os: linux
      compiler: clang-6.0
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-6.0
            - ubuntu-toolchain-r-test
          packages:
            - check
            - clang-6.0
            - clang-tidy-6.0
      env:
        - ANALYZE=true
        - PYTHON=python3
#
# clang-format code analysis
# is allowed to fail (see allow_failures)
    - os: linux
      compiler: clang-6.0
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-6.0
            - ubuntu-toolchain-r-test
          packages:
            - clang-6.0
            - clang-tidy-6.0
            - clang-format-6.0
      env:
        - CLANG_FORMAT=true
#
# DOCKER build
    - os: linux
      compiler: gcc
      env:
        - DOCKER=true
#
# clang-6 FUZZER build
    - os: linux
      compiler: clang-6.0
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-6.0
            - ubuntu-toolchain-r-test
          packages:
            - check
            - clang-6.0
            - clang-tidy-6.0
            - libfuzzer-6.0-dev
      env:
        - FUZZER=true
#
# OSX clang build
    - os: osx
      compiler: clang
      # OSX may have different hostnames between processes, which causes multicast unit test to fail.
      # Hardcode the hostname here
      addons:
        hostname: travis-osx
      # disable homebrew auto update which takes a lot of time
      env: HOMEBREW_NO_AUTO_UPDATE=1
      cache:
        directories:
          - $HOME/Library/Caches/Homebrew
#
# SONAR gcc-4.9 build
    - os: linux
      compiler: gcc-4.9
      addons:
        sonarcloud:
          organization: open62541
          branches:
            - master
            - sonarcloud
      env:
        - SONAR=true
      cache:
        directories:
          - '$HOME/.sonar/cache'
  allow_failures:
    #
    # clang-format code analysis
    - env:
        - CLANG_FORMAT=true

cache:
  pip: true
  apt: true
  directories:
    - $HOME/install
    - $HOME/.cache/pip

# combine all the commands into one single command. See https://github.com/travis-ci/travis-ci/issues/1066
before_install: |
 set -eE

 errorTrap() {
   last_rv=$?

   if [ $last_rv -ne 0 ] ; then
      echo ""
      echo ""
      echo "----------------- Error -----------------"
      echo ""
      echo "---- Check additional output above!! ----"
      # Wait a bit until the stdout is flushed
      for i in 1 2 3 4 5 6 7 8 9 10; do echo "."; sleep 1; done
   fi

   exit $last_rv
 }
 trap errorTrap 0

 # set paths for locally installed libs (like liburcu)
 export LOCAL_PKG=$HOME/install
 mkdir -p $LOCAL_PKG/lib
 mkdir -p $LOCAL_PKG/include
 mkdir -p $LOCAL_PKG/bin
 export LIBRARY_PATH=$LOCAL_PKG/lib:$LIBRARY_PATH
 export C_INCLUDE_PATH=$LOCAL_PKG/include:$C_INCLUDE_PATH
 export CPLUS_INCLUDE_PATH=$LOCAL_PKG/include:$CPLUS_INCLUDE_PATH
 export PKG_CONFIG_PATH=$LOCAL_PKG/lib/pkgconfig:$PKG_CONFIG_PATH
 export PATH=$LOCAL_PKG:$LOCAL_PKG/bin:$PATH
 export CMAKE_PREFIX_PATH=$LOCAL_PKG:CMAKE_PREFIX_PATH
 # set local path for python packages
 export PATH=$PATH:$HOME/.local/bin # linux
 export PATH=$PATH:$HOME/Library/Python #OS X
 export PATH=$PATH:$HOME/Library/Python/2.7/bin #OS X

 if [ ${TRAVIS_OS_NAME} == "linux" ]; then sh ./tools/travis/travis_linux_before_install.sh; fi
 if [ ${TRAVIS_OS_NAME} == "osx" ]; then sh ./tools/travis/travis_osx_before_install.sh; fi

script: |
 set -eE

 errorTrap() {
   last_rv=$?

   if [ $last_rv -ne 0 ] ; then
      echo ""
      echo ""
      echo "----------------- Error -----------------"
      echo ""
      echo "---- Check additional output above!! ----"
      # Wait a bit until the stdout is flushed
      for i in 1 2 3 4 5 6 7 8 9 10; do echo "."; sleep 1; done
   fi

   exit $last_rv
 }
 trap errorTrap 0

 if [ ${TRAVIS_OS_NAME} == "linux" ]; then sh ./tools/travis/travis_linux_script.sh; fi
 if [ ${TRAVIS_OS_NAME} == "osx" ]; then sh ./tools/travis/travis_osx_script.sh; fi

after_success: |
 set -eE

 errorTrap() {
   last_rv=$?

   if [ $last_rv -ne 0 ] ; then
     echo ""
     echo ""
     echo "----------------- Error -----------------"
     echo ""
     echo "---- Check additional output above!! ----"
     # Wait a bit until the stdout is flushed
     for i in 1 2 3 4 5 6 7 8 9 10; do echo "."; sleep 1; done
   fi

   exit $last_rv
 }
 trap errorTrap 0

 if [ ${TRAVIS_OS_NAME} == "linux" ]; then sh ./tools/travis/travis_linux_after_success.sh; fi
 # Sleep to flush travis output
 echo == Build success ==
 sleep 5

after_failure: |
 # Sleep to flush travis output
 echo == Build failed ==
 sleep 5

deploy:
  provider: releases
  api_key:
    secure: PKCoA7MBRtHloIbNF4Qj5LQyCafjekfVeFXlMBd9KmC0ynNuef+D7nn38f/jo25/b0Ii7r+hgslkQPezbKyEqo2zcCB8Pn8TWau2hbzKM/dUCPoN90HVaQcRjUi8P2Y+QkouwyPWSujBL35/X5QiAntRotCSbZx4fkyiN8cU95o=
  file:
    - open62541-win32.zip
    - open62541-win64.zip
    - open62541-linux32.tar.gz
    - open62541-linux64.tar.gz
    - open62541-raspberrypi.tar.gz
    - open62541.c
    - open62541.h
    - open62541*.deb
  file_glob: true
  skip_cleanup: true
  on:
    repo: open62541/open62541
    tags: true
    condition: $CC = gcc-4.8 && $ANALYZE = false
