准备具有外部依赖项的CRAN R软件包(nlopt)

时间:2019-01-23 06:41:55

标签: r rcpp r-package cran nlopt

我正在尝试将包提交给CRAN,该包在预测试期间失败了 在Debian上进行处理。

我使用一些与nlopt优化接口的C ++代码 Rcpp / RcppArmadillo的库(使用<nlopt.hpp>)。因此,我的软件包需要nlopt的系统版本,可以通过deb软件包libnlopt-dev安装(我将其添加到SystemRequirements字段中)。

我使用配置脚本和pkg-config检索(希望) 适当的编译器标志,然后将其发送到src / Makevars

NLOPT_LIBS=`pkg-config --libs ${PKG_CONFIG_NAME}`
NLOPT_FLAG=`pkg-config --cflags ${PKG_CONFIG_NAME}`

此方法适用于我的系统(Ubuntu 18.04,R 3.5.2)和Travis (Linux和Mac OS),但在Debian CRAN服务器上失败: https://win-builder.r-project.org/incoming_pretest/PLNmodels_0.7_20190119_161032/Debian/00install.out

我添加了一些详细信息来检查标志是否正确导出 在CRAN服务器上,它们对我来说似乎还不错:至少, 在系统上找到了nlopt(请参见下面的NLOPT_LIBS=-lnlopt -lm)。 但是,<nlopt.hpp>在后​​面找不到...

任何帮助将不胜感激。感谢您抽出宝贵的时间阅读这篇文章。

* installing *source* package ‘PLNmodels’ ...
Using NLOPT_LIBS=-lnlopt -lm
Using NLOPT_FLAG=
** libs
g++-8  -std=gnu++11 -I"/home/hornik/tmp/R/include" -DNDEBUG -fopenmp
-I"/home/hornik/lib/R/Library/3.6/x86_64-linux-gnu/Rcpp/include"
-I"/home/hornik/lib/R/Library/3.6/x86_64-linux-gnu/RcppArmadillo/include"
-I/usr/local/include -fopenmp  -fpic  -g -O2 -Wall -pedantic
-mtune=native -c RcppExports.cpp -o RcppExports.o
g++-8  -std=gnu++11 -I"/home/hornik/tmp/R/include" -DNDEBUG -fopenmp
-I"/home/hornik/lib/R/Library/3.6/x86_64-linux-gnu/Rcpp/include"
-I"/home/hornik/lib/R/Library/3.6/x86_64-linux-gnu/RcppArmadillo/include"
-I/usr/local/include -fopenmp  -fpic  -g -O2 -Wall -pedantic
-mtune=native -c call_nlopt_PLN_VE.cpp -o call_nlopt_PLN_VE.o
In file included from call_nlopt_PLN_VE.cpp:6:
utils.h:5:10: fatal error: nlopt.hpp: No such file or directory
 #include <nlopt.hpp>
          ^~~~~~~~~~~
compilation terminated.
make: *** [/home/hornik/tmp/R/etc/Makeconf:173: call_nlopt_PLN_VE.o] Error 1
ERROR: compilation failed for package ‘PLNmodels’
* removing ‘/srv/hornik/tmp/CRAN/PLNmodels.Rcheck/PLNmodels’

2 个答案:

答案 0 :(得分:3)

nlopt的C ++接口已迁移到Debian c.f中的单独软件包。 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=855600。因此,看起来特定的CRAN机器使用了Debian Testing或Stable + Backports,并且仅安装了libnlopt-dev而没有安装libnlopt-cxx-dev。您必须与CRAN维护人员联系以安装此依赖项。

顺便说一句,理想情况下应在configure脚本中避免此类错误,即,您应尝试编译一个需要nlopt.hpp的简单程序。

答案 1 :(得分:3)

您问了同样的问题here on r-package-devel,但我对您没有好的答案。

从本质上讲,您需要在一个必需的上游软件包中进行细微改动。那非常微妙。除了@Ralf的建议,我什么都没想到:测试

或者您可能只是无法将软件包的要求传达给CRAN。但这将是一个更简单的问题,当遇到错误的版本时,您注定会失败。

总的来说,我的建议与之前相同:与Jelmer合作,然后等待他发布更新的nloptr版本。在此之前,所有解决方案肯定都是软糖,因为您无法控制您的软件包可能遇到的nloptr版本。。