#!/usr/bin/env bash

#  Copyright 2020-2021 Couchbase, Inc.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

PROJECT_ROOT="$( cd "$(dirname "$0"/..)" >/dev/null 2>&1 ; pwd -P )"

echo "HOSTNAME=${HOSTNAME}"
echo "NODE_NAME=${NODE_NAME}"
echo "CONTAINER_TAG=${CONTAINER_TAG}"
echo "JENKINS_SLAVE_LABELS=${JENKINS_SLAVE_LABELS}"
echo "NODE_LABELS=${NODE_LABELS}"

CB_DEFAULT_CC=cc
CB_DEFAULT_CXX=c++
CB_CLANG=${CB_CLANG:-clang}
CB_CLANGXX=${CB_CLANGXX:-clang++}

CB_SANITIZER=${CB_SANITIZER:-""}
if [ "x${CB_SANITIZER}" != "x" ] ; then
    CB_DEFAULT_CC=${CB_CLANG}
    CB_DEFAULT_CXX=${CB_CLANGXX}
fi

CB_CMAKE=${CB_CMAKE:-$(which cmake)}
CB_CC=${CB_CC:-$(which ${CB_DEFAULT_CC})}
CB_CXX=${CB_CXX:-$(which ${CB_DEFAULT_CXX})}
CB_NUMBER_OF_JOBS=${CB_NUMBER_OF_JOBS:-1}
CB_CMAKE_BUILD_TYPE=${CB_CMAKE_BUILD_TYPE:-Debug}
CB_CACHE_OPTION=${CB_CACHE_OPTION:-ccache}
CB_TEST_SUITE=${CB_TEST_SUITE:-}
CB_BORINGSSL=${CB_BORINGSSL:-ON}

echo "CB_CMAKE=${CB_CMAKE}"
echo "CB_CC=${CB_CC}"
echo "CB_CXX=${CB_CXX}"
echo "CB_NUMBER_OF_JOBS=${CB_NUMBER_OF_JOBS}"
echo "CB_CMAKE_BUILD_TYPE=${CB_CMAKE_BUILD_TYPE}"
echo "CB_CACHE_OPTION=${CB_CACHE_OPTION}"
echo "CB_TEST_SUITE=${CB_TEST_SUITE}"
echo "CB_BORINGSSL=${CB_BORINGSSL}"

CB_CMAKE_EXTRAS=
case "${CB_SANITIZER}" in
    asan | address)
        CB_CMAKE_EXTRAS="-DENABLE_SANITIZER_ADDRESS=ON"
        ;;

    lsan | leak)
        CB_CMAKE_EXTRAS="-DENABLE_SANITIZER_LEAK=ON"
        ;;

    ubsan | undefined_behaviour)
        CB_CMAKE_EXTRAS="-DENABLE_SANITIZER_UNDEFINED_BEHAVIOUR=ON"
        ;;

    tsan | thread)
        CB_CMAKE_EXTRAS="-DENABLE_SANITIZER_THREAD=ON"
        export TSAN_OPTIONS="second_deadlock_stack=1"
        ;;

    msan | memory)
        CB_CMAKE_EXTRAS="-DENABLE_SANITIZER_MEMORY=ON"
        ;;

    valgrind)
        CB_CMAKE_EXTRAS="-DCOUCHBASE_CXX_CLIENT_ENABLE_VALGRIND=ON"
        ;;
esac

CB_COLUMNAR=${CB_COLUMNAR:-""}
if [ ! -z "$CB_COLUMNAR" ] ; then
    CB_CMAKE_EXTRAS="${CB_CMAKE_EXTRAS} -DCOUCHBASE_CXX_CLIENT_COLUMNAR=ON"
fi
echo "CB_COLUMNAR=${CB_COLUMNAR}"

set -exuo pipefail

BUILD_DIR="${PROJECT_ROOT}/cmake-build-tests"
if [ "x${CB_SANITIZER}" != "x" ]; then
    BUILD_DIR="${BUILD_DIR}-${CB_SANITIZER}"
fi

rm -rf "${BUILD_DIR}"
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"

CB_CMAKE_BUILD_EXTRAS=
if [ "x${CB_TEST_SUITE}" != "x" ] ; then
    CB_CMAKE_BUILD_EXTRAS="--target build_${CB_TEST_SUITE}_tests"
    if [ "x${CB_TEST_SUITE}" = "xunit" ]; then
        # always run integration tests if "unit" target selected
        CB_CMAKE_BUILD_EXTRAS="${CB_CMAKE_BUILD_EXTRAS} --target build_integration_tests"
    fi
fi

${CB_CMAKE}  \
    -DCMAKE_BUILD_TYPE=${CB_CMAKE_BUILD_TYPE} \
    -DCMAKE_C_COMPILER="${CB_CC}" \
    -DCMAKE_CXX_COMPILER="${CB_CXX}" \
    -DCOUCHBASE_CXX_CLIENT_BUILD_DOCS=OFF \
    -DCOUCHBASE_CXX_CLIENT_BUILD_TESTS=ON \
    -DCOUCHBASE_CXX_CLIENT_BUILD_SHARED=ON \
    -DCOUCHBASE_CXX_CLIENT_STATIC_BORINGSSL=${CB_BORINGSSL} \
    -DCACHE_OPTION="${CB_CACHE_OPTION}" \
    ${CB_CMAKE_EXTRAS} \
    -B "${BUILD_DIR}" \
    -S "${PROJECT_ROOT}"

${CB_CMAKE} --build "${BUILD_DIR}" --parallel ${CB_NUMBER_OF_JOBS} --verbose ${CB_CMAKE_BUILD_EXTRAS}

${CB_CMAKE} --build "${BUILD_DIR}" --parallel ${CB_NUMBER_OF_JOBS} --verbose --target cbc
${BUILD_DIR}/tools/cbc version --json
