Расширенное использование
Добавление новых функций конфигурации
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_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-5.15/qmake-advanced-usage.html