qmake: ветвление и циклы

qmake позволяет писать навороченные скрипты, средства для этого есть.

Ветвление

В самом простом случае проверка выполнения некоторого условия (в документации именуется scopes) выглядит следующим образом:

То, что внутри, отработает только в том случае, если scope истинно. В качестве scope может выступать:

  • mkspecs: названия доступных конфигураций qmake по сочетаниям платформа-компилятор, выглядят как win32-msvc2008, macx-g++42 или wince60standard-armv4i-msvc2005. Могут указываться в виде grep масок (? и *). Подробнее о mkspecs я еще расскажу.
  • Платформа: win32, unix, macx. Она косвенно определяется через mkspecs.
  • Значения из специальной переменной CONFIG (которые являются именами фич, они же features). Об этом я тоже потом подробно расскажу. Для них тоже можно использовать маски, хотя практической пользы от этого немного.
  • Встроенные условные функции.
  • Пользовательские условные функции.
  • build_pass. Об этой затычке я расскажу позже, когда буду ругать режим debug_and_release.

Примеры:

Если условие нужно только на одну строку, то можно записать scope в сокращенном варианте, через двоеточие. Например:

Вложенные условия тоже можно сокращать:

Фактически, двоеточие работает как логическое И. Логическое ИЛИ тоже присутствует и в более привычном для сишников виде, равно как и отрицание:

Чтобы в одном условии объединить И и ИЛИ, нужны скобки. Их предоставляет конструкция if. Вот пример, взятый из документации:

Также в синтаксисе ветвления присутствует else, причем даже в виде, напоминающем else-if:

Цикл for

Цикл выполняется для каждого значения в переменной:

Пример: директории из списка EXTRAS добавляются в SUBDIRS, если они существуют.

Обратите внимание: вторым параметром в цикле for может быть только имя переменной.

Даже ошибки не выдается, тело цикла просто не выполнится ни разу.

Существуют аналоги сишных операторов continue и break, это функции next() и break():

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

Цикл: qmake

  1 comment for “qmake: ветвление и циклы

  1. Сергей Никонов
    08.04.2014 at 12:47

    Хочу добавить, что для использования самодельных условий создавать «фичи» не обязательно, достаточно написать
    CONFIG *= my_condition
    my_condition : DEFINES *= BLA_BLA_BLA
    и условие отработает.

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