为特定 Linux 风格预编译 R 包

Posted

技术标签:

【中文标题】为特定 Linux 风格预编译 R 包【英文标题】:Precompile R packages for specific Linux flavor 【发布时间】:2019-05-07 22:06:34 【问题描述】:

我们已经为 R 包建立了一个简单的类似 CRAN 的本地存储库。用户很多,都使用同一个版本的Linux。

有没有办法说服 R 提供预编译的 Linux 包而不是只提供源包?对于使用我们存储库的任何人来说,编译步骤都需要相当长的时间。应该可以预编译和重用相同的二进制文件,因为我们可以保证 Linux 版本对所有用户都是一致的。

一个人怎么能一起破解这样的东西?

【问题讨论】:

您可能对 cran2deb 和 cran2deb4ubuntu 作为示例感兴趣,尽管它可能对您没有特别的帮助,因为您可能不是在谈论基于 Debian 的发行版。你们都在运行什么发行版? (也就是说,“有没有办法说服 R 提供预编译的 Linux 包而不是源包?”的答案是“可能不是”,但“应该是可以预编译和重用相同的二进制文件”是“是”,而“如何将这样的东西一起破解?”的答案会因您的发行版而异) @duckmayr CentOS 6 目前正在迁移到 CentOS 7。用户没有管理员权限并安装到他们自己的本地存储库中,所以我认为 Linux 软件包不是一个好的解决方案。如果可能的话,我想依赖 R 的内置机制,所以安装我们的包就像从 CRAN 安装一样。 【参考方案1】:

在“所有这些都使用相同版本的 Linux”的非常狭义的意义上,您实际上有一个选择(恰好相对鲜为人知)。使用 例如

创建二进制包
 R CMD INSTALL --build nameOfDirectoryWithSources

正如R CMD INSTALL --help 所说的那样

--build           build binaries of the installed package(s)

这些不是 .deb.rpm 类似的包:没有添加依赖信息或类似的信息。但他们完全按照您的要求做:节省编译时间。

我不知道可以构建一个存储库结构。

【讨论】:

这给了我一个想法——我可以编译包并将其转换为“源包”,“不需要编译”。然后所有的二进制部分都只是“有效负载”......我希望在 repo 中有一个单独的目录,以将预编译的源代码与真正的源代码分开,但此时我愿意破解, 我怀疑你没有尝试过我的建议:)。请这样做,它与您所描述的差不多。 我已经尝试了你的建议。它为我创建了一个 __R_x86_64-pc-linux-gnu.tar.gz .... 这很棒。我挣扎的部分是 - 我如何将它上传到我们的存储库中,以便它被索引并正常工作,明白我的意思吗? 这就是我上面写的:不支持 repo :-/ 因为没有元数据。但它会非常快速地在与您的系统“运行时相同”的系统上安装(版本化)包。也许最好把它想象成一个缓存...... 我接受这个答案,因为它可以满足我的需要。将尝试为此用例提交 R 功能请求 - 应该不会太难!

以上是关于为特定 Linux 风格预编译 R 包的主要内容,如果未能解决你的问题,请参考以下文章

GCC - 多个预编译头文件和特定路径

预编译时宏替换 见解

linux下nm命令的使用

安装git

使用参数预编译文本替换宏

如何在 JS 中预编译脚本