0

如何在 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 $< $@

$(build_dir):

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

1 回答 1

2

如果您在命令行上指定目标,make cleanMake 将尝试构建该目标。如果你不这样做(也就是说,如果你只是运行make),Make 将尝试构建默认目标;默认目标是makefile中的第一个目标(在您的情况下install),除非您使用.DEFAULT_GOAL变量将其设置为其他目标。

当 Make 尝试构建目标时,它首先构建该目标的先决条件(如有必要)。(什么时候有必要?当目标是一个不存在的文件或目录时(除非它是.PHONY,但这是一个高级主题),或者当它的先决条件之一比目标更新时(除非它是“仅订单”,但这是一个高级主题))。因此,如果 Make 尝试构建您的all,它将首先尝试构建$(build_dir)$(xpi_built),它们已在 makefile 的其他地方定义。

如果你想弄清楚 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...
于 2010-05-02T15:17:39.423 回答