Spec-Zone.ru › Qt 5.9

Язык qmake

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

Операторы

Во многих файлах проекта можно использовать операторы присваивания (=) и добавления (+=) для включения всей информации о проекте. Типичный способ использования заключается в присвоении списка значений переменной и добавлении дополнительных значений в зависимости от результата различных проверок. Поскольку qmake определяет некоторые переменные с использованием значений по умолчанию, иногда необходимо использовать оператор удаления (-=) для фильтрации не требуемых значений. В следующих разделах описывается использование операторов для изменения содержимого переменных.

Присваивание значений

Оператор = присваивает значение переменной:

TARGET = myapp

В приведенной строке переменная TARGET устанавливается в значение myapp. Это перезапишет любые ранее заданные значения для TARGET на myapp.

Добавление значений

Оператор += добавляет новое значение в список значений переменной:

DEFINES += USE_MY_STUFF

В приведенной строке USE_MY_STUFF добавляется в список препроцессорных определений, которые должны быть включены в сгенерированный файл Makefile.

Удаление значений

Оператор -= удаляет значение из списка значений переменной:

DEFINES -= USE_MY_STUFF

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

Добавление уникальных значений

Оператор *= добавляет значение в список значений переменной, но только если оно еще не присутствует. Это предотвращает многократное включение значений в переменную. Например:

DEFINES *= USE_MY_STUFF

В приведенной строке USE_MY_STUFF будет добавлено в список препроцессорных определений только в том случае, если оно еще не определено. Обратите внимание, что функция unique() также может использоваться для обеспечения того, что переменная содержит только по одному экземпляру каждого значения.

Замена значений

Оператор ~= заменяет все значения, которые соответствуют регулярному выражению, указанным значением:

DEFINES ~= s/QT_[DT].+/QT

В приведенной строке все значения в списке, начинающиеся с QT_D или QT_T, заменяются на QT.

Расширение переменных

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

EVERYTHING = $$SOURCES $$HEADERS
message("The project contains the following files:")
message($$EVERYTHING)

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

Для получения содержимого значения переменной среды при выполнении qmake используйте оператор $$(...):

DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)

В приведенном присвоении значение переменной среды PWD считывается при обработке файла проекта.

Для получения содержимого значения переменной среды в момент обработки сгенерированного файла Makefile используйте оператор $(...):

DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)

DESTDIR = $(PWD)
message(The project will be installed in the value of PWD)
message(when the Makefile is processed.)

В приведенном присвоении значение PWD считывается сразу при обработке файла проекта, но $(PWD) присваивается DESTDIR в сгенерированном файле Makefile. Это делает процесс сборки более гибким, пока переменная среды установлена правильно при обработке Makefile.

Доступ к свойствам qmake

Специальный оператор $$[...] может использоваться для доступа к свойствам qmake:

message(Qt version: $$[QT_VERSION])
message(Qt is installed in $$[QT_INSTALL_PREFIX])
message(Qt resources can be found in the following locations:)
message(Documentation: $$[QT_INSTALL_DOCS])
message(Header files: $$[QT_INSTALL_HEADERS])
message(Libraries: $$[QT_INSTALL_LIBS])
message(Binary files (executables): $$[QT_INSTALL_BINS])
message(Plugins: $$[QT_INSTALL_PLUGINS])
message(Data files: $$[QT_INSTALL_DATA])
message(Translation files: $$[QT_INSTALL_TRANSLATIONS])
message(Settings: $$[QT_INSTALL_CONFIGURATION])
message(Examples: $$[QT_INSTALL_EXAMPLES])

Дополнительную информацию см. в разделе Настройка qmake.

Свойства, доступные с помощью этого оператора, обычно используются для включения сторонних плагинов и компонентов в Qt. Например, плагин Qt Designer можно установить вместе со встроенными плагинами Qt Designer, если в его файле проекта сделать следующее объявление:

target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target

Области видимости

Области видимости похожи на операторы if в процедурных языках программирования. Если определенное условие выполняется, объявления внутри области видимости обрабатываются.

Синтаксис области видимости

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

<condition> {
    <command or definition>
    ...
}

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

Области видимости и условия

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

win32 {
    SOURCES += paintwidget_win.cpp
}

Приведенный код добавит файл paintwidget_win.cpp в список исходных файлов, перечисленных в сгенерированном файле Makefile при сборке для платформы Windows. При сборке для других платформ это определение будет проигнорировано.

Условиям, используемым в данной области видимости, также можно присвоить отрицание, чтобы предоставить альтернативный набор объявлений, которые будут обрабатываться только в том случае, если исходное условие ложно. Например, для обработки чего-либо при сборке на всех платформах кроме Windows, отрицайте область видимости так:

!win32 {
    SOURCES -= paintwidget_win.cpp
}

Области видимости могут быть вложены для объединения нескольких условий. Например, чтобы включить определенный файл для определенной платформы только в том случае, если включено отладка, напишите следующее:

