make是一個命令工具,它解釋Makefile中的規則。
make經過比較對應文件(規則的目標和依賴,)的最後修改時間,來決定哪些文件須要更新、那些文件不須要更新。對須要更新的文件make就執行數據庫中所記錄的相應命令(在make讀取Makefile之後會創建一個編譯過程的描述數據庫。此數據庫中記錄了全部各個文件之間的相互關係,以及它們的關係描述)來重建它,對於不須要重建的文件make什麼也不作
如下幾種文件在執行make時將會被編譯shell
- 全部的源文件沒有被編譯過,則對各個C源文件進行編譯並進行連接,生成最後的可執行程序;
- 每個在上次執行make以後修改過的C源代碼文件在本次執行make時將會被從新編譯;
- 頭文件在上一次執行make以後被修改。則全部包含此頭文件的C源文件在本次執行make時將會被從新編譯。
Makefile是一種文件,由它來告訴make須要作什麼,該怎麼作。
一個簡單的Makefile描述規則組成:數據庫
TARGET... : PREREQUISITES...
COMMAND
...工具
target:規則的目標。一般是程序中間或者最後須要生成的文件名。能夠是.o文件、也能夠是最後的可執行程序的文件名。另外,目標也能夠是一個make執行的動做的名稱,如目標「clean」,成這樣的目標是「僞目標」。ui
prerequisites:規則的依賴。生成規則目標所須要的文件名列表。一般一個目標依賴於一個或者多個文件。spa
command:規則的命令行。是make程序全部執行的動做(任意的shell命令或者可在shell下執行的程序)。命令行
#sample Makefile
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
- 目標(target)包含:可執行文件「edit」和.o文件(main.o,kbd.o….),依賴(prerequisites)就是冒號後面的那些 .c 文件和 .h文件。全部的.o文件既是依賴(相對於可執行程序edit)又是目標(相對於.c和.h文件)。命令包括 「cc –c maic.c」、「cc –c kbd.c」……
- 在這個例子中,「edit」的依賴爲8個.o文件;而「main.o」的依賴文件爲「main.c」和「defs.h」。當「main.c」或者「defs.h」被修改之後,再次執行「make」時「main.o」就會被更新(其它的.o文件不會被更新),同時「main.o」 的更新將會致使「edit」被更新。
- 目標「clean」不是一個文件,它僅僅表明了執行一個動做的標識。在執行make時,它所指定的動做不會被執行。Makefile中把那些沒有任何依賴只有執行動做的目標稱爲「僞目標」(phony targets)。執行「clean」目標所定義的命令,可在shell下輸入:make clean。