Найти и переместить файлы с расширением во время сборки, используя 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 вместо того, чтобы инструктировать всех разработчиков устанавливать различные инструменты.
не будет проблемой.