MakeFile的寫法

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: 目標文件或者是一個label
  • prerequisites: Target的依賴文件
  • command: 執行的命令,在Makefile中的命令,必需要以[Tab]鍵開始。

這個語句的意思就是,當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種內容:

  1. 顯式規則
  2. 隱式規則:make提供自動推導的功能,遇到.o時會自動推導出依賴文件包括.c,以及執行的命令cc -c,所以這些東西能夠省略不寫
  3. 變量
  4. 文件指示:可使用include包含其餘Makefile文件,文件內容會放在包含文件處,include前不要有[Tab],在[-include]表示忽略找不到或者沒法讀取的文件,能夠用空格隔開文件來包含多個文件;通常如今當前目錄及
  5. 註釋:單行註釋,使用‘#’;

GNU中執行一個make命令的過程以下:

  1. 讀入全部的makefile文件
  2. 讀入被include的其餘文件
  3. 初始化變量
  4. 推導隱晦規則,並分析全部規則
  5. 根據依賴文件爲每一個目標文件創建依賴鏈
  6. 根據依賴鏈決定哪些文件須要從新編譯
  7. 執行生成命令。

參考資料:http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile

相關文章
相關標籤/搜索