Конфигурация проекта с qmake
Инструмент qmake помогает упростить процесс сборки проектов. Он автоматизирует генерацию файлов Makefile так, что для создания каждого из них требуется всего несколько строк информации.
Проекты описываются содержимым pro-файлов проекта. Файлы проекта обычно содержат список исходных и заголовочных файлов, общую информацию о конфигурации и любые специфичные для приложения детали, такие как список дополнительных библиотек или путей.
Файлы проекта могут содержать несколько различных элементов, включая комментарии, объявления переменных, встроенные функции и некоторые простые структуры управления. В большинстве простых проектов необходимо только объявить исходные и заголовочные файлы с некоторыми базовыми параметрами конфигурации.
Формат файла проекта, используемый qmake, может использоваться для поддержки как простых, так и довольно сложных систем сборки. Простые файлы проектов используют простой декларативный стиль, определяющий стандартные переменные, указывающие исходные и заголовочные файлы, которые используются в проекте. Комплексные проекты могут использовать структуры управления потоком для точной настройки процесса сборки.
- Переменные qmake
- Операторы
- Шаблоны проектов
- Подключение модулей Qt
- Подключение других библиотек
- Пример pro-файла по умолчанию
- Подключение каталога в проект
- Примеры использования переменных
- Структура проекта qmake
Переменные qmake
В файле проекта переменные используются для хранения списков строк. В простейших проектах эти переменные сообщают qmake о параметрах конфигурации для использования или содержат имена файлов и пути, которые будут использоваться в процессе сборки.
qmake ищет определённые переменные в каждом файле проекта и использует их содержимое для определения того, что он должен писать в Makefile.
Список часто используемых переменных представлен в таблице.
Название | Описание |
---|---|
CONFIG |
Общие параметры конфигурации проекта. |
DEPENDPATH |
Путь поиска зависимостей для приложения. |
DEFINES |
qmake добавляет значения этой переменной в качестве макросов препроцессора компилятора C. |
DESTDIR |
Каталог, в который будет помещен исполняемый файл или двоичный файл. |
DISTFILES |
Список файлов, которые должны быть включены в пакет приложения. |
HEADERS |
Список имён файлов заголовков (.h), используемых при создании проекта. |
INCLUDEPATH |
Список любых дополнительных путей, необходимых для приложения. |
LIBS |
Сторонние библиотеки, используемые в проекте. |
PKGCONFIG |
Сторонние библиотеки, подключаемые с помощью pkg-config . |
QT |
Список модулей Qt, используемых в проекте. |
RESOURCES |
Список файлов ресурсов (.qrc), которые будут включены в окончательный проект. |
SOURCES |
Список файлов исходного кода, которые будут использоваться при создании проекта. |
TARGET |
Имя исполняемого файла для приложения, по умолчанию используется имя файла проекта |
TEMPLATE |
Шаблон для использования в проекте, определяет, будет ли вывод процесса сборки приложением, библиотекой или плагином |
TRANSLATIONS |
Файлы переводов. |
VPATH |
Путь для поиска файлов. |
Операторы
Оператор = присваивает значение переменной:
TARGET = ru.auroraos.MyApp
Команда перезапишет любые значения, ранее установленные для TARGET
.
Оператор += добавляет новое значение в список значений переменной:
DISTFILES += USE_MY_STUFF
Оператор -= удаляет значение из списка значений в переменной:
DISTFILES -= USE_MY_STUFF
Оператор *= добавляет значение в список значений в переменной, но только если оно ещё не присутствует:
DISTFILES *= USE_MY_STUFF
Оператор ~= заменяет любые значения, которые соответствуют регулярному выражению с указанным значением:
DISTFILES ~= s/QT_[DT].+/QT
Любые значения в списке, начинающиеся с QT_D
или QT_T
, заменяются QT
.
Шаблоны проектов
Переменная TEMPLATE
используется для определения типа проекта, который будет собран.
Если она не объявлена в файле проекта, qmake предполагает, что должно быть создано приложение.
Основные типы проектов:
app
(по умолчанию) — приложение;lib
— библиотека;subdirs
— проект с поддиректориями, заданными с помощью переменной SUBDIRS. Каждый подкаталог должен содержать свой собственный файл проекта.
При использовании шаблона lib
в переменную CONFIG
можно добавить следующие параметры,
чтобы определить тип созданной библиотеки:
dll
— библиотека является общей библиотекой;staticlib
— библиотека представляет собой статическую библиотеку;plugin
— библиотека — это плагин.
Проект testcase
— это проект приложения, предназначенный для запуска в качестве
автоматизированного теста.
Любой проект может быть помечен как тестовый добавлением testcase
к переменной CONFIG
.
Подключение модулей Qt
Переменная QT используется для добавления в проект необходимых Qt-модулей. Например, можно подключить модули XML и Network следующим образом:
QT += network xml
QT включает модули core
и gui
по умолчанию, поэтому вышеприведённое объявление добавляет
к этому списку ещё два пункта.
Следующее присваивание исключает модули по умолчанию и приводит к ошибкам при компиляции
исходного кода приложения:
QT = network xml # Это опустит модули core и gui
Если требуется создать проект без модуля gui
, нужно исключить его с помощью оператора -=:
QT -= gui # Используется только основной модуль core
Список доступных в ОС Аврора Qt-модулей находится в статье о допустимых зависимостях.
Подключение других библиотек
Если в проекте используются другие библиотеки в дополнение к тем, которые поставляются с Qt, их необходимо указать в файле проекта.
Пути, по которым qmake ищет библиотеки для сопоставления, могут быть добавлены в список значений
в переменной LIBS
.
Можно указать пути к библиотекам или использовать нотацию в стиле Unix
для указания библиотек и путей.
Например, можно указать библиотеку opencv
:
LIBS += -L$$OUT_PWD/../libs/opencv/lib -lopencv_core -lopencv_imgproc
Пути, содержащие заголовочные файлы, также могут быть указаны аналогичным образом
с помощью переменной INCLUDEPATH
:
INCLUDEPATH += \
$$PWD/../libs/opencv/modules/core/include \
$$PWD/../libs/opencv/modules/imgproc/include \
$$OUT_PWD/../libs/opencv \
Полный пример подключения и использования opencv можно найти в DocumentScanner.
Список доступных в ОС Аврора сторонних библиотек находится в статье о допустимых зависимостях.
Чтобы зависимости проекта были установлены автоматически перед установкой приложения,
следует их указать в spec-файле в секции Requires
и/или BuildRequires
.
Пример pro-файла по умолчанию
При создании проекта с названием MyApp автоматически будет сгенерирован следующий pro-файл:
TARGET = ru.auroraos.MyApp
CONFIG += \
auroraapp
PKGCONFIG += \
SOURCES += \
src/main.cpp \
HEADERS += \
DISTFILES += \
rpm/ru.auroraos.MyApp.spec \
AUTHORS.md \
CODE_OF_CONDUCT.md \
CONTRIBUTING.md \
LICENSE.BSD-3-CLAUSE.md \
README.md \
AURORAAPP_ICONS = 86x86 108x108 128x128 172x172
CONFIG += auroraapp_i18n
TRANSLATIONS += \
translations/ru.auroraos.MyApp.ts \
translations/ru.auroraos.MyApp-ru.ts \
В TARGET
содержится название приложения и организации.
С помощью CONFIG
подключается библиотека Libauroraapp.
В SOURCES
указывается путь к стартовой точке приложения.
В DISTFILES
указываются дополнительные файлы приложения, в том числе конфигурационный
spec-файл.
AURORAAPP_ICONS
содержит имена каталогов в каталоге icons, где находятся иконки.
TRANSLATIONS
содержит пути к файлам с переводами.
Подключение каталога в проект
Если проект содержит каталог с дополнительными файловыми ресурсами, его тоже следует подключить с помощью qmake.
В pro-файл проекта помещается код, указывающий исходное расположение каталога и его будущий каталог при установке приложения на устройстве. Пример:
new_folder.files = new_folder/*
new_folder.path = /usr/share/$${TARGET}/new_folder
INSTALLS += new_folder
OTHER_FILES += new_folder/*
В переменной new_folder.files
указывается путь к каталогу в проекте.
В переменной new_folder.path
указывается путь, по которому каталог вместе с содержимым будет размещён
на устройстве.
Примеры использования переменных
Пример подключения заголовочных файлов:
HEADERS += \
src/applicationcontroller.h \
src/applicationservice.h \
src/notificationsmodel.h \
Символ \
здесь и в других примерах ставится в конце каждой строки многострочной команды.
Символ /
используется в качестве разделителя имён каталогов и файлов в qmake, как и в остальном Qt.
Пример подключения сторонних библиотек через pkg-config
:
PKGCONFIG += \
pushclient \
nemonotifications-qt5 \
Пример объявления собственных констант через DEFINES
:
DEFINES += \
DBUS_SERVICE=\\\"ru.auroraos.PushReceiver\\\" \
DBUS_PATH=\\\"/ru/auroraos/PushReceiver\\\" \
DBUS_INTERFACE=\\\"ru.auroraos.PushReceiver\\\" \
APP_ID_FILE_PATH=\\\"$${APP_ID_PATH}/$${APP_ID_FILE}\\\" \
Первые три строки примера приведены из проекта PushReceiver
,
доступного в примерах приложений в Аврора IDE.
Пример указания пути для целевого исполняемого файла:
DESTDIR = ../../lib
Символ ..
обозначает движение к родительскому каталогу от текущего.
Текущий каталог для начала отсчёта — каталог, где находится данный pro-файл,
обычно это корневой каталог проекта.
Пример подключения qrc-файла:
RESOURCES += qml.qrc
Пример указания каталогов для поиска зависимостей:
DEPENDPATH += ../mylib
Пример указания пути для поиска файлов:
VPATH += res/myfiles
Структура проекта qmake
qmake как систему сборки можно выбрать при создании проекта из шаблона в окне Система сборки.
В результате в директории проекта будет создана следующая файловая структура:
.
├── icons
│ ├── 108x108
│ │ └── ru.template.{Имя_проекта}.png
│ ├── 128x128
│ │ └── ru.template.{Имя_проекта}.png
│ ├── 172x172
│ │ └── ru.template.{Имя_проекта}.png
│ └── 86x86
│ └── ru.template.{Имя_проекта}.png
├── qml
│ ├── cover
│ │ └── DefaultCoverPage.qml
│ ├── icons
│ │ └── {Имя_проекта}.svg
│ ├── pages
│ │ ├── AboutPage.qml
│ │ └── MainPage.qml
│ └── {Имя_проекта}.qml
├── rpm
│ ├── ru.template.{Имя_проекта}.changes.in
│ ├── ru.template.{Имя_проекта}.changes.run.in
│ └── ru.template.{Имя_проекта}.spec
├── ru.template.{Имя_проекта}.desktop
├── ru.template.{Имя_проекта}.pro
├── ru.template.{Имя_проекта}.pro.user
├── src
│ └── main.cpp
└── translations
├── ru.template.{Имя_проекта}-ru.ts
└── ru.template.{Имя_проекта}.ts