Spec-Zone.ru › Qt 5.6

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

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

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.6/qmake-advanced-usage.html

Spec-Zone.ru

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