Spec-Zone.ru › Qt 5.12

Тестовые функции

Тестовые функции возвращают булево значение, которое можно проверить в условных частях областей видимости. Тестовые функции можно разделить на встроенные функции и библиотеки функций.

См. также Функции замены.

Встроенные тестовые функции

Основные тестовые функции реализованы как встроенные функции.

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 считается активным значением (для анализа функций), он будет использоваться для генерации файла сборки. В общем случае второй параметр не нужен, но для конкретных тестов взаимоисключающих значений он очень ценен.

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(тест)

Строит проект теста. Если тест проходит, возвращается 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(имя)

Проверяет, присутствует ли модуль 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.12/qmake-test-function-reference.html

Spec-Zone.ru

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