Чтобы создать отчет о покрытии (code coverage) по коду на C/C++, необходимо вызывать компилятор gcc или clang с флагом --coverage
. Рассмотрим, как сделать так, чтобы при сборке RPM получался пригодный для создания отчета исполняемый файл.
Рассматриваем систему rosa2021.1. Информация также актуальна для любой Росы на rpm4: rosa2023.1, rosa2021.15, rosa2019.05. Флаги сборки RPM задаются макросом %optflags, который, как можно убедиться в файлах внутри папки /usr/lib/rpm/, формируется с участием макроса %debugcflags:
$ grep -inHr debugcflags /usr/lib/rpm /usr/lib/rpm/rosa/macros:151:%debugcflags %{?_enable_debug_packages:-gdwarf-4 -Wstrict-aliasing=2} /usr/lib/rpm/rosa/macros:167:%__common_cflags -O2 -fomit-frame-pointer %{debugcflags} -pipe %{Werror_cflags} %{?_fortify_cflags} %{?_fpic_cflags}
Посмотрим значение этого макроса по умолчанию:
$ rpm -E %debugcflags -gdwarf-4 -Wstrict-aliasing=2
Для gcc -gdwarf-4 — это то же самое, что -g, однако по историческим причинам в Росе используется именно -gdwarf-4. Исполняемые файлы собираются с debuginfo, а после сборки от них автоматически отрезаются дебаг и встроенные исходники и кладутся в подпакеты *-debuginfo и *-debugsource, которые кладутся в отдельный репозиторий (например, https://mirror.yandex.ru/rosa/rosa2021.1/repository/x86_64/debug_main/release/). Пакетный менеджер dnf умеет автоматически подбирать, какие debug-пакеты нужно поставить для заданного пакета или файла, например:
sudo dnf debuginfo-install bash
или:
sudo dnf debuginfo-install /usr/bin/bash
Обе команды установят пакеты bash-debuginfo и bash-debugsource.
Но мы немного отвлеклись. Можно добавить --coverage
к этим флагам, переназначив значение RPM-макроса %debugcflags. Есть несколько способов это сделать (нужно выбрать один из них):
1) создаем файл ~/.rpmmacros с текстом:
%debugcflags -gdwarf-4 -Wstrict-aliasing=2 --coverage
(если надо, то можно еще и -O0
добавить)
2) через параметры командной строки rpmbuild:
rpmbuild --define 'debugcflags -gdwarf-4 -Wstrict-aliasing=2 --coverage' ...
3) в шапку spec-файла добавить:
%global debugcflags %{debugcflags} --coverage
После сборки пакета в ~/rpmbuild/BUILD/ будут лежать исполняемые файлы и файлы *.gcno рядом с ними. После запуска такого исполняемого файла появятся файлы *.gcda, после чего можно создать отчет о покрытии:
lcov -t "fizzbuzz" -o fizzbuzz.info -c -d .
genhtml -o report fizzbuzz.info
(где место fizzbuzz любое имя)
Существуют и другие утилиты вместо genhtml, например, gcovr. Пример, как выглядит отчет:
Оранжевым отмечен код, который исполнялся при запуске исполняемого файла.
Если при сборке пакета запускались исполняемые файлы, например, в секции %check, как в https://abf.io/import/cronie, то файлы *.gcda уже будут в наличии после сборки пакета. Можно пойти дальше и автоматизировать создание отчетов по аналогии с https://nixtux.ru/1041.
Отправить ответ