#!/usr/bin/env sh
# This script can be used on the command line directly to configure several
# different build environments.
# This is called by `.travis.yml` via Travis CI.
# Travis supplies $TRAVIS_OS_NAME.
#  http://docs.travis-ci.com/user/multi-os/
# Our .travis.yml also defines:

#   - BUILD_TYPE=Release/Debug
#   - LIB_TYPE=static/shared
#
# Optional environmental variables
#   - DESTDIR <- used for setting the install prefix
#   - BUILD_TOOL=["Unix Makefile"|"Ninja"]
#   - BUILDNAME <- how to identify this build on the dashboard
#   - DO_MemCheck <- if set, try to use valgrind
#   - DO_Coverage <- if set, try to do dashboard coverage testing
#

env_set=1
if ${BUILD_TYPE+false}; then
  echo "BUILD_TYPE not set in environment."
  env_set=0
fi
if ${LIB_TYPE+false}; then
  echo "LIB_TYPE not set in environment."
  env_set=0
fi
if ${CXX+false}; then
  echo "CXX not set in environment."
  env_set=0
fi


if [ ${env_set} -eq 0 ]; then
  echo "USAGE:  CXX=$(which clang++)  BUILD_TYPE=[Release|Debug] LIB_TYPE=[static|shared] $0"
  echo ""
  echo "Examples:"
  echo "           CXX=$(which clang++) BUILD_TYPE=Release LIB_TYPE=shared DESTDIR=/tmp/cmake_json_cpp $0"
  echo "           CXX=$(which clang++) BUILD_TYPE=Debug   LIB_TYPE=shared DESTDIR=/tmp/cmake_json_cpp $0"
  echo "           CXX=$(which clang++) BUILD_TYPE=Release LIB_TYPE=static DESTDIR=/tmp/cmake_json_cpp $0"
  echo "           CXX=$(which clang++) BUILD_TYPE=Debug   LIB_TYPE=static DESTDIR=/tmp/cmake_json_cpp $0"

  echo "           CXX=$(which g++)     BUILD_TYPE=Release LIB_TYPE=shared DESTDIR=/tmp/cmake_json_cpp $0"
  echo "           CXX=$(which g++)     BUILD_TYPE=Debug   LIB_TYPE=shared DESTDIR=/tmp/cmake_json_cpp $0"
  echo "           CXX=$(which g++)     BUILD_TYPE=Release LIB_TYPE=static DESTDIR=/tmp/cmake_json_cpp $0"
  echo "           CXX=$(which g++)     BUILD_TYPE=Debug   LIB_TYPE=static DESTDIR=/tmp/cmake_json_cpp $0"

  exit -1
fi

if ${DESTDIR+false}; then
  DESTDIR="/usr/local"
fi

# -e: fail on error
# -v: show commands
# -x: show expanded commands
set -vex

env | sort

which cmake
cmake --version

echo ${CXX}
${CXX} --version
_COMPILER_NAME=`basename ${CXX}`
if [ "${LIB_TYPE}" = "shared" ]; then
  _CMAKE_BUILD_SHARED_LIBS=ON
else
  _CMAKE_BUILD_SHARED_LIBS=OFF
fi

CTEST_TESTING_OPTION="-D ExperimentalTest"
#   - DO_MemCheck <- if set, try to use valgrind
if ! ${DO_MemCheck+false}; then
   valgrind --version
   CTEST_TESTING_OPTION="-D ExperimentalMemCheck"
else
#   - DO_Coverage <- if set, try to do dashboard coverage testing
  if ! ${DO_Coverage+false}; then
     export CXXFLAGS="-fprofile-arcs -ftest-coverage"
     export LDFLAGS="-fprofile-arcs -ftest-coverage"
     CTEST_TESTING_OPTION="-D ExperimentalTest -D ExperimentalCoverage"
     #gcov --version
  fi
fi

#  Ninja                        = Generates build.ninja files.
if ${BUILD_TOOL+false}; then
  BUILD_TOOL="Ninja"
  export _BUILD_EXE=ninja
  which ninja
  ninja --version
else
#  Unix Makefiles               = Generates standard UNIX makefiles.
  export _BUILD_EXE=make
fi

_BUILD_DIR_NAME="build-cmake_${BUILD_TYPE}_${LIB_TYPE}_${_COMPILER_NAME}_${_BUILD_EXE}"
mkdir -p ${_BUILD_DIR_NAME}
cd "${_BUILD_DIR_NAME}"
  if ${BUILDNAME+false}; then
     _HOSTNAME=`hostname -s`
     BUILDNAME="${_HOSTNAME}_${BUILD_TYPE}_${LIB_TYPE}_${_COMPILER_NAME}_${_BUILD_EXE}"
  fi
  cmake \
    -G "${BUILD_TOOL}" \
    -DBUILDNAME:STRING="${BUILDNAME}" \
    -DCMAKE_CXX_COMPILER:PATH=${CXX} \
    -DCMAKE_BUILD_TYPE:STRING=${BUILD_TYPE} \
    -DBUILD_SHARED_LIBS:BOOL=${_CMAKE_BUILD_SHARED_LIBS} \
    -DCMAKE_INSTALL_PREFIX:PATH=${DESTDIR} \
    ../

  ctest -C ${BUILD_TYPE} -D ExperimentalStart -D ExperimentalConfigure -D ExperimentalBuild ${CTEST_TESTING_OPTION} -D ExperimentalSubmit
  # Final step is to verify that installation succeeds
  cmake --build . --config ${BUILD_TYPE} --target install

  if [ "${DESTDIR}" != "/usr/local" ]; then
     ${_BUILD_EXE} install
  fi
cd -

if ${CLEANUP+false}; then
  echo "Skipping cleanup: build directory will persist."
else
  rm -r "${_BUILD_DIR_NAME}"
fi
