#!/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_dir=${1}/cpp
build_dir=${2}/cpp

: "${ARROW_OFFLINE:=OFF}"
: "${ARROW_USE_CCACHE:=OFF}"
: "${BUILD_DOCS_CPP:=OFF}"

if [ -x "$(command -v git)" ]; then
  git config --global --add safe.directory "${1}"
fi

# TODO(kszucs): consider to move these to CMake
if [ -n "${CONDA_PREFIX}" ] && [ "${ARROW_EMSCRIPTEN:-OFF}" = "OFF" ]; then
  echo -e "===\n=== Conda environment for build\n==="
  conda list

  if [ -n "${AR}" ]; then
    ARROW_CMAKE_ARGS+=" -DCMAKE_AR=${AR}"
  fi
  if [ -n "${RANLIB}" ]; then
    ARROW_CMAKE_ARGS+=" -DCMAKE_RANLIB=${RANLIB}"
  fi
  export ARROW_CMAKE_ARGS
  ARROW_GANDIVA_PC_CXX_FLAGS=$(echo | ${CXX} -E -Wp,-v -xc++ - 2>&1 | grep '^ ' | awk '{print "-isystem;" substr($1, 1)}' | tr '\n' ';')
  export ARROW_GANDIVA_PC_CXX_FLAGS
elif [ -x "$(command -v xcrun)" ]; then
  ARROW_GANDIVA_PC_CXX_FLAGS="-isysroot;$(xcrun --show-sdk-path)"
  export ARROW_GANDIVA_PC_CXX_FLAGS
fi

if [ "${GITHUB_ACTIONS:-false}" = "true" ]; then
  case "$(uname)" in
    Linux|Darwin|MINGW*)
      if [ "${ARROW_GDB:-OFF}" != "ON" ]; then
        : "${ARROW_C_FLAGS_DEBUG:=-g1}"
        : "${ARROW_CXX_FLAGS_DEBUG:=-g1}"
      fi
      ;;
    *)
      ;;
  esac
fi

# Convert the space-separated CMake options into a Bash array.
# This avoids ShellCheck SC2086 and preserves argument boundaries.
read -r -a ARROW_CMAKE_ARGS_ARRAY <<< "$ARROW_CMAKE_ARGS"

if [ "${ARROW_ENABLE_THREADING:-ON}" = "OFF" ]; then
  ARROW_AZURE=OFF
  ARROW_FLIGHT=OFF
  ARROW_FLIGHT_SQL=OFF
  ARROW_FLIGHT_SQL_ODBC=OFF
  ARROW_FLIGHT_SQL_ODBC_INSTALLER=OFF
  ARROW_GCS=OFF
  ARROW_JEMALLOC=OFF
  ARROW_MIMALLOC=OFF
  ARROW_S3=OFF
  ARROW_S3_MODULE=OFF
  ARROW_WITH_OPENTELEMETRY=OFF
fi

if [ "${ARROW_USE_CCACHE}" == "ON" ]; then
    echo -e "===\n=== ccache configuration\n==="
    ccache --show-config
    echo -e "===\n=== ccache statistics before build\n==="
    ccache -sv 2>/dev/null || ccache -s
fi

if [ "${ARROW_USE_TSAN}" == "ON" ] && [ ! -x "${ASAN_SYMBOLIZER_PATH}" ]; then
    echo -e "Invalid value for \$ASAN_SYMBOLIZER_PATH: ${ASAN_SYMBOLIZER_PATH}"
    exit 1
fi

case "$(uname)" in
  Linux)
    n_jobs=$(nproc)
    ;;
  Darwin)
    n_jobs=$(sysctl -n hw.ncpu)
    ;;
  MINGW*)
    n_jobs=${NUMBER_OF_PROCESSORS:-1}
    ;;
  *)
    n_jobs=${NPROC:-1}
    ;;
esac

mkdir -p "${build_dir}"
pushd "${build_dir}"

