Как заставить qmake всегда пересобирать проект «с чистого листа» при изменении макросов

от автора

Если вдруг кто не в курсе, то спешу сообщить, что 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 всегда можно посмотреть макросы, с которыми компилировался проект.

ссылка на оригинал статьи http://habrahabr.ru/post/182518/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *