diff --git a/configure b/configure index aa9a93f4..d6313cdc 100755 --- a/configure +++ b/configure @@ -27,8 +27,44 @@ case "$CC" in ;; esac +# By default CXX_STD is CXX11 +CXX_STD=CXX11 + +# But if it works, use CXX17 +CXX=`"${R_HOME}"/bin/R CMD config CXX17` +CXX17STD=`"${R_HOME}"/bin/R CMD config CXX17STD` +CXX17FLAGS=`"${R_HOME}"/bin/R CMD config CXX17FLAGS` +if [ "$CXX" != "" -a "$CXX17FLAGS" != "" -a "$CXX17STD" != "" ]; then + 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 $CXX17FLAGS $CXX17STD - -o /dev/null > /dev/null 2>&1 + if [ $? -eq 0 ]; then + # See https://github.com/r-lib/later/issues/115 + echo "Using c++17." + CXX_STD=CXX17 + else + echo "Cannot use c++17 using default configuration for c++11" + fi +fi + + # Write to Makevars -sed -e "s|@extra_pkg_libs@|$EXTRA_PKG_LIBS|" -e "s|@pkg_cppflags@|$PKG_CPPFLAGS|" \ +sed -e "s|@extra_pkg_libs@|$EXTRA_PKG_LIBS|" -e "s|@pkg_cppflags@|$PKG_CPPFLAGS|" -e "s|@cxx_std@|$CXX_STD|"\ src/Makevars.in > src/Makevars # Success diff --git a/src/Makevars.in b/src/Makevars.in index 17fe7ca4..ddc9023a 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_cppflags@ PKG_LIBS = -pthread @extra_pkg_libs@