Беда с исключениями gcovr

Я запускаю 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с не работают как положено? Возможно, это не правильный вид / стиль регулярных выражений?

2

Решение

Оба эти варианта недостаточно хорошо документированы, поэтому основным источником знаний является исходный код.

а) для чего нужен —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
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]