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 $< $@
$(build_dir):
@if [ ! -x $(build_dir) ]; \
then \
mkdir $(build_dir); \
fi
谁能解释一下这个makefile的一部分?
特别感兴趣$(build_dir)/%: %
以及$<
和$@
指令$(build_dir)
,我想两者都已执行,但按顺序排列? 答案 0 :(得分:2)
$(build_dir)/%: %
cp -f $< $@
这是一个静态模式规则,在其命令中使用自动变量; $<
扩展到最左边的先决条件,$@
扩展到目标。如果您尝试制作$(build_dir)/foo
(无论$(build_dir)
是什么),Make会将此规则视为
$(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 $@
看起来您的主要目标是$(xpi_file)
:
$(xpi_file): $(build_dir) $(xpi_built)
因此Make会首先制作$(build_dir)
(如有必要),然后是%(xpi_built)
列表的成员,其中包含$(build_dir)/%
形式的一些内容。完成后,它将执行此规则的命令:它将进入$(build_dir)
,压缩一些内容,并echo
几条消息。
答案 1 :(得分:0)
请参阅GNU make文档中的Pattern Rules和Automatic Variables。第一条规则匹配$(build_dir)
内的文件,而不是$(build_dir)
本身。 $<
扩展到当前规则的先决条件列表,$@
是当前规则的目标。