我正在创建一个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并不起作用。从研究这个看来,我需要configure
和Makevars
中的设置选项的组合,但我还没有完全理解它。我对R编程感到满意并且知道足够的C ++来完成一些基本功能,但我仍然不了解构建过程中涉及的所有细微差别。如果有人能够解释configure/configure.ac
与Makevars/Makevars.in
的主要目的,那么这些目的也会有所帮助。
理想情况下,我希望将API与R包捆绑在一起,并在特定于平台的文件夹中包含不同的版本。 API只包含3个头文件和一个二进制文件(很少更改)。我意识到这会阻止我将软件包放在CRAN上,但这很好。我已经成功地在不同的文件夹中使用API文件构建了包,但是在运行时它仍然在标准点(/ Library / Frameworks)中查找它。我意识到这是一个更加负载的问题,我也可以创建一个单独的帖子。
答案 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并根据平台添加适当的选项。可能有更直接的解决方案,但这适用于我的目的。