Найти и переместить файлы с расширением во время сборки, используя CMake

В настоящее время я пытаюсь использовать Gcov и Gcovr из CMake на Windows, используя MinGW. Компиляция файлов с правильными флагами работает как шарм. Однако CLion использует сборку вне исходного кода, которую Gcov не понимает.

В Linux я использовал следующее, чтобы скопировать все *.gcda а также *.gcno к CMAKE_SOURCE_DIR от CMAKE_BINARY_DIR подпапки:

set(GCOV_DATA_DIR  "${CMAKE_SOURCE_DIR}/gcov_data")
add_custom_target(prepare_coverage
    # Copy necessary files to CMAKE_SOURCE_DIR
    COMMAND ${CMAKE_COMMAND} -E make_directory ${GCOV_DATA_DIR}
    COMMAND find ${CMAKE_BINARY_DIR} -name \"*.gcda\" -o -name \"*.gcno\" | xargs -l -i cp {} "${GCOV_DATA_DIR}"
)

Обратите внимание, что тестовые двоичные файлы выполняются в CMAKE_BINARY_DIR, Это работает довольно хорошо, и я могу потом вызвать Gcovr с некоторыми дополнительными флагами, чтобы получить хороший отчет.

Однако на винде у меня нету xargs (Я был уже убежден, что find сделал работу). Чтобы сделать эту команду CMake независимой от платформы, я ищу способ заставить CMake находить и копировать / перемещать файлы во время сборки (аналогично созданию каталога).

Может кто-нибудь сказать мне, если это возможно, и как я должен это сделать? Конечно, я всегда могу установить дополнительные программы или скрипты, но я предпочел бы решить эту проблему в CMake вместо того, чтобы инструктировать всех разработчиков устанавливать разные инструменты.

1 ответ

Решение

Если вы не используете CMAKE_RUNTIME_OUTPUT_PATH в вашем проекте, то .gcda а также .gcno файлы создаются в каталоге с исполняемыми файлами, поэтому вы можете вычислить этот каталог с помощью $<TARGET_FILE_DIR:tgt> генератор-выражение.

Поскольку вы знаете имена исходных файлов, вы можете вычислить абсолютные пути всех файлов, связанных с gcov, и генерировать соответствующие команды копирования без find,

Другим подходом может быть написание xargs-подобной программы / скрипта самостоятельно, доставка его вместе с вашим проектом и использование его в COMMAND, Так

... но я бы предпочел решить эту проблему в CMake вместо того, чтобы инструктировать всех разработчиков устанавливать различные инструменты.

не будет проблемой.

Другие вопросы по тегам