From eabcaecffbac6bb574305b133efa0d6137768abe Mon Sep 17 00:00:00 2001 From: Vladimir Tamara Date: Thu, 26 Mar 2020 13:19:32 -0500 Subject: [PATCH] Uses CXX17 if it cannot find timespec_get or TIME_UTC with CXX11. Fixes #115 --- configure | 43 ++++++++++++++++++++++++++++++++++++++++++- src/Makevars.in | 3 +-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 85c118c9..5e86b83c 100755 --- a/configure +++ b/configure @@ -20,9 +20,50 @@ else EXTRA_PKG_LIBS=-latomic fi +CXX=$("${R_HOME}"/bin/R CMD config CXX) +CXX11FLAGS=$("${R_HOME}"/bin/R CMD config CXX11FLAGS) +if [ "$CXX" != "" -a "$CXX11FLAGS" != "" ]; then + # Detect whether if c++11 is enough + CXX11STD=$("${R_HOME}"/bin/R CMD config CXX11STD) + ptimespec='#include +#include +// Example adapted from https://en.cppreference.com/w/cpp/chrono/c/timespec_get + +namespace std { + + int main() + { + timespec ts; + timespec_get(&ts, TIME_UTC); + char buf[100]; + strftime(buf, sizeof buf, "%D %T", gmtime(&ts.tv_sec)); + printf("Current time: %s.%09ld UTC", buf, ts.tv_nsec); + return 0; + } + +}' + echo "$ptimespec" | ${CXX} -x c++ -c $CXX11FLAGS $CXX11STD - -o /dev/null > /dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "c++11 is enough." + CXX_STD=CXX11 + else + CXX17FLAGS=$("${R_HOME}"/bin/R CMD config CXX17FLAGS) + CXX17STD=$("${R_HOME}"/bin/R CMD config CXX17STD) + echo "$ptimespec" | ${CXX} -x c++ -c $CXX17FLAGS $CXX17STD - -o /dev/null > /dev/null 2>&1 + if [ $? -eq 0 ]; then + # See https://github.com/r-lib/later/issues/115 + echo "c++17 is required." + CXX_STD=CXX17 + else + echo "Neither c++11 nor c++17 work" + CXX_STD="" + fi + fi +fi + # Write to Makevars -sed -e "s|@extra_pkg_libs@|$EXTRA_PKG_LIBS|" src/Makevars.in > src/Makevars +sed -e "s|@extra_pkg_libs@|$EXTRA_PKG_LIBS|;s|@cxx_std@|$CXX_STD|" src/Makevars.in > src/Makevars # Success exit 0 diff --git a/src/Makevars.in b/src/Makevars.in index f3d2a500..9227f2e8 100644 --- a/src/Makevars.in +++ b/src/Makevars.in @@ -1,5 +1,4 @@ -# Use C++11 if available -CXX_STD=CXX11 +CXX_STD=@cxx_std@ PKG_CPPFLAGS = -pthread -DSTRICT_R_HEADERS PKG_LIBS = -pthread @extra_pkg_libs@