Makefile學習總結文檔之Makefile的介紹與總述

Makefile的介紹與總述

最近在學習Android系統工程師的知識,涉及到Makefile的學習,本文參考《GNU_make_zh_CN》的pdf版本來學習的。
參考博客鏈接:https://www.cnblogs.com/cj5785/p/9893162.html

  1. 當使用make工具進行編譯時,工程中以下幾種文件在執行make時將會編譯(重新編譯):
    a) 所有的源文件沒有被編譯過,則對各個C源文件進行編譯並進行鏈接,生成最後的可執行程序;
    b) 每一個在上次執行make之後修改過的C源代碼文件在本次執行make時將會被重新編譯;
    c) 頭文件在上一次執行make之後被修改。則所有包含此頭文件的C源文件在本次執行make時將會被重新編譯;

  2. 一個簡單的Makefile描述規則組成:
    TARGET…:PREREQUISITES…
    COMMAND

  3. 一個規則可以有多個命令行,每一條命令佔一行。每一個命令行必須以[Tab]字符開始,[Tab]字符告訴make此行是一個命令行,make按照命令完成相應的動作。

  4. 所有的命令行必須以[Tab]字符開始,但並不是所有以[Tab]鍵出現行都是命令行,但make程序會把第一條規則之後的所有以[Tab]字符開始的行都作爲命令行來處理。

  5. “#”字符後的內容被作爲是註釋內容處理。註釋行的結尾如果存在反斜線“\”,那麼下一行也被作爲註釋行。

  6. 在一個Makefile中包含其他的makefile文件,使用“include”,和c語言對頭文件的包含方式一致。
    include FILENAMES…
    FILENAMES 是shell所支持的文件名(可以使用通配符)
    “$(bar)”被擴展爲“bish bash”

  7. make程序在處理include時,將暫停對當前使用指示符“include”的makefile文件的讀取,而轉去依次讀取由“include“”指定符指定的文件列表。直到完成所有這些文件以後再回頭繼續讀取指示符“include”所在的makefile文件。

  8. 使用“-”的意思是告訴make,忽略此操作的錯誤,make繼續執行。如“-include FILENAMES…”,make程序處理時,如果“FILENAMES”列表中的任何一個文件不能正常讀取而且不存在一個創建此文件的規則時,make程序將會提示錯誤並退出。

  9. 爲了和其他的make程序進行兼容。也可以使用“sinclude”來代替“-include”;

  10. 如果使用一個沒有依賴只有命令行的雙冒號規則去更新一個文件,那麼每次執行make時,此規則的目標文件將會被無條件的更新。如果這樣一個規則的目標是makefile文件,那麼執行make時,這個makefile文件(雙冒號規則的目標)就會被無條件更新,而使得make的執行陷入一個死循環(此makefile文件被不斷的更新、重新讀取、更新在重新讀取的過程)。爲了防止這種情況的發生,make在遇到一個目標時makefile文件的雙冒號規則時,將忽略對這個規則的執行。

  11. 執行make時,如果沒有使用“-f”選項指定一個文件,make程序將會讀取缺省的文件。

  12. make的執行過程分爲兩個階段
    a) 讀取所有的makefile文件(包括“MAKIFILES”變量指定的、指定符“include”指定的、以及命令行選項“-f”指定的makefile文件),內建所有的變量、明確規則和隱含規則,並建立所有目標和依賴之間的依賴關係結構鏈表。
    b) 根據第一階段已經建立的依賴關係結構鏈表決定哪些目標需要更新,並使用對應的規則來重建這些目標。

  13. 當變量使用追加符(+=)時,如果此前這個變量是一個簡單變量(使用:=定義的),則認爲它是立即展開的,其他情況都被認爲是“延後”展開的變量。

  14. 所有使用到條件語句在產生分支的地方,make 程序會根據預設條件將正確地分支展開。就是說條件分支的展開是“立即”的。其中包括:“ifdef”、“ifeq”、“ifndef”和“ifneq”所確定的所有分支命令。

  15. make 的執行過程如下:
    a) 依次讀取變量“MAKEFILES”定義的 makefile 文件列表
    b) 讀取工作目錄下的 makefile 文件(根據命名的查找順序“GNUmakefile”,“makefile”,“Makefile”,首先找到那個就讀取那個)
    c) 依次讀取工作目錄 makefile 文件中使用指示符“include”包含的文件
    d) 查找重建所有已讀取的 makefile 文件的規則(如果存在一個目標是當前讀取的某一個 makefile 文件,則執行此規則重建此 makefile 文件,完成以後從第一步開始重新執行)
    e) 初始化變量值並展開那些需要立即展開的變量和函數並根據預設條件確定執行分支
    f) 根據“終極目標”以及其他目標的依賴關係建立依賴關係鏈表
    g) 執行除“終極目標”以外的所有的目標的規則(規則中如果依賴文件中任一個文件的時間戳比目標文件新,則使用規則所定義的命令重建目標文件)
    h) 執行“終極目標”所在的規則

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