lcov代码覆盖范围-带有输入变量的删除命令不起作用

时间:2019-05-29 08:21:39

标签: bash lcov

问题描述

我正在尝试筛选在测试覆盖范围内我们不想忽略的目录。为此,我们使用Lcov

当我尝试将要忽略的目录放在变量__ignoreinput中时,命令#${__lcov} ${__gcovopts} --remove MYCODE.info "${__ignoreinput}" -o MYCODE_filtered.info > /dev/null 2> /dev/null不起作用,它不会过滤任何内容。而当我使用不带__ignoreinput的命令时,如

 ${__lcov} ${__gcovopts} --remove MYCODE.info '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' -o MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov filtrering failed" && exit 1 ;fi

过滤器正常运行。我究竟做错了什么。我不明白。


脚本

#!/bin/bash
__orc=/home/anybody/workspace/project
__buildtype="local"
__output=/home/anybody/workspace/lcov


#doe not work
#__ignoreinput="'/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*'"
#__ignoreinput="/opt/* /usr/include/* *3rdParty/* *Input_API/* *Grammars/* "
#__ignoreinput="\"/opt/*\" \"/usr/include/*\" \"*3rdParty/*\" \"*Input_API/*\" \"*Grammars/*\""


__gcovopts=--gcov-tool=/opt/1A/x86_64-2.6.32-v2/bin/gcov
__lcov=lcov
if [[ "${__buildtype}" == "docker" ]] ;then
  __build=MYCODE/build_x86_64-2.6.32-v2_Gcov
else
  __build=MYCODE/cmake-build-coverage
fi

echo "Filter lcov tracefile"
cd ${__orc}/${__build}
#does not work
#${__lcov} ${__gcovopts} --remove MYCODE.info "${__ignoreinput}" -o MYCODE_filtered.info > /dev/null 2> /dev/null

#works
${__lcov} ${__gcovopts} --remove MYCODE.info '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' -o MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov filtrering failed" && exit 1 ;fi

echo "Generate HTML reports"
cd ${__orc}/${__build}
genhtml --ignore-errors source -o ${__output}/lcov_"$(git rev-list HEAD -n 1)" MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov reports failed" && exit 1 ;fi

1 个答案:

答案 0 :(得分:1)

传递__ignoreinput的一种简单方法是将glob表达式存储在数组中,并在传递给lcov命令的同时用单引号将它们展开。将忽略输入写为

__ignoreinput=( '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' )

并执行以下操作应按预期进行。

"${__lcov}" "${__gcovopts}" --remove MYCODE.info "${__ignoreinput[@]}" -o MYCODE_filtered.info 2>&1 > /dev/null

对于您描述中的所有失败情况,__ignoreinput".."下被设置为一个完整字符串,但是该命令希望单词将每个表达式分割为一个表达式。数组扩展"${__ignoreinput[@]}"会按照命令的期望将数组中定义的每个单词作为一个单独的单词放置。

在定义过程中,还要仔细地对数组中的单词进行单/双引号,因为缺少引号*可能会进行路径名扩展,并且可能会扩展到每个路径下的文件名列表。

另请参阅如何将> /dev/null 2> /dev/null最小化为> /dev/null 2> /dev/null或仅在&> /dev/null中将bash最小化。


另外,给变量名加上前缀__也是不好的做法。像那里的大多数语言一样,字符本身可以是有效的变量标识符。如上所示,建议将变量名完全括在{..}周围。