###############################################################################
# Copyright (c) 2014-2019, Lawrence Livermore National Security, LLC.
#
# Produced at the Lawrence Livermore National Laboratory
#
# LLNL-CODE-666778
#
# All rights reserved.
#
# This file is part of Conduit.
#
# For details, see: http://software.llnl.gov/conduit/.
#
# Please also read conduit/LICENSE
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
#   this list of conditions and the disclaimer below.
#
# * Redistributions in binary form must reproduce the above copyright notice,
#   this list of conditions and the disclaimer (as noted below) in the
#   documentation and/or other materials provided with the distribution.
#
# * Neither the name of the LLNS/LLNL nor the names of its contributors may
#   be used to endorse or promote products derived from this software without
#   specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY,
# LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
###############################################################################
sudo: false

language: cpp
compiler:
  - gcc
env:
  global:
    - COMPILER_CC=gcc-4.8
    - COMPILER_CXX=g++-4.8
    - COMPILER_FC=gfortran-4.8
    # we need to know the root dir for our 3rd party lib installs
    - TRAVIS_HOME=`pwd`
  matrix:
    #################################
    # test:
    #  static vs shared libs
    #  python 2 vs 3
    #  cmake 3.14.2
    #  silo vs no silo
    #  adios vs no adios
    #  coverage of unit tests
    #################################
    #################################
    # mpi on, docs on, shared libs, python 2.7, adios off
    - BUILD_SHARED_LIBS=ON
      ENABLE_COVERAGE=ON
      ENABLE_MPI=ON
      ENABLE_DOCS=ON
      ENABLE_SILO=ON
      ENABLE_ADIOS=OFF
      ENABLE_PYTHON=ON
      ENABLE_PYTHON2=ON
      PYTHON_VERSION=2.7.18
      PYTHON2_CONSTRAINTS=" ^py-setuptools@44.1.0 "
      PYTHON2_DOCS_CONSTRAINTS=" ^py-pygments@2.4.2 "
      CMAKE_VERSION=3.14.2
      BLT_CXX_STD=c++11
    # mpi on, docs off, static libs, python 2.7, adios off
    - BUILD_SHARED_LIBS=OFF
      ENABLE_COVERAGE=OFF
      ENABLE_MPI=ON
      ENABLE_DOCS=OFF
      ENABLE_SILO=ON
      ENABLE_ADIOS=OFF
      ENABLE_PYTHON=ON
      ENABLE_PYTHON2=ON
      PYTHON_VERSION=2.7.18
      PYTHON2_CONSTRAINTS=" ^py-setuptools@44.1.0 "
      PYTHON2_DOCS_CONSTRAINTS=" ^py-pygments@2.4.2 "
      CMAKE_VERSION=3.14.2
      BLT_CXX_STD=c++11
    # mpi on, docs off, shared libs, python 3.6, adios off
    - BUILD_SHARED_LIBS=ON
      ENABLE_COVERAGE=OFF
      ENABLE_MPI=ON
      ENABLE_DOCS=OFF
      ENABLE_SILO=ON
      ENABLE_ADIOS=OFF
      ENABLE_PYTHON=ON
      ENABLE_PYTHON2=OFF
      PYTHON_VERSION=3.6.3
      CMAKE_VERSION=3.14.2
      BLT_CXX_STD=c++11
    # mpi on, docs off, static libs, python 3.6, adios off
    - BUILD_SHARED_LIBS=OFF
      ENABLE_COVERAGE=OFF
      ENABLE_MPI=ON
      ENABLE_DOCS=OFF
      ENABLE_SILO=ON
      ENABLE_ADIOS=OFF
      ENABLE_PYTHON=ON
      ENABLE_PYTHON2=OFF
      PYTHON_VERSION=3.6.3
      CMAKE_VERSION=3.14.2
      BLT_CXX_STD=c++11
    # mpi on, docs off, static libs, python 2.7, adios on
    - BUILD_SHARED_LIBS=OFF
      ENABLE_COVERAGE=OFF
      ENABLE_MPI=ON
      ENABLE_DOCS=OFF
      ENABLE_SILO=ON
      ENABLE_ADIOS=ON
      ENABLE_PYTHON=ON
      ENABLE_PYTHON2=ON
      PYTHON_VERSION=2.7.18
      PYTHON2_CONSTRAINTS=" ^py-setuptools@44.1.0 "
      PYTHON2_DOCS_CONSTRAINTS=" ^py-pygments@2.4.2 "
      CMAKE_VERSION=3.14.2
      BLT_CXX_STD=c++11

addons:
  apt:
    sources:
    - sourceline: 'ppa:ubuntu-toolchain-r/test'
      key_url: 'hkp://keyserver.ubuntu.com:80'
    packages:
       - binutils
       - gcc-4.8
       - g++-4.8
       - gfortran-4.8
       - openmpi-bin
       - libopenmpi-dev
       - libncurses-dev
       - libssl-dev
       - libopenblas-dev
       - zlib1g-dev
       - libgdbm-dev
       - libreadline-dev
       - libsqlite3-dev
       - libbz2-dev
       - perl

before_install:
  - pip install --user cpp-coveralls

