我正在创建一个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包 bundle 在一起,并在特定于平台的文件夹中使用不同的版本。该API仅包含3个头文件和一个二进制文件(并且很少更改)。我意识到这会阻止我将程序包放在CRAN上,但这很好。我已经成功地使用其他文件夹中的API文件成功构建了该程序包,但在运行时它仍会在标准位置(/Library/Frameworks)中进行查找。我意识到这是一个比较麻烦的问题,我也可以创建一个单独的帖子。
最佳答案
这篇文章帮助我弄清楚了: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,并根据平台添加适当的选项。可能有一个更直接的解决方案,但这对我而言有效。
关于c++ - 在R软件包中更改Mac与Linux的构建选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32851240/