什麼是Makefile

一、什麼是Makefile
1.GNU make是一個命令工具,是一個用來控制軟件構建過程的自動化管理工具。Make工具通過稱爲Makefile的文件完成並自動維護編譯工作。

3、makefile定義了一系列的規則來指定,一個工程中的哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作。

總之,makefile爲我們帶來了極大地好處—–“自動化編譯”,一旦編譯成功,只要我們使用一個make工具,整個工程就完全自動化編譯,爲軟件開發提高了效率。

二、Makefile文件編寫規則
1、基本構成
目標文件列表 分隔符 依賴文件列表

[命令]
[命令]

單獨的命令行要以tab鍵開始
# 代表註釋行標誌
目標可以是一個或多個,可以是Object File,也可以是執行文件,甚至可以是一個標籤。
依賴文件列表就是生成目標所需要的文件或目標
命令就是生成目標所需要執行的腳本
2、Makefile的組成部分
一個完整的Makefile文件主要有以下及部分構成:

(1)顯式規則

所謂顯式規則就是顯式指定依賴文件或命令,例如:

 test:test.c
     gcc  -o  test test.c

當我們想生成一個可執行文件test時,這個test文件依賴與test.c文件,就可以用上面的格式進行編寫,切記要在命令行前面加上tab鍵

(2)隱含規則

所謂隱含規則就是需要自動推導文件以及依賴文件後面的命令,不需要我們把每一個文件都寫全,只要make看到一個[.o]文件,它就會自動的把[.c]文件加在依賴關係中,如果make找到一 個whatever.o,那麼whatever.c,就會是whatever.o的依賴文件。並且 cc -c whatever.c 也會被推導出來,於是,我們的makefile再也不用寫得這麼複雜。
一個例子來幫助我們理解一下:

objects = main.o  command.o display.o /
              insert.o search.o 

    edit : $(objects)
            cc -o edit $(objects)

    main.o : defs.h
    command.o : defs.h command.h
    display.o : defs.h buffer.h
    insert.o : defs.h buffer.h
    search.o : defs.h buffer.h

  clean :
            rm edit $(objects)

這樣看起來就簡單很多,但是也有缺點,這樣修改會破壞文件本身的依賴關係

(3)僞目標
它不代表一個真正的文件名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們也可以將一個僞目標稱爲標籤。

使用僞目標有兩點原因:
1. 避免在我們的Makefile中定義的只執行命令的目標(此目標的目的爲了執行一系列命令,而不需要創建這個目標)和工作目錄下的實際文件出現名字衝突。
2. 提高執行make時的效率,特別是對於一個大型的工程來說,編譯的效率也許你同樣關心

例如:

clean:
    rm -f .o temp

這裏的“rm”並不是創建“clean”文件,而是刪除當前目錄下的所有.o和temp文件,但是噹噹前目錄下沒有clean文件時,當我們輸入“make clean”時,rm這一行命令總會被執行,但是當存在clean文件時,在我們輸入“make clean”時。規則沒有依賴文件,所以目標被認爲是最新的而不去執行規則作定義的命令,命令“rm”將不會被執行。
但這並不是我們期望的結果,所以這時候就可以將clean文件定義成僞目標,就不會存在這種情況了;

.PHONY : clean 

這樣,不管是否存在clean文件,我們輸入“make clean”之後。“rm”命令都會被執行。

(3)特殊目標
.PHONY 所有的依賴被作爲僞目標
.IGNORE 後面的依賴文件,生成這些文件的命令在執行時如果出現錯誤,將被忽略繼續執行
.SUFFIXES 該目標的依賴文件被認爲是一個後綴列表
.SILENT 執行生成依賴文件的命令時不會打印所執行的命令
.PRECLOUS 該目標的依賴文件會受到特殊對待,如果make被終止,或者終止,這些依賴並不會被刪除,如果是中間文件,不需要時也不會刪除
.INTERMEDIATE 目標依賴文件在make執行時被當做中間文件對待
(4)使用變量
定義變量的形式:變量名 賦值符 變量值
引用變量:(變量名),如果要用字符(變量名),如果要用字符要使用$$來表示
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章