Конфигурация проекта с cmake
CMake — это инструмент, упрощающий процесс сборки проектов. CMake автоматически создаёт системы сборки, например файлы Makefiles.
CMake автоматизирует настройку систем сборки. Он контролирует процесс компиляции программного обеспечения с помощью простых файлов конфигурации, называемых файлами CMakeLists.txt. CMake генерирует собственные конфигурации сборки и рабочие области, которые можно использовать в среде компилятора.
IDE автоматически запускает CMake для обновления информации о проекте, когда разработчик редактирует файл конфигурации CMakeLists.txt. Информация о проекте также автоматически обновляется при сборке проекта.
- Команды и макросы CMake
- Переменные CMake
- Пример CMakeLists.txt для ОС Аврора
- Структура проекта CMake
Команды и макросы CMake
В команде project
указывается имя проекта, например, ru.auroraos.cmakeExample
.
cmake_minimum_required
указывает необходимую минимальную версию CMake.
Одной из основных функций является find_package
.
Она позволяет найти библиотеки и файлы заголовков, поставляемые с Qt.
Затем можно использовать эти библиотеки и файлы заголовков с командой target_link_libraries
для создания библиотек и приложений на основе Qt.
pkg_search_module
использует инструмент pkg-config для определения местоположения
запрошенной библиотеки.
Модуль инструмента pkg-config в CMake называется FindPkgConfig
.
Этот модуль, как и другие, можно подключить с помощью команды include
.
add_executable
указывает на исполняемые проекта,
add_custom_target
— на другие файлы проекта,
qt5_add_translation
— на файлы переводов.
file
указывает, где исполняемые файлы приложения будут расположены на устройстве.
Команда install
позволяет создавать правила установки для проекта.
Правила установки, заданные вызовами команды install()
в исходном каталоге, выполняются
по порядку во время установки.
Команды для настройки целей:
target_compile_definitions
— указывает параметры компиляции для заданного первого аргумента<target>
;target_include_directories
— добавляет указанные каталоги в цель;target_link_libraries
— указывает библиотеки или флаги для использования при связывании данной цели и/или её зависимостей.
Макросы Qt5::Core
:
qt5_add_big_resources
— компилирует большие двоичные ресурсы в объектный код;qt5_add_binary_resources
— создаёт файл RCC из списка файлов ресурсов Qt;qt5_add_resources
— компилирует двоичные ресурсы в исходный код;qt5_generate_moc
— вызывает moc для входного файла;qt5_import_plugins
— задаёт настраиваемый набор подключаемых модулей для импорта для статической сборки Qt;qt5_wrap_cpp
— создаёт файлы .moc из источников.
Переменные CMake
Значения переменных можно устанавливать с помощью команды set
.
Примеры переменных:
CMAKE_AUTOMOC
— запускает компилятор moc автоматически при необходимости;CMAKE_INCLUDE_CURRENT_DIR
— включает автоматическое добавление текущих исходных каталогов и каталогов сборки в путь include.
Примеры установки переменных:
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
ON
или OFF
включают или выключают функциональность, за которую переменные отвечают.
Модули Qt, загруженные с помощью find_package
, также устанавливают различные переменные.
Примеры переменных для модуля Core:
Qt5Core_FOUND
— логическое значение, которое описывает, был ли модуль найден успешно;Qt5Core_LIBRARIES
— имя импортированной цели для модуля;Qt5Core_INCLUDE_DIRS
— список подключаемых каталогов для использования при сборке с библиотекой;Qt5Core_VERSION_STRING
— строка, содержащая версию модуля.
Для всех пакетов, найденных с помощью find_package
, доступны эквиваленты этих переменных;
они чувствительны к регистру.
Обычно редко нужен прямой доступ к этим переменным. Общие задачи, такие как связывание с модулем, должны выполняться через цели библиотек, которые определяет каждый модуль.
Пример CMakeLists.txt для ОС Аврора
При создании проекта с названием cmakeExample автоматически будет сгенерирован следующий CMakeLists.txt:
project(ru.auroraos.cmakeExample CXX)
cmake_minimum_required(VERSION 3.5)
find_package (Qt5 COMPONENTS Core Network Qml Gui Quick LinguistTools REQUIRED)
include(FindPkgConfig)
pkg_search_module(AURORA auroraapp REQUIRED)
pkg_search_module(AURORA auroraapp_i18n REQUIRED)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(short_name cmakeExample)
FILE(GLOB TsFiles "translations/*.ts")
qt5_add_translation(QmFiles ${TsFiles})
add_executable(ru.auroraos.cmakeExample src/main.cpp ${QmFiles})
target_compile_definitions(ru.auroraos.cmakeExample PRIVATE
$<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>
)
target_include_directories(ru.auroraos.cmakeExample PRIVATE
$<BUILD_INTERFACE:
${AURORA_INCLUDE_DIRS}
>)
target_link_libraries(ru.auroraos.cmakeExample
Qt5::Quick
${AURORA_LDFLAGS}
)
install(TARGETS ru.auroraos.cmakeExample
RUNTIME DESTINATION bin
)
install(DIRECTORY qml
DESTINATION share/ru.auroraos.cmakeExample
)
foreach(_file IN LISTS QmFiles)
get_filename_component(_filename "${_file}" NAME)
string(REPLACE "${short_name}" "${PROJECT_NAME}" _full_filename "${_filename}")
install(FILES ${_file} DESTINATION share/ru.auroraos.cmakeExample/translations RENAME ${_full_filename})
endforeach()
install(FILES ru.auroraos.cmakeExample.desktop
DESTINATION share/applications
)
install(FILES icons/86x86/ru.auroraos.cmakeExample.png
DESTINATION share/icons/hicolor/86x86/apps
)
install(FILES icons/108x108/ru.auroraos.cmakeExample.png
DESTINATION share/icons/hicolor/108x108/apps
)
install(FILES icons/128x128/ru.auroraos.cmakeExample.png
DESTINATION share/icons/hicolor/128x128/apps
)
install(FILES icons/172x172/ru.auroraos.cmakeExample.png
DESTINATION share/icons/hicolor/172x172/apps
)
# Get the other files reachable from the project tree in Qt Creator
FILE(GLOB TsFiles "translations/*.ts")
add_custom_target(distfiles
SOURCES
AUTHORS.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
LICENSE.BSD-3-CLAUSE.md
README.md
ru.auroraos.cmakeExample.desktop
qml/cmakeExample.qml
qml/cover/DefaultCoverPage.qml
qml/pages/MainPage.qml
qml/pages/AboutPage.qml
rpm/ru.auroraos.cmakeExample.spec
rpm/ru.auroraos.cmakeExample.changes.in
rpm/ru.auroraos.cmakeExample.changes.run.in
${TsFiles})
file(WRITE "${CMAKE_BINARY_DIR}/QtCreatorDeployment.txt"
"${CMAKE_INSTALL_PREFIX}
${CMAKE_BINARY_DIR}/ru.auroraos.cmakeExample:bin
")
В файле сначала указывается название проекта и минимальная необходимая версия CMake.
С помощью find_package
подключаются Qt-модули Core, Network, Qml, Gui, Quick и LinguistTools.
В следующем блоке подключается библиотека Libauroraapp.
С помощью команд FILE
и qt5_add_translation
подключаются файлы переводов.
Команды target*
настраивают параметры цели, в том числе библиотеки-зависимости.
Следующие несколько блоков описывают команды install
для установки файлов и каталогов проекта.
Финальный блок описывает все файлы и каталоги проекта. Он используется для удобного отображения структуры проекта в IDE. Здесь перечисляются файлы приложения, в том числе конфигурационный spec-файл.
Структура CMake проекта
CMake как систему сборки можно выбрать при создании проекта из шаблона в окне Система сборки.
В результате в директории проекта будет создана следующая файловая структура:
.
├── CMakeLists.txt
├── CMakeLists.txt.user
├── icons
│ ├── 108x108
│ │ └── ru.template.{Имя_проекта}.png
│ ├── 128x128
│ │ └── ru.template.{Имя_проекта}.png
│ ├── 172x172
│ │ └── ru.template.{Имя_проекта}.png
│ └── 86x86
│ └── ru.template.{Имя_проекта}.png
├── qml
│ ├── {Имя_проекта}.qml
│ ├── cover
│ │ └── DefaultCoverPage.qml
│ ├── icons
│ │ └── {Имя_проекта}.svg
│ └── pages
│ ├── AboutPage.qml
│ └── MainPage.qml
├── rpm
│ ├── ru.template.{Имя_проекта}.changes.in
│ ├── ru.template.{Имя_проекта}.changes.run.in
│ └── ru.template.{Имя_проекта}.spec
├── ru.template.{Имя_проекта}.desktop
├── src
│ └── main.cpp
└── translations
├── {Имя_проекта}-ru.ts
└── {Имя_проекта}.ts