这两个选项都没有很好的文档记录,因此主要的知识来源是源代码。
a) --exclude-directories 的用途是什么,因为您似乎(应该)能够通过将正确的正则表达式传递给 --exclude 来排除目录?
--exclude-directories
gcovr 使用的选项以按其名称而不是完整路径跳过目录。如果您检查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
use开头--exclude-directories='MyMod.*'
。
b) 关于为什么 --excludes 不能按预期工作的任何建议?也许这些不是正则表达式的正确种类/风格?
你的正则表达式是正确的。这是典型的 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.cpp