我在一个源代码外构建上运行gcovr (3.3),如:
gcovr --root=/path/to/source --object-directory=/path/to/build
现在我想从报告中排除两件不同的事情:
1)任何以“测试”为名的.cpp文件
--exclude='.*Test.*'似乎不起作用
2)目录中的所有源文件(例如/path/to/source/MyModule/)
--exclude='/path/to/source/MyModule/.*'似乎不起作用。
--exclude-directories='/path/to/source/MyModule'似乎也不起作用。
我的问题
( a) --exclude-directories是为了什么,因为您(应该)应该能够排除一个目录,并将正确的regex传递给--exclude。
( b)对于--exclude不按预期工作的原因,有什么建议吗?也许这些不是正确的正则表达式的类型/风格?
发布于 2016-09-28 09:16:42
这两个选项都没有很好的文档记录,因此知识的主要来源是源代码。
( a)什么是--排除--目录,因为似乎您应该(应该)能够排除一个目录,并将正确的regex传递给--排除?
由gcovr使用的--exclude-directories选项可以跳过目录的名称,而不是完全路径。如果您检查gcovr的源代码,就可以验证它。魔术是用def link_walker(path)函数实现的:
for root, dirs, files in os.walk(
os.path.abspath(path), followlinks=True
):
for exc in options.exclude_dirs:
for d in dirs:
m = exc.search(d)根据os.walk文档,dirs是子目录名称的列表。要跳过以MyMod开头的所有目录,请使用--exclude-directories='MyMod.*'。
( b)有何建议也许这些不是正确的正则表达式的类型/风格?
您的正则表达式是正确的。这是典型的Python正则表达式。
要了解在--exclude选项中发生了什么,启用-v输出是很有用的。启用此选项后,输出应该有很多行:
currdir /cygdrive/f/test/path/to/source
gcov_fname myfile.cpp.gcov
[' -', ' 0', 'Source', 'myfile.cpp\n']
source_fname /cygdrive/f/test/path/to/source/myfile.gcda
root /cygdrive/f/test/path/to/source
fname /cygdrive/f/test/path/to/source/myfile.cpp
Parsing coverage data for file /cygdrive/f/test/path/to/source/myfile.cpp这个输出由def process_gcov_data(data_fname, covdata, source_fname, options)函数产生。如果您检查源代码,您将看到以下内容:
for exc in options.exclude:
if (filtered_fname is not None and exc.match(filtered_fname)) or \
exc.match(fname) or \
exc.match(os.path.abspath(fname))排除过滤器适用于上面打印的fname。这是绝对的文件。此外,它也适用于所有有覆盖数据的文件。如果文件被排除,则应在输出中显示以下行(需要-v选项):
Excluding coverage data for file /cygdrive/f/test/path/to/source/myfile.cpphttps://stackoverflow.com/questions/39671850
复制相似问题