Переменные в qmake

Название «qmake» несколько вводит в заблуждение, т.к. сам qmake ничего не билдит, он только подготавливает сборку под конкретный тулчейн. Идея заключается в том, чтобы на основании одного файла проекта qmake (*.pro) можно было автоматически создать необходимый makefile или его аналог для каждого сочетания платформы и компилятора; дальше проект собирается уже средствами конкретного тулчейна.

Под Windows qmake «из коробки» умеет делать makefile под Visual C++ от 2005 до 2012 и под MinGW (это то, что я пробовал), а также под Cygwin и Intel C++ Compiler (а в эти края я не гулял). Также помимо makefile qmake может создавать родные проекты для Viusal Sudio, но лично я эту фичу никогда не использовал и не знаю, насколько она рабочая; в дальнейшем я рассматриваю только вариант с makefile.

Makefile создается на основании значений ряда переменных, которые явно или неявно определяются в .pro файле. Смысл предопределенных переменных — это тема дальнейших заметок, а пока рассмотрим базовый синтаксис файла проекта qmake, т.е. — работу с переменными.

Синтаксис объявления переменных

Имя переменной — обычный идентификатор, регистр имеет значение. Объявляются переменные неявно, с помощью присваивания значения.

По смыслу, значение переменной — это не одно цельное значение, а список значений, разделенных пробелами. При этом количество пробелов между значениями в списке роли не играет (они сжимаются при парсинге в один пробел), также как не играют роли и пробелы в начале и в конце списка значений (они отбрасываются). Если значение содержит пробелы, то его нужно заключить в двойные кавычки. Если это значение — имя файла, то дважды подумайте, нужны ли вам эти грабли; если возможно, откажитесь от использования пробелов в именах файлов и путях к ним. Лично у меня именно так и сделано, и все мои скрипты, которые будут в последующих заметках, предполагают имена файлов без пробелов и я не обещаю, что с пробелами они будут работать. Из этой же оперы совет: оставайтесь в ASCII, с русскими буквами в .pro будут проблемы, причем не только в именах файлов.

В списке значений можно использовать значения других переменный с помощью оператора $$:

Список значений переменной должен быть в одной строке. Если хочется красоты, то можно заескейпить конец строки на сишный манер:

Аналогичным образом можно заескейпить специальные символы:

Символ # заескейпить нельзя. Чтобы указать в значении решетку, нужно использовать предопределенную переменную LITERAL_HASH:

Также существуют не упомянутые в документации подобные переменные для $ (LITERAL_DOLLAR) и табуляции \t (LITERAL_WHITESPACE).

Очистить переменную можно несколькими способами:

Операции с переменными

Кроме простого присваивания qmake понимает также следующие операции:

На последнем операторе остановлюсь подробнее. Синтаксис выражения следующий: s/regexp поиска/на что меняется. Заменяется почему-то только первое найденное значение. Если и есть способ использовать matches (значения из круглых скобок в regexp) в подстановке, то он мне неизвестен. Таким образом, этот оператор имеет практическую пользу только для замены уникальных значений в списке.

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

«Объектная» нотация

В некоторых фичах qmake используется следующий паттерн, использующий нотацию наподобие обращения к полям объекта:

На самом деле никаких «объектов» в qmake нет, просто в имени переменной можно точку использовать.

Но паттерн выглядит симпатично, и его можно использовать в своих наработках. Для этого нужно уметь, зная имя «объекта», получить имя переменной-«поля», такая себе косвенная адресация:
Функция eval вначале раскрывает переданный параметр согласно синтаксису .pro файла (получится v = $$s.f1), а затем интерпретирует получившийся текст как часть .pro файла (в v запишется 10).

Цикл: qmake

  2 comments for “Переменные в qmake

  1. Павел
    25.07.2013 at 13:12

    В абзаце «Операции с переменными» для того, чтобы регулярное выражение делало замену рекурсивно можно попробовать написать: VAR ~= s/v5/vvv/g
    P.S. у меня сработало как надо.

Добавить комментарий