make命令會查找目錄下的Makefile或者makefile文件,而後執行該文件。能夠用 make -f 來指定自定義名稱的Makefile文件ubuntu
編寫Makefile文件要服從三個原則:ui
1)若是這個工程沒有編譯過,那麼咱們的全部c文件都要編譯並被連接。spa
2)若是這個工程的某幾個c文件被修改,那麼咱們只編譯被修改的c文件,並連接目標程序。code
3)若是這個工程的頭文件被改變了,那麼咱們須要編譯引用了這幾個頭文件的c文件,並連接目標程序。blog
Makefile的規則以下,這是Makefile的核心所在:get
Target ... : prerequisites ...
command ....
這個語句的意思就是,當Target依賴的任何一個文件比Target新,或者是target不存在時,就執行command命令來生成Target文件。it
如今假設有3個頭文件,和8個.c文件,一個Makefile的例子以下:編譯
edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o /*註釋:若是後面這些.o文件比edit可執行文件新,那麼纔會去執行下面這句命令*/ 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
寫完依賴文件後,在命令那行加上一個[tab],'\'表明一行沒有寫完。clean的後面沒有定義依賴文件,使用make clean時,不會查找依賴文件,直接執行定義的命令。寫好Makefile後在Makefile所在目錄下執行make便可生成editor文件。最好爲每一個makefile定義一個clean命令。class
.PHONY : clean clean : -rm edit $(objects)
.PHONY爲clean的僞目標,通常把clean放在文件最後,rm前的[-]表明忽略出現問題的文件。變量
一個Makefile中可能存在4種內容:
GNU中執行一個make命令的過程以下:
參考資料:http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile