2010-05-02 56 views
0

如何區分makefile中的哪些目標以及如何在內部調用它們()?我有一個具有實際變量的目標數量的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 $< [email protected] 

$(build_dir): 

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

很好。現在在你的問題的文本中,你應該參考這個例子來解釋你在問什麼。 – 2010-05-02 15:18:36

回答

2

如果在命令行上的目標,如make clean make將試圖建立一個目標。如果你不這樣做(也就是說,如果你只運行make),Make將嘗試構建默認目標;默認目標是生成文件中的第一個目標(在您的案例中爲install),除非您使用.DEFAULT_GOAL變量將其設置爲其他值。

當Make嘗試構建目標時,如果需要,它會首先構建該目標的先決條件。 (什麼時候有必要?當目標是一個不存在的文件或目錄時(除非它是.PHONY,但這是一個高級主題),或者當它的一個先決條件比目標更新時(除非它是「僅限訂單」 ,但這是一個高級話題))。因此,如果Make試圖構建all,它將首先嚐試構建$(build_dir)$(xpi_built),它們已在makefile的其他位置定義。

如果你想弄清楚Make會做什麼,什麼時候做,你可以使用的技巧。例如,你可以運行make -n,Make會告訴你它會做什麼,而不是這樣做。或者你可以在規則中輸入一個像@echo now making [email protected]的命令,告訴你它在做什麼。或者更多信息:

some_target: preq another_preq and_another 
    @echo Making [email protected] The prerequisites are $^. Of those, $? are newer than [email protected] 
    other_commands... 
+0

偉大的信息,還有一個問題 - 如果有兩個相同的目標具有不同的先決條件,他們將按哪個順序運行? – Pablo 2010-05-02 15:26:41

+1

1)你現在已經足夠了解自己嘗試一下,看看會發生什麼,2)你現在知道手冊的位置,3)第二個會覆蓋第一個,Make會警告你你做錯了什麼(除非你使用雙冒號規則,但這是先進的)。 – Beta 2010-05-02 15:50:05