#!/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.

set -ex

source $TRAVIS_BUILD_DIR/ci/travis_env_common.sh

only_library_mode=no
using_homebrew=no

while true; do
    case "$1" in
	--only-library)
	    only_library_mode=yes
	    shift ;;
	--homebrew)
	    using_homebrew=yes
	    shift ;;
	*) break ;;
    esac
done

if [ "$only_library_mode" == "no" ]; then
  source $TRAVIS_BUILD_DIR/ci/travis_install_conda.sh
fi

if [ "$ARROW_TRAVIS_USE_TOOLCHAIN" == "1" ]; then
  # Set up C++ toolchain from conda-forge packages for faster builds
  source $TRAVIS_BUILD_DIR/ci/travis_install_toolchain.sh
fi

mkdir -p $ARROW_CPP_BUILD_DIR
pushd $ARROW_CPP_BUILD_DIR

CMAKE_COMMON_FLAGS="\
-DCMAKE_INSTALL_PREFIX=$ARROW_CPP_INSTALL \
-DARROW_NO_DEPRECATED_API=ON \
-DARROW_INSTALL_NAME_RPATH=OFF \
-DARROW_EXTRA_ERROR_CONTEXT=ON"
CMAKE_LINUX_FLAGS=""
CMAKE_OSX_FLAGS="\
-DARROW_GFLAGS_USE_SHARED=OFF"

if [ "$ARROW_TRAVIS_USE_TOOLCHAIN" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_JEMALLOC=ON"
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_WITH_BZ2=ON"
fi

if [ "$ARROW_TRAVIS_MIMALLOC" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_MIMALLOC=ON"
fi

if [ $only_library_mode == "yes" ]; then
  CMAKE_COMMON_FLAGS="\
    $CMAKE_COMMON_FLAGS \
    -DARROW_BUILD_UTILITIES=OFF"
else
  CMAKE_COMMON_FLAGS="\
    $CMAKE_COMMON_FLAGS \
    -DARROW_BUILD_BENCHMARKS=ON \
    -DARROW_BUILD_TESTS=ON \
    -DARROW_BUILD_EXAMPLES=ON \
    -DARROW_BUILD_UTILITIES=ON"
fi

ARROW_CXXFLAGS=""

# Use Ninja for faster builds when using toolchain
if [ "$ARROW_TRAVIS_USE_TOOLCHAIN" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -GNinja"
  if [ "$DISTRO_CODENAME" != "trusty" ]; then
    # Make sure the toolchain linker (from binutils package) is picked up by clang
    ARROW_CXXFLAGS="$ARROW_CXXFLAGS -B$CPP_TOOLCHAIN/bin"
  fi
  export TRAVIS_MAKE=ninja
elif [ "$using_homebrew" = "yes" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -GNinja"
  export TRAVIS_MAKE=ninja
else
  export TRAVIS_MAKE=make
fi

if [ "$ARROW_TRAVIS_FLIGHT" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_FLIGHT=ON"
fi

if [ "$ARROW_TRAVIS_INTEGRATION" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_BUILD_INTEGRATION=ON"
fi

if [ "$ARROW_TRAVIS_PLASMA" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_PLASMA=ON"
fi

if [ "$ARROW_TRAVIS_PLASMA_JAVA_CLIENT" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_PLASMA_JAVA_CLIENT=ON"
fi

if [ "$ARROW_TRAVIS_ORC" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_ORC=ON"
fi

if [ "$ARROW_TRAVIS_PYTHON" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_PYTHON=ON"
  if [ "$using_homebrew" == "yes" ]; then
    CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS \
-DPYTHON_EXECUTABLE=$(brew --prefix python)/bin/python3"
  fi
fi

if [ "$ARROW_TRAVIS_S3" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_S3=ON"
fi

if [ "$ARROW_TRAVIS_PARQUET" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS \
-DARROW_PARQUET=ON \
-DPARQUET_BUILD_EXAMPLES=ON \
-DPARQUET_BUILD_EXECUTABLES=ON"
fi

if [ "$ARROW_TRAVIS_GANDIVA" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_GANDIVA=ON"
  if [ "$ARROW_TRAVIS_GANDIVA_JAVA" == "1" ]; then
      CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_GANDIVA_JAVA=ON"
  fi
fi

if [ "$ARROW_TRAVIS_VALGRIND" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_TEST_MEMCHECK=ON"
fi

if [ "$ARROW_USE_ASAN" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_USE_ASAN=ON"
fi

if [ "$ARROW_USE_UBSAN" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_USE_UBSAN=ON"
fi


if [ "$ARROW_TRAVIS_COVERAGE" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_GENERATE_COVERAGE=ON"
fi

if [ "$ARROW_TRAVIS_VERBOSE" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_VERBOSE_THIRDPARTY_BUILD=ON"
fi

if [ "$ARROW_TRAVIS_STATIC_BOOST" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_BOOST_USE_SHARED=OFF"
fi

if [ "$ARROW_TRAVIS_OPTIONAL_INSTALL" == "1" ]; then
  CMAKE_COMMON_FLAGS="$CMAKE_COMMON_FLAGS -DARROW_OPTIONAL_INSTALL=ON"
fi

if [ "$ARROW_TRAVIS_USE_TOOLCHAIN" == "1" ]; then
  conda activate $CPP_TOOLCHAIN
fi

# conda-forge sets the build flags by default to -02, skip this to speed up the build
export CFLAGS=${CFLAGS//-O2}
export CXXFLAGS=${CXXFLAGS//-O2}

if [ $TRAVIS_OS_NAME == "osx" ]; then
  source $TRAVIS_BUILD_DIR/ci/travis_install_osx_sdk.sh
fi

if [ $TRAVIS_OS_NAME == "linux" ]; then
    cmake $CMAKE_COMMON_FLAGS \
          $CMAKE_LINUX_FLAGS \
          -DCMAKE_BUILD_TYPE=$ARROW_BUILD_TYPE \
          -DBUILD_WARNING_LEVEL=$ARROW_BUILD_WARNING_LEVEL \
          -DARROW_CXXFLAGS="$ARROW_CXXFLAGS" \
          $ARROW_CPP_DIR
else
    cmake $CMAKE_COMMON_FLAGS \
          $CMAKE_OSX_FLAGS \
          -DCMAKE_BUILD_TYPE=$ARROW_BUILD_TYPE \
          -DBUILD_WARNING_LEVEL=$ARROW_BUILD_WARNING_LEVEL \
          $ARROW_CPP_DIR
fi

# Build and install libraries. Configure ARROW_CPP_BUILD_TARGETS environment
# variable to only build certain targets. If you use this, you must also set
# the environment variable ARROW_TRAVIS_OPTIONAL_INSTALL=1
time $TRAVIS_MAKE -j4 $ARROW_CPP_BUILD_TARGETS
time $TRAVIS_MAKE install

popd
