Qmake и Rebuild all

Объясните пожалуйста, как работают эти кнопки в Qtcreator'e.

Прочитал в нескольких гайдах, что qmake выполняет pro файлы. Это файлы, в которых описано, как собирать проект в рабочую программу (грубо говоря). Про Rebuild all вообще нигде не видел инфы.

Много раз тестил у себя на компе, и выяснил, что Rebuild All выполняет всё, что написано в pro файлах, кроме функций. А qmake выполняет только функции. Я правильно всё понял или это зависит от каких-то настроек? Можно ли настроить так, чтобы выполнять оба действия одной кнопкой?

Что точно делает каждая из кнопок? В интернете информация об этом размытая, такая, как будто это все знают, и оно само собой разумеется.

Пример: В проекте есть файл iss_generator.pri. Он подключен в pro файл следующим образом.

include(iss_generator.pri)

Вот код этого файла.

iss_file = $$DeployDir/install.iss

iss ="Здесь большой текст этого файла"

write_file($$iss_file, iss)

Файл появляется в папке только при qmake. При build не появляется.


Ответы (1 шт):

Автор решения: Dmitry Sokolov

Система сборки, основанная на qmake - двухфазная.

  1. Фаза генерации сборочных скриптов (проектов). За эту фазу отвечает (или можно запустить) пункт меню Build -> Run qmake. Либо, если билд-скрипты еще не разу не создавались, то эта фаза запускается автоматически. Соответственно, если у вас уже есть билд-директория, то при изменении .pro/.pri файлов, вы должны сами вызывать Build -> Run qmake.
  2. Фаза сборки проектов. Это либо Build All (инкрементальная сборка), либо Rebuild All.

Для автоматической генерации билд-скриптов можно сделать такой хак:

QMAKE_EXTRA_TARGETS += after_build firsthook
firsthook.target = first
firsthook.depends = after_build
after_build.depends = all
after_build.CONFIG = phony
after_build.commands = $(DEL_FILE) $(MAKEFILE)

Т.е. после каждой сборки будет удаляться билд-скрипт, и Qt Creator будет сам запускать qmake при каждом Build All.

Также, посмотрите хороший гайд по qmake.

Update

Если есть какие-то цели (target) выполняемые после сборки всего, то их надо добавить в зависимости after_build.depend

after_build.depend = all  <список всех целей выполняемых после сборки>

чтобы цель after_build была самой последней выполняемой командой.

→ Ссылка