if [ "${ARROW_OFFLINE}" = "ON" ]; then
  "${source_dir}"/thirdparty/download_dependencies.sh "${PWD}"/thirdparty > \
    enable_offline_build.sh
  # shellcheck source=/dev/null
  . enable_offline_build.sh
  # We can't use mv because we can't remove /etc/resolv.conf in Docker
  # container.
  cp /etc/resolv.conf{,.bak}
  echo > /etc/resolv.conf
fi

if [ "${ARROW_USE_MESON:-OFF}" = "ON" ]; then
  function meson_boolean() {
    if [ "${1}" = "ON" ]; then
      echo "true"
    else
      echo "false"
    fi
  }

  ORIGINAL_CC="${CC}"
  if [ -n "${CC}" ]; then
    if [ "${ARROW_USE_CCACHE}" = "ON" ]; then
      CC="ccache ${CC}"
    else
      if command -v sccache; then
        CC="sccache ${CC}"
      fi
    fi
  fi

  ORIGINAL_CXX="${CXX}"
  if [ -n "${CXX}" ]; then
    if [ "${ARROW_USE_CCACHE}" = "ON" ]; then
      CXX="ccache ${CXX}"
    else
      if command -v sccache; then
        CXX="sccache ${CXX}"
      fi
    fi
  fi
  meson setup \
    --prefix="${MESON_PREFIX:-${ARROW_HOME}}" \
    --buildtype="${ARROW_BUILD_TYPE:-debug}" \
    --pkg-config-path="${CONDA_PREFIX}/lib/pkgconfig/" \
    -Dauto_features=enabled \
    -Dfuzzing=disabled \
    -Ds3=disabled \
    . \
    "${source_dir}"

  CC="${ORIGINAL_CC}"
  CXX="${ORIGINAL_CXX}"
elif [ "${ARROW_EMSCRIPTEN:-OFF}" = "ON" ]; then
  n_jobs=2 # Emscripten build fails on docker unless this is set really low
  # shellcheck source=/dev/null
  source ~/emsdk/emsdk_env.sh
  CMAKE_INSTALL_PREFIX=$(em-config CACHE)/sysroot
  export CMAKE_INSTALL_PREFIX
  # conda sets LDFLAGS / CFLAGS etc. which break
  # emcmake so we unset them
  unset LDFLAGS CFLAGS CXXFLAGS CPPFLAGS
  emcmake cmake \
    --preset="ninja-${ARROW_BUILD_TYPE:-debug}-emscripten" \
    -DCMAKE_VERBOSE_MAKEFILE="${CMAKE_VERBOSE_MAKEFILE:-OFF}" \
    -DCMAKE_C_FLAGS="${CFLAGS:-}" \
    -DCMAKE_CXX_FLAGS="${CXXFLAGS:-}" \
    -DCMAKE_CXX_STANDARD="${CMAKE_CXX_STANDARD:-20}" \
    -DCMAKE_INSTALL_LIBDIR="${CMAKE_INSTALL_LIBDIR:-lib}" \
    -DCMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX:-${ARROW_HOME}}" \
    -DCMAKE_UNITY_BUILD="${CMAKE_UNITY_BUILD:-OFF}" \
    "${ARROW_CMAKE_ARGS_ARRAY[@]}" \
    "${source_dir}"
elif [ -n "${CMAKE_PRESET}" ]; then
  cmake \
    --preset="${CMAKE_PRESET}" \
    "${ARROW_CMAKE_ARGS_ARRAY[@]}" \
    "${source_dir}"
