#!/usr/bin/env bash

# PROJ needs libtiff to do grid shifts, and libcurl to use the CDN
# technically it doesn't need either, and because these are relatively
# new, most people don't need them at all

# ================ LIBTIFF ========================

# Anticonf (tm) script by Jeroen Ooms (2018)
# 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
# LIBTIFF_INCLUDE_DIR and LIBTIFF_LIB_DIR manually via e.g:
# R CMD INSTALL --configure-vars='LIBTIFF_INCLUDE_DIR=/.../include LIBTIFF_LIB_DIR=/.../lib'

# Library settings
LIBTIFF_PKG_CONFIG_NAME="libtiff-4"
LIBTIFF_PKG_DEB_NAME="libtiff-dev + libjpeg-dev + zlib1g-dev"
LIBTIFF_PKG_RPM_NAME="libtiff-devel + libjpeg-turbo-devel + zlib-devel"
LIBTIFF_PKG_BREW_NAME="libtiff"
LIBTIFF_PKG_TEST_HEADER="<tiff.h>"
LIBTIFF_PKG_LIBS="-ltiff -ljpeg -lz"
LIBTIFF_PKG_CFLAGS=""

# Use pkg-config if available
if [ $(command -v pkg-config) ]; then
  PKGCONFIG_CFLAGS=$(pkg-config --cflags --silence-errors ${LIBTIFF_PKG_CONFIG_NAME})
  PKGCONFIG_LIBS=$(pkg-config --libs ${LIBTIFF_PKG_CONFIG_NAME})
fi

# Note that cflags may be empty in case of success
if [ "$LIBTIFF_INCLUDE_DIR" ] || [ "$LIBTIFF_LIB_DIR" ]; then
  echo "Found LIBTIFF_INCLUDE_DIR and/or LIBTIFF_LIB_DIR!"
  LIBTIFF_PKG_CFLAGS="-I$INCLUDE_DIR $LIBTIFF_PKG_CFLAGS"
  LIBTIFF_PKG_LIBS="-L$LIBTIFF_LIB_DIR $LIBTIFF_PKG_LIBS"
elif [ "$PKGCONFIG_CFLAGS" ] && [ "$PKGCONFIG_LIBS" ]; then
  echo "Found libtiff pkg-config cflags and libs!"
  LIBTIFF_PKG_CFLAGS=${PKGCONFIG_CFLAGS}
  # pkg-config may miss -ljpeg and -lz, in which case it needs static libs
  if [[ ${LIBTIFF_PKGCONFIG_LIBS} != *"-ltiff"* ]] || \
     [[ ${LIBTIFF_PKGCONFIG_LIBS} != *"-ljpeg"* ]] || \
     [[ ${LIBTIFF_PKGCONFIG_LIBS} != *"-lz"* ]]; then
    LIBTIFF_PKGCONFIG_LIBS=$(pkg-config --libs --static ${LIBTIFF_PKG_CONFIG_NAME})
  fi
  if [[ ${LIBTIFF_PKGCONFIG_LIBS} == *"-ltiff"* ]] && \
     [[ ${LIBTIFF_PKGCONFIG_LIBS} == *"-ljpeg"* ]] && \
     [[ ${LIBTIFF_PKGCONFIG_LIBS} == *"-lz"* ]]; then
    LIBTIFF_PKG_LIBS=${LIBTIFF_PKGCONFIG_LIBS}
  fi
fi

# For debugging
echo "Using LIBTIFF_PKG_CFLAGS=$LIBTIFF_PKG_CFLAGS"
echo "Using LIBTIFF_PKG_LIBS=$LIBTIFF_PKG_LIBS"

# Find compiler
CC=$(${R_HOME}/bin/R CMD config CC)
CFLAGS=$(${R_HOME}/bin/R CMD config CFLAGS)
CPPFLAGS=$(${R_HOME}/bin/R CMD config CPPFLAGS)

# Test configuration
echo "#include $LIBTIFF_PKG_TEST_HEADER" | ${CC} ${CPPFLAGS} ${LIBTIFF_PKG_CFLAGS} ${CFLAGS} -E -xc - >/dev/null 2>&1

