Spec-Zone.ru › Qt 5.11

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

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

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 (в корневом каталоге проекта)
  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 и ниоткуда больше.
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

Spec-Zone.ru

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