解释makefile

时间:2010-05-01 04:59:52

标签: syntax makefile

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),我想两者都已执行,但按顺序排列?

2 个答案:

答案 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 RulesAutomatic Variables。第一条规则匹配$(build_dir)内的文件,而不是$(build_dir)本身。 $<扩展到当前规则的先决条件列表,$@是当前规则的目标。