Расширенное использование
Добавление новых функций конфигурации
qmake позволяет создавать собственные features , которые могут быть включены в файлы проекта, добавив их имена в список значений, заданных переменной CONFIG. Функции представляют собой наборы пользовательских функций и определений в файлах .prf , которые могут располагаться в одном из нескольких стандартных каталогов. Местоположения этих каталогов определяются в нескольких местах, и qmake проверяет каждый из них в следующем порядке, когда ищет файлы .prf:
- В каталоге, указанном в переменной среды
QMAKEFEATURES, которая содержит список каталогов, разделенных разделителем пути платформы (двоеточие для Unix, точка с запятой для Windows). - В каталоге, указанном в переменной свойства
QMAKEFEATURES, которая содержит список каталогов, разделенных разделителем пути платформы. - В каталоге features, расположенном внутри каталога
mkspecs. Каталогиmkspecsмогут быть расположены ниже любого из каталогов, указанных в переменной средыQMAKEPATH, которая содержит список каталогов, разделенных разделителем пути платформы. Например:$QMAKEPATH/mkspecs/<features>. - В каталоге features, расположенном ниже каталога, указанного в переменной среды QMAKESPEC. Например:
$QMAKESPEC/<features>. - В каталоге features, расположенном в каталоге
data_install/mkspecs. Например:data_install/mkspecs/<features>. - В каталоге features, расположенном как брат каталога, указанного в переменной среды
QMAKESPEC. Например:$QMAKESPEC/../<features>.
Ниже перечислены каталоги features, в которых ищутся файлы функций:
-
features/unix,features/win32, илиfeatures/macx, в зависимости от используемой платформы features/
Например, рассмотрим следующую запись в файле проекта:
CONFIG += myfeatures
С этим добавлением к переменной CONFIG qmake будет искать указанные выше расположения для файла myfeatures.prf после завершения парсинга файла проекта. На системах Unix он будет искать следующий файл:
-
$QMAKEFEATURES/myfeatures.prf(для каждого каталога, указанного в переменной средыQMAKEFEATURES) -
$$QMAKEFEATURES/myfeatures.prf(для каждого каталога, указанного в переменной свойстваQMAKEFEATURES) -
myfeatures.prf(в корневом каталоге проекта) -
$QMAKEPATH/mkspecs/features/unix/myfeatures.prfи$QMAKEPATH/mkspecs/features/myfeatures.prf(для каждого каталога, указанного в переменной средыQMAKEPATH) -
$QMAKESPEC/features/unix/myfeatures.prfи$QMAKESPEC/features/myfeatures.prf -
data_install/mkspecs/features/unix/myfeatures.prfиdata_install/mkspecs/features/myfeatures.prf -
$QMAKESPEC/../features/unix/myfeatures.prfи$QMAKESPEC/../features/myfeatures.prf
Примечание: Файлы .prf должны иметь имена в нижнем регистре.
Установка файлов
На Unix-системах часто используется инструмент сборки для установки приложений и библиотек, например, вызывая make install. По этой причине в qmake есть понятие install set, объекта, содержащего инструкции о том, как устанавливать часть проекта. Например, набор файлов документации можно описать следующим образом:
documentation.path = /usr/local/program/doc documentation.files = docs/*
Член path сообщает qmake, что файлы должны быть установлены в /usr/local/program/doc (член path), а член files указывает файлы, которые должны быть скопированы в каталог установки. В этом случае все содержимое каталога docs будет скопировано в /usr/local/program/doc.
После того, как набор установок будет полностью описан, его можно добавить в список установок, используя строку такого типа:
INSTALLS += documentation
qmake обеспечит копирование указанных файлов в каталог установки. Если вам требуется больший контроль над этим процессом, вы также можете предоставить определение для члена extra объекта. Например, следующая строка сообщает qmake выполнить серию команд для этого набора установок:
unix:documentation.extra = create_docs; mv master.doc toc.doc
Область unix scope гарантирует, что эти конкретные команды выполняются только на платформах Unix. Соответствующие команды для других платформ могут быть определены с использованием других правил области.
Команды, указанные в члене extra , выполняются перед выполнением инструкций в других членах объекта.
Если вы добавляете встроенный набор установок в переменную INSTALLS и не указываете члены files или extra, qmake определит, что нужно скопировать за вас. В настоящее время поддерживаются наборы установок target и dlltarget. Например:
target.path = /usr/local/myprogram INSTALLS += target
В приведенных выше строках qmake знает, что нужно скопировать, и автоматически выполнит процесс установки.
Добавление пользовательских целей
qmake пытается сделать все, что ожидается от инструмента кроссплатформенной сборки. Это часто не идеально, когда вам действительно нужно запустить особые зависящие от платформы команды. Это можно сделать, предоставив конкретные инструкции различным бэкендам qmake.
Настройка вывода Makefile выполняется с помощью API в стиле объекта, как и в других местах в qmake. Объекты определяются автоматически путем указания их членов. Например:
mytarget.target = .buildfile mytarget.commands = touch $$mytarget.target mytarget.depends = mytarget2 mytarget2.commands = @echo Building $$mytarget.target
Вышеуказанные определения определяют цель qmake под названием mytarget, содержащую цель Makefile под названием .buildfile, которая в свою очередь генерируется функцией touch(). Наконец, член .depends указывает, что mytarget зависит от mytarget2, другой цели, которая определяется позже. mytarget2 — это фиктивная цель. Она определена только для вывода текста в консоль.
Последний шаг — использование переменной QMAKE_EXTRA_TARGETS для указания qmake, что этот объект является целью для сборки:
QMAKE_EXTRA_TARGETS += mytarget mytarget2
Это все, что вам нужно сделать, чтобы фактически собрать пользовательские цели. Конечно, вы можете связать одну из этих целей с целью сборки qmake. Для этого просто включите вашу цель Makefile в список PRE_TARGETDEPS.
Спецификации пользовательских целей поддерживают следующие члены:
| Член | Описание |
|---|---|
| commands | Команды для генерации пользовательской цели сборки. |
| CONFIG | Конкретные параметры конфигурации для пользовательской цели сборки. Может быть установлено в recursive для указания создания правил в Makefile для вызова соответствующей цели внутри Makefile, специфичного для подцели. Этот член по умолчанию создает запись для каждой из подцелей. |
| depends | Существующие цели сборки, от которых зависит пользовательская цель сборки. |
| recurse | Указывает, какие подцели должны быть использованы при создании правил в Makefile для вызова в Makefile, специфичном для подцели. Этот член используется только когда recursive установлено в CONFIG. Типичные значения — «Debug» и «Release». |
| recurse_target | Указывает цель, которая должна быть собрана через Makefile подцели для правила в Makefile. Этот член добавляет что-то вроде $(MAKE) -f Makefile.[subtarget] [recurse_target]. Этот член используется только когда recursive установлено в CONFIG. |
| target | Имя пользовательской цели сборки. |
Добавление компиляторов
Можно настроить qmake для поддержки новых компиляторов и препроцессоров:
new_moc.output = moc_${QMAKE_FILE_BASE}.cpp
new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"
new_moc.input = NEW_HEADERS
QMAKE_EXTRA_COMPILERS += new_moc С приведенными выше определениями вы можете использовать прямой заменитель moc, если он доступен. Команда выполняется для всех аргументов, переданных переменной NEW_HEADERS (из члена input), а результат записывается в файл, определенный членом output. Этот файл добавляется к другим исходным файлам проекта. Кроме того, qmake выполнит depend_command для генерации информации о зависимостях и также добавит эту информацию в проект.
Спецификации пользовательских компиляторов поддерживают следующие члены:
| Член | Описание |
|---|---|
| commands | Команды, используемые для генерации выходных данных из входных. |
| CONFIG | Конкретные параметры конфигурации для пользовательского компилятора. См. таблицу CONFIG для получения подробной информации. |
| depend_command | Указывает команду, используемую для генерации списка зависимостей для выходных данных. |
| dependency_type | Указывает тип файла выходных данных. Если это известный тип (например, TYPE_C, TYPE_UI, TYPE_QRC), он обрабатывается как один из этих типов файлов. |
| depends | Указывает зависимости выходного файла. |
| input | Переменная, которая указывает файлы, которые должны быть обработаны пользовательским компилятором. |
| name | Описание того, что делает пользовательский компилятор. Это используется только в некоторых бэкендах. |
| output | Имя файла, созданного пользовательским компилятором. |
| output_function | Указывает пользовательскую функцию qmake, используемую для указания имени создаваемого файла. |
| variables | Указывает, что указанные здесь переменные заменяются $(QMAKE_COMP_VARNAME), когда на них ссылаются в файле pro как $(VARNAME). |
| variable_out | Переменная, в которую должны добавляться файлы, созданные из выходных данных. |
Член CONFIG поддерживает следующие параметры:
| Параметр | Описание |
|---|---|
| combine | Указывает, что все входные файлы объединяются в один выходной файл. |
| target_predeps | Указывает, что выходные данные должны быть добавлены в список PRE_TARGETDEPS. |
| explicit_dependencies | Зависимости выходных данных генерируются только из члена depends и ниоткуда больше. |
| no_link | Указывает, что выходные данные не должны добавляться в список объектов, которые должны быть связаны. |
Зависимости библиотек
Часто при линковке с библиотекой qmake полагается на базовую платформу, чтобы определить, от каких других библиотек зависит данная библиотека, и позволяет платформе подключать их. Однако во многих случаях этого недостаточно. Например, при статической линковке библиотеки к другим библиотекам не происходит линковка, и, следовательно, не создаются зависимости от этих библиотек. Однако приложение, которое позднее слинкуется с этой библиотекой, должно знать, где найти символы, необходимые статической библиотеке. qmake пытается отслеживать зависимости библиотеки, если это уместно, при явном включении отслеживания.
Первый шаг — включение отслеживания зависимостей в самой библиотеке. Для этого необходимо указать qmake, чтобы он сохранил информацию о библиотеке:
CONFIG += create_prl
Это актуально только для шаблона lib и будет проигнорировано для всех остальных. При включении этого параметра qmake создаст файл с расширением .prl, в котором будет сохранена метаинформация о библиотеке. Этот метафайл похож на обычный файл проекта, но содержит только внутренние объявления переменных. При установке этой библиотеки, указав её как цель в объявлении INSTALLS, qmake автоматически скопирует файл .prl в путь установки.
Второй шаг в этом процессе — включение чтения этой метаинформации в приложениях, использующих статическую библиотеку:
CONFIG += link_prl
При включении этого параметра qmake обработает все библиотеки, к которым слинковано приложение, и найдет их метаинформацию. qmake будет использовать это для определения соответствующей информации о линковке, в частности, добавляя значения в список DEFINES и LIBS файла проекта приложения. После обработки этого файла qmake просмотрит недавно добавленные библиотеки в переменной LIBS, найдет их зависимые файлы .prl и продолжит до тех пор, пока все библиотеки не будут разрешены. В этот момент Makefile создается в обычном режиме, и библиотеки явно слинкуются с приложением.
Файлы .prl должны создаваться только qmake и не должны передаваться между операционными системами, так как они могут содержать платформозависимую информацию.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qmake-advanced-usage.html