Spec-Zone.ru › Qt 5.11

Язык 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 использует при генерации файлов Makefile, такими как 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/archives/qt-5.11/qmake-language.html

Spec-Zone.ru

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