Pull to refresh

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

Reading time 2 min
Views 6K
Если вдруг кто не в курсе, то спешу сообщить, что 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 всегда можно посмотреть макросы, с которыми компилировался проект.
Tags:
Hubs:
+5
Comments 14
Comments Comments 14

Articles