#!/bin/sh

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

# Anticonf (tm) script by Jeroen Ooms, Jim Hester (2017)
# License: MIT
#
# This script will query 'pkg-config' for the required cflags and ldflags.
# If pkg-config is unavailable or does not find the library, try setting
# INCLUDE_DIR and LIB_DIR manually via e.g:
# R CMD INSTALL --configure-vars='INCLUDE_DIR=/.../include LIB_DIR=/.../lib'

# Library settings
PKG_CONFIG_NAME="arrow"
PKG_DEB_NAME="(unsuppored)"
PKG_RPM_NAME="(unsuppored)"
PKG_BREW_NAME="apache-arrow"
PKG_TEST_HEADER="<arrow/api.h>"
PKG_LIBS="-larrow"

# Make some env vars case-insensitive
ARROW_R_DEV=`echo $ARROW_R_DEV | tr '[:upper:]' '[:lower:]'`
FORCE_AUTOBREW=`echo $FORCE_AUTOBREW | tr '[:upper:]' '[:lower:]'`
FORCE_BUNDLED_BUILD=`echo $FORCE_BUNDLED_BUILD | tr '[:upper:]' '[:lower:]'`
ARROW_USE_PKG_CONFIG=`echo $ARROW_USE_PKG_CONFIG | tr '[:upper:]' '[:lower:]'`

VERSION=`grep '^Version' DESCRIPTION | sed s/Version:\ //`
UNAME=`uname -s`

# generate code
if [ "$ARROW_R_DEV" = "true" ] && [ -f "data-raw/codegen.R" ]; then
  echo "*** Generating code with data-raw/codegen.R"
  ${R_HOME}/bin/Rscript data-raw/codegen.R
fi

if [ -f "tools/apache-arrow.rb" ]; then
  # If you want to use a local apache-arrow.rb formula, do
  # $ cp ../dev/tasks/homebrew-formulae/autobrew/apache-arrow.rb tools/apache-arrow.rb
  # before R CMD build or INSTALL (assuming a local checkout of the apache/arrow repository)
  cp tools/autobrew .
  if [ "$FORCE_AUTOBREW" != "false" ]; then
    # It is possible to turn off forced autobrew if the formula is included,
    # but most likely you shouldn't because the included formula will reference
    # the C++ library at the version that matches the R package.
    FORCE_AUTOBREW="true"
  fi
fi

if [ "$FORCE_AUTOBREW" = "true" ] || [ "$FORCE_BUNDLED_BUILD" = "true" ]; then
  ARROW_USE_PKG_CONFIG="false"
fi

# Note that cflags may be empty in case of success
if [ "$INCLUDE_DIR" ] || [ "$LIB_DIR" ]; then
  echo "*** Using INCLUDE_DIR/LIB_DIR"
  PKG_CFLAGS="-I$INCLUDE_DIR $PKG_CFLAGS"
  PKG_DIRS="-L$LIB_DIR"
