Документация
ОС Аврора 5.1.0

Конфигурация проекта с cmake

CMake — это инструмент, упрощающий процесс сборки проектов. CMake автоматически создаёт системы сборки, например файлы Makefiles.

CMake автоматизирует настройку систем сборки. Он контролирует процесс компиляции программного обеспечения с помощью простых файлов конфигурации, называемых файлами CMakeLists.txt. CMake генерирует собственные конфигурации сборки и рабочие области, которые можно использовать в среде компилятора.

IDE автоматически запускает CMake для обновления информации о проекте, когда разработчик редактирует файл конфигурации CMakeLists.txt. Информация о проекте также автоматически обновляется при сборке проекта.

Команды и макросы 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

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.