[Rcpp-devel] R CMD check not happy about -std=c++0x
Romain François
francoisromain at free.fr
Sat Jan 16 09:39:22 CET 2010
Yes it is fairly tricky.
What I could not understand was why would R CMD check not complain about
Rcpp because we also set the non portable flags in Rcpp. It turns out it
works for Rcpp because the way R CMD check checks for these variables is
buggy and it appears that Rcpp takes advantage of this bug.
Eventually R CMD check calls this from the root directory of the package :
make -f 'src/Makevars' -f '/usr/local/lib/R/share/make/check.mk'
which is supposed to print out the flags. This is what gets printed for
the CPP package :
PKG_CFLAGS:
PKG_CPPFLAGS:
PKG_CXXFLAGS: -I/usr/local/lib/R/library/Rcpp/lib -std=c++0x
PKG_FCFLAGS:
PKG_FFLAGS:
This is what gets printed in Rcpp:
o libRcpp
make: o: Command not found
make: [libRcpp] Error 127 (ignored)
cp libRcpp ../inst/lib
cp: cannot stat `libRcpp': No such file or directory
make: *** [userLibrary] Error 1
So the PKG_CXXFLAGS does not get printed, so it cannot be identified as
wrong, which is why Rcpp passes check.
I can take advantage of this by using this Makevars in CPP:
PKG_LIBS=`Rcpp:::LdFlags()`
PKG_CXXFLAGS=`Rcpp:::CxxFlags()`
all: $(SHLIB) hack
hack:
mkdir tmp
cp vector_int_.o tmp
rm -fr tmp
where the "hack" target works when R CMD INSTALL, but not when R CMD check.
or I can do the right thing and report this as a bug to R, which means
we'll have to find another way to compile Rcpp.
On 01/15/2010 09:55 PM, Dirk Eddelbuettel wrote:
>
> On 15 January 2010 at 14:26, Romain François wrote:
> | On 01/15/2010 02:15 PM, Dirk Eddelbuettel wrote:
> |>
> |> On 15 January 2010 at 08:27, Romain François wrote:
> |> | I'm getting a warning when I try to build my CPP package that depends on
> |> | Rcpp and uses the classic Makevars :
> |> |
> |> | PKG_CXXFLAGS=`Rcpp:::CxxFlags()` -I.
> |> | PKG_LIBS=`Rcpp:::LdFlags()`
> |> |
> |> |
> |> | I get this warning from R CMD check :
> |> |
> |> | * checking for portable compilation flags in Makevars ... WARNING
> |> | Non-portable flags in variable 'PKG_CXXFLAGS':
> |> | -std=c++0x
> |>
> |> I also noticed that yesterday working on another package using Rcpp. I think
> |> we need to fix this.
> |
> | Rcpp:::CxxFlags() will only include "-std=c++0x" when we know we can use
> | it : GCC>= 4.3
> |
> | but there is no way to tell R CMD that "this is alright, go on".
>
> It is tricky. I think there are 'two GCCs' here, if not three:
>
> a) when we build Rcpp we can query what compiler it sees; that is how we
> started -- but there is the rub: the compiler that 'g++ --version' shows
> may not be the one that is used to build the package!!
>
> That we learn via R CMD config CXX and I think I adjusted configure
> for that.
>
> So this govern how Rcpp is built.
>
> b) But here is the sticky bit. Rcpp is used by other packages, and we no
> longer control what compiler they use !!
>
> In that sense I fear that your tests of 'can use C++0x' may be too
> optimistic and I am wondering if we should make it a simple user control,
> just like the one for static links.
>
> Simple because we don't know how we may be called.
>
> Does this make sense to you?
>
> | We can subvert the test if we explicitely define how to compile and
> | link, i.e something like this (although it does not work)
> |
> | RCPP_CXXFLAGS=`Rcpp:::CxxFlags()` -I.
> | PKG_LIBS=`Rcpp:::LdFlags()`
> |
> | # this tricks R CMD SHLIB so that it does not compile
> | # anything
> | OBJECTS=
> |
> | all: compile link
> |
> | compile:
> | $(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) $(RCPP_CXXFLAGS) .....
> |
> | link:
> | $(SHLIB_CXXLD) -o $(pkg)$(DYLIB_EXT) $^ $(SHLIB_CXXLDFLAGS) $(PKG_LIBS)
>
> I don't follow. Who now sets which flags differently?
>
> Dirk
>
> |
> | I've played with this, but since I don't understand Makefile, this does
> | not work. Someone with makefile skills would make sense of it I suppose.
> |
> | Too dumb here.
> |
> | Romain
> |
> |
> |> Recall that 'can use Cxx0x' should be based on the compiler used to build R
> |> (!!) not Rcpp or the current package. So we need to query 'R CMD config CXX'
> |> at build time and somehow remember that.
> |>
> |> | Is there a workaround ? We probably would then have to update the new
> |> | skeleton generator to use it.
> |>
> |> Right.
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/KfKn : Rcpp 0.7.2
|- http://tr.im/JOlc : External pointers with Rcpp
`- http://tr.im/JFqa : R Journal, Volume 1/2, December 2009
More information about the Rcpp-devel
mailing list