else
  # Use pkg-config if available and allowed
  pkg-config --version >/dev/null 2>&1
  if [ "$ARROW_USE_PKG_CONFIG" != "false" ] && [ $? -eq 0 ]; then
    PKGCONFIG_CFLAGS=`pkg-config --cflags --silence-errors ${PKG_CONFIG_NAME}`
    PKGCONFIG_LIBS=`pkg-config --libs-only-l --silence-errors ${PKG_CONFIG_NAME}`
    PKGCONFIG_DIRS=`pkg-config --libs-only-L --silence-errors ${PKG_CONFIG_NAME}`
    # TODO: what about --libs-only-other?
  fi

  if [ "$PKGCONFIG_CFLAGS" ] || [ "$PKGCONFIG_LIBS" ]; then
    echo "*** Arrow C++ libraries found via pkg-config"
    PKG_CFLAGS="$PKGCONFIG_CFLAGS"
    PKG_LIBS=${PKGCONFIG_LIBS}
    PKG_DIRS=${PKGCONFIG_DIRS}

    # Check for version mismatch
    PC_LIB_VERSION=`pkg-config --modversion arrow`
    echo $PC_LIB_VERSION | grep -e 'SNAPSHOT$' >/dev/null 2>&1
    # If on a release (i.e. not SNAPSHOT) and version != R package version, warn
    if [ $? -eq 1 ] && [ "$PC_LIB_VERSION" != "$VERSION" ]; then
      echo "**** Warning: library version mismatch"
      echo "**** C++ is $PC_LIB_VERSION but R is $VERSION"
      echo "**** If installation fails, upgrade the C++ library to match"
      echo "**** or retry with ARROW_USE_PKG_CONFIG=false"
    fi
  else
    if [ "$UNAME" = "Darwin" ] && [ "$FORCE_BUNDLED_BUILD" != "true" ]; then
      if [ "$FORCE_AUTOBREW" != "true" ] && [ "`command -v brew`" ] && [ "`brew ls --versions ${PKG_BREW_NAME}`" != "" ]; then
        echo "*** Using Homebrew ${PKG_BREW_NAME}"
        BREWDIR=`brew --prefix`
        PKG_LIBS="$PKG_LIBS -larrow_bundled_dependencies"
        PKG_DIRS="-L$BREWDIR/opt/$PKG_BREW_NAME/lib $PKG_DIRS"
        PKG_CFLAGS="-I$BREWDIR/opt/$PKG_BREW_NAME/include"
      else
        echo "*** Downloading ${PKG_BREW_NAME}"
        if [ -f "autobrew" ]; then
          echo "**** Using local manifest for ${PKG_BREW_NAME}"
        else
          curl -sfL "https://autobrew.github.io/scripts/$PKG_BREW_NAME" > autobrew
          if [ $? -ne 0 ]; then
            echo "Failed to download manifest for ${PKG_BREW_NAME}"
          fi
        fi
        . autobrew
        if [ $? -ne 0 ]; then
          echo "Failed to retrieve binary for ${PKG_BREW_NAME}"
        fi
        # autobrew sets `PKG_LIBS`, `PKG_DIRS`, and `PKG_CFLAGS`
      fi
    else
      # Set some default values/backwards compatibility
      if [ "${LIBARROW_DOWNLOAD}" = "" ] && [ "${NOT_CRAN}" != "" ]; then
        LIBARROW_DOWNLOAD=$NOT_CRAN; export LIBARROW_DOWNLOAD
      fi
      if [ "${LIBARROW_BINARY}" = "" ] && [ "${LIBARROW_DOWNLOAD}" != "" ]; then
        LIBARROW_BINARY=$LIBARROW_DOWNLOAD; export LIBARROW_BINARY
      fi
      if [ "${LIBARROW_MINIMAL}" = "" ] && [ "${LIBARROW_DOWNLOAD}" = "true" ]; then
        LIBARROW_MINIMAL=false; export LIBARROW_MINIMAL
      fi
      if [ "${LIBARROW_MINIMAL}" = "" ] && [ "${NOT_CRAN}" = "true" ]; then
        LIBARROW_MINIMAL=false; export LIBARROW_MINIMAL
      fi

      # find openssl on macos. macOS ships with libressl. openssl is installable
      # with brew, but it is generally not linked. We can over-ride this and find
      # openssl but setting OPENSSL_ROOT_DIR (which cmake will pick up later in
      # the installation process). FWIW, arrow's cmake process uses this
      # same process to find openssl, but doing it now allows us to catch it in
      # nixlibs.R and throw a nicer error.
      if [ "$UNAME" = "Darwin" ] && [ "${OPENSSL_ROOT_DIR}" = "" ]; then
        brew --prefix openssl >/dev/null 2>&1
        if [ $? -eq 0 ]; then
          export OPENSSL_ROOT_DIR="$(brew --prefix openssl)"
        fi
      fi

      ${R_HOME}/bin/Rscript tools/nixlibs.R $VERSION
      PKG_CFLAGS="-I`pwd`/libarrow/arrow-${VERSION}/include $PKG_CFLAGS"

      LIB_DIR="libarrow/arrow-${VERSION}/lib"
      if [ -d "$LIB_DIR" ]; then
        # Enumerate the static libs, put their -l flags in BUNDLED_LIBS,
        # and put their -L location in PKG_DIRS
        #
        # If tools/nixlibs.R fails to produce libs, this dir won't exist
        # so don't try (the error message from `ls` would be misleading)
        # Assume nixlibs.R has handled and messaged about its failure already
        #
        # TODO: what about non-bundled deps?
        BUNDLED_LIBS=`cd $LIB_DIR && ls *.a`
        BUNDLED_LIBS=`echo "$BUNDLED_LIBS" | sed -e "s/\\.a lib/ -l/g" | sed -e "s/\\.a$//" | sed -e "s/^lib/-l/" | tr '\n' ' ' | sed -e "s/ $//"`
        PKG_DIRS="-L`pwd`/$LIB_DIR"

        # When using brew's openssl it is not bundled and it is not on the system
        # search path  and so we must add the lib path to BUNDLED_LIBS if we are
        # using it. Note the order is important, this must be after the arrow
        # lib path + the pkg and bundled libs above so this is why we're
        # appending to BUNDLED_LIBS and not PKG_DIRS
        if [ "$OPENSSL_ROOT_DIR" != "" ]; then
          BUNDLED_LIBS="$BUNDLED_LIBS -L$OPENSSL_ROOT_DIR/lib"
        fi
      fi
    fi
  fi
fi

# If libarrow uses the old GLIBCXX ABI, so we have to use it too
if [ "$ARROW_USE_OLD_CXXABI" ]; then
  PKG_CFLAGS="$PKG_CFLAGS -D_GLIBCXX_USE_CXX11_ABI=0"
fi

