Если вдруг кто не в курсе, то спешу сообщить, что qmake этого не делает. Этот печальный факт может привести к крайне неприятным багам сборки, если забыть сделать полный ребилд после изменения макросов проекта.
Для решения этой проблемы я нарисовал себе следующий скрипт, который удобнее всего поместить в свою собственную фичу. Подробно объяснить происходящее здесь я не могу, объем будет на не толстую, но книгу. Кому интересно — добро пожаловать в мой блог, я там о qmake написал все, что знаю.
# функция, в которой происходит вся работа
defineReplace(checkDefinesForChanges) {
old_def = $$cat($$OUT_PWD/defines.txt)
curr_def = $$DEFINES
curr_def -= $$old_def
old_def -= $$DEFINES
diff = $$old_def $$curr_def
# если макросы поменялись, то удаляем все файлы в OUT_PWD
!isEmpty(diff) {
A = $$system(del /F /Q /S $$system_path($${OUT_PWD}/*.*))
message(DEFINES WERE CHANGED)
}
write_file($$OUT_PWD/defines.txt, DEFINES);
return(???)
}
# нагибаем QMAKE_EXTRA_COMPILERS, чтобы запустить
# checkDefinesForChanges после всех фич
_defines_check_ = ???
defines_check.name = check on defines being changed
defines_check.input = _defines_check_
defines_check.CONFIG += no_link ignore_no_exist
defines_check.depends = ???
defines_check.commands = ???
defines_check.output_function = checkDefinesForChanges
QMAKE_EXTRA_COMPILERS += defines_check
# цели в Makefile, чтобы при удалении defines.txt запускался qmake
recompile_on_defines_txt_not_existsing.target = $(MAKEFILE)
recompile_on_defines_txt_not_existsing.depends = $$OUT_PWD/defines.txt
recompile_on_defines_txt_not_existsing2.target = $$OUT_PWD/defines.txt
recompile_on_defines_txt_not_existsing2.depends = qmake
QMAKE_EXTRA_TARGETS += recompile_on_defines_txt_not_existsing recompile_on_defines_txt_not_existsing2
Суть происходящего: я нагибаю QMAKE_EXTRA_COMPILERS, чтобы вызвать свою функцию после обработки всех фич. Тем самым я могу получить финальное значение переменной DEFINES, которое использую для того, чтобы определить факт смены макросов. Если изменение было — удаляю все файлы в OUT_PWD (команда для Windows, под Linux поменяйте на что нужно).
В качестве полезного иногда бонуса, в файле defines.txt всегда можно посмотреть макросы, с которыми компилировался проект.
Автор: mgsxx