Skip to content

[Rcpp-devel] C++11 Solaris cmath/math.H

6 messages · Jan Wijffels, Dirk Eddelbuettel

#
Hello,

I'm trying to fix the installation issue I have with the package udpipe:
https://github.com/bnosac/udpipe but I'm getting issues on Solaris giving
messages like this:

/opt/csw/bin/g++ -std=gnu++11
-I/opt/R/R-3.4.1-patched-gcc/lib/R/include -DNDEBUG
-I"/export/home/XyG0aYI/R/Rcpp/include" -I/opt/csw/include
-I/usr/local/include   -fPIC  -O2 -c RcppExports.cpp -o RcppExports.o
In file included from /opt/csw/include/c++/5.2.0/cmath:44:0,
                 from
/export/home/XyG0aYI/R/Rcpp/include/Rcpp/platform/compiler.h:100,
                 from /export/home/XyG0aYI/R/Rcpp/include/Rcpp/r/headers.h:48,
                 from /export/home/XyG0aYI/R/Rcpp/include/RcppCommon.h:29,
                 from /export/home/XyG0aYI/R/Rcpp/include/Rcpp.h:27,
                 from RcppExports.cpp:4:
/usr/include/math.h:45:12: error: ?std::float_t? has not been declared
 using std::float_t;
            ^
/usr/include/math.h:46:12: error: ?std::double_t? has not been declared
 using std::double_t;

This type of error seems to be something that has been mentioned in
https://journal.r-project.org/archive/2011-2/RJournal_2011-2_Plummer.pdf
but still can't seem to find the solution.

To make this problem as tiny as possible, I've made a reproducible example.
Let's say I have an R package with the following inside the src folder

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::plugins(cpp11)]]
CharacterVector na_locf(CharacterVector x) {
  return x;
}

If the DESCRIPTION file mentions the following:

Imports: Rcpp (>= 0.12.12)
LinkingTo: Rcpp
SystemRequirements: C++11

Or if there is CXX_STD=CXX11 in the Makevars file, I get the errors like
this when building on Solaris (see log on
https://builder.r-hub.io/status/original/ttt_0.1.0.tar.gz-26c279a1b07047fea8ded89b4e07c6ad),
using rhub::check(platform  = "solaris-x86-patched"), while on Ubuntu this
is working fine.

/opt/csw/bin/g++ -std=gnu++11
-I/opt/R/R-3.4.1-patched-gcc/lib/R/include -DNDEBUG
-I"/export/home/XyG0aYI/R/Rcpp/include" -I/opt/csw/include
-I/usr/local/include   -fPIC  -O2 -c RcppExports.cpp -o RcppExports.o
In file included from /opt/csw/include/c++/5.2.0/cmath:44:0,
                 from
/export/home/XyG0aYI/R/Rcpp/include/Rcpp/platform/compiler.h:100,
                 from /export/home/XyG0aYI/R/Rcpp/include/Rcpp/r/headers.h:48,
                 from /export/home/XyG0aYI/R/Rcpp/include/RcppCommon.h:29,
                 from /export/home/XyG0aYI/R/Rcpp/include/Rcpp.h:27,
                 from RcppExports.cpp:4:
/usr/include/math.h:45:12: error: ?std::float_t? has not been declared
 using std::float_t;

I
?f I do not add ?SystemRequirements: C++11 and remove the Makevars file,
this works fine on Solaris. I need however C++11 as I need it in the udpipe
R package for building udpipe.cpp but can't add
to that udpipe.cpp file the following types of statements due to conflicts
on the use of the Free macro.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]

Is there anyone having similar problems that can give an indication on how
to solve this Solaris build issue?

many thanks,
Jan



Jan Wijffels
Statistician
www.bnosac.be  | +32 486 611708
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20170906/c8af4900/attachment.html>
#
Small update on this question. The issue appears when exporting the Rcpp
function and the error messages are caused by RcppExports.cpp
which is generated when running Rcpp::compileAttributes()

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
CharacterVector na_locf(CharacterVector x) {
  return x;
}

This is the output from Rcpp::compileAttributes()

#include <Rcpp.h>

using namespace Rcpp;

// na_locf
CharacterVector na_locf(CharacterVector x);
RcppExport SEXP _ttt_na_locf(SEXP xSEXP) {
  BEGIN_RCPP
  Rcpp::RObject rcpp_result_gen;
  Rcpp::RNGScope rcpp_rngScope_gen;
  Rcpp::traits::input_parameter< CharacterVector >::type x(xSEXP);
  rcpp_result_gen = Rcpp::wrap(na_locf(x));
  return rcpp_result_gen;
  END_RCPP
}

static const R_CallMethodDef CallEntries[] = {
  {"_ttt_na_locf", (DL_FUNC) &_ttt_na_locf, 1},
  {NULL, NULL, 0}
};

RcppExport void R_init_ttt(DllInfo *dll) {
  R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
  R_useDynamicSymbols(dll, FALSE);
}

My excuses for this update.

Jan


Jan Wijffels
Statistician
www.bnosac.be  | +32 486 611708
On 6 September 2017 at 15:03, Jan Wijffels <jwijffels at bnosac.be> wrote:

            
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20170906/56a8fca0/attachment-0001.html>
#
Hi Jan,
On 6 September 2017 at 15:03, Jan Wijffels wrote:
| I'm trying to fix the installation issue I have with the package udpipe:
| https://github.com/bnosac/udpipe but I'm getting issues on Solaris giving
| messages like this:

Solaris no longer really matters.

| If I do not add ?SystemRequirements: C++11 and remove the Makevars file,
| this works fine on Solaris.

