我的包中的某些函数使用C++ 11容器运行得更快,但CRAN不接受我的包使用它们$(SHLIB_OPENMP_CXXFLAGS),$(CXX1XSTD)因为它不能在Solaris(或其他次要平台)上编译.CRAN的建议是编写一个配置脚本,但我认为这对我来说太费时间学习,并且使我的代码在很少人使用的平台上不必要地复杂化.
目前,我刚刚注释掉所有C++ 11代码,并删除了$(CXX1XSTD)来自MakevarsCRAN的提交.这是一个糟糕的工作,我宁愿能够检测CRAN Makevars并进行调整,所以我不必为每个版本维护一个CRAN fork.
我仍在测试C++ 11是否可用,但它只是Makevars中C++ 11和OpenMP标志的组合,这是带有CRAN提交的Solaris上的绊脚石.我觉得必须有一个微不足道的方法来解决这个问题.
是否有一个环境变量我应该用来测试CRAN本身是否正在检查我的包,我可以测试哪个Makevars?我已经搜索了R代码库并阅读了R Internals和Writing R Extensions,虽然我不能说我已经了解它们,这是一些CRAN维护者所期望的.CRAN 可能会设置环境变量,但我希望测试_R_CHECK_CRAN_INCOMING_=TRUE会增加维护者的愤怒.
我不认为"if solaris"测试Makevars是否足够:它是否存在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