#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

# Incrementally compiles the frontend and backend.

set -euo pipefail
trap 'echo Error in $0 at line $LINENO: $(cd "'$PWD'" && awk "NR == $LINENO" $0)' ERR

: ${IMPALA_TOOLCHAIN=}

BUILD_EVERYTHING=1
BUILD_FE_ONLY=0
BUILD_TESTS=1
CLEAN=0
TARGET_BUILD_TYPE=${TARGET_BUILD_TYPE:-""}
BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS:-""}
CMAKE_ONLY=0
MAKE_CMD=make
MAKE_ARGS="-j${IMPALA_BUILD_THREADS:-4} ${IMPALA_MAKE_FLAGS}"

# The minimal make targets if BUILD_EVERYTHING is 0.
MAKE_TARGETS="impalad statestored catalogd fesupport loggingsupport ImpalaUdf"

# parse command line options
for ARG in $*
do
  case "$ARG" in
    -notests)
      BUILD_TESTS=0
      BUILD_EVERYTHING=0
      ;;
    -clean)
      CLEAN=1
      ;;
    -build_type=*)
      TARGET_BUILD_TYPE="${ARG#*=}"
      ;;
    -build_shared_libs)
      BUILD_SHARED_LIBS="ON"
      ;;
    -build_static_libs)
      BUILD_SHARED_LIBS="OFF"
      ;;
    -ninja)
      MAKE_CMD=ninja
      ;;
    -cmake_only)
      CMAKE_ONLY=1
      ;;
    -fe)
      MAKE_TARGETS+=" fe"
      ;;
    -fe_only)
      BUILD_FE_ONLY=1
      BUILD_EVERYTHING=0
      ;;
    -cscope)
      MAKE_TARGETS+=" cscope"
      ;;
    -impala-lzo)
      MAKE_TARGETS+=" impala-lzo"
      ;;
    -tarballs)
      MAKE_TARGETS+=" tarballs"
      ;;
    -help|*)
      echo "make_impala.sh [-build_type=<build type> -notests -clean]"
      echo "[-build_type] : Target build type. Examples: Debug, Release, Address_sanitizer."
      echo "                If omitted, the last build target is built incrementally"
      echo "[-build_shared_libs] : Link all executables dynamically"
      echo "[-build_static_libs] : Link all executables statically (the default)"
      echo "[-cmake_only] : Generate makefiles and exit"
      echo "[-fe] : Builds fe in addition to backend."
      echo "[-fe_only] : Builds fe only."
      echo "[-ninja] : Use the Ninja build tool instead of Make"
      echo "[-notests] : Omits building the backend tests and benchmarks."
      echo "[-clean] : Cleans previous build artifacts."
      echo "[-cscope] : Builds cscope metadata."
      echo "[-impala-lzo] : Builds Impala LZO."
      echo "[-tarballs] : Builds additional tarballs like the shell tarball."
      echo ""
      echo "If either -build_type or -build_*_libs is set, cmake will be re-run for the "
      echo "project. Otherwise the last cmake configuration will continue to take effect."
      exit 1
      ;;
  esac
done

if [ $BUILD_TESTS -eq 1 ]; then
  MAKE_TARGETS+=" be-test be-benchmarks"
fi

echo "********************************************************************************"
echo " Building Impala "
if [ "x${TARGET_BUILD_TYPE}" != "x" ];
then
  echo " Build type: ${TARGET_BUILD_TYPE} "
  if [ "x${BUILD_SHARED_LIBS}" == "x" ]
  then
      echo " Impala libraries will be STATICALLY linked"
  fi
fi
if [ "x${BUILD_SHARED_LIBS}" == "xOFF" ]
then
  echo " Impala libraries will be STATICALLY linked"
fi
if [ "x${BUILD_SHARED_LIBS}" == "xON" ]
then
  echo " Impala libraries will be DYNAMICALLY linked"
fi
echo "********************************************************************************"

cd ${IMPALA_HOME}

if [ "x${TARGET_BUILD_TYPE}" != "x" ] || [ "x${BUILD_SHARED_LIBS}" != "x" ] || \
  [ "${MAKE_CMD}" != "make" ]
then
    rm -f ./CMakeCache.txt
    CMAKE_ARGS=()
    if [ "x${TARGET_BUILD_TYPE}" != "x" ]; then
      CMAKE_ARGS+=(-DCMAKE_BUILD_TYPE=${TARGET_BUILD_TYPE})
    fi

    if [ "x${BUILD_SHARED_LIBS}" != "x" ]; then
      CMAKE_ARGS+=(-DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS})
    fi

    if [ "${MAKE_CMD}" = "ninja" ]; then
      CMAKE_ARGS+=" -GNinja"
    fi

    if [[ ! -z $IMPALA_TOOLCHAIN ]]; then

      if [[ ("$TARGET_BUILD_TYPE" == "ADDRESS_SANITIZER") \
              || ("$TARGET_BUILD_TYPE" == "TIDY") ]]
      then
        CMAKE_ARGS+=(-DCMAKE_TOOLCHAIN_FILE=$IMPALA_HOME/cmake_modules/clang_toolchain.cmake)
      else
        CMAKE_ARGS+=(-DCMAKE_TOOLCHAIN_FILE=$IMPALA_HOME/cmake_modules/toolchain.cmake)
      fi
    fi

    cmake . ${CMAKE_ARGS[@]}
fi

if [ $CLEAN -eq 1 ]
then
  ${MAKE_CMD} ${IMPALA_MAKE_FLAGS} clean
fi

$IMPALA_HOME/bin/gen_build_version.py

if [ $CMAKE_ONLY -eq 1 ]; then
  exit 0
fi

MAKE_ARGS=-j${IMPALA_BUILD_THREADS:-4}
if [ $BUILD_FE_ONLY -eq 1 ]; then
  ${MAKE_CMD} ${MAKE_ARGS} fe
elif [ $BUILD_EVERYTHING -eq 1 ]; then
  ${MAKE_CMD} ${MAKE_ARGS}
else
  ${MAKE_CMD} ${MAKE_ARGS} ${MAKE_TARGETS}
fi
