Расширенное использование
Добавление новых функций конфигурации
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(в корневом каталоге проекта). Корень проекта определяется верхним файлом.pro. Однако, если вы разместите файл.qmake.cacheв подкаталоге или каталоге подпроекта, корнем проекта станет сам подкаталог. -
$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 и ниоткуда больше. |
| dep_lines | Вывод из .depend_command интерпретируется как один файл на строку. По умолчанию используется разделение по пробелам, и эта функция сохранена только по соображениям обратной совместимости. |
| 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/qt-5.13/qmake-advanced-usage.html