我正在创建一个 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 中是行不通的。通过研究,我似乎需要在 configure
和 Makevars
中组合设置选项,但我还没有完全弄明白。我对 R 编程很满意,对 C++ 的了解也足以实现一些基本功能,但我仍然不了解构建过程中涉及的所有细微差别。如果有人可以解释 configure/configure.ac
与 Makevars/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/