#! /usr/bin/env sh

if [ -z "$R_HOME" ]; then
    echo >&2 R_HOME is not set, are you running R CMD INSTALL?
    exit 1
fi

if [ "$R_OSTYPE" = "unix" ]; then
    UNAME=`uname`
else
    UNAME=Windows
fi

# CentOS 7 seems to work with C++-14
if [ "$UNAME" = "Linux" ]; then
    CXX_STANDARD=14
else
    CXX_STANDARD=14
fi

AX="ax"
if [ "$UNAME" = "Windows" ]; then
    # https://bugs.r-project.org/show_bug.cgi?id=18869
    CMAKE_PREFIX_PATH=""
    case "$R_VERSION" in
      4.4.*)
          CMAKE_PREFIX_PATH="../extra/cmake/R-4.4"
          RT="`echo ${RTOOLS44_HOME-C:/rtools44} | sed 's|\\\\|/|g'`"
          cat src/extra/cmake/R-4.4/protobuf-targets.cmake.in |
              sed "s|@RTOOLS44@|${RT}|" |
              cat > src/extra/cmake/R-4.4/protobuf-targets.cmake
          ;;
      4.3.*)
          CMAKE_PREFIX_PATH="../extra/cmake/R-4.3"
          RT="`echo ${RTOOLS43_HOME-C:/rtools43} | sed 's|\\\\|/|g'`"
          cat src/extra/cmake/R-4.3/protobuf-targets.cmake.in |
              sed "s|@RTOOLS43@|${RT}|" |
              cat > src/extra/cmake/R-4.3/protobuf-targets.cmake
          ;;
      4.2.*)
      ;;
      4.1.*)
      ;;
      4.0.*)
      ;;
    esac
    PROTOBUF_LIBS="`pkg-config --libs protobuf`"
    LIBCURL_LIBS="`pkg-config --libs libcurl`"
    XCFLAGS="-DCURL_STATICLIB"
    XCXXFLAGS="-DCURL_STATICLIB"
elif [ "$UNAME" = "Darwin" ]; then
    if [ -f "/opt/R/`arch`/bin/protoc" ]; then
    	echo "** Using CRAN protobuf in /opt/R/`arch`"
	    if /usr/bin/which -s pkg-config && pkg-config --silence-errors --cflags protobuf | grep -q -v /opt/R; then
  	    echo "** Seems like another version of protobuf is installed."
	      echo "** You need to uninstall it to use CRAN's protobuf."
	      echo "** If you are using homebrew, call 'brew unlink protobuf'".
	      exit 2
    	fi
	    CMAKE_PREFIX_PATH="/opt/R/`arch`"
	    PROTOBUF_LIBS="-lprotobuf"
    else
	    echo "** Using protobuf via pkg-config"
	    if ! pkg-config --exists protobuf; then
	      echo "** Could not find protobuf with pkg-config"
  	    exit 2
  	  fi
  	  XCPPFLAGS="`pkg-config --cflags-only-I protobuf`"
	    PROTOBUF_LIBS="`pkg-config --libs protobuf`"
    fi
    LIBCURL_LIBS="-lcurl"
else
    PROTOBUF_LIBS="`pkg-config --libs protobuf || echo '-lprotobuf'`"
    LIBCURL_LIBS="`pkg-config --libs libcurl || echo '-lcurl'`"
    # this is for the R-hub images that have protobuf in /usr/local/clang
    if [ -f "/usr/local/clang/bin/protoc" ]; then
      CMAKE_PREFIX_PATH="/usr/local/clang"
    fi
fi

# We do parallel build if
# - on Github Actions, or
# - if NOT_CRAN == "true", or
# - if we are in load_all().
CMAKE_BUILD_PARALLEL_LEVEL=""
if [ "$R_INSTALL_PARALLEL" = "false" ]; then
  echo '** parallel build is off'
