Тестирующие функции
Тестирующие функции возвращают булево значение, которое можно проверить в условных частях областей. Тестирующие функции можно разделить на встроенные функции и библиотеки функций.
См. также Функции замены.
Встроенные тестирующие функции
Базовые тестирующие функции реализованы как встроенные функции.
cache(variablename, [set|add|sub] [transient] [super|stash], [source variablename])
Это внутренняя функция, которой обычно не нужно пользоваться.
Эта функция была добавлена в Qt 5.0.
CONFIG(config)
Эта функция может быть использована для проверки переменных, помещенных в переменную CONFIG. Это то же самое, что и области, но с дополнительным преимуществом: можно передать второй параметр для проверки активной конфигурации. Поскольку порядок значений важен в переменных CONFIG, (то есть, последнее заданное значение будет считаться активной конфигурацией для взаимно исключающих значений), второй параметр может быть использован для указания набора значений, которые необходимо учитывать. Например:
CONFIG = debug CONFIG += release CONFIG(release, debug|release):message(Release build!) #will print CONFIG(debug, debug|release):message(Debug build!) #no print
Поскольку release считается активным значением (для анализа возможностей) он будет использоваться в CONFIG для генерации файла сборки. В большинстве случаев второй параметр не нужен, но для проверки взаимно исключающих конфигураций он является незаменимым.
contains(variablename, value)
Успешно выполняется, если переменная variablename содержит значение value; в противном случае завершается неудачей. Возможна передача регулярного выражения для параметра value.
Вы можете проверить возвращаемое значение этой функции с помощью области.
Например:
contains( drivers, network ) {
# drivers contains 'network'
message( "Configuring for network build..." )
HEADERS += network.h
SOURCES += network.cpp
} Содержимое области обрабатывается только в том случае, если переменная drivers содержит значение network. В этом случае соответствующие файлы добавляются в переменные SOURCES и HEADERS.
count(variablename, number)
Успешно выполняется, если переменная variablename содержит список с указанным количеством number значений; в противном случае завершается неудачей.
Эта функция используется для обеспечения того, чтобы объявления внутри области обрабатывались только в том случае, если переменная содержит правильное количество значений. Например:
options = $$find(CONFIG, "debug") $$find(CONFIG, "release")
count(options, 2) {
message(Both release and debug specified.)
} debug(level, message)
Проверяет, выполняется ли qmake на указанном уровне отладки. Если да, возвращает true и выводит сообщение отладки.
defined(name[, type])
Проверяет, определена ли функция или переменная name. Если type опущено, проверяются все функции. Чтобы проверить только переменные или определённый тип функций, укажите type. Может принимать следующие значения:
-
testпроверяет только тестирующие функции -
replaceпроверяет только функции замены -
varпроверяет только переменные
equals(variablename, value)
Проверяет, равна ли variablename строке value.
Например:
TARGET = helloworld
equals(TARGET, "helloworld") {
message("The target assignment was successful.")
} error(string)
Эта функция никогда не возвращает значение. qmake отображает string как сообщение об ошибке пользователю и завершает работу. Эта функция должна использоваться только для невосстановимых ошибок.
Например:
error(An error has occurred in the configuration process.)
eval(string)
Вычисляет содержимое строки с использованием правил синтаксиса qmake и возвращает true. В строке можно использовать определения и присваивания для изменения значений существующих переменных или создания новых определений.
Например:
eval(TARGET = myapp) {
message($$TARGET)
} Примечание: Кавычки могут быть использованы для ограничения строки, а возвращаемое значение можно игнорировать, если оно не требуется.
exists(filename)
Проверяет, существует ли файл с данным filename. Если файл существует, функция выполняется успешно; в противном случае — завершается неудачей. Если для имени файла указано регулярное выражение, эта функция выполняется успешно, если какой-либо файл соответствует указанному регулярному выражению.
Например:
exists( $(QTDIR)/lib/libqt-mt* ) {
message( "Configuring for multi-threaded Qt..." )
CONFIG += thread
} Примечание: "/" должен использоваться в качестве разделителя каталогов независимо от используемой платформы.
export(variablename)
Экспортирует текущее значение variablename из локального контекста функции в глобальный контекст.
for(iterate, list)
Начинает цикл, который перебирает все значения в list, устанавливая iterate в каждое значение по очереди. Для удобства, если list равно 1..10, iterate будет перебирать значения от 1 до 10.
Например:
LIST = 1 2 3
for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!) greaterThan(variablename, value)
Проверяет, что значение variablename больше, чем value. Сначала эта функция пытается выполнить числовое сравнение. Если хотя бы один из операндов не преобразуется в число, функция выполняет строковое сравнение.
Например:
ANSWER = 42
greaterThan(ANSWER, 1) {
message("The answer might be correct.")
} Невозможно напрямую сравнить два числа как строки. В качестве обходного пути, создайте временные значения с нечисловым префиксом и сравните их.
Например:
VALUE = 123
TMP_VALUE = x$$VALUE
greaterThan(TMP_VALUE, x456): message("Condition may be true.") См. также lessThan().
if(condition)
Вычисляет condition. Используется для группировки булевых выражений.
Например:
if(linux-g++*|macx-g++*):CONFIG(debug, debug|release) {
message("We are on Linux or Mac OS, and we are in debug mode.")
} include(filename)
Включает содержимое файла, указанного filename, в текущий проект в той точке, где оно включено. Эта функция успешно выполняется, если filename включено; в противном случае завершается неудачей. Включенный файл обрабатывается немедленно.
Вы можете проверить, был ли файл включен, используя эту функцию в качестве условия для области. Например:
include( shared.pri )
OPTIONS = standard custom
!include( options.pri ) {
message( "No custom build options specified" )
OPTIONS -= custom
} infile(filename, var, val)
Успешно выполняется, если файл filename (когда он анализируется самим qmake) содержит переменную var со значением val; в противном случае завершается неудачей. Если вы не указали val, функция проверяет, была ли переменной var присвоена в файле.
isActiveConfig
Это псевдоним функции CONFIG.
isEmpty(variablename)
Успешно выполняется, если переменная variablename пуста; в противном случае завершается неудачей. Это эквивалентно count( variablename, 0 ).
Например:
isEmpty( CONFIG ) {
CONFIG += warn_on debug
} isEqual
Это псевдоним функции equals.
lessThan(variablename, value)
Проверяет, что значение variablename меньше, чем value. Работает как greaterThan().
Например:
ANSWER = 42
lessThan(ANSWER, 1) {
message("The answer might be wrong.")
} load(feature)
Загружает файл с функцией (.prf) по указанию feature, если функция ещё не загружена.
log(message)
Выводит сообщение на консоль. В отличие от функции message, не добавляет текст в начало или разрыв строки в конце.
Эта функция была добавлена в Qt 5.0.
См. также message().
message(string)
Всегда выполняется успешно и отображает string как общее сообщение пользователю. В отличие от функции error(), эта функция позволяет продолжить обработку.
message( "This is a message" )
Вышеприведённая строка выводит "Это сообщение" на консоль. Использование кавычек необязательно, но рекомендуется.
Примечание: По умолчанию сообщения выводятся для каждого файла Makefile, сгенерированного qmake для данного проекта. Если вы хотите убедиться, что сообщения отображаются только один раз для каждого проекта, проверьте переменную build_pass в сочетании с областью, чтобы отфильтровать сообщения во время сборки. Например:
!build_pass:message( "This is a message" )
mkpath(dirPath)
Создаёт путь к каталогу dirPath. Эта функция является обёрткой вокруг функции QDir::mkpath.
Эта функция была добавлена в Qt 5.0.
requires(condition)
Вычисляет condition. Если условие ложно, qmake пропускает этот проект (и его SUBDIRS) при сборке.
Примечание: Вы также можете использовать переменную REQUIRES для этой цели. Однако мы рекомендуем использовать эту функцию вместо неё.
system(command)
Выполняет заданную command в вторичной оболочке. Успешно выполняется, если команда завершается с нулевым кодом выхода; в противном случае завершается неудачей. Вы можете проверить возвращаемое значение этой функции с помощью области.
Например:
system("ls /bin"): HAS_BIN = TRUE См. также вариант замены system().
touch(filename, reference_filename)
Обновляет метку времени filename для соответствия метке времени reference_filename.
Эта функция была добавлена в Qt 5.0.
unset(variablename)
Удаляет variablename из текущего контекста.
Например:
NARF = zort
unset(NARF)
!defined(NARF, var) {
message("NARF is not defined.")
} versionAtLeast(variablename, versionNumber)
Проверяет, что номер версии из variablename больше или равен versionNumber. Номер версии рассматривается как последовательность неотрицательных десятичных чисел, разделенных точкой; любая нечисловая часть строки будет проигнорирована. Сравнение выполняется сегмент за сегментом слева направо; если одна версия является префиксом другой, она считается меньшей.
Эта функция была добавлена в Qt 5.10.
versionAtMost(variablename, versionNumber)
Проверяет, что номер версии из variablename меньше или равен versionNumber. Работает как versionAtLeast().
Эта функция была добавлена в Qt 5.10.
warning(string)
Всегда выполняется успешно и отображает string как предупреждение пользователю.
write_file(filename, [variablename, [mode]])
Записывает значения variablename в файл с именем filename, каждое значение в новой строке. Если variablename не указано, создаётся пустой файл. Если mode равно append и файл уже существует, он дописывается вместо перезаписи.
Эта функция была добавлена в Qt 5.0.
Библиотека тестирующих функций
Сложные тестирующие функции реализованы в библиотеке файлов .prf.
packagesExist(packages)
Использует механизм PKGCONFIG для определения наличия указанных пакетов на этапе разбора проекта.
Это может быть полезно для опциональной активации или деактивации функций. Например:
packagesExist(sqlite3 QtNetwork QtDeclarative) {
DEFINES += USE_FANCY_UI
} А затем, в коде:
#ifdef USE_FANCY_UI
// Use the fancy UI, as we have extra packages available
#endif prepareRecursiveTarget(target)
Обеспечивает создание целевых задач для всего проекта, аналогичных целевой задаче install, подготавливая задачу, которая итерируется по всем подкаталогам. Например:
TEMPLATE = subdirs SUBDIRS = one two three prepareRecursiveTarget(check)
Подкаталоги, в которых указаны have_no_default или no_<target>_target в их файле .CONFIG, исключаются из этой задачи:
two.CONFIG += no_check_target
Вы должны вручную добавить подготовленную целевую задачу в QMAKE_EXTRA_TARGETS:
QMAKE_EXTRA_TARGETS += check
Чтобы сделать задачу глобальной, код выше необходимо включить в каждый подпроект в подкаталоге. Кроме того, чтобы эти задачи выполняли какие-либо действия, подпроекты, не являющиеся подкаталогами, должны включать соответствующий код. Самый простой способ достижения этого — создание файла пользовательской функции. Например:
# <project root>/features/mycheck.prf
equals(TEMPLATE, subdirs) {
prepareRecursiveTarget(check)
} else {
check.commands = echo hello user
}
QMAKE_EXTRA_TARGETS += check Файл функции необходимо внедрить в каждый подпроект, например, с помощью .qmake.conf:
# <project root>/.qmake.conf CONFIG += mycheck
Эта функция была добавлена в Qt 5.0.
qtCompileTest(test)
Создаёт проект теста. Если тест пройден, возвращается true и config_<test> добавляется к переменной CONFIG. В противном случае возвращается false.
Для использования этой функции необходимо загрузить соответствующий файл функции:
# <project root>/project.pro load(configure)
Это также устанавливает переменную QMAKE_CONFIG_TESTS_DIR в подкаталог config.tests родительского каталога проекта. Это значение можно переопределить после загрузки файла функции.
Внутри каталога тестов должен быть один подкаталог на тест, содержащий простой проект qmake. Следующий фрагмент кода иллюстрирует файл .pro проекта:
# <project root>/config.tests/test/test.pro SOURCES = main.cpp LIBS += -ltheFeature # Note that the test project is built without Qt by default.
Следующий фрагмент кода иллюстрирует основной файл .cpp проекта:
// <project root>/config.tests/test/main.cpp
#include <TheFeature/MainHeader.h>
int main() { return featureFunction(); } Следующий фрагмент кода демонстрирует вызов теста:
# <project root>/project.pro qtCompileTest(test)
Если проект теста успешно скомпилирован, тест пройден.
Результаты теста автоматически кешируются, что делает их доступными для всех подпроектов. Поэтому рекомендуется запускать все тесты конфигурации в файле проекта верхнего уровня.
Чтобы подавить повторное использование кэшированных результатов, передайте CONFIG+=recheck в qmake.
См. также load().
Эта функция была добавлена в Qt 5.0.
qtHaveModule(name)
Проверяет, присутствует ли модуль Qt, указанный как name. Список возможных значений см. в QT.
Эта функция была добавлена в Qt 5.0.1.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qmake-test-function-reference.html