# Set any user-defined CXXFLAGS
if [ "$ARROW_R_CXXFLAGS" ]; then
  PKG_CFLAGS="$PKG_CFLAGS $ARROW_R_CXXFLAGS"
fi

# Test configuration
CXXCPP="`${R_HOME}/bin/R CMD config CXX11` -E"
if [ $? -eq 0 ]; then
  # Great, CXX11 exists for this version of R (current);
  # now let's set the other two variables
  CXX11FLAGS=`"${R_HOME}"/bin/R CMD config CXX11FLAGS`
  CXX11STD=`"${R_HOME}"/bin/R CMD config CXX11STD`
else
  # For compatibility with R < 3.4, when these were called CXX1X
  CXXCPP="`${R_HOME}/bin/R CMD config CXX1X` -E"
  CXX11FLAGS=`"${R_HOME}"/bin/R CMD config CXX1XFLAGS`
  CXX11STD=`"${R_HOME}"/bin/R CMD config CXX1XSTD`
fi
CPPFLAGS=`"${R_HOME}"/bin/R CMD config CPPFLAGS`
TEST_CMD="${CXXCPP} ${CPPFLAGS} ${PKG_CFLAGS} ${CXX11FLAGS} ${CXX11STD} -xc++ -"
echo "#include $PKG_TEST_HEADER" | ${TEST_CMD} >/dev/null 2>&1

if [ $? -eq 0 ] || [ "$UNAME" = "Darwin" ]; then
  # Always build with arrow on macOS
  PKG_CFLAGS="$PKG_CFLAGS -DARROW_R_WITH_ARROW"
  # Check for features
  LIB_DIR=`echo $PKG_DIRS | sed -e 's/^-L//'`
  ARROW_OPTS_CMAKE="$LIB_DIR/cmake/arrow/ArrowOptions.cmake"
  # Check for Parquet
  grep 'set(ARROW_PARQUET "ON")' $ARROW_OPTS_CMAKE >/dev/null 2>&1
  if [ $? -eq 0 ]; then
    PKG_CFLAGS="$PKG_CFLAGS -DARROW_R_WITH_PARQUET"
    PKG_LIBS="-lparquet $PKG_LIBS"
    # NOTE: parquet is assumed to have the same -L flag as arrow
    # so there is no need to add its location to PKG_DIRS
  fi
  # Check for Arrow Dataset subcomponent
  grep 'set(ARROW_DATASET "ON")' $ARROW_OPTS_CMAKE >/dev/null 2>&1
  if [ $? -eq 0 ]; then
    PKG_CFLAGS="$PKG_CFLAGS -DARROW_R_WITH_DATASET"
    PKG_LIBS="-larrow_dataset $PKG_LIBS"
    # NOTE: arrow-dataset is assumed to have the same -L flag as arrow
    # so there is no need to add its location to PKG_DIRS
  fi
  # Check for S3
  grep 'set(ARROW_S3 "ON")' $ARROW_OPTS_CMAKE >/dev/null 2>&1
  if [ $? -eq 0 ]; then
    PKG_CFLAGS="$PKG_CFLAGS -DARROW_R_WITH_S3"
    if [ "$BUNDLED_LIBS" != "" ]; then
      # We're depending on openssl/curl from the system, so they're not in the bundled deps
      BUNDLED_LIBS="$BUNDLED_LIBS -lssl -lcrypto -lcurl"
    fi
  fi
  # prepend PKG_DIRS and append BUNDLED_LIBS to PKG_LIBS
  PKG_LIBS="$PKG_DIRS $PKG_LIBS $BUNDLED_LIBS"
  echo "PKG_CFLAGS=$PKG_CFLAGS"
  echo "PKG_LIBS=$PKG_LIBS"
else
  if [ "$UNAME" = "Darwin" ]; then
    # Just for debugging: is this possible?
    echo "Test to load header failed. Command:"
    echo "$TEST_CMD"
  fi
  echo "------------------------- NOTE ---------------------------"
  echo "See https://arrow.apache.org/docs/r/articles/install.html"
  echo "for help installing Arrow C++ libraries"
  echo "---------------------------------------------------------"
  PKG_LIBS=""
  PKG_CFLAGS=""
fi

# Write to Makevars
sed -e "s|@cflags@|$PKG_CFLAGS|" -e "s|@libs@|$PKG_LIBS|" src/Makevars.in > src/Makevars

# This is removed because a (bad?) CRAN check fails when arrow.so is stripped
# # Add stripping
# if [ "$R_STRIP_SHARED_LIB" != "" ]; then
#   # R_STRIP_SHARED_LIB is set in the global Renviron and should be available here
#   echo "
# strip: \$(SHLIB)
# 	$R_STRIP_SHARED_LIB \$(SHLIB) >/dev/null 2>&1 || true
#
# .phony: strip
# " >> src/Makevars
# fi

# Success
exit 0
