Побочные эффекты у функций в qmake можно делать при помощи функции export():
export(variablename) Exports the current value of variablename from the local context of a function to the global context.Один из примеров удачного, на мой взгляд, использования:
defineReplace(getBuildConfig) {
__BUILD_CONFIG = ""
if(contains(QMAKE_CFLAGS_RELEASE, "-MT") |
contains(QMAKE_CFLAGS_DEBUG, "-MTd")) {
__BUILD_CONFIG = mt
}
contains(QMAKE_SUBSYSTEM_SUFFIX, ",5\.01") {
!isEmpty(__BUILD_CONFIG):__BUILD_CONFIG = $${__BUILD_CONFIG}_xp
else: __BUILD_CONFIG = xp
}
CONFIG(debug, debug|release) {
!isEmpty(__BUILD_CONFIG):__BUILD_CONFIG = $${__BUILD_CONFIG}_d
else: __BUILD_CONFIG = d
}
return($$__BUILD_CONFIG)
}
defineTest(addLib) {
__LIBNAME = $$1
__LIBTYPE = $$2
equals(__LIBTYPE, systemlib) {
LIBS += -l$$__LIBNAME
}
else {
__BUILD_CONFIG = $$getBuildConfig()
!isEmpty(__BUILD_CONFIG):__LIBNAME = $$__LIBNAME-$$__BUILD_CONFIG
LIBS += -l$$__LIBNAME
}
export(LIBS)
}
Функция getBuildConfig() определяет постфикс для библиотеки в зависимости от конфигурации среды окружения. Функция addLib() добавляет библиотеку в список LIBS по ее имени без постфикса. Вот пример части .pro файла без использования этих функций:
CONFIG(debug, debug|release) {
LIBS += mylib-mt_xp_d
} else {
LIBS += mylib-mt_xp
}
Данный пример не учитывает того, что сборка может быть с динамическим рантаймом (MD/MDd), без использования toolset для XP и т. п., так как это может привести к значительному разрастанию кода. А теперь посмотрим пример с использованием ранее объявленных функций:
addLib(mylib)Файл проекта получается значительно более читабельным.
No comments:
Post a Comment