2010-05-02 3 views
0

Как я могу различать в make-файле, какие цели и как (, когда) они называются внутренне? У меня есть makefile с количеством целей, которые на самом деле являются переменными.Внутренние вызовы makefile для таргетинга

UPD: вот пример

build_dir := $(bin_dir)/build 

xpi_built := $(build_dir)/$(install_rdf) \ 
      $(build_dir)/$(chrome_manifest) \ 
      $(chrome_jar_file) \ 
      $(default_prefs)/* 

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

.PHONY: install 
install: $(build_dir) $(xpi_built) 
    @echo "Installing in profile folder: $(profile_location)" 
    @cp -Rf $(build_dir)/* $(profile_location) 
    @echo "Installing in profile folder. Done!" 
    @echo 

$(xpi_file): $(build_dir) $(xpi_built) 
    @echo "Creating XPI file." 
    @cd $(build_dir); $(ZIP) -r ../$(xpi_file) $(xpi_built_no_dir) 
    @echo "Creating XPI file. Done!" 
    @cp update.rdf $(bin_dir)/ 
    @cp -u *.xhtml $(bin_dir)/ 
    @cp -Rf $(default_prefs) $(build_dir)/; \ 

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

$(build_dir): 

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

Отлично. Теперь в тексте вашего вопроса вы должны обратиться к примеру, чтобы объяснить, что вы спрашиваете. – 2010-05-02 15:18:36

ответ

2

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

Когда Make пытается построить цель, он сначала создает предпосылки этой цели, если это необходимо. (Когда это необходимо? Когда цель является файлом или каталогом, который не существует реальным (если это не .PHONY, но это расширенная тема), или когда одно из его предварительных условий новее, чем цель (если только это не «только порядок») , но это передовая тема)). Поэтому, если Make пытается создать ваш all, он сначала попытается построить $(build_dir) и $(xpi_built), которые были определены в другом месте в файле makefile.

Если вы пытаетесь выяснить, что сделает Make, и когда есть трюки, которые вы можете использовать. Например, вы можете запустить make -n, а Make сообщит вам, что он будет делать, а не делать это. Или вы можете ввести команду, как @echo now making [email protected] в правиле, чтобы рассказать вам, что она делает. Или для получения дополнительной информации:

some_target: preq another_preq and_another 
    @echo Making [email protected] The prerequisites are $^. Of those, $? are newer than [email protected] 
    other_commands... 
+0

отличная информация, и еще один вопрос - если есть две идентичные цели с разными предпосылками, в каком порядке они будут работать? – Pablo

+1

1) вы теперь знаете достаточно, чтобы попробовать сами и посмотреть, что произойдет, 2) вы теперь знаете, где находится руководство, 3) второй будет переопределять первый, и Make предупредит вас, что вы делаете что-то неправильно (если только вы используйте правило двойной толстой кишки, но это продвинуто). – Beta

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