qmake: встроенные функции, часть 2

Консоль

Выдать сообщение на консоль (будет отображаться во вкладке Compiler Output в Qt Creator) можно с помощью функции message:

Если нужно завершить qmake с ошибкой, используйте error:

Как альтернативу error в некоторых можно использовать функцию requires. Эта функция получает один параметр — условие для проверки — и если оно не выполняется, вместо нормального Makefile генерируется заглушка, которая пишет что «модуль не найден».

Есть еще функция prompt, которая ждет ввода пользователя и возвращает его.

Польза от этой функции была бы сомнительна, даже если бы она работала в Qt Creator. А она не работает, Qt Creator не перенаправляет ввод в qmake.

В тему о выводе из qmake и make. По умолчанию, вывод очень подробный, для каждого компилируемого файла выводится вся командная строка со всеми параметрами и т.п. Если хочется более сжатого вывода, по строчке на обрабатываемый файл, можно включить тихий режим:

Имена файлов

Функции basename и dirname служат для разбора имени файла:

Для работы с путями qmake предоставляет несколько полезных функций:

Функция files возвращает список всех найденных по маске файлов:

Работа с файлами

Проверить, существует ли файл или каталог, можно с помощью exists:

Создать каталог можно с помощью функции mkpath. Если каталог уже существует, ошибки не будет.

Функция cat читает текстовый файл и сохраняет его в переменную. Какая при этом используется кодировка — не разбирался детально. Точно не UTF-8, а раз так, то лучше ограничиваться ANSI.

Функция write_file позволяет создать файл и записать в него значение переменной:

Функция touch устанавливает время модификации файла (первый параметр) равным времени модификации другого файла (второй параметр):

Shell

Самый мощный способ расширить qmake, по сути, чем угодно — это вызвать из него внешнюю программу. Для этого служит функция system в разных своих проявлениях:

Обращаю ваше внимание: system выполняется во время выполнения qmake, а не make! Это различие очень важно. Qt Creator при построении проекта запускает make, а не qmake, как можно было бы подумать. Если .pro файл не поменялся (явно или неявно через свои зависимости вроде фич), то qmake при этом запущен не будет! Имейте это в виду. Если вы хотите, чтобы некоторое действие выполнялось при любом построении проекта, вам нужно менять Makefile. О том, как это можно сделать, я расскажу в дальнейших постах.

«Мета-qmake»

В qmake есть несколько функций (eval, infile, fromfile), которые позволяют интерпретировать произвольный текст как часть .pro файла, причем этот текст может формироваться динамически. Я не особо игрался с ними, так как, по-моему, это уже слишком сложно и подобные задачи удобнее решаются другими средствами. Единственное применение, которое я нашел полезным — это использование функции eval для доступа к переменным по динамически генерируемым именам.

Функция eval вначале вычисляет параметр, а потом интерпретирует его как код в синтаксисе qmake и выполняет его.

Функции infile и fromfile позволяют обращаться к переменным, определенным в других файлах синтаксиса qmake. Первая функция позволяет проверить, равна ли некоторая переменная некоторому значению, а вторая — получить это значение. При этом, заметьте, указанный файл выполняется по правилам qmake.

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

Цикл: qmake