Пересборка RPM с созданием отчета о покрытии кода в Росе

Чтобы создать отчет о покрытии (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.

Отправить ответ

avatar
  Subscribe  
Сообщать по почте