2013-05-22 7 views
6

Ich habe ein R-Paket für die ich eine MCMC Algorithmus Algebra C++ enthaltenden Matrix bewegte unter Verwendung des RcppEigen Paket, das die Geschwindigkeit dramatisch verbessert.Wie kann ich die Makevars-Datei für ein Rcpp (RcppEigen) -Paket verbessern?

jedoch R CMD check gibt die folgende NOTE auf Linux (Thanks to R-Forge):

* checking installed package size ... NOTE 
    installed size is 6.6Mb 
    sub-directories of 1Mb or more: 
    libs 6.1Mb 

Diese Warnung wird wahrscheinlich nicht von der unglaublichen Größe meiner C++ Code (which is only around 150 lines) angetrieben wird, da es nur auf Linux erscheint, aber wahrscheinlich durch meine Unfähigkeit, die Makevars Datei korrekt zu konfigurieren. (Ich habe noch nie zuvor make oder makefile verwendet).
Auch beim Senden des Pakets an CRAN, schrieb Brian Ripley etwas in Bezug auf diese NOTE, die mich erwarten, dass es ein Makevars Problem ist: "Es kommt aus dem Debuggen von Symbolen."

Meine Makevars sind der Standard RcppMakevars (unten angegeben), hergestellt von Rcpp.package.skeleton.

Meine Fragen:

  • Wie kann ich meine Makevars in so konfigurieren, dass die Größe der kompilierten Bibliothek auf Linux reduziert (das heißt, der NOTE loswerden)?
  • Was sind gute Ressourcen auf, wie in den Zauber von Makevars für Rcpp zu bekommen?
    (ich irgendetwas in der Gallery nicht finden und die R extension manual on this war mir auch unverständlich)

mein Makevars:

## Use the R_HOME indirection to support installations of multiple R version 
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` 
PKG_CPPFLAGS = -I. -I../inst/include 

mein Makevars.win:

## This assume that we can call Rscript to ask Rcpp about its locations 
## Use the R_HOME indirection to support installations of multiple R version 
PKG_LIBS = $(shell $(R_HOME)/bin/Rscript.exe -e "Rcpp:::LdFlags()") 
PKG_CPPFLAGS = -I. -I../inst/include 

Antwort

7

Sie zitieren, was wir schrieben. Es gibt nichts Konkretes hier: Sie nur über grundlegende Makefile-Syntax und Optionen erfahren möchten.

mit src/Makevars Fiedeln, es sei denn, Sie verstehen, was Sie tun, ist nicht zu empfehlen. Sie werden wahrscheinlich etwas kaputt machen, insbesondere baut auf einer anderen Architektur. Simon Urbanek ist ziemlich unnachgiebig über diesen Rat.

Brian Ripley ist natürlich halb korrekt: Wenn Sie Debuggen aktiviert haben, sind Bibliotheken größer. Aber CXXFLAGS sind nie gesetzt, insbesondere keine -g Flag gesetzt ist das Debuggen zu aktivieren. Also sind wir es nicht: Wenn das Debuggen standardmäßig aktiviert ist, wurde es von etwas anderem aktiviert. Kann standardmäßig R sein. Sehen Sie Ihre .R/Makevars.

Der andere Treiber für Größe ist Vorlagen C++. Vergleichen Sie mit anderen Paketen, die (Rcpp) Eigen verwenden, sie sind wahrscheinlich auch groß. Das ist "nur ein Geschäftsaufwand": Die Vorlagen geben Ihnen die (Kodierungs-) Macht, die Sie genießen.

Edited für Tippfehler

+1

Vielen Dank für die Antwort, zu klären nur: Was ist Ihr sagen, ist im Grunde (a) gibt es wirklich kein Problem, kommt die Größe aus der Struktur der 'Eigen', (b) Es gibt keine empfohlenen 'CXXFLAGS'-Flags, die für' RcppEigen' gesetzt werden können, und (c) wenn Sie die Flags ändern wollen, gehen Sie in die grundlegende Makefile-Syntax und -Optionen_. Versteh ich dich richtig? – Henrik

+0

Ja zu a) und c); wir sagen, was du in b) brauchst und dir geben; Sehen Sie sich die RcppEigen-Dokumente, Beispiele und das Skeleton-Paket an - aber im Wesentlichen benötigen Sie nur LinkingTo: RcppEigen. Sie verwenden RcppEigen, und nicht die Kopie von Eigenen, richtig? –

+0

Ja, ich benutze 'RcppEigen' und wahrscheinlich habe ich' RcppEigen.package.skeleton' benutzt (wie ich 'RcppEigen' vor' Rcpp' auf beiden Seiten und LinkingTo in 'DESCRIPTION') habe. Meine Frage ist vielleicht, ob es sinnvoll ist, z.B. die berühmte '-O3'-Option (und wenn ja, wie)? – Henrik