1# Anticonf (tm) script by Jeroen Ooms (2020) 2# This script will query 'pkg-config' for the required cflags and ldflags. 3# If pkg-config is unavailable or does not find the library, try setting 4# INCLUDE_DIR and LIB_DIR manually via e.g: 5# R CMD INSTALL --configure-vars='INCLUDE_DIR=/.../include LIB_DIR=/.../lib' 6 7# Library settings 8PKG_CONFIG_NAME="openssl" 9PKG_DEB_NAME="libssl-dev" 10PKG_RPM_NAME="openssl-devel" 11PKG_CSW_NAME="libssl_dev" 12PKG_BREW_NAME="openssl@1.1" 13PKG_TEST_FILE="tools/version.c" 14PKG_LIBS="-lssl -lcrypto" 15PKG_CFLAGS="" 16 17# For testing alpha version 18# export PKG_CONFIG_PATH="/usr/local/opt/openssl@3/lib/pkgconfig" 19 20# Use pkg-config if available 21pkg-config ${PKG_CONFIG_NAME} --atleast-version=1.0 2>/dev/null 22if [ $? -eq 0 ]; then 23 PKGCONFIG_CFLAGS=`pkg-config --cflags ${PKG_CONFIG_NAME}` 24 PKGCONFIG_LIBS=`pkg-config --libs ${PKG_CONFIG_NAME}` 25fi 26 27# Note that cflags may be empty in case of success 28if [ "$INCLUDE_DIR" ] || [ "$LIB_DIR" ]; then 29 echo "Found INCLUDE_DIR and/or LIB_DIR!" 30 PKG_CFLAGS="-I$INCLUDE_DIR $PKG_CFLAGS" 31 PKG_LIBS="-L$LIB_DIR $PKG_LIBS" 32elif [ "$PKGCONFIG_CFLAGS" ] || [ "$PKGCONFIG_LIBS" ]; then 33 echo "Found pkg-config cflags and libs!" 34 PKG_CFLAGS=${PKGCONFIG_CFLAGS} 35 PKG_LIBS=${PKGCONFIG_LIBS} 36elif [ `uname` = "Darwin" ]; then 37 test ! "$CI" && brew --version 2>/dev/null 38 if [ $? -eq 0 ]; then 39 BREWDIR=`brew --prefix` 40 PKG_CFLAGS="-I$BREWDIR/opt/openssl/include" 41 PKG_LIBS="-L$BREWDIR/opt/openssl/lib $PKG_LIBS" 42 else 43 curl -sfL "https://autobrew.github.io/scripts/$PKG_BREW_NAME" > autobrew 44 . ./autobrew 45 fi 46fi 47 48# Find compiler 49CC=`${R_HOME}/bin/R CMD config CC` 50CFLAGS=`${R_HOME}/bin/R CMD config CFLAGS` 51CPPFLAGS=`${R_HOME}/bin/R CMD config CPPFLAGS` 52 53# For debugging 54echo "Using PKG_CFLAGS=$PKG_CFLAGS" 55 56# Test configuration 57${CC} ${CPPFLAGS} ${PKG_CFLAGS} ${CFLAGS} -E ${PKG_TEST_FILE} >/dev/null 2>configure.log 58 59# Customize the error 60if [ $? -ne 0 ]; then 61 echo "--------------------------- [ANTICONF] --------------------------------" 62 echo "Configuration failed because $PKG_CONFIG_NAME was not found. Try installing:" 63 echo " * deb: $PKG_DEB_NAME (Debian, Ubuntu, etc)" 64 echo " * rpm: $PKG_RPM_NAME (Fedora, CentOS, RHEL)" 65 echo " * csw: $PKG_CSW_NAME (Solaris)" 66 echo " * brew: $PKG_BREW_NAME (Mac OSX)" 67 echo "If $PKG_CONFIG_NAME is already installed, check that 'pkg-config' is in your" 68 echo "PATH and PKG_CONFIG_PATH contains a $PKG_CONFIG_NAME.pc file. If pkg-config" 69 echo "is unavailable you can set INCLUDE_DIR and LIB_DIR manually via:" 70 echo "R CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...'" 71 echo "-------------------------- [ERROR MESSAGE] ---------------------------" 72 cat configure.log 73 echo "--------------------------------------------------------------------" 74 exit 1 75fi 76 77# Try to link against the correct OpenSSL version 78if [ -z "$AUTOBREW" ]; then 79SONAME=`${CC} -E ${PKG_CFLAGS} src/tests/soname.h | sh | xargs` 80if [ "$SONAME" ]; then 81if [ `uname` = "Darwin" ]; then 82 PKG_LIBS_VERSIONED=`echo "${PKG_LIBS}" | sed "s/-lssl/-lssl.${SONAME}/" | sed "s/-lcrypto/-lcrypto.${SONAME}/"` 83else 84 PKG_LIBS_VERSIONED=`echo "${PKG_LIBS}" | sed "s/-lssl/-l:libssl.so.${SONAME}/" | sed "s/-lcrypto/-l:libcrypto.so.${SONAME}/"` 85fi 86 87# Test if versioned linking works 88${CC} ${PKG_CFLAGS} src/tests/main.c ${PKG_LIBS_VERSIONED} -o src/main.exe 2>/dev/null 89if [ $? -eq 0 ]; then PKG_LIBS="${PKG_LIBS_VERSIONED}"; fi 90 91# Suppress opensslv3 warnings for now 92if [ "$SONAME" = "3" ]; then 93PKG_CFLAGS="$PKG_CFLAGS -DOPENSSL_SUPPRESS_DEPRECATED" 94fi 95 96fi #SONAME 97fi #AUTOBREW 98 99echo "Using PKG_LIBS=$PKG_LIBS" 100 101# Write to Makevars 102sed -e "s|@cflags@|$PKG_CFLAGS|" -e "s|@libs@|$PKG_LIBS|" src/Makevars.in > src/Makevars 103 104# Success 105exit 0 106