2009-09-03 6 views
0

Je construis un paquet R et j'ai besoin de construire une bibliothèque jni pour OSX (appelée myPackage.jnilib) dans le cadre de mon processus de construction, puis les mécanismes d'installation automatique de R l'intègrent le répertoire libs de mon paquet.Construction et installation d'une bibliothèque de packages R avec une extension jnilib

Le problème est que R par défaut est d'essayer de construire un objet appelé myPackage.so. J'aimerais pouvoir personnaliser cela mais je ne vois pas comment.

Je peux obtenir une partie du chemin en subvertissant les mécanismes de R en utilisant une cible "all" bidon dans Makevars (décrit here), puis en copiant le fichier dans le répertoire inst de mon paquet. C'est OK pour mes propres utilisations locales, mais génère des maux de tête en essayant de construire des binaires universels et n'est pas très portable. Je suis en train de préparer le paquet pour CRAN donc cette méthode ne marchera probablement pas.

Je vois deux solutions possibles mais n'ai pas non plus travailler encore

  1. Copiez ma bibliothèque manuellement dans le répertoire libs de mon package lors de l'installation. Puisque ce répertoire est créé à la volée, comment pourrais-je savoir de quoi il s'agit dans Makevars ou un script configure?

  2. La meilleure solution: Dites à R CMD SHLIB le nom de mon fichier de sortie pour pouvoir utiliser le paquet normal de R mécanismes et laissez-le copier le fichier dans le bon répertoire.

+0

Je ne sais absolument rien à ce problème. Mais peut-être que ce blog pourrait aider? http://bit.ly/ODVaL –

+0

Merci. Ce blog et le paquet helloWorldJava est vraiment utile. –

Répondre

0

Dans le cas où quelqu'un d'autre rencontre ce problème, je poste ma propre solution de contournement ici.

Je définis des cibles dans mes Makevars et copiez les bibliothèques directement (ie réponse 1). La variable R_LIBRARY_DIR fournit l'emplacement temporaire où le package est en cours de construction.

Mon Makevars ressemble maintenant quelque chose comme ça

OBJECTS = 

LIBSINSTDIR=$(R_LIBRARY_DIR)/myPackage/libs/ 

#ARCHFLAG is set in the configure script to i386 or ppc as appropriate 
JNIINSTDIR=$(LIBSINSTDIR)/@[email protected]/ 

.PHONY: all 

all: $(SHLIB) jnilib 

jnilib: object1.o object2.o 
    $(CXX) -bundle $(JAVA_LIBS) $(JAVA_CPPFLAGS) -o libmyPackage.jnilib object1.o object2.o 
    mkdir -p $(JNIINSTDIR) 
    cp libmyPackage.jnilib $(JNIINSTDIR) 
Questions connexes