2012-06-20 8 views
2

У меня есть файл makefile, содержащий оператор include. Я не контролирую содержание включенного make-файла. Тем не менее, я хочу, чтобы добавить некоторые предварительные шаги обработки перед «некоторыми» (не все) целями. Рассмотрим следующий пример:Makefile с двумя целями с тем же именем

install: 
     @echo "install target" 

include othermakefile.mk 

othermakefile.mk содержит установить цель, а также. Если я запустил этот скрипт, make выдаст предупреждение и проигнорирует первый установить цель.

+0

Затем переименуйте свои цели в нечто очень маловероятное, чтобы столкнуться (например, 'foo_blah_install'). –

+0

Как я уже сказал, я хочу, чтобы скрипт выполнял некоторые ** команды предварительной обработки **, когда пользователь вводит «make install». Я не хочу менять имя цели. – Javad

+0

related: http://stackoverflow.com/q/1644920/86967 – nobar

ответ

3

Ничего проще:

install: pre_install 

.PHONY: pre_install 
pre_install: 
    do preinstallation things 

include othermakefile.mk 

EDIT:
Если вы хотите запустить pre_install перед тем installили любой из его preqs, вот так. Это грубо и некрасиво, но это делает работу:

install: pre_install 
    $(MAKE) -f othermakefile.mk [email protected] 

.PHONY: pre_install 
pre_install: 
    do preinstallation things 

Обратите внимание, что это не обязательно перестраивать все предпосылки install, поэтому некоторые из них могут оставаться в своих старых государств и не отражают влияния pre_install. Если это не достаточно хорошо, и вы хотите pre_install, прежде чем все из других предпосылок, можно добавить флаг опции:

install: pre_install 
    $(MAKE) --always-make -f othermakefile.mk [email protected] 

Теперь Make будет считать, что все цели являются устаревшими, и отстроить с нуля (после pre_install).

+1

+1. Но гарантируется ли, что Make будет обрабатывать 'install' зависимости в порядке сверху вниз? Т.е. если 'othermakefile.mk' содержит' install: foobar', гарантируется ли, что 'pre_install' обрабатывается до' foorbar'? –

+0

@OliCharlesworth: нет, нет такой гарантии; Make будет создавать 'pre_install' до' install' (как я прочитал вопрос), но не обязательно перед другими установками 'install'. Там * есть способ опередить все остальные цели, но это более радикально. – Beta

+0

Не могли бы вы рассказать мне, как я могу * опередить все остальные предпосылки *? – Javad