测试包是否被 CRAN 检查

test for whether package is being checked by CRAN

我的包 运行 中的一些函数使用 C++11 容器要快得多,但 CRAN 不接受我的包同时使用 $(SHLIB_OPENMP_CXXFLAGS)$(CXX1XSTD) 因为它不在 Solaris(或其他次要平台)上编译。 CRAN 的建议是写一个配置脚本,但我认为这对我来说太费时间了,而且对于很少有人使用的平台来说,我的代码不必要地复杂化。

目前,我刚刚注释掉了所有 C++11 代码,并从 Makevars 中删除了 $(CXX1XSTD) 用于 CRAN 提交。这是一个糟糕的解决方法,我更希望能够在 Makevars 中检测到 CRAN 并进行调整,这样我就不必为每个版本都维护一个 CRAN 分支。

我仍在测试 C++11 是否可用,但它只是 Makevars 中 C++11 和 OpenMP 标志的组合,这是带有 CRAN 提交的 Solaris 上的绊脚石。我觉得一定有解决这个问题的简单方法。

是否有我应该使用的环境变量来测试 CRAN 本身是否正在检查我的包,我可以在 Makevars 中测试?我已经搜索了 R 代码库并阅读了 R Internals 和 Writing R Extensions,尽管我不能说我对它们了如指掌,但一些 CRAN 维护者希望如此。有 CRAN 可能 设置的环境变量,但我希望测试 _R_CHECK_CRAN_INCOMING_=TRUE 之类的东西会引起维护者的愤怒。

我认为 Makevars 中的 "if solaris" 测试不够:C++11 和 OpenMP 标志同时存在是不允许的,因为它们可能会在使用频率低于 Solaris 的平台上失败。

也许我只是用错误的方式来处理这个问题。

虽然可以对此进行测试,但真正正确的方法是配置脚本。我使用 configure.ac autoconf 来生成它,最终并没有那么难。然后,C++ 代码可以根据需要使用 ifdef 来测试是否存在 C++11 符号,并且仍然使用 OpenMP #pragma 声明。 Windows 需要特殊处理。我使用了 RODBC 包中的方法。这尚未提交给 CRAN 或在 Solaris 上进行测试,但它确实直接回答了 CRAN 维护者的建议。

参见:https://github.com/jackwasey/icd

相关文件为:configure.ac、src/config.h.in、src/Makevars.in