Spec-Zone.ru › Qt

Расширенное использование

Добавление новых функций конфигурации

qmake позволяет создавать собственные features , которые могут быть включены в файлы проекта путем добавления их имён в список значений, заданных переменной CONFIG. Функции представляют собой наборы пользовательских функций и определений в файлах .prf , которые могут находиться в одном из стандартных каталогов. Расположение этих каталогов определяется в нескольких местах, и qmake проверяет каждый из них в следующем порядке при поиске файлов .prf:

  1. В каталоге, указанном в переменной среды QMAKEFEATURES, которая содержит список каталогов, разделенных разделителем списка путей платформы (двоеточие для Unix, точка с запятой для Windows).
  2. В каталоге, указанном в переменной свойства QMAKEFEATURES, которая содержит список каталогов, разделенных разделителем списка путей платформы.
  3. В каталоге features, находящемся внутри каталога mkspecs . Каталоги mkspecs могут быть расположены в любом из каталогов, указанных в переменной среды QMAKEPATH, которая содержит список каталогов, разделенных разделителем списка путей платформы. Например: $QMAKEPATH/mkspecs/<features>.
  4. В каталоге features, расположенном под каталогом, указанным в переменной среды QMAKESPEC. Например: $QMAKESPEC/<features>.
  5. В каталоге features, расположенном в каталоге data_install/mkspecs . Например: data_install/mkspecs/<features>.
  6. В каталоге features, который является соседним каталогом с каталогом, указанным в переменной среды QMAKESPEC . Например: $QMAKESPEC/../<features>.

Следующие каталоги features просматриваются на наличие файлов с функциями:

  1. features/unix, features/win32, или features/macx, в зависимости от используемой платформы
  2. features/

Например, рассмотрим следующее присваивание в файле проекта:

CONFIG += myfeatures

С этим добавлением в переменную CONFIG, qmake будет искать указанные выше места расположения для файла myfeatures.prf после завершения анализа вашего файла проекта. В системах Unix он будет искать следующий файл:

  1. $QMAKEFEATURES/myfeatures.prf (для каждого каталога, указанного в переменной среды QMAKEFEATURES)
  2. $$QMAKEFEATURES/myfeatures.prf (для каждого каталога, указанного в переменной свойства QMAKEFEATURES)
  3. myfeatures.prf (в корневом каталоге проекта). Корень проекта определяется верхним файлом .pro. Однако, если вы поместите файл .qmake.cache в подкаталог или каталог подпроекта, корнем проекта станет сам подкаталог.
  4. $QMAKEPATH/mkspecs/features/unix/myfeatures.prf и $QMAKEPATH/mkspecs/features/myfeatures.prf (для каждого каталога, указанного в переменной среды QMAKEPATH)
  5. $QMAKESPEC/features/unix/myfeatures.prf и $QMAKESPEC/features/myfeatures.prf
  6. data_install/mkspecs/features/unix/myfeatures.prf и data_install/mkspecs/features/myfeatures.prf
  7. $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. Соответствующие команды для других платформ могут быть определены с помощью других правил scope.

Команды, указанные в члене 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_existing_only Каждая зависимость, являющаяся результатом .depend_command, проверяется на существование. Несуществующие зависимости игнорируются. Это значение было добавлено в Qt 5.13.2.
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-6.2/qmake-advanced-usage.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API