2013-08-01 32 views
1

Managing Projects with GNU Make的第8章(P150)中,作者介紹了Tromey’s Waymakefile雙美元符號用戶自定義函數

define make-depend 
    $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -M $1 | \ 
    $(SED) 's,\($$(notdir $2)\) *:,$$(dir $2) $3: ,' > $3.tmp 
    $(MV) $3.tmp $3 
endef 

%.o: %.c 
    $(call make-depend,$<,[email protected],$(subst .o,.d,[email protected])) 
    $(COMPILE.c) -o [email protected] $< 

我的雙美元符號的理解,$$(notdir $2)$$(dir $2),是它用來逃避$以便它後來擴大。但是,我們期望它在這裏運營商$2,對吧?

我懷疑這是一個錯誤,但我無法在勘誤中找到它。這真的是一個錯誤,還是我誤解了它?

回答

3

是的,像這樣使用它是美元符號翻倍的錯誤。如果你打算將call函數的結果發送到像eval這樣的函數,再次擴大結果,唯一不會讓它們翻倍的是它。但這兩種情況都不需要。

我應該指出,這個例子雖然比其他大多數方法都好,但現在已經有些廢棄了。 GCC編譯器提供的選項可以非常精確地生成所需的makefile依賴項輸出,而無需後處理,同時仍然可以創建對象文件。這實際上效率更高,因爲每次編譯時都不必運行編譯器兩次。

+0

謝謝您的確認。上述sed處理是爲了解決make restart問題。它是添加依賴文件作爲頭文件和源文件列表的目標,如'list.o list.d:list.c list.h'。我查了一下gcc手冊,但是我找不到'-M '這個選項。 –

+0

當您使用此方法時,您不希望'.d'文件成爲目標。你爲什麼要添加它? – MadScientist

+0

實際上,我希望'.d'作爲目標,因爲這本書中介紹的某些好處(P151),作爲避免重新啓動的一種方法。總結在這裏:'.d'和'.o'通過這種方式邏輯連接,缺少'.d'則表示缺少'.o'。因此,我們可以忽略缺少的'.d',然後繼續。 –