script:
  - which g++
  - g++ --version
  - export CC=${COMPILER_CC}
  - export CXX=${COMPILER_CXX}
  - export FC=${COMPILER_FC}
  - ${CC} --version
  - cd $TRAVIS_BUILD_DIR
  - echo $TRAVIS_BUILD_DIR
  # setup spack spec based on our travis options
  - export SPACK_SPEC="%gcc@4.8"
  # variants
  - if [ $ENABLE_DOCS = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC}+doc"; fi
  - if [ $ENABLE_DOCS = 'OFF' ]; then export SPACK_SPEC="${SPACK_SPEC}~doc"; fi
  - if [ $ENABLE_MPI = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC}+mpi"; fi
  - if [ $ENABLE_MPI = 'OFF' ]; then export SPACK_SPEC="${SPACK_SPEC}~mpi"; fi
  - if [ $ENABLE_PYTHON = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC}+python"; fi
  - if [ $ENABLE_PYTHON = 'OFF' ]; then export SPACK_SPEC="${SPACK_SPEC}~python"; fi
  - if [ $ENABLE_SILO = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC}+silo"; fi
  - if [ $ENABLE_SILO = 'OFF' ]; then export SPACK_SPEC="${SPACK_SPEC}~silo"; fi
  - if [ $ENABLE_ADIOS = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC}+adios"; fi
  # skip conduit zfp when adios is on b/c adios needs older zfp
  - if [ $ENABLE_ADIOS = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC}~zfp"; fi
  - if [ $ENABLE_ADIOS = 'OFF' ]; then export SPACK_SPEC="${SPACK_SPEC}~adios"; fi
  # versions and package selections
  - export SPACK_SPEC="${SPACK_SPEC} ^cmake@${CMAKE_VERSION}"
  - export SPACK_SPEC="${SPACK_SPEC} ^python@${PYTHON_VERSION}"
  # fix constraint issue for python 2
  - if [ $ENABLE_PYTHON2 = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC} ${PYTHON2_CONSTRAINTS}"; fi
  - if [ $ENABLE_PYTHON2 = 'ON' -a $ENABLE_DOCS = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC} ${PYTHON2_DOCS_CONSTRAINTS}"; fi
  - if [ $ENABLE_SILO = 'ON' ]; then export SPACK_SPEC="${SPACK_SPEC} ^silo~mpi"; fi
  # turn off hdf5 mpi support
  - export SPACK_SPEC="${SPACK_SPEC} ^hdf5~mpi"
  - echo $SPACK_SPEC
  # Output something every 10 minutes or Travis kills the job
  - while sleep 540; do echo "=====[ $SECONDS seconds still running ]====="; done &
  # build deps using uberenv
  # use -k to avoid suprises related to certs
  - python scripts/uberenv/uberenv.py -k --spec "${SPACK_SPEC}" --spack-config-dir=scripts/uberenv_configs/spack_configs/configs/travis/ || travis_terminate 1;
  # todo:
  #- export SPACK_PYTHON_BIN_DIR=`ls -d ${TRAVIS_BUILD_DIR}/uberenv_libs/spack/opt/spack/*/*/python*/bin`
  #- pip install cpp-coveralls
  #create out-of-source build dir and install dir
  - mkdir travis-debug-build
  - mkdir travis-debug-install
  - cd    travis-debug-build
  # cmake options
  # build type
  - CMAKE_OPTS="-DCMAKE_BUILD_TYPE=Debug"
  # shared or static libs
  - CMAKE_OPTS="${CMAKE_OPTS} -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}"
  # enable coverage (only when using shared libs case)
  - CMAKE_OPTS="${CMAKE_OPTS} -DENABLE_COVERAGE=${ENABLE_COVERAGE}"
  # enable mpi if selected
  - CMAKE_OPTS="${CMAKE_OPTS} -DENABLE_MPI=${ENABLE_MPI}"
  # set c++ std
  - CMAKE_OPTS="${CMAKE_OPTS} -DBLT_CXX_STD=${BLT_CXX_STD}"
  # enable ADIOS if selected
  - if [ $ENABLE_ADIOS = 'ON' ]; then CMAKE_OPTS="${CMAKE_OPTS} -DADIOS_DIR=`ls -d ${TRAVIS_BUILD_DIR}/uberenv_libs/spack/opt/spack/*/*/adios*/`"; fi
  # install path
  - CMAKE_OPTS="${CMAKE_OPTS} -DCMAKE_INSTALL_PREFIX=${TRAVIS_BUILD_DIR}/travis-debug-install"
  # make sure cmake is in our path
  - export CMAKE_BIN_DIR=`ls -d ${TRAVIS_BUILD_DIR}/uberenv_libs/spack/opt/spack/*/*/cmake*/bin | head -n1`
  - export PATH=${CMAKE_BIN_DIR}:$PATH
  - echo $PATH
  - which cmake
  - cmake --version
  # find the spack generated host-config file that describes tpls
  - export HOST_CONFIG=`ls ${TRAVIS_BUILD_DIR}/uberenv_libs/*.cmake`
  # configure with cmake using host-config
  - cmake ${CMAKE_OPTS} -C ${HOST_CONFIG} ${TRAVIS_BUILD_DIR}/src
  #- echo "Printing CMakeError.log"
  #- tail -n200 /home/travis/build/BradWhitlock/conduit/travis-debug-build/CMakeFiles/CMakeError.log
  # build, test, and install
  - make
  - env CTEST_OUTPUT_ON_FAILURE=1 make test
  - make install
  # test our examples that demo using an installed conduit
  - cd $TRAVIS_BUILD_DIR
  - ./scripts/ci/travis-test-build-examples-vs-install.sh
  - ./scripts/ci/travis-test-python-example-vs-install.sh

after_success:
  - test ${ENABLE_COVERAGE} = "ON" && coveralls --gcov /usr/bin/gcov-4.8 --include src/libs/conduit --include src/libs/blueprint --gcov-options '\-lp' --root $TRAVIS_BUILD_DIR --build-root $TRAVIS_BUILD_DIR/travis-debug-build;
notifications:
  email:
    recipients:
      - cyrush@llnl.gov
    on_success: always
    on_failure: always
