0

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

问题是 R 的默认设置是尝试构建一个名为myPackage.so. 我希望能够自定义它,但看不到如何。

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

我可以看到两个潜在的解决方案,但还没有工作

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

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

4

1 回答 1

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)
于 2009-09-04T07:21:28.803 回答