# Customize the error
if [ $? -ne 0 ]; then
  echo "------------------------- ANTICONF WARNING ---------------------------"
  echo "$LIBTIFF_PKG_CONFIG_NAME was not found. Try installing:"
  echo " * deb: $LIBTIFF_PKG_DEB_NAME (Debian, Ubuntu, etc)"
  echo " * rpm: $LIBTIFF_PKG_RPM_NAME (Fedora, EPEL)"
  echo " * brew: $LIBTIFF_PKG_BREW_NAME (OSX)"
  echo "If $LIBTIFF_PKG_CONFIG_NAME is already installed, check that 'pkg-config' is in your"
  echo "PATH and LIBTIFF_PKG_CONFIG_PATH contains a $LIBTIFF_PKG_CONFIG_NAME.pc file. If pkg-config"
  echo "is unavailable you can set LIBTIFF_INCLUDE_DIR and LIBTIFF_LIB_DIR manually via:"
  echo "R CMD INSTALL --configure-vars='LIBTIFF_INCLUDE_DIR=... LIBTIFF_LIB_DIR=...'"
  echo "--------------------------------------------------------------------"
  LIBTIFF_PKG_LIBS=""
else
  LIBTIFF_PKG_CFLAGS="-DTIFF_ENABLED $PKG_CFLAGS"
fi



# ============= LIBCURL ===============

# 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='LIBCURL_INCLUDE_DIR=/.../include LIBCURL_LIB_DIR=/.../lib'

# Library settings
PKG_CONFIG_NAME="libcurl"
PKG_DEB_NAME="libcurl4-openssl-dev"
PKG_RPM_NAME="libcurl-devel"
PKG_CSW_NAME="libcurl_dev"
PKG_TEST_HEADER="<curl/curl.h>"
PKG_LIBS="-lcurl"
PKG_CFLAGS=""

# Use pkg-config if available
pkg-config --version >/dev/null 2>&1
if [ $? -eq 0 ]; then
  PKGCONFIG_CFLAGS=`pkg-config --cflags ${PKG_CONFIG_NAME}`
  case "$PKGCONFIG_CFLAGS" in
    *CURL_STATICLIB*) PKGCONFIG_LIBS=`pkg-config --libs --static ${PKG_CONFIG_NAME}`;;
    *) PKGCONFIG_LIBS=`pkg-config --libs ${PKG_CONFIG_NAME}`;;
  esac
fi

# Note that cflags may be empty in case of success
if [ "$LIBCURL_INCLUDE_DIR" ] || [ "$LIBCURL_LIB_DIR" ]; then
  echo "Found LIBCURL_INCLUDE_DIR and/or LIBCURL_LIB_DIR!"
  PKG_CFLAGS="-I$LIBCURL_INCLUDE_DIR $PKG_CFLAGS"
  PKG_LIBS="-L$LIBCURL_LIB_DIR $PKG_LIBS"
elif [ "$PKGCONFIG_CFLAGS" ] || [ "$PKGCONFIG_LIBS" ]; then
  echo "Found libcurl pkg-config cflags and libs!"
  PKG_CFLAGS=${PKGCONFIG_CFLAGS}
  PKG_LIBS=${PKGCONFIG_LIBS}
fi

# Find compiler
CC=`${R_HOME}/bin/R CMD config CC`
CFLAGS=`${R_HOME}/bin/R CMD config CFLAGS`
CPPFLAGS=`${R_HOME}/bin/R CMD config CPPFLAGS`

# For debugging
echo "Using LIBCURL_PKG_CFLAGS=$PKG_CFLAGS"
echo "Using LIBCURL_PKG_LIBS=$PKG_LIBS"

# Test configuration
echo "#include $PKG_TEST_HEADER" | ${CC} ${CPPFLAGS} ${PKG_CFLAGS} ${CFLAGS} -E -xc - >/dev/null 2>&1 || R_CONFIG_ERROR=1;

# Customize the error
if [ $R_CONFIG_ERROR ]; then
  echo "------------------------- ANTICONF WARNING ---------------------------"
  echo "$PKG_CONFIG_NAME was not found. Try installing:"
  echo " * deb: $PKG_DEB_NAME (Debian, Ubuntu, etc)"
  echo " * rpm: $PKG_RPM_NAME (Fedora, CentOS, RHEL)"
  echo " * csw: $PKG_CSW_NAME (Solaris)"
  echo "If $PKG_CONFIG_NAME is already installed, check that 'pkg-config' is in your"
  echo "PATH and PKG_CONFIG_PATH contains a $PKG_CONFIG_NAME.pc file. If pkg-config"
  echo "is unavailable you can set LIBCURL_INCLUDE_DIR and LIBCURL_LIB_DIR manually via:"
  echo "R CMD INSTALL --configure-vars='LIBCURL_INCLUDE_DIR=... LIBCURL_LIB_DIR=...'"
  echo "--------------------------------------------------------------------"
  PKG_LIBS=""
else
  PKG_CFLAGS="-DCURL_ENABLED $PKG_CFLAGS"
fi

# ============== ASSEMBLE =============

PKG_CFLAGS="$LIBTIFF_PKG_CFLAGS $PKG_CFLAGS"
PKG_LIBS="$LIBTIFF_PKG_LIBS $PKG_LIBS"

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