You could add C++11 conditionally, ie only on Linux/macOS/Windows.  You could
use (even a shell script named) configure for that.

| I need however C++11 as I need it in the udpipe
| R package for building udpipe.cpp but can't add
| to that udpipe.cpp file the following types of statements due to conflicts
| on the use of the Free macro.
| #include <Rcpp.h>
| using namespace Rcpp;
| // [[Rcpp::plugins(cpp11)]]

Can you explain a bit more?  What Free macro?  Do you know about forcing R to
add Rf_ to its macros?

Also [[Rcpp::plugins(cpp11)]] should not be needed in a package.

Dirk
4 days later
#
Solaris no longer really matters.
Does that mean that CRAN will accept a package which gives errors on
Solaris?

You could add C++11 conditionally, ie only on Linux/macOS/Windows
Yes, but I always need C++11 for this package. I just wanted to make a
small reproducible example. The bigger reproducible example is the package
at https://github.com/bnosac/udpipe

If I add the Rcpp.h header to file
https://github.com/bnosac/udpipe/blob/master/src/udpipe.cpp, I'm getting
issues similar to this

udpipe.cpp:23406:30: error: macro "Free" passed 2 arguments, but takes just 1
   alloc->Free(alloc, p->probs);


? Also [[Rcpp::plugins(cpp11)]] should not be needed in a package.
Thank you for the remark. The udpipe package currently uses CXX_STD=CXX11
in Makevars and specifies SystemRequirements: C++11 in DESCRIPTION. Example
was just put there to show a minimal example of the error, coming from when
Rcpp compiles the attributes.

If you could provide a pointer where I should look for a solution, this
would be great otherwise the package which is now on CRAN will be rejected
any time soon I think.

best,
Jan






Jan Wijffels
Statistician
www.bnosac.be  | +32 486 611708
On 6 September 2017 at 18:49, Dirk Eddelbuettel <edd at debian.org> wrote:

            
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20170910/2f6b0bae/attachment.html>
#
Jan: This is hard/impossible for me to read. I do not use a html email
client, so if you used colour here, I don't see.  Please use indentation if
you can.
On 10 September 2017 at 22:35, Jan Wijffels wrote:
|  Solaris no longer really matters.
| Does that mean that CRAN will accept a package which gives errors on
| Solaris?

I don't know. Only CRAN can speak to that. But Solaris no exists (as an
Oracle product) and is no longer maintained at U Oxford meaning CRAN may noe
have test machines any more.

| 
| You could add C++11 conditionally, ie only on Linux/macOS/Windows
| Yes, but I always need C++11 for this package. I just wanted to make a
| small reproducible example. The bigger reproducible example is the package
| at https://github.com/bnosac/udpipe

Fine, then use it. I use CXX_STD=CXX11 in many of my packages too.
 
| If I add the Rcpp.h header to file
| https://github.com/bnosac/udpipe/blob/master/src/udpipe.cpp, I'm getting
| issues similar to this
| 
| udpipe.cpp:23406:30: error: macro "Free" passed 2 arguments, but takes just 1
|    alloc->Free(alloc, p->probs);

Quite possibly not a Solaris issue but a simply _ordering issue_: place
Rcpp.h last, not first, and/or tell R not to define macros. An `#undef`
may help too.
 
| ? Also [[Rcpp::plugins(cpp11)]] should not be needed in a package.
| Thank you for the remark. The udpipe package currently uses CXX_STD=CXX11
| in Makevars and specifies SystemRequirements: C++11 in DESCRIPTION. Example

You need one of these two, not both.

| was just put there to show a minimal example of the error, coming from when
| Rcpp compiles the attributes.
| 
| If you could provide a pointer where I should look for a solution, this
| would be great otherwise the package which is now on CRAN will be rejected
| any time soon I think.

Try reordering.

Hth,  Dirk

| 
| best,
| Jan
| 
| 
| 
| 
| 
| 
| Jan Wijffels
| Statistician
| www.bnosac.be  | +32 486 611708
|
| On 6 September 2017 at 18:49, Dirk Eddelbuettel <edd at debian.org> wrote:
| 
| >
| > Hi Jan,
| >
| > On 6 September 2017 at 15:03, Jan Wijffels wrote:
| > | I'm trying to fix the installation issue I have with the package udpipe:
| > | https://github.com/bnosac/udpipe but I'm getting issues on Solaris
| > giving
| > | messages like this:
| >
| > Solaris no longer really matters.
| >
| > | If I do not add ?SystemRequirements: C++11 and remove the Makevars file,
| > | this works fine on Solaris.
| >
| > You could add C++11 conditionally, ie only on Linux/macOS/Windows.  You
| > could
| > use (even a shell script named) configure for that.
| >
| > | I need however C++11 as I need it in the udpipe
| > | R package for building udpipe.cpp but can't add
| > | to that udpipe.cpp file the following types of statements due to
| > conflicts
| > | on the use of the Free macro.
| > | #include <Rcpp.h>
| > | using namespace Rcpp;
| > | // [[Rcpp::plugins(cpp11)]]
| >
| > Can you explain a bit more?  What Free macro?  Do you know about forcing R
| > to
| > add Rf_ to its macros?
| >
| > Also [[Rcpp::plugins(cpp11)]] should not be needed in a package.
| >
| > Dirk
| >
| > --
| > http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
| >
4 days later
#
Thank you for the feedback. It helped, although not in the direction I had
in mind originally but the proposed directions are equally fine.

many thanks,
Jan


Jan Wijffels
Statistician
www.bnosac.be  | +32 486 611708
On 11 September 2017 at 13:28, Dirk Eddelbuettel <edd at debian.org> wrote:

            
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20170916/4b9dcef0/attachment.html>