[Rd] CXX_STD and configure.ac in packages

Romain François romain at r-enthusiasts.com
Mon Mar 31 13:30:08 CEST 2014


Le 31 mars 2014 à 12:20, Martyn Plummer <plummerm at iarc.fr> a écrit :

> On Mon, 2014-03-31 at 07:09 +0000, Martyn Plummer wrote:
>> Hi Martin,
>> 
>> Thanks for the patch. I have applied it. I also added CXX1X and friends to the list of approved variables for R CMD config.
>> So you can now query the existence of C++11 support with `R CMD config CXX1X` (It is empty if C++11 support is not available)
>> and then take appropriate action in your configure script if, in Dirk's words, you want to do the configure dance.
>> 
>> The philosophy underlying C++ support in R is that there are only two standards - C++98 and C++11 - and that
>> you should write to one of those standards. 
> 
> A should add a clarification. The way I wrote this makes it sound like
> an even-handed choice, but only C++98 has cross-platform support. If you
> use C++11 then many users will not currently be able to use your code. 

OTOH, if nobody goes there, the need for C++11 might not be perceived as important by people who take care of cross platform support. 

Probably not Martin’s fight. One can do the gymnastics to get an unordered_map with C++98 (through boost, tr1, etc ...), but C++11 brings a great combination of new features that make it a better language, and I agree that it is almost a new language. And once you start using it, it is hard to look back. 

>> Nobody should be writing new code that uses TR1 extensions now: they are
>> superseded by the new standard.
>> 
>> The map and unordered_map classes are a corner case, as they offer the same functionality but latter has much better
>> complexity guarantees, so it is tempting to use it when available.  But from a global perspective you should think of
>> C++98 and C++11 as two different languages.
>> 
>> Martyn
>> 
>> ________________________________________
>> From: r-devel-bounces at r-project.org [r-devel-bounces at r-project.org] on behalf of Romain Francois [romain at r-enthusiasts.com]
>> Sent: 31 March 2014 08:22
>> To: Martin Morgan
>> Cc: R-devel
>> Subject: Re: [Rd] CXX_STD and configure.ac in packages
>> 
>> Hi,
>> 
>> My advice would be to use SystemRequirements: C++11
>> 
>> As <unordered_map> is definitely a part of C++11, assuming this version of the standard gives it to you. Your package may not compile on platforms where a C++11 compiler is not available, but perhaps if this becomes a pattern, then such compilers will start to be available, as in the current version of OSX and recent enough versions of various linux distributions.
>> 
>> The subset of feature that the version of gcc gives you with Rtools might be enough.
>> 
>> Alternatively, if you use Rcpp, you can use the RCPP_UNORDERED_MAP macro which will expand to either unordered_map or tr1::unordered_map, all the condition compiling is done in Rcpp.
>> 
>> Romain
>> 
>> Le 30 mars 2014 à 21:50, Martin Morgan <mtmorgan at fhcrc.org> a écrit :
>> 
>>> In C++ code for use in a R-3.1.0 package, my specific problem is that I would like to use <unordered_map> if it is available, or <tr1/unordered_map> if not, or <map> if all else fails.
>>> 
>>> I (think I) can accomplish this with configure.ac as
>>> 
>>> AC_INIT("DESCRIPTION")
>>> 
>>> CXX=`"${R_HOME}/bin/R" CMD config CXX`
>>> CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS`
>>> 
>>> AC_CONFIG_HEADERS([src/config.h])
>>> AC_LANG(C++)
>>> AC_CHECK_HEADERS([unordered_map tr1/unordered_map])
>>> AC_OUTPUT
>>> 
>>> Use of configure.ac does not seem to be entirely consistent with section 1.2.4 of Writing R Extensions, where one is advised that to use C++(11? see below) code one should
>>> 
>>>   CXX_STD = CXX11
>>> 
>>> in Makevars(.win). My code does not require a compiler that supports the full C++11 feature set. In addition, I do not understand the logic of setting a variable that influences compiler flags in Makevars -- configure.ac will see a compiler with inaccurate flags.
>>> 
>>> Is use of configure.ac orthogonal to setting CXX_STD=CXX11?
>>> 
>>> Some minor typos:
>>> 
>>> /R-3-1-branch$ svn diff
>>> Index: doc/manual/R-exts.texi
>>> ===================================================================
>>> --- doc/manual/R-exts.texi    (revision 65339)
>>> +++ doc/manual/R-exts.texi    (working copy)
>>> @@ -2250,7 +2250,7 @@
>>> @subsection Using C++11 code
>>> 
>>> @R{} can be built without a C++ compiler although one is available
>>> -(but not necessarily installed) or all known @R{} platforms.
>>> +(but not necessarily installed) on all known @R{} platforms.
>>> For full portability across platforms, all
>>> that can be assumed is approximate support for the C++98 standard (the
>>> widely used @command{g++} deviates considerably from the standard).
>>> @@ -2272,7 +2272,7 @@
>>> support a flag @option{-std=c++0x}, but the latter only provides partial
>>> support for the C++11 standard.
>>> 
>>> -In order to use C++ code in a package, the package's @file{Makevars}
>>> +In order to use C++11 code in a package, the package's @file{Makevars}
>>> file (or @file{Makevars.win} on Windows) should include the line
>>> 
>>> @example
>>> @@ -2329,7 +2329,7 @@
>>> anything other than the GNU version of C++98 and GNU extensions (which
>>> include TR1).  The default compiler on Windows is GCC 4.6.x and supports
>>> the @option{-std=c++0x} flag and some C++11 features (see
>>> - at uref{http://gcc.gnu.org/gcc-4.6/cxx0x_status.html}.  On these
>>> + at uref{http://gcc.gnu.org/gcc-4.6/cxx0x_status.html}).  On these
>>> platforms, it is necessary to select a different compiler for C++11, as
>>> described above, @emph{via} personal @file{Makevars} files.  For
>>> example, on OS X 10.7 or later one could select @command{clang++}.
>>> 
>>> --
>>> Computational Biology / Fred Hutchinson Cancer Research Center
>>> 1100 Fairview Ave. N.
>>> PO Box 19024 Seattle, WA 98109
>>> 
>>> Location: Arnold Building M1 B861
>>> Phone: (206) 667-2793
>>> 
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> -----------------------------------------------------------------------
>> This message and its attachments are strictly confidenti...{{dropped:8}}
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> -----------------------------------------------------------------------
> This message and its attachments are strictly confiden...{{dropped:9}}



More information about the R-devel mailing list