2013-03-08 79 views
2

我有這個Makefile這似乎是工作,但我不知道如何:調用此模式匹配規則的是什麼?

EXECUTABLE=hello 
CC=gcc 
OBJS = a.o 

all: $(EXECUTABLE) 

%.o : %.c 
    $(CC) -o [email protected] -c $< 

$(EXECUTABLE): $(OBJS) 
    $(CC) -o [email protected] $< 

我知道前3行是本地定義的,當我輸入「make」將建立在all目標。現在,從這裏我有點失落......我猜:

  1. 製作看到$(EXECUTABLE)標籤和跳是構建命令
  2. 它看到$(OBJS)標籤,因爲a.o不存在本地目錄就跳轉到模式匹配規則
  3. 製作認定a.c和運行規則來產生a.o
  4. 現在做返回到$(EXECUTABLE)指揮和運行的.o文件相結合,使「你好」節目

問題:

  1. 是我認爲流動的理解是否正確?
  2. 此文件中「標籤」的位置是否相關?
  3. 是否有一些我錯過的GNU文檔證實了我對此工作原理的懷疑?

回答

1

您的流程基本正確。如果您沒有在命令行上顯式傳遞一個命令,Make會構建文件中列出的第一個目標。在大多數makefile中,人們將有all作爲第一個目標,所以在你的例子中你可以輸入make,它會自動構建all目標。內部做什麼是構建您在Makefile中定義的依賴關係列表。 all依賴於$(EXECUTABLE)這是取決於$(OBJS)。爲了滿足all目標的創建,它必須從該依賴列表的底部開始,然後繼續工作。製作手冊其實很好,如果你想看看這裏:http://www.gnu.org/software/make/manual/,尤其是你在這裏的具體問題:http://www.gnu.org/software/make/manual/make.html#How-Make-Works

+0

感謝您的信息。因此,最後一個鏈接告訴我#3的答案(這是標籤**的順序**是重要的)是否正確? – Mike 2013-03-08 15:25:31

+0

它唯一重要的是你不打算提供一個make的目標,比如它給出的「make all」「make clean」等例子 – ThePosey 2013-03-08 15:27:51

1

我發現了一個工具來幫助至少回答我的問題的一部分,所以我會發布它以供我和其他人蔘考:

可以通過$(warning <some string>)調用「調試」Makefile。

所以在我的例子中,我用它作爲這樣的:

all: $(warning All before exe call) $(EXECUTABLE) 
    $(warning All warning after call) 

%.o : %.c 
    $(warning before pattern) 
    $(CC) -o [email protected] -c $< 
    $(warning after pattern) 

$(EXECUTABLE): $(warning before obj) $(OBJS) 
    $(warning after obj) 
    $(CC) -o [email protected] $< 

,得到了我展示的流量輸出:

[email protected]:~/C$ make 
Makefile:6: All before exe call // started at all 
Makefile:14: before obj   // Jumped to EXECUTABLE label 
Makefile:10: before pattern  // Jumped to pattern matching 
Makefile:10: after pattern 
gcc -o a.o -c a.c 
Makefile:15: after obj    // back to EXECUTABLE label 
Makefile:15: after build   // back to build command 
gcc -o hello a.o 
Makefile:7: All warning after call 

利用這一點,我發現我能做到這一點:

$(EXECUTABLE): $(warning before obj) $(OBJS) 

但不是:

$(EXECUTABLE): 
    $(warning before obj) 
    $(OBJS) 

這是有道理的,因爲白色空間在Makefiles中很重要

+1

$(info)是另一個很好的make函數,用於輸出信息$(info $(OBJS)) – ThePosey 2013-03-08 15:29:41

+0

@ThePosey謝謝!我還沒有在$ info上找到任何東西,打印通用字符串或只是字段? – Mike 2013-03-08 15:37:24

+0

請注意,在目標的先決條件列表中放置'$(warning ...)'並不符合您的期望,因爲它在讀取makefile時立即進行評估,而不是在考慮目標時進行評估。 – Idelic 2013-03-08 15:50:31