2010-03-20 2 views
7

У меня есть Makefile с чем-то вроде следующих целей:Makefile: выполнить одну цель из другой цели плюс дополнительные команды

 
install: 
    do a whole bunch of stuff to install 

dist: install 
    cp README.txt $(INSTALL_DIR) 
    zip $(INSTALL_DIR) 

Я пытаюсь не повторять команды от цели install и сделать dist выполнить install первый перед тем выполняя свои собственные команды.

Вызов make dist действительно выполняет все команды с целевого install, но затем просто останавливается и не выполняет свои собственные команды, например. cp.

Я что-то упустил?

+0

Обычно ваш «установить» правило, будет зависеть от «всех» или около того, и «все» будет делать «целый букет вещи для сборки », оставив« установить », чтобы сделать« целую кучу вещей для установки ». –

+0

@ Джонатан Да, это на самом деле то, что он делает. Я отредактирую это. – cschol

ответ

9

попробуйте добавить эту строку в Makefile

.PHONY: установить расстояние

+0

Вот и все. Можете ли вы объяснить, почему это необходимо? Благодарю. – cschol

+0

Был ли каталог установки «install» (или, возможно, «dist»)? Это приводит к путанице. Обозначение «.PHONY» (расширение GNU Make) означает примерно то, что «цель» следует рассматривать как всегда устаревшую. –

+6

Чтобы подробно рассказать о том, что Джонатан сказал о .PHONY, подумайте об этом так: сделайте предположение, что все цели являются фактическими файлами и смотрит, может ли он найти файл, если он не может считать файл устаревшим, а правило казнены. .PHONY говорит, что это не файл, поэтому не ищите его или не пытайтесь сопоставить его с любыми шаблонами/правилами и, конечно, если действительно есть файл/каталог, который называется, не принимайте этот файл цель, потенциально рассматривающая цель как актуальную. http://www.gnu.org/s/hello/manual/make/Phony-Targets.html – jhabbott

Смежные вопросы