使用C ++ 11容器,我的包中的某些函数运行得更快,但CRAN不能同时使用$(SHLIB_OPENMP_CXXFLAGS)
和$(CXX1XSTD)
接受我的包,因为它不能编译Solaris(或其他次要平台)。 CRAN的建议是编写一个配置脚本,但我认为这对我来说太费时间学习,并且使我的代码在很少人使用的平台上不必要地复杂化。
目前,我刚刚注释掉了所有C ++ 11代码,并从$(CXX1XSTD)
中删除了Makevars
以便提交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
这样的测试会引起维护者的愤怒。
我不认为"如果是solaris"在Makevars
中进行测试就足够了:它是否同时存在C ++ 11和OpenMP标志,因为它们可能会在比Solaris使用的平台上失败。
也许我只是以错误的方式接近这一点。
答案 0 :(得分:2)
尽管可以对此进行测试,但实际上正确的方法是配置脚本。我使用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