else
  cmake \
    -Dabsl_SOURCE="${absl_SOURCE:-}" \
    -DARROW_ACERO="${ARROW_ACERO:-OFF}" \
    -DARROW_AZURE="${ARROW_AZURE:-OFF}" \
    -DARROW_BOOST_USE_SHARED="${ARROW_BOOST_USE_SHARED:-ON}" \
    -DARROW_BUILD_BENCHMARKS_REFERENCE="${ARROW_BUILD_BENCHMARKS:-OFF}" \
    -DARROW_BUILD_BENCHMARKS="${ARROW_BUILD_BENCHMARKS:-OFF}" \
    -DARROW_BUILD_EXAMPLES="${ARROW_BUILD_EXAMPLES:-OFF}" \
    -DARROW_BUILD_INTEGRATION="${ARROW_BUILD_INTEGRATION:-OFF}" \
    -DARROW_BUILD_SHARED="${ARROW_BUILD_SHARED:-ON}" \
    -DARROW_BUILD_STATIC="${ARROW_BUILD_STATIC:-ON}" \
    -DARROW_BUILD_TESTS="${ARROW_BUILD_TESTS:-OFF}" \
    -DARROW_BUILD_UTILITIES="${ARROW_BUILD_UTILITIES:-ON}" \
    -DARROW_COMPUTE="${ARROW_COMPUTE:-ON}" \
    -DARROW_CSV="${ARROW_CSV:-ON}" \
    -DARROW_CUDA="${ARROW_CUDA:-OFF}" \
    -DARROW_CXXFLAGS="${ARROW_CXXFLAGS:-}" \
    -DARROW_CXX_FLAGS_DEBUG="${ARROW_CXX_FLAGS_DEBUG:-}" \
    -DARROW_CXX_FLAGS_RELEASE="${ARROW_CXX_FLAGS_RELEASE:-}" \
    -DARROW_CXX_FLAGS_RELWITHDEBINFO="${ARROW_CXX_FLAGS_RELWITHDEBINFO:-}" \
    -DARROW_C_FLAGS_DEBUG="${ARROW_C_FLAGS_DEBUG:-}" \
    -DARROW_C_FLAGS_RELEASE="${ARROW_C_FLAGS_RELEASE:-}" \
    -DARROW_C_FLAGS_RELWITHDEBINFO="${ARROW_C_FLAGS_RELWITHDEBINFO:-}" \
    -DARROW_DATASET="${ARROW_DATASET:-OFF}" \
    -DARROW_DEPENDENCY_SOURCE="${ARROW_DEPENDENCY_SOURCE:-AUTO}" \
    -DARROW_DEPENDENCY_USE_SHARED="${ARROW_DEPENDENCY_USE_SHARED:-ON}" \
    -DARROW_ENABLE_THREADING="${ARROW_ENABLE_THREADING:-ON}" \
    -DARROW_ENABLE_TIMING_TESTS="${ARROW_ENABLE_TIMING_TESTS:-ON}" \
    -DARROW_EXTRA_ERROR_CONTEXT="${ARROW_EXTRA_ERROR_CONTEXT:-OFF}" \
    -DARROW_FILESYSTEM="${ARROW_FILESYSTEM:-ON}" \
    -DARROW_FLIGHT="${ARROW_FLIGHT:-OFF}" \
    -DARROW_FLIGHT_SQL="${ARROW_FLIGHT_SQL:-OFF}" \
    -DARROW_FLIGHT_SQL_ODBC="${ARROW_FLIGHT_SQL_ODBC:-OFF}" \
    -DARROW_FLIGHT_SQL_ODBC_INSTALLER="${ARROW_FLIGHT_SQL_ODBC_INSTALLER:-OFF}" \
    -DARROW_FUZZING="${ARROW_FUZZING:-OFF}" \
    -DARROW_GANDIVA_PC_CXX_FLAGS="${ARROW_GANDIVA_PC_CXX_FLAGS:-}" \
    -DARROW_GANDIVA="${ARROW_GANDIVA:-OFF}" \
    -DARROW_GCS="${ARROW_GCS:-OFF}" \
    -DARROW_HDFS="${ARROW_HDFS:-ON}" \
    -DARROW_INSTALL_NAME_RPATH="${ARROW_INSTALL_NAME_RPATH:-ON}" \
    -DARROW_JEMALLOC="${ARROW_JEMALLOC:-OFF}" \
    -DARROW_JSON="${ARROW_JSON:-ON}" \
    -DARROW_LARGE_MEMORY_TESTS="${ARROW_LARGE_MEMORY_TESTS:-OFF}" \
    -DARROW_MIMALLOC="${ARROW_MIMALLOC:-ON}" \
    -DARROW_ORC="${ARROW_ORC:-OFF}" \
    -DARROW_PARQUET="${ARROW_PARQUET:-OFF}" \
    -DARROW_RUNTIME_SIMD_LEVEL="${ARROW_RUNTIME_SIMD_LEVEL:-MAX}" \
    -DARROW_S3="${ARROW_S3:-OFF}" \
    -DARROW_S3_MODULE="${ARROW_S3_MODULE:-OFF}" \
    -DARROW_SIMD_LEVEL="${ARROW_SIMD_LEVEL:-DEFAULT}" \
    -DARROW_SUBSTRAIT="${ARROW_SUBSTRAIT:-OFF}" \
    -DARROW_TEST_LINKAGE="${ARROW_TEST_LINKAGE:-shared}" \
    -DARROW_TEST_MEMCHECK="${ARROW_TEST_MEMCHECK:-OFF}" \
    -DARROW_USE_ASAN="${ARROW_USE_ASAN:-OFF}" \
    -DARROW_USE_CCACHE="${ARROW_USE_CCACHE:-ON}" \
    -DARROW_USE_GLOG="${ARROW_USE_GLOG:-OFF}" \
    -DARROW_USE_LLD="${ARROW_USE_LLD:-OFF}" \
    -DARROW_USE_MOLD="${ARROW_USE_MOLD:-OFF}" \
    -DARROW_USE_STATIC_CRT="${ARROW_USE_STATIC_CRT:-OFF}" \
    -DARROW_USE_TSAN="${ARROW_USE_TSAN:-OFF}" \
    -DARROW_USE_UBSAN="${ARROW_USE_UBSAN:-OFF}" \
    -DARROW_VERBOSE_THIRDPARTY_BUILD="${ARROW_VERBOSE_THIRDPARTY_BUILD:-OFF}" \
    -DARROW_WITH_BROTLI="${ARROW_WITH_BROTLI:-OFF}" \
    -DARROW_WITH_BZ2="${ARROW_WITH_BZ2:-OFF}" \
    -DARROW_WITH_LZ4="${ARROW_WITH_LZ4:-OFF}" \
    -DARROW_WITH_OPENTELEMETRY="${ARROW_WITH_OPENTELEMETRY:-OFF}" \
    -DARROW_WITH_MUSL="${ARROW_WITH_MUSL:-OFF}" \
    -DARROW_WITH_SNAPPY="${ARROW_WITH_SNAPPY:-OFF}" \
    -DARROW_WITH_UTF8PROC="${ARROW_WITH_UTF8PROC:-ON}" \
    -DARROW_WITH_ZLIB="${ARROW_WITH_ZLIB:-OFF}" \
    -DARROW_WITH_ZSTD="${ARROW_WITH_ZSTD:-OFF}" \
    -DAWSSDK_SOURCE="${AWSSDK_SOURCE:-}" \
    -DAzure_SOURCE="${Azure_SOURCE:-}" \
    -Dbenchmark_SOURCE="${benchmark_SOURCE:-}" \
    -DBOOST_SOURCE="${BOOST_SOURCE:-}" \
    -DBrotli_SOURCE="${Brotli_SOURCE:-}" \
    -DBUILD_WARNING_LEVEL="${BUILD_WARNING_LEVEL:-CHECKIN}" \
    -Dc-ares_SOURCE="${cares_SOURCE:-}" \
    -DCMAKE_BUILD_TYPE="${ARROW_BUILD_TYPE:-debug}" \
    -DCMAKE_VERBOSE_MAKEFILE="${CMAKE_VERBOSE_MAKEFILE:-OFF}" \
    -DCMAKE_C_FLAGS="${CFLAGS:-}" \
    -DCMAKE_CXX_FLAGS="${CXXFLAGS:-}" \
    -DCMAKE_CXX_STANDARD="${CMAKE_CXX_STANDARD:-20}" \
    -DCMAKE_INSTALL_LIBDIR="${CMAKE_INSTALL_LIBDIR:-lib}" \
    -DCMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX:-${ARROW_HOME}}" \
    -DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT="${CMAKE_MSVC_DEBUG_INFORMATION_FORMAT:-}" \
    -DCMAKE_UNITY_BUILD="${CMAKE_UNITY_BUILD:-OFF}" \
    -DCUDAToolkit_ROOT="${CUDAToolkit_ROOT:-}" \
    -Dgflags_SOURCE="${gflags_SOURCE:-}" \
    -Dgoogle_cloud_cpp_storage_SOURCE="${google_cloud_cpp_storage_SOURCE:-}" \
    -DgRPC_SOURCE="${gRPC_SOURCE:-}" \
    -DGTest_SOURCE="${GTest_SOURCE:-}" \
    -Dlz4_SOURCE="${lz4_SOURCE:-}" \
    -Dnlohmann_json_SOURCE="${nlohmann_json_SOURCE:-}" \
    -Dopentelemetry-cpp_SOURCE="${opentelemetry_cpp_SOURCE:-}" \
    -DORC_SOURCE="${ORC_SOURCE:-}" \
    -DPARQUET_BUILD_EXAMPLES="${PARQUET_BUILD_EXAMPLES:-OFF}" \
    -DPARQUET_BUILD_EXECUTABLES="${PARQUET_BUILD_EXECUTABLES:-OFF}" \
    -DPARQUET_REQUIRE_ENCRYPTION="${PARQUET_REQUIRE_ENCRYPTION:-ON}" \
    -DProtobuf_SOURCE="${Protobuf_SOURCE:-}" \
    -DRapidJSON_SOURCE="${RapidJSON_SOURCE:-}" \
    -Dre2_SOURCE="${re2_SOURCE:-}" \
    -Dsimdjson_SOURCE="${simdjson_SOURCE:-}" \
    -DSnappy_SOURCE="${Snappy_SOURCE:-}" \
    -DThrift_SOURCE="${Thrift_SOURCE:-}" \
    -Dutf8proc_SOURCE="${utf8proc_SOURCE:-}" \
    -Dzstd_SOURCE="${zstd_SOURCE:-}" \
    -Dxsimd_SOURCE="${xsimd_SOURCE:-}" \
    -G "${CMAKE_GENERATOR:-Ninja}" \
    "${ARROW_CMAKE_ARGS_ARRAY[@]}" \
    "${source_dir}"
