2010-05-01 75 views
0
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 $< [email protected] 

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

任何人都可以解释我这个makefile的一部分吗?特别感兴趣解释makefile

  • $(build_dir)/%: %以及$<[email protected]指令
  • 两个标签$(build_dir)存在,我想都被执行,但以什么顺序?

回答

2
$(build_dir)/%: % 
    cp -f $< [email protected] 

这是一个静态模式规则,它在其命令中使用自动变量; $<扩展到最左边的先决条件,[email protected]扩展到目标。如果你试图让$(build_dir)/foo(无论$(build_dir)是),让将把此规则

$(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 [email protected] 

看起来好像你的主要目标是$(xpi_file)

$(xpi_file): $(build_dir) $(xpi_built) 

所以make会首先制作$(build_dir)(如有必要),然后列出%(xpi_built)列表中的成员,其中包括$(build_dir)/%表格的一些内容。一旦这些完成,它将执行这条规则的命令:它将cd到$(build_dir),压缩一些东西,并且echo几条消息。

+0

@Beta 感谢您的详细解释。你知道有什么好的电子书吗? – Pablo 2010-05-01 07:53:22

+0

@Michael电子书? LukášLalinský引用了GNUMake手册,这是我所知道的最好的文档。还有“先进的自动依赖生成”,这是先进的,“递归考虑有害”,这是一个我不同意的流行参考。 – Beta 2010-05-01 19:18:13

0

Pattern RulesAutomatic Variables在GNU使文档。第一条规则匹配$(build_dir)内的文件,而不是$(build_dir)本身。 $<展开为当前规则的先决条件列表,[email protected]是当前规则的目标。

+0

不太对 - '$ <'扩展到(仅)第一个先决条件。 '$ ^'扩展到所有先决条件 – 2010-05-01 06:02:07