qmake: команды в Makefile, которые выполняются всегда

Иногда необходимо, чтобы некоторые команды выполнялись всегда, при любом запуске make, в самом начале или в самом конце работы.

Чтобы наша цель выполнялась в нужное время, нужно как-то привязаться с к цели, которая первой выполняется при запуске make. Это обеспечит то, что наша команда выполнится. Далее, нужно привязяться таким образом, чтобы наша цель выполнялась до (или после) всех целей, от которых зависит первая цель.

Выполнение Makefile по умолчанию начинается с первой цели по порядку. qmake первыми целями генерирует следующее:

Глядя на эти правила, придумать цель, которая всегда будет выполняться, и будет выполняться в самом конце, несложно. Эту цель можно сделать зависимой от all (значит, она выполнится после all), и сделать first зависимой от нее (а значит, она выполнится).

Результирующий Makefile:

Конечно, все поломается, если make будет вызван как make all, но Qt Creator по умолчанию запускает make без параметров. Так что меня такой способ устраивает.

Да, еще — до последних команд дело не дойдет, если make завершится с ошибкой в каком-либо правиле посередине. Нюанс, с которым ничего поделать нельзя.

Если с командой, выполняемой в конце, все достаточно просто, то с командой, выполняемой в начале выполнения make, дела обстоят сложнее. Во-первых, для того, чтобы такая цель гарантированно выполнилась до выполнения всего остального, Makefile и $(DESTDIR_TARGET) должны от нее зависеть. Далее, эта цель не может быть phony, потому как в противном случае у Makefile и $(DESTDIR_TARGET) будет необновленная зависимость, что приведет к запуску команд одного из этих правил (скорее всего, Makefile, и значит, произойдет вызов qmake). Раз цель не может быть phony, то должен существовать одноименный файл. И этот файл должен быть старым, иначе qmake запустится. И, наконец, чтобы команды выполнялись всегда, цель должна быть зависимой от FORCE.

В Makefile получается следующее:

И не забывайте — файл .beforebuild существует, и он всегда старше Makefile!

Цикл: qmake

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