Как заставить llvm-cov поговорить с codecov.io
Я нахожусь в процессе (наконец-то!) Настройки мониторинга покрытия кода для моего нового C++ проекта. В связи с тем, что мне нужны некоторые расширенные функции C++20 (чтение, сопрограммы), я использую clang 6
как компилятор.
Теперь я следовал этому руководству о том, как сделать базовое покрытие кода для вашего проекта, и все работало как по волшебству. Если я сделаю:
clang++ -fprofile-instr-generate -fcoverage-mapping test.cpp -o test.out
LLVM_PROFILE_FILE="coverage/test.profraw" ./test.out
llvm-profdata merge -sparse coverage/test.profraw -o coverage/test.profdata
llvm-cov show ./test.out -instr-profile=coverage/test.profdata
Я получаю хороший цветной отчет на своем терминале, который говорит мне, что покрыто, а что нет.
Все идет нормально! Я думал, что я был близок к тому, что я хотел, но затем боль началась, когда я попытался загрузить отчет в https://codecov.io/.
Я пробовал несколько вещей, в том числе:
Запуск их
https://codecov.io/bash
сценарий на моемcoverage
папка в надежде, что, возможно, это поймает мойtest.profdata
, Без кости, и это имеет смысл, так как дажеllvm-cov
нужен путь к исполняемому файлу для запуска.С использованием
export
функциональность: при запускеllvm-cov export --instr-profile=coverage/test.profdata ./test.out
Я получаю красивый файл JSON (через терминал). Я попытался бросить вывод вcoverage.json
файл, который фактически был загружен, но затем кодеки просто говорят, что произошла ошибка при его разборе, без дополнительной информации.
Я чувствую себя полностью потерянным. На их веб-сайте все кажется таким черным, что я просто не понимаю, как сделать что-то, что случайно не подходит к тем случаям, с которыми они могут справиться.
Как я могу заставить это работать с кодеками? Если codecov не может обработать мои отчеты, есть ли какое-либо другое эквивалентное покрытие кода онлайн, которое я могу использовать, чтобы заставить это работать?
2 ответа
Похоже, кодеков bash, используемый для загрузки данных покрытия на их сайт, ищет файлы, соответствующие широкому диапазону шаблонов, связанных с форматами, которые он понимает. Они плохо документированы, но вы можете, по крайней мере, увидеть, какие шаблоны жизнеспособны, посмотрев скрипт на Github. Конечно, это не говорит вам о том, что ожидает Codecov от формата файлов, соответствующих заданному шаблону, как вы обнаружили, когда ваш coverage.json
файл был отклонен.
Методом проб и ошибок я обнаружил, что следующий код создает файл, который codecov будет правильно интерпретировать при запуске сценария bash:
llvm-cov show ./test.out -instr-profile=default.profdata > coverage.txt
Я не проверял, какие имена файлов разрешены, но кажется, что вы можете поместить любые дополнительные символы между coverage
а также .txt
в названии файла, в который вы передаете данные покрытия (например, вы можете назвать его coverage_my_file_name.txt
).
Другой вариант - использовать GCOV-профилирование, которое немного менее точное, чем на основе исходного кода, но поддерживается codecov.io. Вам нужен флаг компилятора "--coverage", чтобы включить его.
Вы можете использовать grcov (который вы также можете загрузить с https://github.com/mozilla/grcov/releases), чтобы проанализировать файлы gcno / gcda и загрузить их через загрузчик кода codecov.io:
grcov OBJ_DIR -s SRC_DIR -t lcov --branch > lcov.info
bash codecov.sh -f "lcov.info"
Я планирую добавить поддержку исходных отчетов в grcov, что упростит поддержку формата и для codecov.