Недавнее обновление ОС привело к краху моего сценария покрытия.
lcov 1.13
gcov (GCC) 9.1.1
Часть моего CMake, которая используется для генерации данных о покрытии:
if ($ENV{COVERAGE})
message("Setting up for coverage")
enable_testing()
include(CodeCoverage)
setup_target_for_coverage(${PROJECT_NAME}_coverage tests coverage)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
endif ()
Команда lcov
, которую я выдал после сборки тестов:
lcov --capture --directory build/ --output-file coverage.info
К сожалению, теперь не удается:
Capturing coverage data from build/
Found gcov version: 9.1.1
Scanning build/ for .gcda files ...
geninfo: WARNING: no .gcda files found in build/ - skipping!
Finished .info-file creation
Сообщение об ошибке имеет смысл, потому что нет файлов .gcda
— только файлы .gcno
. Я не уверен, служат ли они той же цели и / или могут ли они использоваться с lcov
.
Я выдал nm some_binary | grep gcov
и там много символов в виде:
00000000004b3520 d __gcov_._ZZZN6__pstl10__internal15__pattern_walk2IRKNS_9execution2v115parallel_policyEN9__gnu_cxx17__normal_iteratorIPKiSt6vectorIiSaIiEEEENS8_IPiSD_EEZSt9transformIS6_SE_SG_ZN12_GLOBAL__N_150ParallelTransformTest_NoDataShouldReturnEmpty_Test8TestBodyEvEUlRKT_E_ENSt9enable_ifIXsrNS3_19is_execution_policyINSt5decayISK_E4typeEEE5valueET1_E4typeEOSK_T0_SY_SU_T2_EUlRS9_RiE_St17integral_constantIbLb0EEEESU_SX_SY_SY_SU_SZ_T3_S13_IbLb1EEENKUlvE_clEvENKUlSE_SE_E_clESE_SE_
Так что я думаю, что CMake по-прежнему правильно пытающийся, чтобы дать мне данные о покрытии.
Он отлично работал на gcc 7
, если я правильно помню.
Есть ли новое решение / флаг CMake для выпуска / флаг lcov для выпуска? Или он сломался прямо сейчас и нет обходного пути? Или, может быть, я делал что-то странное все это время?
Я считаю, что GCC 9 теперь по умолчанию выводит данные о покрытии в формате JSON, как указано в изменить заметки.
The gcov tool has changed its intermediate format to a new JSON format.
Также похоже, что у lcov есть открытый проблема для обработки этого нового формата.
Последняя фиксация для ветки master на lcov должна решить эту проблему, так что вы можете попробовать собрать lcov из исходников. Кажется, я не могу найти никаких предположений о том, что это можно настроить в GCC, так что это может быть ваш единственный вариант на данный момент.
Да, запуск lcov
из мастера позволяет анализировать промежуточный формат gcov — хотя мне нужно было установить дополнительные пакеты, такие как zlib
, или кучу модулей Perl из cpan
. Не совсем чистый, но делает свое дело.
Кажется так. Любые известные обходные пути? Я не хочу перекомпилировать весь проект под другой версией компилятора только для того, чтобы получить охват.