[Предыдущая: Примечания для платформ] [Содержание] [Следующая: Использование предварительно скомпилированных заголовков]
Продвинутое использование qmake
Многие файлы проекта qmake просто описывают исходные и заголовочные файлы, относящиеся к проекту, используя список определений имя = значение и имя += значение. qmake также предоставляет дополнительные операторы, функции и области видимости, которые можно использовать для обработки информации, переданной в объявлениях переменных. Эти продвинутые средства позволяют генерировать из одного файла проекта Make-файлы для разнообразных платформ.
Операторы
Во многих файлах проекта операторы присваивания (=) и дополнения (+=) могут быть использованы для добавления всей информации о проекте. Типичный шаблон использования - присвоить переменной список значений и добавить дополнительные значения в зависимости от результата разнообразных тестов. Так как qmake определяет некоторые переменные, используя значения по умолчанию, иногда необходимо использовать оператор удаления (-=) чтобы отфильтровать ненужные значения. Следующие операторы могут быть использованы для манипуляции содержимым переменных.
Оператор = присваивает переменной значение:
TARGET = myapp
В строке выше переменную TARGET устанавливают равной myapp. Это затрет все значения, ранее установленные для TARGET кроме myapp.
Оператор += добавляет новое значение к списку значений переменной:
DEFINES += QT_DLL
В строке выше QT_DLL добавляется в конец списка определений препроцессора, помещаемый в генерируемый Make-файл.
Оператор -= удаляет значение из списка значений переменной:
DEFINES -= QT_DLL
В строке выше QT_DLL удаляется из списка определений препроцессора, помещаемого в генерируемый Make-файл.
Оператор *= добавляет значение в список значений переменной, но только если его там не было. Это предотвращает многократное добавление значений в переменную. Например:
DEFINES *= QT_DLL
В строке выше значение QT_DLL будет добавлено в список определений препроцессора только если этого значения там еще не было. Обратите внимание на то, что функция unique() также можно использовать для того, чтобы убедиться что переменные содержат только один экземпляр каждого значения.
Оператор ~= заменяет все значения, которые соответствуют регулярному выражению, на указанное значение:
DEFINES ~= s/QT_[DT].+/QT
В строке выше все значения списка, которые начинаются на QT_D или QT_T, заменяются на QT.
Оператор $$ используется для извлечения содержимого переменной и может быть использован для передачи значений между переменными или передачи их в функции:
EVERYTHING = $$SOURCES $$HEADERS
message("The project contains the following files:")
message($$EVERYTHING)
Области видимости
Области видимости аналогичны операторам if в процедурных языках программирования. Если некоторое условие истинно, то объявления внутри области видимости обрабатываются.
Области видимости и условия
Области видимости записываются как условие с рядом объявлений, содержащихся внутри пары скобок; например:
win32 {
SOURCES += paintwidget_win.cpp
}
Вышеприведенный код добавит файл paintwidget_win.cpp к источникам, перечисленным в сгенерированном Make-файле, если qmake используется на платформе Windows. Если qmake используется не на платформе Windows, определение будет пропущено.
Используемые в данной области видимости условия могут быть также инвертированы для предоставления альтернативного набора объявлений, который будет обработан только если начальное условие ложно. Например, предположим, мы хотим обработать что-либо на всех платформах за исключением Windows. Мы можем добиться этого инвертированием области видимости, например так:
!win32 {
SOURCES -= paintwidget_win.cpp
}
Области видимости могут быть вложенными для объединения более чем одного условия. Например, если вы хотите включить отдельный файл для определенной платформы только если разрешена отладка, тогда напишите следующее:
macx {
debug {
HEADERS += debugging.h
}
}
Чтобы избежать написания множества вложенных областей видимости вы можете вложить их используя оператор :. Вложенные области видимости в примере выше можно переписать следующим образом:
macx:debug {
HEADERS += debugging.h
}
Вы также можете использовать оператор : для выполнения отдельной строки условных присваиваний; например:
win32:DEFINES += QT_DLL
В строке выше QT_DLL добавляется к переменной DEFINES только на платформе Windows. Как правило, оператор : ведет себя как логический оператор AND, объединяя вместе несколько условий, и требует истинности их всех.
Вы также можете предоставить альтернативные объявления внутри области видимости используя область видимости 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, используемым во многих условиях области видимости, с помощью областей видимости можно проверять различные другие встроенные значения, зависящие от платформы и компилятора. Они базируются на спецификациях платформ, предоставленных в каталоге Qt mkspecs. Например, следующие строки из файла проекта показывают текущую используемую спецификацию и проверяют на спецификацию 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 или включить в сгенерированный Make-файл для вычисления при сборке проекта.
Для получения содержимого значения окружения при запуске qmake используйте оператор $$(...):
DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)
В вышеприведенном присваивании значение переменной окружения PWD читается при обработке файла проекта.
Для получения содержимого значения окружения в тот момент, когда обрабатывается сгенерированный Make-файл, используйте оператор $(...):
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 в сгенерированном Make-файле. Это делает процесс сборки более гибким до тех, пока переменная окружения корректно установлена при обработке Make-файла.
Специальный оператор $$[...] может быть использован для получения доступа к различным опциям конфигурирования, которые были установлены при сборке Qt:
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_SETTINGS])
message(Examples: $$[QT_INSTALL_EXAMPLES])
message(Demonstrations: $$[QT_INSTALL_DEMOS])
Доступность переменных с помощью этого оператора обычно используется для разрешения интеграции с Qt сторонних подключаемых модулей и компонентов. Например, подключаемый модуль Qt Designer можно установить рядом со встроенными подключаемыми модулями Qt Designer'а, если в его файле проекта сделано следующее объявление:
target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target
Функции обработки переменной
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)
}
Добавление новых функций конфигурации
qmake позволяет вам создавать собственные функции, которые можно включать в файлы проекта, добавив их имена в список значений, задаваемых переменной CONFIG. Функции - это коллекции пользовательских функций и определений в файлах .prf, которые могут постоянно находиться в одном из стандартных каталогов. Размещение этих каталогов описывается в нескольких местах, а qmake при поиске файлов .prf проверяет каждое из них в следующем порядке:
- В каталоге, включенном в переменную окружения QMAKEFEATURES; содержит список каталогов, разделенных двоеточием.
- В каталоге, включенном в переменную свойства QMAKEFEATURES; содержит список каталогов, разделенных двоеточием.
- В каталоге функций, находящемся внутри каталога mkspecs. Каталоги mkspecs могут располагаться внизу всех каталогов, включенных в переменную окружения QMAKEPATH (список каталогов, разделенных двоеточием). ($QMAKEPATH/mkspecs/<features>)
- В каталоге функций, находящемся внизу каталога, предоставляемого переменной окружения QMAKESPEC. ($QMAKESPEC/<features>)
- В каталоге функций, находящемся в каталоге data_install/mkspecs. (data_install/mkspecs/<features>)
- В каталоге функций, который существует на том же уровне, что каталог указанный в переменной окружения QMAKESPEC. ($QMAKESPEC/../<features>)
В следующих каталогах функций производится поиск файлов функций:
- features/unix, features/win32 или features/macx, в зависимости от используемой платформы
- features/
Например, рассмотрим следующее присваивание в файле проекта:
CONFIG += myfeatures
С этим добавлением к переменной CONFIG, qmake будет искать файл myfeatures.prf в местах, перечисленных выше после завершения разбора вашего файла проекта. На Unix системах будет разыскиваться следующий файл:
- $QMAKEFEATURES/myfeatures.prf (для каждого каталога, перечисленного в переменной окружения QMAKEFEATURES)
- $$QMAKEFEATURES/myfeatures.prf (для каждого каталога, перечисленного в переменной окружения QMAKEFEATURES)
- myfeatures.prf (в корневом каталоге проекта)
- $QMAKEPATH/mkspecs/features/unix/myfeatures.prf и $QMAKEPATH/mkspecs/features/myfeatures.prf (для каждого каталога, перечисленного в переменной окружения QMAKEPATH)
- $QMAKESPEC/features/unix/myfeatures.prf и $QMAKESPEC/features/myfeatures.prf
- data_install/mkspecs/features/unix/myfeatures.prf и data_install/mkspecs/features/myfeatures.prf
- $QMAKESPEC/../features/unix/myfeatures.prf и $QMAKESPEC/../features/myfeatures.prf
Замечание: Имена файлов .prf должны быть в нижнем регистре.
[Предыдущая: Примечания для платформ] [Содержание] [Следующая: Использование предварительно скомпилированных заголовков]
|