
#!/bin/sh
# Anticonf (tm) script by Mark Klik (2022)
# 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_XYZ_DIR and LIB_XYZ_DIR (with XYZ the specific library LZ4, ZSTD or XXHASH)
# manually via e.g: R CMD INSTALL --configure-vars='INCLUDE_LZ4_DIR=/.../include LIB_LZ4_DIR=/.../lib'
# Alternatively, you can build the required libraries directly from bundled code by
# setting BUILD_INTERNAL_LIBS to true

# compile LZ4, ZSTD and XXHASH directly from the bundled code in the package
if [ "$BUILD_INTERNAL_LIBS" = true ]; then
  echo "Found BUILD_INTERNAL_LIBS set to true, compiling bundled LZ4 and ZSTD libraries!"
  cp src/Makevars.win src/Makevars
  exit 0
fi

# default cflags
PKG_CFLAGS=""
LOCALLIBS=""


# library settings LZ4
PKG_LZ4_CONFIG_NAME="liblz4"
PKG_LZ4_DEB_NAME="liblz4-dev"
PKG_LZ4_RPM_NAME="lz4-devel"
PKG_LZ4_CSW_NAME="liblz4_dev"
PKG_LZ4_OSX_NAME="lz4"
PKG_LZ4_TEST_HEADER="<lz4.h>"
PKG_LZ4_LIBS="-llz4"

# library settings ZSTD
PKG_ZSTD_CONFIG_NAME="libzstd"
PKG_ZSTD_DEB_NAME="libzstd-dev"
PKG_ZSTD_RPM_NAME="libzstd-devel"
PKG_ZSTD_CSW_NAME="libzstd-dev"
PKG_ZSTD_OSX_NAME="zstd"
PKG_ZSTD_TEST_HEADER="<zstd.h>"
PKG_ZSTD_LIBS="-lzstd"


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

# Use pkg-config if available
pkg-config --version 2>/dev/null
if [ $? -eq 0 ]; then
  PKGCONFIG_LZ4_CFLAGS=`pkg-config --cflags ${PKG_LZ4_CONFIG_NAME}`
  PKGCONFIG_LZ4_LIBS=`pkg-config --libs ${PKG_LZ4_CONFIG_NAME}`
fi

# Note that cflags may be empty in case of success
if [ "$INCLUDE_LZ4_DIR" ] || [ "$LIB_LZ4_DIR" ]; then
  echo "Found INCLUDE_LZ4_DIR and/or LIB_LZ4_DIR!"
  PKG_CFLAGS="-I$INCLUDE_LZ4_DIR $PKG_CFLAGS"
  PKG_LZ4_LIBS="-L$LIB_LZ4_DIR"
elif [ "$PKGCONFIG_LZ4_CFLAGS" ] || [ "$PKGCONFIG_LZ4_LIBS" ]; then
  echo "Found pkg-config cflags and libs for LZ4!"
  PKG_CFLAGS="$PKGCONFIG_LZ4_CFLAGS $PKG_CFLAGS"
  PKG_LZ4_LIBS=${PKGCONFIG_LZ4_LIBS}
fi

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

# Customize the error
if [ $R_CONFIG_LZ4_ERROR ]; then
  echo "------------------------------- ANTICONF WARNING ---------------------------------"
  echo "Configuration with system library $PKG_LZ4_CONFIG_NAME failed, falling back to"
  echo "$PKG_LZ4_CONFIG_NAME included in the package code. To use the $PKG_LZ4_CONFIG_NAME"
  echo "system library, try installing:"
  echo " * deb: $PKG_LZ4_DEB_NAME (Debian, Ubuntu, etc)"
  echo " * rpm: $PKG_LZ4_RPM_NAME (Fedora, CentOS, RHEL)"
  echo " * csw: $PKG_LZ4_CSW_NAME (Solaris)"
  echo " * OSX: $PKG_LZ4_OSX_NAME (macOS)"
  echo "If $PKG_LZ4_CONFIG_NAME is already installed, check that 'pkg-config' is in your"
  echo "PATH and PKG_CONFIG_PATH contains a $PKG_LZ4_CONFIG_NAME.pc file. If pkg-config"
  echo "is unavailable you can set INCLUDE_LZ4_DIR and LIB_LZ4_DIR manually via:"
  echo "R CMD INSTALL --configure-vars='INCLUDE_LZ4_DIR=... LIB_LZ4_DIR=...'"
  echo "Alternatively, you can force-build the required libraries directly from bundled"
  echo "code by setting BUILD_INTERNAL_LIBS to true"
  echo "----------------------------------------------------------------------------------"
  LOCALLIBS="./libLZ4.a $LOCALLIBS"
  PKG_LZ4_LIBS=""
fi

pkg-config --version 2>/dev/null
if [ $? -eq 0 ]; then
  PKGCONFIG_ZSTD_CFLAGS=`pkg-config --cflags ${PKG_ZSTD_CONFIG_NAME}`
  PKGCONFIG_ZSTD_LIBS=`pkg-config --libs ${PKG_ZSTD_CONFIG_NAME}`
fi

# Note that cflags may be empty in case of success
if [ "$INCLUDE_ZSTD_DIR" ] || [ "$LIB_ZSTD_DIR" ]; then
  echo "Found INCLUDE_ZSTD_DIR and/or LIB_ZSTD_DIR!"
  PKG_CFLAGS="-I$INCLUDE_ZSTD_DIR $PKG_CFLAGS"
  PKG_ZSTD_LIBS="-L$LIB_ZSTD_DIR"
elif [ "$PKGCONFIG_ZSTD_CFLAGS" ] || [ "$PKGCONFIG_ZSTD_LIBS" ]; then
  echo "Found pkg-config cflags and libs for ZSTD!"
  PKG_CFLAGS="$PKGCONFIG_ZSTD_CFLAGS $PKG_CFLAGS"
  PKG_ZSTD_LIBS=${PKGCONFIG_ZSTD_LIBS}
fi

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

# Customize the error
if [ $R_CONFIG_ZSTD_ERROR ]; then
  echo "------------------------------- ANTICONF WARNING ---------------------------------"
  echo "Configuration with system library $PKG_ZSTD_CONFIG_NAME failed, falling back to"
  echo "$PKG_ZSTD_CONFIG_NAME included in the package code. To use the $PKG_ZSTD_CONFIG_NAME"
  echo "system library, try installing:"
  echo " * deb: $PKG_ZSTD_DEB_NAME (Debian, Ubuntu, etc)"
  echo " * rpm: $PKG_ZSTD_RPM_NAME (Fedora, CentOS, RHEL)"
  echo " * csw: $PKG_ZSTD_CSW_NAME (Solaris)"
  echo " * OSX: $PKG_ZSTD_OSX_NAME (macOS)"
  echo "If $PKG_ZSTD_CONFIG_NAME is already installed, check that 'pkg-config' is in your"
  echo "PATH and PKG_CONFIG_PATH contains a $PKG_ZSTD_CONFIG_NAME.pc file. If pkg-config"
  echo "is unavailable you can set INCLUDE_ZSTD_DIR and LIB_ZSTD_DIR manually via:"
  echo "R CMD INSTALL --configure-vars='INCLUDE_ZSTD_DIR=... LIB_ZSTD_DIR=...'"
  echo "Alternatively, you can force-build the required libraries directly from bundled"
  echo "code by setting BUILD_INTERNAL_LIBS to true"
  echo "----------------------------------------------------------------------------------"
  LOCALLIBS="./libZSTD.a $LOCALLIBS"
  PKG_ZSTD_LIBS=""
fi

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

# Success
exit 0
