воскресенье, 23 мая 2010 г.

Qt и условная сборка qmake

Попытаюсь сэкономить кому-нибудь время,силы и нервы.
В одном из Qt проектов (.lib) нужно было сделать так, чтобы при сборке в режиме debug сгенерированная dll помещалась в дерикторию debug, а при сборке в режиме release - в директорию release.
Решение состояло в том, чтобы прописать в pro-файле следующее:
CONFIG += designer plugin debug
TEMPLATE = lib
TARGET = $$qtLibraryTarget($$TARGET)
.....................

debug {
DLLDESTDIR += ../MyApp/debug
message(1)

}
release {
DLLDESTDIR += ../MyApp/release
message(2)
}
Но почему-то сгенерированная dll помещалась всегда в обе папке, независимо от режима сборки. И на консоль выдавались оба сообщения - message(1) и message(2)

Дело было в том, что переменная CONFIG уже содержала в себе значения и debug, и release.
Результат выполнения message($$CONFIG) такой:
Project MESSAGE: lex yacc warn_on debug uic resources rtti_off exceptions_off stl_off incremental_off thread_off windows release ReleaseBuild Release build_pass qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe debug shared stl exceptions rtti mmx 3dnow sse sse2 def_files release ReleaseBuild Release build_pass designer plugin debug
Решение состоит в использовании функции CONFIG и выглядит следующим образом:
CONFIG( debug, debug|release ) {
DLLDESTDIR += ../MyApp/debug
message(1)
} else {
DLLDESTDIR += ../MyApp/release
message(2)
}
Теперь будет выполняться только единственная ветвь в зависимости от режима сборки.

2 комментария :

tsapelman комментирует...

Ой! Большое Вам человеческое спасибо!
Голову сломал, почему компилер не хавает условия, вроде первого приведённого в Вашей статье.
Теперь сделал, как Вы рекомендуете - всё собирается как надо!

Руслан комментирует...

Всегда рад помочь!