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

Prepare CRAN R package with external dependencies (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’

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.

的简单程序

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

本质上,您在一个必需的上游包中有细微的变化。那是非常微妙的。除了@Ralf 的建议,我什么都想不起来:对其进行测试

或者您可能只是未能将包裹的要求传达给 CRAN。但那是一个更简单的问题,遇到版本不对,肯定会安装失败。

总的来说,我的建议和以前一样:与 Jelmer 合作,等待他发布更新的 nloptr 版本。在那之前,所有的解决方案都注定是胡说八道 ,因为您无法控制您的软件包可能遇到的 nloptr 版本