[英]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.