Тестовые функции
Тестовые функции возвращают булево значение, которое можно проверить в условных частях областей видимости. Тестовые функции можно разделить на встроенные функции и библиотеки функций.
См. также Функции замены.
Встроенные тестовые функции
Базовые тестовые функции реализованы как встроенные функции.
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
Поскольку релиз считается активным значением (для анализа возможностей), он будет использоваться как 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-6.0/qmake-test-function-reference.html