fi

: "${ARROW_BUILD_PARALLEL:=$((n_jobs + 1))}"
if [ "${ARROW_USE_MESON:-OFF}" = "ON" ]; then
  time meson compile -j "${ARROW_BUILD_PARALLEL}"
  meson install
  # Remove all added files in cpp/subprojects/ because they may have
  # unreadable permissions on Docker host.
  pushd "${source_dir}"
  meson subprojects purge --confirm --include-cache
  popd
else
  : "${CMAKE_BUILD_PARALLEL_LEVEL:=${ARROW_BUILD_PARALLEL}}"
  export CMAKE_BUILD_PARALLEL_LEVEL
  time cmake --build . --target install
fi

# Save disk space by removing large temporary build products
find . -name "*.o" -delete

if [ "${ARROW_OFFLINE}" = "ON" ]; then
  cp /etc/resolv.conf{.bak,}
fi

popd

if [ -x "$(command -v ldconfig)" ]; then
  if [ "$(id --user)" -eq 0 ]; then
    SUDO=
  else
    if [ -x "$(command -v sudo)" ]; then
      SUDO=sudo
    else
      SUDO=
    fi
  fi
  ${SUDO} ldconfig "${ARROW_HOME}/${CMAKE_INSTALL_LIBDIR:-lib}"
fi

if [ "${ARROW_USE_CCACHE}" == "ON" ]; then
  echo -e "===\n=== ccache statistics after build\n==="
  ccache -sv 2>/dev/null || ccache -s
fi

if command -v sccache &> /dev/null; then
  echo "=== sccache stats after the build ==="
  sccache --show-stats
fi

if [ "${BUILD_DOCS_CPP}" == "ON" ]; then
  pushd "${source_dir}/apidoc"
  OUTPUT_DIRECTORY=${build_dir}/apidoc doxygen
  popd
fi
