使用jnilib扩展构建和安装R包库

时间:2009-09-03 17:29:39

标签: r package

我正在构建一个R包,需要为我的构建过程构建一个OSX的jni库(称为myPackage.jnilib),然后将R的自动安装机制放在我的包的libs目录中。

问题是R的默认设置是尝试构建一个名为myPackage.so的对象。我希望能够自定义这个,但看不清楚。

我可以通过使用Makevars中的虚假“all”目标(描述here)颠覆R的机制,然后将文件复制到我的包的inst目录中来获得部分方法。这对我自己的本地用途来说没问题但是在尝试构建通用二进制文件时会产生令人头疼的问题并且不是很便携。我正在为CRAN准备包,所以这种方法不太可行。

我可以看到两种可能的解决方案,但尚未开始工作

  1. 在安装过程中手动将我的库复制到我的包的libs目录。由于此目录是动态创建的,我如何从Makevars或配置脚本中找出它的内容

  2. 最佳解决方案:告诉R CMD SHLIB输出文件的名称,这样我就可以使用R的常规包机制,让它将文件复制到正确的目录。

1 个答案:

答案 0 :(得分:0)

如果其他人遇到这个问题,我在这里发布我自己的解决方法。

我在Makevars中定义目标并直接复制库(即答案1)。变量R_LIBRARY_DIR提供构建包的临时位置。

我的Makevars现在看起来像这样

OBJECTS = 

LIBSINSTDIR=$(R_LIBRARY_DIR)/myPackage/libs/

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

.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)