Как я могу явно запустить 'make clean' между разными целями? - PullRequest
3 голосов
/ 20 января 2012

Я ищу следующее поведение:

# make debug (project is rebuilt. this works fine.)
# make debug (project is not rebuilt because no changes have been made.)
# make release (this is a different target than the currently-built one. I want 'make clean' to run before the release target is built)
# make release (project is not rebuilt because no changes have been made.)

Спасибо.

Ответы [ 4 ]

2 голосов
/ 20 января 2012

Интересная проблема. Единственный способ, которым я могу придумать для этого, - это внешняя запись самой последней цели (например, передать ее в файл), а затем проверить, совпадает ли она с текущей или отличается от нее. Если они одинаковые, просто запустите обычный процесс сборки; если они различаются, сначала запустите make clean.

Я предпринял первую попытку, чтобы проиллюстрировать процесс (не проверено).

debug release:
ifneq ($(MAKECMDGOALS),$(shell cat last_target.txt))
    $(MAKE) clean
endif
    @echo $@ > last_target.txt
    [regular build commands]

Это предполагает, что обе цели имеют одинаковый рецепт (с разными настройками для определенных переменных). Если они имеют разные рецепты, условная часть и команда echo, очевидно, должны быть вставлены в оба рецепта.

0 голосов
/ 21 января 2012

Предположительно, цели debug и release создают одинаковые файлы, но с разными флагами.Есть статья Мистера Марка под названием Перестройка при изменении CPPFLAGS , в которой описано, как заставить gmake делать то, что вам нужно.

В качестве альтернативы вы можете переключиться на ElectricMake , gmake-совместимая реализация make со многими улучшениями по сравнению со стандартным gmake, включая функцию ledger , которая позволяет учитывать аргументы командной строки / флаги компилятора при последней проверке, поэтому вы получаете поведение, которое вы 'описываю просто включение этой функции:

emake --emake-ledger=command debug   ;# builds everything with debug flags
emake --emake-ledger=command debug   ;# does nothing
emake --emake-ledger=command release ;# rebuilds everything with release flags
emake --emake-ledger=command release ;# does nothing

(отказ от ответственности: я архитектор ElectricMake)

0 голосов
/ 20 января 2012

Чтобы уточнить мой комментарий, я думаю, что лучшая настройка - это иметь разные выходные каталоги для разных наборов параметров сборки.В вашем случае, будет выходной каталог для debug и выходной каталог для release.Идея состоит в том, что все файлы, созданные во время сборки (объектные файлы, библиотеки, исполняемые файлы и т. Д.), Помещаются в целевой каталог.

Это полностью отделит make release от make debug и уничтожитвозможность перепутывания частичных сборок.

0 голосов
/ 20 января 2012

Возможно, у вас уже есть или должны быть отдельные каталоги для DEBUG и RELEASE.Они должны быть отдельными, потому что все посредники и исполняемые файлы разные.Тогда было бы тривиально иметь отдельные make-цели / context в каждом каталоге, с «глобальным», чтобы выбрать правильный make-файл и продолжить оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...