3

我正在创建一个 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.acvs的主要目的,Makevars/Makevars.in那也会有所帮助。

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

4

1 回答 1

1

这篇文章帮助我弄清楚了: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 并根据平台添加适当的选项。可能有更直接的解决方案,但这适用于我的目的。

于 2015-09-30T23:45:40.313 回答