我对如何有效地准备R包有点困惑,因此它将在所有需要的系统平台上兼容。这是必需的,以便CRAN接受新版本的包。主要困难来自编译外部C ++共享库,以及可选的CUDA版本(如果编译器可用)。为了支持这种流程,我创建了特定的Makefile,遗憾的是使用了GNU扩展。它适用于Linux,OSX以及在Solaris上通过gmake
手动执行时。相关部分在这里:
# Checking whether nvcc compiler is available
NVCC_TEST = $(shell basename $(shell which nvcc 2> /dev/null)"")
ifeq ($(NVCC_TEST),nvcc)
ALL_LIBS += libcucubes_gpu.so
ALL_OBJS += $(GPU_OBJS)
ALL_FLAGS += $(GPU_FLAGS)
else
ALL_OBJS += gpu_fallback.o
endif
事实证明,在Solaris上运行R CMD INSTALL (...)
时,安装会失败,如下所示:
make: Fatal error in reader: Makefile, line 39: Unexpected end of line seen
ERROR: compilation failed for package 'libcucubes'
事实证明,这是因为执行了Solaris的make
版本而不是GNU兼容的gmake
(我已经测试过它工作正常),即使它是可用。我的问题是,对于R包构建,是否有任何简单的方法强制使用gmake
。一般来说,我知道我可以使用autotools
来解决安装过程中的兼容性问题,但它似乎为这个简单的案例带来了太多的复杂性。任何建议都将非常感谢,谢谢!
答案 0 :(得分:0)
如果你不能让你的构建过程使用gmake
而不是Solaris的纯POSIX make
,你可以使用这个hack:
为此hack创建一个专用目录:mkdir $HOME/make_hack
Softlink gmake as
make in that directory: ln -s /path/to/gmake $HOME/make_hack/make
设置你的路径:PATH=$HOME/make_hack:$PATH
现在,使用PATH
运行您的构建过程,它应该使用gmake
。希望它只使用make
envval中的PATH
而不是一些硬编码的完整路径。
是的,这是一个黑客攻击。但是,修改构建过程以使用gmake
代替make
可能要容易得多。
答案 1 :(得分:0)
不过,如果您确实必须使用GNU make,请在DESCRIPTION中进行声明 提交者
SystemRequirements: GNU make
,并确保您使用环境变量MAKE的值(和 不只是在脚本中制作。
configure
脚本是首选的解决方案。顺便说一句,与完整的Makevars
相比,Makefile
文件通常也更受欢迎。