CMake: очистить каталог покрытия перед целью тестирования

#cmake #clang #code-coverage

#cmake #clang #код-покрытие

Вопрос:

Я работаю над проектом на C с CMake clang. Теперь я хотел бы интегрировать покрытие на основе исходного кода с моими модульными тестами. При компиляции с правильными флагами необработанные данные покрытия помещаются в файлы в соответствии с шаблоном, заданным переменной LLVM_PROFILE_FILE среды. Поскольку я использую catch2 в качестве тестовой среды, я вызываю:

 catch_discover_tests(
  my_test
  PROPERTIES ENVIRONMENT LLVM_PROFILE_FILE=coverage/my_test_%p.profraw
)
 

При запуске test цели это приведет к размещению .profraw каждого тестового процесса в coverage каталоге. Я также добавил пользовательскую coverage цель, которая объединяет эти файлы в .profdata файл:

 add_custom_command(
  OUTPUT coverage/my_test.profdata
  COMMAND llvm-profdata merge -sparse coverage/*.profraw -o coverage/my_test.profdata
)

add_custom_target(coverage DEPENDS coverage/my_test.profdata)
 

Это работает достаточно хорошо. Однако, если я теперь test снова запущу цель несколько раз и забуду очистить coverage каталог между ними, запуск coverage цели объединит данные из нескольких тестовых запусков. Это не то, что я хочу, поэтому я хотел бы убедиться, что coverage каталог всегда удаляется перед запуском тестов. Но я не уверен, как это сделать, я пробовал:

 add_custom_target(
  clean_coverage_dir
  COMMAND ${CMAKE_COMMAND} -E rm -rf coverage
)

add_dependencies(test clean_coverage_dir)
 

После catch_discover_tests , но это приводит к:

 Cannot add target-level dependencies to non-existent target "test".
 

Что я могу сделать? Может быть, мне следует использовать совсем другой подход?

Комментарии:

1. Возможно, стоит взглянуть на тестовые приспособления: cmake.org/cmake/help/latest/prop_test/FIXTURES_SETUP.html

2. @fabian Я не слышал об этом раньше, я изучу это, спасибо.

Ответ №1:

Если кому-то интересно, я нашел своего рода очевидное решение:

 add_custom_target(
  test_coverage
  COMMAND ${CMAKE_COMMAND} -E rm -rf coverage amp;amp;
          ${CMAKE_CTEST_COMMAND} --force-new-ctest-process amp;amp;
          llvm-profdata merge -sparse coverage/*.profraw -o coverage/my_test.profdata
  WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)