天天看點

【Makefile】2-Makefile的介紹及原理

目錄

  • 前言
  • 概念
  • Chapter 2:介紹
    • 2.1 makefile的規則
    • 2.3 make 是如何工作的 **
    • 2.5 讓 make 自動推導
    • 2.8 Makefile 裡面有什麼
    • 2.9 Makefile 的檔案名
    • 2.10 引用其它的Makefile
      • 尋找其它的 Makefile 路徑及順序
    • 2.11 環境變量 MAKEFILES
    • 2.12 make 的工作方式
  • 參考
    • 書籍

  • 本筆記主要記錄Makefile一些概念要點。
  • 本筆記為提取性筆記,章節與《跟我一起寫Makefile》同步,是以會看到有些小标題會跳過。

target ... : prerequisites ...
    command
    ...
    ...
           
  • target
    • 可以是一個object file(目标檔案)
    • 也可以是一個執行檔案
    • 還可以是一個标簽(label)。
  • prerequisites
    • 生成該 target 所依賴的檔案 和 / 或 targe。
  • command
    • 為該 target 要執行的指令(任意的shell指令)。
  • 注:prerequisites 中如果有一個以上的檔案比 target 檔案要新的話,command 所定義的指令就會被執行。

在預設的方式下,也就是我們隻輸入 make 指令,就會按下面流程走

  1. make會在目前目錄下找名字叫 Makefile 或 makefile 的檔案。
    • GNU make找尋預設的Makefile的規則是在目前目錄下依次找三個檔案—— GNU-makefile 、 makefile 和 Makefile。
  2. 如果找到,它會找檔案中的第一個目标檔案(target),在上面的例子中,他會找到edit這個檔案,并把這個檔案作為最終的目标檔案。
    • 注:此處的 "edit" 是第一個目标,例子就不貼出來了。
  3. 如果 edit 檔案不存在,或是edit所依賴的後面的.o檔案的檔案修改時間要比 edit 這個檔案新,那麼,他就會執行後面所定義的指令來生成 edit 這個檔案。
  4. 如果 edit 所依賴的.o檔案也不存在,那麼 make 會在目前檔案中找目标為.o檔案的依賴性,如果找到則再根據那一個規則生成.o檔案。(這有點像一個堆棧的過程)
  5. 當然,你的 C 檔案和 H 檔案是存在的啦,于是 make 會生成.o檔案,然後再用.o檔案生成make的終極任務,也就是執行檔案 edit 了。

 該功能了解一下。

 隻要make看到一個.o檔案,它就會自動地把.c檔案加在依賴關系中,如果make找到一個whatever.o,那麼whatever.c就會是whatever.o的依賴檔案。并且cc -c whatever.c也會被推導出來。

如:

whatever.o : whatever.h
# 等價于
whatever.o : whatever.c whatever.h
    cc -c whatever.c
           

Makefile 裡主要包含了五個東西:

* 顯式規則

* 隐晦規則

* 變量定義

* 檔案訓示

* 注釋

  • 注:還值得一提的是,在Makefile中的指令,必須要以Tab鍵開始。

    以上幾點詳細解釋參考《跟我一起寫Maefile》對于章節

  • 預設情況下,make指令會在目前目錄下按順序找尋檔案名為 GNUmakefile、makefile、Makefile的檔案。
    • 推薦使用 Makefile 命名。
  • 也可以使用别名命名,如 Makefile.build、abcde等等,隻需要使用 make -f 檔案名 或 make -file 檔案名 來指定檔案名即可。

  • 在 Makefile 使用 include 關鍵字可以把别的 Makefile 包含進來,這很像 C 語言的 #include ,被 包含的檔案會原模原樣的放在目前檔案的包含位置。
  • include 文法:
    • filename 可以是目前作業系統 Shell 的檔案模式(可以包含路徑、通配符和多個檔案)(多個檔案時用空格隔開)。
include <filename>
           

  1. 先在 filename 指定路徑找。如:include <./Makefile.build> ,表示在目前路徑先找。
  2. 如果 filename 沒有指定路徑的話,就先從 make 目前路徑先找。
  3. 以上兩個都沒有,便開始找 make時 -I 或 --include-dir 指定路徑找。
  4. 還沒找到便去目錄

    /include (一般是:/usr/local/bin 或 /usr/include)

    找。

  5. 都沒有便發出警告。(若想略過警告,可以使用 - 号,-include )
  • 總結一下:filename指定路徑->目前路徑->-I或--include-dir 指定路徑->最後路徑。

不建議使用 MAKEFILE 變量。需要了解,可以看文檔。

**若使用Makefile時,出現了神奇的 bug ,可以先看看目前環境變量中有沒有定義這個變量。

GNU 的 make 工作時的執行步驟如下:

  1. 讀入所有的 Makefile。
  2. 讀入被 include 的其它 Makefile。
  3. 初始化檔案中的變量。
  4. 推導隐晦規則,并分析所有規則。
  5. 為所有的目标檔案建立依賴關系鍊。
  6. 根據依賴關系,決定哪些目标要重新生成。
  7. 執行生成指令。

  • 《GUN Makefile》
  • 《跟我一起寫Makefile》

繼續閱讀