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

时间:2015-09-29 18:26:19

标签: c++ linux r macos r-package

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

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)中查找它。我意识到这是一个更加负载的问题,我也可以创建一个单独的帖子。

1 个答案:

答案 0 :(得分:1)

这篇文章帮助我解决了问题:stackoverflow.com/a/32590600/1457051

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

#!/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并根据平台添加适当的选项。可能有更直接的解决方案,但这适用于我的目的。