我如何区分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 $< $@
$(build_dir):
@if [ ! -x $(build_dir) ]; \
then \
mkdir $(build_dir); \
fi
答案 0 :(得分:2)
如果在命令行上指定目标,则在make clean
Make中将尝试构建该目标。如果你不这样做(也就是说,如果你只是运行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...