Hi We are currently embedding a rather large C++ library in R (BioC), and we want some comments on the portability of how we have approach this. First of, we are not really able to do much about the portability of the basic library, which of course is the main question :) We have an approach which seems to work, I just want a bit of feedback on it.... The way we integrate it into R is simply by having a subdirectory / src/sdk together with a Makevars file. This file basically looks like PKG_CPPFLAGS+=\ -imacros R_affx_constants.h\ -Isdk/files\ (... + a lot of other -I statements telling CPP to include subdirectories of src/sdk) Then we have a SOURCES.SDK = \ sdk/files/FileIO.cpp \ (... + a lot of other .cpp files) SOURCES.OURS = \ R_affx_cdf.cpp and then finally a OBJS=$(SOURCES.SDK:.cpp=.o) $(SOURCES.OURS:cpp:.o) We seem to need the last statement since it seems that .cpp is not automatically a C++ suffix (but is it done the "right" way for portability?). We need the -imacro statement in order to include some macros from Rconfig.h (big endian checks) which are then translated from the WORDS_BIGENDIAN used in R to the IS_BIG_ENDIAN used in the library. Comments on the portability? Kasper
Kasper Daniel Hansen <khansen at stat.berkeley.edu> writes:> Hi > > We are currently embedding a rather large C++ library in R (BioC), > and we want some comments on the portability of how we have approach > this. > > First of, we are not really able to do much about the portability of > the basic library, which of course is the main question :) We have an > approach which seems to work, I just want a bit of feedback on it.... > > The way we integrate it into R is simply by having a subdirectory / > src/sdk together with a Makevars file. This file basically looks like > > PKG_CPPFLAGS+=\ > -imacros R_affx_constants.h\ > -Isdk/files\ > (... + a lot of other -I statements telling CPP to include > subdirectories of src/sdk) > > Then we have a > > SOURCES.SDK = \ > sdk/files/FileIO.cpp \ > (... + a lot of other .cpp files) > SOURCES.OURS = \ > R_affx_cdf.cpp > > and then finally a > > OBJS=$(SOURCES.SDK:.cpp=.o) $(SOURCES.OURS:cpp:.o) > > We seem to need the last statement since it seems that .cpp is not > automatically a C++ suffix (but is it done the "right" way for > portability?).Er, I don't think it has to do with .cpp being a known suffix or not. If it wasn't, you would use SUFFIXES and a .cpp.o rule. The last line comes from specifying sources, rather than objects. Traditional make style would be OBJS.SDK = \ sdk/files/FileIO.o \ (... + a lot of other .cpp files) OBJS.OURS = \ R_affx_cdf.o OBJS = $(OBJS.SDK) $(OBJS.OURS) from which the suffix rules would deduce the source files.> We need the -imacro statement in order to include some > macros from Rconfig.h (big endian checks) which are then translated > from the WORDS_BIGENDIAN used in R to the IS_BIG_ENDIAN used in the > library. > > Comments on the portability? > > Kasper > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- O__ ---- Peter Dalgaard ?ster Farimagsgade 5, Entr.B c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907
>>>>> Kasper Daniel Hansen writes:> Hi > We are currently embedding a rather large C++ library in R (BioC), > and we want some comments on the portability of how we have approach > this.> First of, we are not really able to do much about the portability of > the basic library, which of course is the main question :) We have an > approach which seems to work, I just want a bit of feedback on it....> The way we integrate it into R is simply by having a subdirectory / > src/sdk together with a Makevars file. This file basically looks like> PKG_CPPFLAGS+=\ > -imacros R_affx_constants.h\ > -Isdk/files\ > (... + a lot of other -I statements telling CPP to include > subdirectories of src/sdk)> Then we have a> SOURCES.SDK = \ > sdk/files/FileIO.cpp \ > (... + a lot of other .cpp files) > SOURCES.OURS = \ > R_affx_cdf.cpp> and then finally a> OBJS=$(SOURCES.SDK:.cpp=.o) $(SOURCES.OURS:cpp:.o)> We seem to need the last statement since it seems that .cpp is not > automatically a C++ suffix (but is it done the "right" way for > portability?). We need the -imacro statement in order to include some > macros from Rconfig.h (big endian checks) which are then translated > from the WORDS_BIGENDIAN used in R to the IS_BIG_ENDIAN used in the > library.> Comments on the portability?THings like OBJS=$(SOURCES.SDK:.cpp=.o) are portable. Not sure about the .cpp not being a C++ suffix part; the generated Makeconf files should contain a rule for .cpp.o: $(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) -c $< -o $@ and the appropriate .SUFFIXES settings. (Maybe you manipulate .SUFFIXES?) Using FOO += something in Make files is not portable. best -k