2010-03-16 141 views
7

例如在

$(CC) $(CFLAGS) -c -o [email protected] $< 

它們意味着什麼?

+3

你在'make'上讀過哪些文檔? http://www.makelinux.net/make3/make3-CHP-1-SECT-5.html? http://www.cs.swarthmore.edu/~newhall/unixhelp/howto_makefiles.html? Anytthing? – 2010-03-16 14:51:52

回答

3

[email protected]正在建設目標的名稱 - 正在創建的程序或目標文件。

$<使其重建的文件的名稱是文件'其存在允許爲目標選擇推理規則'的文件的名稱。

在這個例子中,你可能有:

program.o: program.c 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

在這種情況下,[email protected]是 'program.o' 和$<是 'program.c'。 (由於「-c」選項,該規則必須生成目標文件。)

要小心'$ <';如果有一個比程序更新的標題,'$ <'會改爲匹配 - 然後編譯行將不起作用。如圖所示,雖然它足夠安全。關於 '$ <'


貝塔評論...

的 '製作' 的定義POSIX說:

  • $<

    在推理規則中, $ <宏應評估爲其存在允許推斷的文件名規則被選爲目標。在.DEFAULT規則中,$ <宏應評估爲當前目標名稱。其他未指定$ <宏的含義。

    例如,在.c.a推理規則中,$ <代表先決條件.c文件。

所以,我給的例子, '$ <' 在技術上是 '未指定'。而且,在正確的背景下, 具體做法是:

.c.o: 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

然後 '$ <' 無條件 'progname.c' 當 'progname.o' 正在建設中。

'make'的某些版本曾經用它來做奇怪的事情; GNU Make(3.81)和Solaris 10似乎都表現得很健全。我懷疑是因爲時間扭曲而陷入困境。我用下面的Makefile:

all: x.o 

x.o: x.c 
     ${CC} ${CFLAGS} -c -o [email protected] $< 

x.o: x.h 

我用 'echo "int main(){return 0;}" > x.c' 和 'echo > x.h' 創建的代碼。從'x.c'和'x.h'中觸發哪個文件並不重要;無論哪種方式,彙編都是「正確的」。我有一箇舊的衍生產品,大約在1992年,它與大多數時間的Sun MAKE都兼容,它錯誤地處理了它。

第七版UNIX程序員手冊說:

的規則以創建後綴文件S2依賴於類似命名的文件,後綴S1指定 作爲一個條目「目標's1s2。在這樣的條目中,特殊的宏$ *代表目標名稱,其中後綴名已刪除 ,完整目標名稱爲$ @,需要完整列表的$ <,以及$?對於過期的先決條件列表 。

它沒有說任何關於它的含義。我注意到,第7版'make'會列出'$ c $'和'x.h'爲'$ <' - 但POSIX表示這是不正確的。

太陽「讓用戶指南」(16修訂版A 1987年3月)說:

$<依賴文件的名稱,因爲如果選擇通過make爲使用一個隱含的規則。

或多或少符合您現在看到的內容。


唉,這就是生活;事物在你周圍變化。有時你發現它發生了;有時候你沒有。

+1

這是不正確的,$ <是列表中的第一個依賴項,不一定是導致目標被重建的依賴項。 – Beta 2010-03-16 15:24:03

+1

P.S. $?是比目標(或PHONY)更新的先決條件列表,所以這些會導致這個目標被重新制作。 – Beta 2010-03-16 15:28:45

+0

@貝塔:好的 - 我認爲,我已經通過一些歷史評論解決了問題。 – 2010-03-16 17:41:30