GNU make手冊翻譯系列(2)

4.2 依賴類型

        實際上有兩種不同類型的依賴可以被GNUmake程序理解:一種是之前章節中描述的常規依賴;另一種是"order-only"依賴.常規依賴主要陳述了兩件事:首先,由於目標的配方在執行之前必須確保該目標的所有常規依賴都已經更新,所以這些常規依賴的書寫順序決定了各自的更新順序;其次,它確定了一個依賴關係,就是如果有任意一個常規依賴比目標新,那麼就認爲目標已經過期而需要被重建.

        通常有一點是很明確的,那就是如果一個目標的依賴被更新了,則該目標也需要被更新.

        但是,偶爾你會遇到這樣一種情況,你想在規則的依賴列表中設置一個特殊的分類,這個特殊分類中的依賴更新後不會強制規則的目標也進行更新.這種情況下,你就需要定義"order-only"依賴."order-only"依賴可以通過在依賴列表中放置管道符號"|"來進行設置:管道符號“|”左邊的是常規依賴,管道符號右邊的就是“order-only”依賴.這樣的規則書寫格式如下:

目標列表:常規依賴部分|"order-only"依賴部分

        "常規依賴部分"可以爲空.同樣,也可以對一個目標進行多次追加依賴.需要注意的是,如果你在規則的常規依賴和"order-only"依賴中都設置了同一個文件,那麼該文件將優先被視爲常規依賴(因爲常規依賴的行爲是"order-only"依賴行爲的一個超集).

考慮下這麼一個例子,你的目標文件位於一個獨立的目錄下,而這個目錄在執行make之前可能並不存在.在這種情況下,你希望只是在任何一個目標文件被放置進去之前創建該目錄,但是因爲目錄的時間戳會因爲裏面任何一個文件被添加,刪除,或者重命名而修改,我們顯然不希望因爲目錄時間戳一改變就去重建目標文件.處理這個問題的一種方法就是使用"order-only"依賴:將該目錄設置爲所有目標的"order-only"依賴.

		OBJDIR := objdir
		OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
		$(OBJDIR)/%.o : %.c
		    $(COMPILE.c) $(OUTPUT_OPTION) $<
		all: $(OBJS)
		$(OBJS): | $(OBJDIR)	
		$(OBJDIR):
		    mkdir $(OBJDIR)

上面這個例子中,規則會在"objdir/foo.o"文件被創建之前先創建objdir這個目錄,但沒有"objdir/*.o"文件會因爲objdir目錄時間戳變化而被重建.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章