2010-05-01 2 views
0
xpi_built := $(build_dir)/$(install_rdf) \ 
      $(build_dir)/$(chrome_manifest) \ 
      $(chrome_jar_file) \ 
      $(default_prefs) 

xpi_built_no_dir := $(subst $(build_dir)/,,$(xpi_built)) 

$(xpi_file): $(build_dir) $(xpi_built) 
@echo "Creating XPI file." 
cd $(build_dir); $(ZIP) ../$(xpi_file) $(xpi_built_no_dir) 
@echo "Creating XPI file. Done!" 

$(build_dir)/%: % 
cp -f $< [email protected] 

$(build_dir): 
@if [ ! -x $(build_dir) ]; \ 
    then \ 
    mkdir $(build_dir); \ 
    fi 

Может ли кто-нибудь объяснить мне эту часть файла makefile? Особый интересОбъяснение makefile

  • $(build_dir)/%: %, а также $< и [email protected] директивы
  • две этикетки $(build_dir) существует, я думаю, как будут выполнены, но и в каком порядке?

ответ

2
$(build_dir)/%: % 
    cp -f $< [email protected] 

Это правило статического шаблона, в котором в его команде используются автоматические переменные; $< расширяется до крайнего левого края, [email protected] расширяется до цели. Если вы попытаетесь сделать $(build_dir)/foo (независимо от $(build_dir) есть), сделать будет относиться к этому правилу, как

$(build_dir)/foo: foo 
    cp -f foo $(build_dir)/foo 

Следующее правило,

$(build_dir): 
    @if [ ! -x $(build_dir) ]; \ 
    then \ 
    mkdir $(build_dir); \ 
    fi 

для $(build_dir) сам по себе, и является излишне сложным. Он говорит, что «если $(build_dir) не существует, то MKDIR его», и он может быть записан следующим образом:

$(build_dir): 
    mkdir [email protected] 

Это выглядит так, как будто ваша основная цель $(xpi_file):

$(xpi_file): $(build_dir) $(xpi_built) 

Так сделать волю сначала сделайте $(build_dir) (при необходимости), затем список членов %(xpi_built), который включает в себя пару вещей вида $(build_dir)/%. Как только это будет сделано, он выполнит команды этого правила: он будет cd в $(build_dir), застегните некоторые вещи вверх и echo пару сообщений.

+0

@Beta Спасибо за подробное объяснение. Знаете ли вы какую-нибудь хорошую электронную книгу? – Pablo

+0

@ Электронная книга Майкла? Lukáš Lalinský привел руководство GNUMake, которое является лучшей документацией, о которой я знаю. Есть также «Advanced Auto-Dependency Generation», который, ну, продвинутый и «Recursive Make считают вредным», популярная ссылка, с которой я не согласен. – Beta

0

См. Pattern Rules и Automatic Variables в документации GNU. Первое правило соответствует файлам внутри $(build_dir), а не $(build_dir). $< расширяет список предпосылок текущего правила, [email protected] является целью для текущего правила.

+0

не совсем верно - '$ <' расширяет (просто) первое обязательное условие. '$ ^' распространяется на все предварительные условия –