CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
組四個變量是常量字符串。用於生成文件的其餘部分,只要$(CC)
出現(例如),將通過g++
OBJECTS=$(SOURCES:.cpp=.o)
替換設置可變對象是相同的源,除了無論圖案.cpp
出現在源的話,其取代.o
EXECUTABLE=hello
套另一個字符串常量變種
all: $(SOURCES) $(EXECUTABLE)
釷e makefile中的第一條實際規則,它告訴make要構建all
它必須首先構建$(SOURCES)
和$(EXECUTABLE)
中的所有內容,然後不做任何事情。由於這是第一次,它成爲默認的目標,所以運行make
到make all
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o [email protected]
相當於另一條規則:創建$(EXECUTABLE)
(其擴展爲hello
)它必須首先建立在$(OBJECTS)
(相當於main.o hello.o factorial.o
)的一切,然後運行命令$(CC) $(LDFLAGS) $(OBJECTS) -o [email protected]
.cpp.o:
$(CC) $(CFLAGS) -o [email protected] $<
圖案規則:爲了打造.o
結尾的文件中,第一個重建/創建/找到的.cpp結束相應的文件,然後運行命令$(CC) $(CFLAGS) -o [email protected] $<
。
最後兩個規則包含特殊變量[email protected]
和$<
這是唯一有效的規則行動,並擴大到目標和第一依賴性分別
所以,當你運行make
,它讀取所有這一切,然後嘗試構建默認目標(全部)。 由於它不存在,它會嘗試構建文件main.cpp,hello.cpp,factorial.cpp和hello。由於前3個(可能)存在,它會爲它們查找規則/依賴關係,但沒有找到任何,因此決定沒有爲它們執行任何操作。如果他們不存在,make會給出一個錯誤,說「沒有規則做目標'main.cpp'」
在「hello」的情況下,它取決於main.o,hello.o和factorial.o ,所以它看着它們。對於main.o,模式規則說它取決於main.cpp,所以如果main.o不存在或者main.cpp更新,它將運行命令g++ -c -Wall -o main.o main.cpp
。 hello.o和factorial.o也是如此。
一旦這些完成,如果hello
不存在或比任何這些.o文件(可能剛剛更改,所以可能很新)舊,它將運行該命令重新鏈接它。最後,它將運行空白命令(無所事事)來「重建」所有內容。
Chris指出的第一行是定義shorthands,其餘的是一個「依賴圖」。當你改變你的源文件時,'make'系統將開始執行規則底部以獲得最終結果,最終創建編譯的最新可執行文件'hello'。 – Recct 2011-02-24 00:07:04