Spec-Zone.ru › Qt 5.13

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

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

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. Соответствующие команды для других платформ могут быть определены с помощью других правил области.

Команды, указанные в 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

Spec-Zone.ru

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