elif [ "$R_INSTALL_PARALLEL" = "true" ]; then
  echo '** parallel build is on because R_INSTALL_PARALLEL=true'
else
  if [ "$GITHUB_ACTIONS" = "true" ]; then
    echo '** parallel build selected because of GitHub Action'
    R_INSTALL_PARALLEL=true
  elif [ "$NOT_CRAN" = "true" ]; then
    echo '** parallel build selected because NOT_CRAN=true is set'
    R_INSTALL_PARALLEL=true
  elif [ -n "$DEVTOOLS_LOAD" ]; then
    echo '** parallel build selected in load_all()'
    R_INSTALL_PARALLEL=true
  fi
fi

# no need to clean up on GHA or in `load_all()` or if
# R_INSTALL_PARALLEL=true, which I set locally on my machine
MRPROPER="mrproper"
if echo ${R_LIBRARY_DIR} | grep -q otelsdk.Rcheck ||
   echo ${R_LIBS} | grep -q otelsdk.Rcheck; then
  MRPROPER="mrproper"
elif [ "$GITHUB_ACTIONS" = "true" ] ||
   [ "$NOT_CRAN" = "true" ] ||
   [ "$R_INSTALL_PARALLEL" = "true" ] ||
   [ -n "$DEVTOOLS_LOAD" ]; then
  MRPROPER=""
fi

# Look up number of processors, if parallel build.
if [ "$R_INSTALL_PARALLEL" = "true" ]; then
  if [ -n "$NCPU" ]; then
    # already set
    true
  elif [ "$R_OSTYPE" = "windows" ]; then
    NCPU=$NUMBER_OF_PROCESSORS
  elif [ "$UNAME" = "Linux" ]; then
    NCPU=`cat /proc/cpuinfo  | grep '^processor\s*:' | wc -l || true`
  elif [ "$UNAME" = "Darwin" ]; then
    NCPU=`sysctl -n hw.ncpu || true`
  else
    NCPU=""
  fi
  if expr "$NCPU" : '[1-9][0-9]*$' >/dev/null; then
    CMAKE_BUILD_PARALLEL_LEVEL="CMAKE_BUILD_PARALLEL_LEVEL=$NCPU"
    if [ -z "$MAKEFLAGS" ]; then
      echo '**'" using $NCPU processors (unless configured differently in Makeconf)"
      MAKEFLAGS=-j${NCPU}
    else
      echo '**'" using $NCPU processors to build opentelemetry-cpp"
    fi
  else
    echo '**'" parallel compilation is disabled."
    NCPU=""
  fi
fi

cat src/Makevars.in |
  sed "s|@UNAME@|${UNAME}|" |
  sed "s|@CXX_STANDARD@|${CXX_STANDARD}|" |
  sed "s|@XCFLAGS@|${XCFLAGS}|" |
  sed "s|@XCXXFLAGS@|${XCXXFLAGS}|" |
  sed "s|@XCPPFLAGS@|${XCPPFLAGS}|" |
  sed "s|@PROTOBUF_LIBS@|${PROTOBUF_LIBS}|" |
  sed "s|@LIBCURL_LIBS@|${LIBCURL_LIBS}|" |
  sed "s|@OTEL_CLEANUP@|${OTEL_CLEANUP}|" |
  sed "s|@CMAKE_PREFIX_PATH@|${CMAKE_PREFIX_PATH}|" |
  sed "s|@CMAKE_BUILD_PARALLEL_LEVEL@|${CMAKE_BUILD_PARALLEL_LEVEL}|" |
  sed "s|@MRPROPER@|${MRPROPER}|" |
  sed "s|@MAKEFLAGS@|${MAKEFLAGS}|" |
  sed "s|@PKG_CFLAGS@|${PKG_CFLAGS}|" |
  sed "s|@PKG_CXXFLAGS@|${PKG_CXXFLAGS}|" |
  sed "s|@PKG_LDFLAGS@|${PKG_LDFLAGS}|" |
  cat > src/Makevars
