【问题标题】:Compiling C++ code for R (CRAN) packages on Solaris在 Solaris 上为 R (CRAN) 包编译 C++ 代码
【发布时间】:2018-07-26 18:23:19
【问题描述】:

我对如何有效地准备 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 来解决安装过程中的兼容性问题,但是对于这种简单的情况,它似乎带来了太多的复杂性。任何建议将不胜感激,谢谢!

【问题讨论】:

  • 您可以使用CMake 创建Makefile
  • 目前最好的解决方案是为每个环境创建Makefile 和一个手写的./configure./bin/sh 兼容)脚本,以根据操作系统和 CUDA 模块的可用性来切换它们...

标签: r makefile gnu-make solaris cran


【解决方案1】:

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

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

  2. 软链接gmake asmakein that directory: ln -s /path/to/gmake $HOME/make_hack/make

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

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

是的,这是一个 hack。但这可能比修改构建过程以使用gmake 而不是make 要容易得多。

【讨论】:

  • 问题在于该解决方案默认情况下应该可以工作,因为该软件包旨在通过 CRAN 广泛使用。
  • @TomekFalkiewicz 问题是该解决方案应该默认工作是的,但是I also want a pony. ;-)
  • 请仔细阅读,因为这不是小马的问题。出于某种原因,您的解决方案正在回答有关如何在 *nix 系统中覆盖 PATH 的问题,我没有问过这个问题,同时完全否定了问题的要点 CRAN 要求。然而蛮力解决方案很简单:使用自定义 ./configure 脚本切换多个 Makefile。
  • @TomekFalkiewicz 如果你知道如何让你的编译工作,那你为什么还要问呢?
  • 退出此对话,因为要么你一直在捉弄我,要么仍然没有时间阅读问题,要么无法理解像 efficiently 这样的词的含义>蛮力解决方案。祝你的声望点狩猎好运!
【解决方案2】:

来自Writing R Extensions

如果您确实需要 GNU make,请在说明中声明它 文件由

SystemRequirements: GNU make

并确保您使用环境变量 MAKE 的值(以及 不只是 make) 在你的脚本中。

configure 脚本是首选的解决方案。顺便说一句,通常Makevars 文件也优于完整的Makefile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多