Я запускаю gcovr (3.3) на сборке вне исходного кода, например:
gcovr --root=/path/to/source --object-directory=/path/to/build
Теперь я хочу исключить из отчета две разные вещи:
1) Любой .cpp
файлы с именем «Test»
--exclude='.*Test.*'
не похоже на работу
2) Все исходные файлы в каталоге (скажем, /path/to/source/MyModule/
)
--exclude='/path/to/source/MyModule/.*'
не похоже на работу.
--exclude-directories='/path/to/source/MyModule'
тоже не похоже на работу.
Мои вопросы
а) что это --exclude-directories
так как кажется, что вы (должны) быть в состоянии исключить каталог с нужным регулярным выражением, переданным в --exclude
?
б) Любые предложения о том, почему --exclude
с не работают как положено? Возможно, это не правильный вид / стиль регулярных выражений?
Оба эти варианта недостаточно хорошо документированы, поэтому основным источником знаний является исходный код.
а) для чего нужен —exclude-directoryies, так как кажется, что вы (должны) иметь возможность исключить каталог с правильным регулярным выражением, переданным в —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
использование --exclude-directories='MyMod.*'
,
б) Любые предложения о том, почему —exclude не работают, как ожидалось? Возможно, это не правильный вид / стиль регулярных выражений?
Ваше регулярное выражение верно. Это типичное регулярное выражение 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
Других решений пока нет …