Hello.

I have a question/suggestion concering Rcpp.
Recently I was trying to get the Gnu Binutils Autotools working inside an 
R-package.
(configure.in, Makefile.am,...autoreconf,...)

In order to get the Compiler-flags in an Rcpp-project right, usually the file 
"Makevars" is used, where the function Rcpp:::LdFlags() or 
RcppClassic:::LdFlags() writes the linkerflags and some additional flags into 
an environment variable.

In the case of the Gnu autotools however, this does not work, because the gnu 
autotools expect the linkerflags (-L) and the additional flags to be specified 
separately.
I tried to "fool" the autotools by putting both types of flags into one of 
those constants, however the gnu autotools has a built-in condition to reject 
flags in the wrong constants.

So my only solution was to sort the flags during the configure-step into the 
two constants. (see below)
(I separated them depending on whether they start with an "-L" or not.)
The code is so extremly ugly, because many terms have to be double- or 
tripple-escaped to be syntactically correct.

Did I overlook a function or an argument in Rcpp::: or RcppClassic::: which 
outputs these two types of flags separately?
If such functions are definately not there, could they be added?


regards, Mr.M
PS.: I hope that I have not overlooked a solution or a post that deals with 
this...

+-------------------+
| /src/configure.in |
+-------------------+

AC_INIT(Rmyproject.cpp)

PACKAGE=rmyproject
VERSION=0.1.0

AM_INIT_AUTOMAKE($PACKAGE, $VERSION)

AC_PROG_CXX

RCPPCXXFLAGS=`Rscript -e "Rcpp:::CxxFlags()"``Rscript -e "cat(paste(\" 
-I\",RcppClassic:::RcppClassic.system.file(),\"/include\",sep=\"\"))"`

RCPPLDFLAGS=`Rscript -e "cat(paste(grep(\" -L\",paste(\" 
\",strsplit(capture.output(Rcpp:::LdFlags()),\" \")@<:@@<:@1@:>@@:>@), value = 
TRUE, invert=TRUE, ignore.case=TRUE),collapse=\"\"))"``Rscript -e 
"cat(paste(grep(\" -L\",paste(\" 
\",strsplit(capture.output(RcppClassic:::LdFlags()),\" \")@<:@@<:@1@:>@@:>@), 
value = TRUE, invert=TRUE, ignore.case=TRUE),collapse=\"\"))"`

RCPPLDADD=`Rscript -e "cat(paste(grep(\" -L\",paste(\" 
\",strsplit(capture.output(Rcpp:::LdFlags()),\" \")@<:@@<:@1@:>@@:>@), value = 
TRUE, ignore.case=TRUE),collapse=\"\"))"``Rscript -e "cat(paste(grep(\" 
-L\",paste(\" \",strsplit(capture.output(RcppClassic:::LdFlags()),\" 
\")@<:@@<:@1@:>@@:>@), value = TRUE,  ignore.case=TRUE),collapse=\"\"))"`

AC_SUBST(RCPPCXXFLAGS)
AC_SUBST(RCPPLDFLAGS)
AC_SUBST(RCPPLDADD)

AC_OUTPUT(Makefile myproject/src/Makefile)

+------------------+
| /src/Makefile.am |
+------------------+

EXTRA_PROGRAMS = Rmyproject.so

Rmyproject_so_SOURCES = Rmyproject.cpp coding2.cpp coding3.cpp

Rmyproject_so_CXXFLAGS = -fPIC @RCPPCXXFLAGS@ -I$(R_INCLUDE_DIR) 
-I./myproject/src

Rmyproject_so_LDFLAGS = -shared @RCPPLDFLAGS@ -Wl,-rpath,$(R_PACKAGE_DIR)/libs  

Rmyproject_so_LDADD = @RCPPLDADD@ $(LIBR) -L./ -lmyproject

all: Rmyproject.so

+------------+
| /configure |
+------------+

cd ./src
./configure
cd ..

-- 
NEU: FreePhone 3-fach-Flat mit kostenlosem Smartphone!                          
        
Jetzt informieren: http://mobile.1und1.de/?ac=OM.PW.PW003K20328T7073a
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to