在Solaris上编译R(CRAN)包的C ++代码

时间:2018-02-15 21:34:30

标签: r makefile gnu-make solaris cran

我对如何有效地准备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来解决安装过程中的兼容性问题,但它似乎为这个简单的案例带来了太多的复杂性。任何建议都将非常感谢,谢谢!

2 个答案:

答案 0 :(得分:0)

如果你不能让你的构建过程使用gmake而不是Solaris的纯POSIX make,你可以使用这个hack:

  1. 为此hack创建一个专用目录:mkdir $HOME/make_hack

  2. Softlink gmake as make in that directory: ln -s /path/to/gmake $HOME/make_hack/make

  3. 设置你的路径:PATH=$HOME/make_hack:$PATH

  4. 现在,使用PATH运行您的构建过程,它应该使用gmake。希望它只使用make envval中的PATH而不是一些硬编码的完整路径。

    是的,这是一个黑客攻击。但是,修改构建过程以使用gmake代替make可能要容易得多。

答案 1 :(得分:0)

来自Writing R Extensions

  

如果您确实必须使用GNU make,请在DESCRIPTION中进行声明   提交者

SystemRequirements: GNU make
     

,并确保您使用环境变量MAKE的值(和   不只是在脚本中制作。

不过,

configure脚本是首选的解决方案。顺便说一句,与完整的Makevars相比,Makefile文件通常也更受欢迎。