c++ - 在 R 包中更改 Mac 与 Linux 的构建选项

标签 c++ linux r macos r-package

我正在创建一个 R 包,它使用第三方(闭源)API 将 .edf 文件导入 R(来自 SR Research Eyelink 眼动仪)。已经在 Linux 上运行它的人分享了他的代码,我能够让它在 Mac 上运行。这是将 src/Makevars 文件更改为指向安装在 mac 上的 API 的问题:

PKG_LIBS=-framework edfapi -F/Library/Frameworks/

要使其在 linux 中工作,Makevars 需要:

PKG_LIBS=-L/usr/local/lib -ledfapi -lm

我知道对于特定于 Windows 的选项,我需要创建一个 Makevars.win 文件,但是我如何让 Mac 和 Linux 的构建选项发生变化?我想做类似的事情:

if [[ `uname` -eq Darwin ]] ; then

  PKG_LIBS=-framework edfapi -F/Library/Frameworks/

fi

if [[ `uname` -eq Linux ]] ;then

  PKG_LIBS=-L/usr/local/lib -ledfapi -lm

fi

但是将它放入 Makevars 中是行不通的。通过研究,我似乎需要在 configureMakevars 中组合设置选项,但我还没有完全弄明白。我对 R 编程很满意,对 C++ 的了解也足以实现一些基本功能,但我仍然不了解构建过程中涉及的所有细微差别。如果有人可以解释 configure/configure.acMakevars/Makevars.in 的主要目的,那也会有所帮助。

理想情况下,我希望将 API 与 R 包捆绑在一起,并将不同版本放在特定于平台的文件夹中。 API 仅包含 3 个头文件和一个二进制文件(并且很少更改)。我意识到这会阻止我将包裹放在 CRAN 上,但这没关系。我已经成功地使用不同文件夹中的 API 文件构建了包,但在运行时它仍然在标准位置 (/Library/Frameworks) 中查找它。我意识到这是一个更复杂的问题,我也可以创建一个单独的帖子。

最佳答案

这篇文章帮助我弄明白了:stackoverflow.com/a/32590600/1457051

配置(在包根目录中)如下所示:

#!/bin/bash

#make the Makevars file
if [ ! -e "./src/Makevars" ]; then
touch ./src/Makevars
fi

#if mac
if [[ `uname` -eq Darwin ]] ; then

echo "PKG_LIBS=-framework edfapi -F/Library/Frameworks/" > ./src/Makevars
#if linux
elif [[ `uname` -eq Linux ]] ;then

echo "PKG_LIBS=-L/usr/local/lib -ledfapi -lm" > ./src/Makevars

fi

创建 Makevars 并根据平台添加适当的选项。可能有更直接的解决方案,但这适用于我的目的。

关于c++ - 在 R 包中更改 Mac 与 Linux 的构建选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851240/

相关文章:

c++ - C++ 中的 "cout << "错误

c++ - ISO C++ 禁止在指向函数的指针和指向对象的指针之间进行转换

c++ - Boost SSL-Server 因 SSLv3 错误而失败

linux - Bash 脚本 : CPU stress test while watching clock speed

r - 转换数字 - 从 float 修剪整数部分

c++ - Windows 中的 Exe 在调用 GetWindowsDirectory 时 append wstring 时崩溃

android - Gradle 构建运行需要很长时间

linux - 如何运行 bash 脚本?

r - order data.table along numeric column puttint special Value (residual category) of other column 最后

仅返回列中的最后一个值(国家/地区)