macx {
    CONFIG(debug, debug|release) {
        HEADERS += debugging.h
    }
}

Чтобы избежать написания многих вложенных областей видимости, вы можете вложить области видимости с помощью оператора :. Вложенные области видимости в приведенном примере можно переписать следующим образом:

macx:CONFIG(debug, debug|release) {
    HEADERS += debugging.h
}

Вы также можете использовать оператор : для выполнения условных присваиваний в одной строке. Например:

win32:DEFINES += USE_MY_STUFF

В приведенной строке USE_MY_STUFF добавляется к переменной DEFINES только при сборке для платформы Windows. В целом, оператор : ведет себя как оператор логического И, объединяющий ряд условий, и требует, чтобы все они были истинными.

Также есть оператор | для работы как оператора логического ИЛИ, объединяя ряд условий и требуя истинности только одного из них.

win32|macx {
    HEADERS += debugging.h
}

Вы также можете предоставить альтернативные объявления тем, которые находятся внутри области видимости, используя область видимости else. Каждая область видимости else обрабатывается, если условия для предыдущих областей видимости ложны. Это позволяет вам писать сложные проверки в сочетании с другими областями видимости (разделенными оператором : как показано выше). Например:

win32:xml {
    message(Building for Windows)
    SOURCES += xmlhandler_win.cpp
} else:xml {
    SOURCES += xmlhandler.cpp
} else {
    message("Unknown configuration")
}

Конфигурация и области видимости

Значения, хранящиеся в переменной CONFIG, специально обрабатываются qmake. Каждое из возможных значений может использоваться в качестве условия для области видимости. Например, список значений, содержащихся в CONFIG, можно расширить значением opengl:

CONFIG += opengl

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

opengl {
    TARGET = application-gl
} else {
    TARGET = application
}

Эта функция упрощает изменение конфигурации проекта без потери всех пользовательских настроек, которые могут потребоваться для определенной конфигурации. В приведенном коде объявления в первой области видимости обрабатываются, и окончательный исполняемый файл будет называться application-gl. Однако, если opengl не указано, вместо этого обрабатываются объявления во второй области видимости, и окончательный исполняемый файл будет называться application.

Поскольку можно вводить свои собственные значения в строке CONFIG, это предоставляет удобный способ настройки файлов проекта и тонкой настройки сгенерированных файлов Make.

Значения области видимости платформы

В дополнение к значениям win32, macx, и unix, используемым во многих условиях области видимости, можно проверить различные другие встроенные значения, специфичные для платформы и компилятора, с областями видимости. Они основаны на спецификациях платформы, предоставленных в каталоге mkspecs Qt. Например, следующие строки из файла проекта показывают используемую спецификацию и проверяют спецификацию linux-g++:

message($$QMAKESPEC)

linux-g++ {
    message(Linux)
}

Вы можете проверить любую другую комбинацию платформ и компиляторов, если для нее существует спецификация в каталоге mkspecs.

Переменные

Многие переменные, используемые в файлах проектов, являются специальными переменными, которые qmake использует при генерации файлов Make, такими как DEFINES, SOURCES и HEADERS. Кроме того, вы можете создавать переменные для собственного использования. qmake создает новые переменные с заданным именем при обнаружении присваивания этому имени. Например:

MY_VARIABLE = value

Нет ограничений на то, что вы делаете со своими переменными, так как qmake проигнорирует их, если не потребуется их вычисление при обработке области видимости.

Вы также можете присвоить значение текущей переменной другой переменной, добавив $$ перед именем переменной. Например:

MY_DEFINES = $$DEFINES

Теперь переменная MY_DEFINES содержит то, что находится в переменной DEFINES на данный момент в файле проекта. Это также эквивалентно:

MY_DEFINES = $${DEFINES}

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

TARGET = myproject_$${TEMPLATE}

Функции замены

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

HEADERS = model.h
HEADERS += $$OTHER_HEADERS
HEADERS = $$unique(HEADERS)

Этот тип функции следует использовать в правой части присваивания (то есть, как операнд).

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

defineReplace(functionName){
    #function code
}

Следующий пример функции принимает имя переменной в качестве единственного аргумента, извлекает список значений из переменной с помощью встроенной функции eval() и компилирует список файлов:

defineReplace(headersAndSources) {
    variable = $$1
    names = $$eval($$variable)
    headers =
    sources =

    for(name, names) {
        header = $${name}.h
        exists($$header) {
            headers += $$header
        }
        source = $${name}.cpp
        exists($$source) {
            sources += $$source
        }
    }
    return($$headers $$sources)
}

Функции проверки

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

count(options, 2) {
    message(Both release and debug specified.)
}

Этот тип функции следует использовать только в условных выражениях.

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

defineTest(allFiles) {
    files = $$ARGS

    for(file, files) {
        !exists($$file) {
            return(false)
        }
    }
    return(true)
}

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qmake-language.html

Spec-Zone.ru

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