cmake
Пользовательские сборки
Поиск…
Вступление
Пользовательские шаги сборки полезны для запуска пользовательских целей в вашей сборке проектов или для простого копирования файлов, поэтому вам не нужно делать это вручную (возможно, dll?). Здесь я покажу вам два примера: первый - для копирования DLL (в частности, библиотек Qt5) в двоичный каталог проектов (Debug или Release), а второй - для запуска пользовательской цели (Doxygen в этом случае) в вашем решении (если вы используете Visual Studio).
замечания
Как вы можете видеть, вы можете много сделать с пользовательскими целями сборки и шагами в cmake, но вы должны быть осторожны при их использовании, особенно при копировании DLL. Хотя это удобно, оно иногда может привести к тому, что ласково называется «dll hell».
В основном это означает, что вы можете потеряться, в каких DLL-файлах зависит ваш исполняемый файл, какие из них загружаются и какие из них ему нужно запустить (возможно, из-за переменной пути вашего компьютера).
Помимо вышеперечисленного, не стесняйтесь делать индивидуальные цели, делая все, что хотите! Они мощные и гибкие и являются бесценным инструментом для любого проекта cmake.
Пример копирования dll Qt5
Предположим, у вас есть проект, который зависит от Qt5, и вам нужно скопировать соответствующие DLL в каталог сборки, и вы не хотите делать это вручную; вы можете сделать следующее:
cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project
# add the executable
add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
add_custom_command(TARGET MyQtProj POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
)
Итак, каждый раз, когда вы строите свой проект, если целевые DLL-файлы были изменены, которые вы хотите скопировать, они будут скопированы после того, как ваша цель (в этом случае основной исполняемый файл) будет построена (обратите внимание на команду copy_if_different
); в противном случае они не будут скопированы.
Кроме того, обратите внимание на использование выражений генератора . Преимущество использования этих компонентов заключается в том, что вам не нужно явно указывать, где копировать DLL или какие варианты использовать. Чтобы иметь возможность использовать их, проект, который вы используете (Qt5 в этом случае), должен иметь импортированные цели.
Если вы создаете отладочную версию, то CMake знает (на основе импортированной цели) скопировать Qt5Cored.dll, Qt5Guid.dll и Qt5Widgetsd.dll в папку Debug вашей папки. Если вы создаете в выпуске, то версии выпуска .dll будут скопированы в папку выпуска.
Запуск пользовательской цели
Вы также можете создать настраиваемую цель для запуска, когда хотите выполнить определенную задачу. Обычно это исполняемые файлы, которые вы запускаете для выполнения разных действий. Что-то, что может быть особенно полезно, - запустить Doxygen для создания документации для вашего проекта. Для этого вы можете сделать следующее в вашем CMakeLists.txt
(для простоты мы рассмотрим пример проекта Qt5):
cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project
add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
add_custom_command(TARGET MyQtProj POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
)
#Add target to build documents from visual studio.
set(DOXYGEN_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile)
#set the output directory of the documentation
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/docs)
# sanity check...
message("Doxygen Output ${DOXYGEN_OUTPUT_DIR}")
find_package(Doxygen)
if(DOXYGEN_FOUND)
# create the output directory where the documentation will live
file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
# configure our Doxygen configuration file. This will be the input to the doxygen
# executable
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
# now add the custom target. This will create a build target called 'DOCUMENTATION'
# in your project
ADD_CUSTOM_TARGET(DOCUMENTATION
COMMAND ${CMAKE_COMMAND} -E echo_append "Building API Documentation..."
COMMAND ${CMAKE_COMMAND} -E make_directory ${DOXYGEN_OUTPUT_DIR}
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${CMAKE_COMMAND} -E echo "Done."
WORKING_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
endif(DOXYGEN_FOUND)
Теперь, когда мы создаем наше решение (опять же, предполагая, что вы используете Visual Studio), у вас будет цель сборки, называемая DOCUMENTATION
которую вы можете создать для восстановления документации вашего проекта.