makefile внутренние вызовы к цели - PullRequest
0 голосов
/ 02 мая 2010

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

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 $< $@

$(build_dir):

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

1 Ответ

2 голосов
/ 02 мая 2010

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

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

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

some_target: preq another_preq and_another
    @echo Making $@. The prerequisites are $^. Of those, $? are newer than $@.
    other_commands...
...