2010-05-01 57 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