… и это является одной из самых неприятных багофич qmake. Я решил пофиксить этот казус. Ошибки билда — это не то, на что я хочу тратить свою жизнь.
Поскольку изменение макросов есть изменение переменной DEFINES
, то при их изменении qmake всегда будет вызван. Так что можно в qmake эту ситуацию и обрабатывать, самым простым образом — удалив все файлы в OUT_PWD
при изменении переменной DEFINES
.
Макросы от предыдущего запуска qmake получить не проблема, их можно сохранять в файл, откуда потом считывать при следующем запуске. А вот что проблема, так это узнать значения макросов. Любая фича может их поменять, так что нужно запускать нашу затычку после всех фич. Так что я извратился с помощью QMAKE_EXTRA_COMPILERS
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# функция, в которой происходит вся работа 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 |
просто нужно придерживаться правила: изменил .pro — перегенерируй Makefile(make distclean && qmake)
Хм… Вручную?
Где что-то происходит вручную — там ошибки.