Friday, April 3, 2015

Функции с побочными эффектами в qmake


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

Побочные эффекты у функций в 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