2012-04-29 180 views
1

我正在學習使用漂亮的Linux工具:make。而且有件事我想明白了:Makefile中的所有目標

讓我們來看看這個簡單的例子:

JADE = $(shell find pages/*.jade) 
HTML = $(JADE:.jade=.html) 

all: $(HTML) 

%.html: %.jade 
    jade < $< --path $< > [email protected] 

clean: 
    rm -f $(HTML) 

.PHONY: clean 

當我運行watch make,我真的不太多瞭解輸出字符串:品牌:無關與'全部'。

問題:

  1. 是什麼的所有動作嗎?
  2. 是否所有的動作都與手錶工具有關?

回答

2

all目標實際上只是您所呈現的makefile中的默認目標。文件中的第一個目標是默認目標,該目標在運行make時未生成目標。

當make告訴你,它沒有工作,構建all目標什麼時候做,那麼就意味着所有的依賴先前已建成並是最新的(即沒有它們的依賴已自去年建立他們改變)。在你的情況下,這意味着HTML輸出文件比相應的Jade輸入文件更新。因此沒有什麼可以做的。

watch實用程序只是反覆運行一個命令,以便觀察其輸出如何隨時間變化。手錶每隔幾秒就會運行make並顯示輸出。當它第一次運行時,它將構建一切,所有後續調用makewatch將表示一切都是最新的。所以在watch範圍內運行make似乎並沒有什麼用處,除非你有任何修改文件的時間在任意時間點,並且你想通過重建它們來做出反應,但這似乎是一個有點人爲的例子。

+0

在我的情況下,makefile做了編譯咖啡,鐵筆和玉石的工作,所以它不應該有任何問題。感謝您的優秀回答 – nXqd 2012-04-29 10:50:45

+0

我可以將所有目標指定爲多個變量:'all:$(HTML)$(JS)$(CSS)' – nXqd 2012-04-29 10:51:58

+1

是的,您可以。如果你先嚐試了這些事情,並且只問過你曾經嘗試過但沒有解決的事情,那對你來說將是一個更具啓發性的經歷。從長遠來看,您將獲得更多利潤。 – 2012-04-29 10:53:57