[英]Specify valgrind options to R package on Travis CI
我正在尝试在Travis CI上使用c ++代码构建R包,并通过使用--use-valgrind
选项运行R CMD check
来使用valgrind对其进行R CMD check
。 在R扩展手册中,它说是提供带有必需选项的~/.valgrindrc
文件,或者在环境变量VALGRIND_OPTS
但我无法弄清楚这两个。
我在这里创建了一个演示仓库,其中包含一个valgrind应该响应的Rcpp函数。
我的.travis.yml
设置如下所示:
language: r
sudo: false
cache: packages
r_check_args: '--use-valgrind'
addons:
apt:
packages:
- valgrind
我有一个.valgrindrc
文件,内容如下:
--leak-check=full
--track-origins=yes
,并尝试将其放在./inst/
和根目录中,但没有一个起作用。 有人知道如何正确设置这些选项吗?
编辑: 这是最新travis版本的链接。
@joepd给出的解决方案可以工作,但是我发现在简单设置环境变量时(也许)更精简的解决方案。
env:
- VALGRIND_OPTS='--leak-check=full --track-origins=yes'
请注意,由于某些未知原因,valgrind仍建议我们设置--leak-check=full
,这就是让我首先想到另一种解决方案的原因。
根据文档 ,仅当文件~/.valgrindrc
不存在且未设置环境变量$VALGRIND_OPTS
,才读取文件./.valgrindrc
(因此,在当前工作目录中)。
不知道是什么情况,但是您可能需要执行以下操作:
before_install:
- "head ~/.valgrindrc || echo '~/.valgrindrc does not exist'"
- echo VALGRIND_OPTS: $VALGRIND_OPTS
- cat ./valgrindrc >> ~/.valgrindrc
前两个用于诊断目的。 最后一个可能会解决该问题(它将您的配置附加到全局配置)。 如果这行不通,您可能会对正在发生的事情有更多的了解。
您还可以使用以下脚本来自定义valgrind检查,并标记哪种输出会导致travis故障。 只需制作某种valgrind-script.R
来加载和测试程序包功能,然后将其和以下内容放入tests
文件夹。 ( valgrind
还需要与.travis.yml
一起安装。)
vg_check <- function ()
{
vg <- system2 (command = 'R',
args = c ('-d "valgrind --tool=memcheck --leak-check=full"',
'-f valgrind-script.R'),
stdout = TRUE, stderr = TRUE)
lost <- NULL
types <- c ("definitely lost", "indirectly lost", "possibly lost")
for (ty in types)
{
lost_type <- which (grepl (ty, vg))
n <- regmatches(vg [lost_type], gregexpr("[[:digit:]]+", vg [lost_type]))
lost <- c (lost, as.numeric (n [[1]] [2:3]))
}
if (any (lost > 0))
stop ("valgrind memory leaks detected!")
if (attr (vg, "status") != 0)
stop ("valgrind error")
}
if (identical (Sys.getenv ("TRAVIS"), "true"))
{
vg_check ()
}
这使用memcheck
,但是您可以自定义它以使用所需的valgrind工具,并将任何类型的输出转换为travis故障。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.