make和makefile
makefile檔案幫助我們記錄了整個專案工程的所有需要編譯的檔案列表,這樣我們在編譯時僅需要輸入簡單的make命令就能編譯出我們期望的結果。
makefile檔案反映了整個專案中各個模組的依賴關係,這樣我們改動了某些原始檔以後,僅需簡單的輸入make命令,make工具就會根據makefile檔案裡描述的依賴關係幫助我們分析那些模組需要重新編譯,並執行相應的操作。
在linux/unix開發環境中,makefile檔案則是描述了乙個特定編譯系統所需要的策略,而make工具則是通過解析makefile檔案並執行相應的命令來幫助我們構建其編譯系統。
makefile簡介
makefile就是乙個簡單的文字檔案,它基本就是有一條條規則構造。
一條makefile的規則構成如下:
target:prerequisites
command1
command2
command
target:規則的目標,可以簡單理解為這條規則存在的目的是什麼。通常是程式中間或者最後需要生成的檔名,也可以不對應具體的檔案,而僅僅就是個概念上的規則目標。
prerequisites:規則的依賴列表,可以簡單的理解為要達到本條規則的目標所需要的先決條件是什麼。可以是檔名,也可以是其他規則的目標;
command:規則的命令,可以簡單的理解為當目標所需要的先決條件的滿足了之後,需要執行什麼動作來達成規則的目標。規則的命令其實就是shell命令。一條規則中可以有多行命令,特別注意:每行命令都必須以tab鍵開始。
make工作原理
make命令如何使用?
make從**讀取makefile?
mak如何解析執行makefile檔案的規則?
make命令的基本使用正規化如下:
make [ -f makefile ] [ options ] ... [ targets ] ...
使用make命令最簡單的方式主要有以下四種方式:
1.簡單粗暴,不帶任何引數,直接指向make:
make
2.指定makefile檔案
make –f
3.指定makefile目標
make
4.到指定目錄下執行make
make –c
在執行make 的時候,我們可以帶上 –f 《檔名》引數,來指定make命令從**讀取make檔案;而如果我們不顯示指定,則make就會在當前目錄下依次查詢名字為gnumakefile,和makefile,makefile的檔案來作為其makefile檔案。
在讀取完makefile的內容後,make工具並不是逐條去執行makefile裡的規則,而是以某條規則為突破口,多公尺諾骨牌效應式的去執行makefile裡的規則。而這條作為突破口的規則的目標,稱為終極目標 ,我們可以在執行make時以引數的形式指定終極目標,從而執行作為突破口的規則,如果我們不顯式指定終極目標,make一般情況下將選擇makefile的第一條規則的目標作為終極目標。
一般情況下,make執行一條規則的具體過程是這樣的:
make解析makefile的流程如下:
假設makefile內容如下:
終極目標:依賴a
依賴b 依賴c
終極目標命令
依賴a:子依賴a1 子依賴a2
依賴a命令
依賴b:子依賴b1 子依賴b2
依賴b命令
依賴c:子依賴c1 子依賴c2
依賴c命令
過程一,以終極目標為樹根,解析出整顆依賴樹:
過程二,對整顆依賴樹以從底到上,從左到右的順序,解析執行每一條規則:
一起學Makefile(六)
命令的回顯 通常,make在執行命令之前都會把執行的命令進行輸出,例如 關閉命令回顯有以下幾種方式 每個需要關閉回顯的命令列之前加上 符號 執行make時機上引數 s 或 slient進製所有執行命令的顯示。在makefile中使用沒有以來的特殊目標時,slient也可以禁止所有命令的回顯。命令的執...
《跟我一起學makefile》學習筆記(一)
最近在學習朱有鵬老師的嵌入式課程,講到了makefile,朱老師推薦了陳皓老師的 跟我一起學makefile 自己對makefile一知半解,決定跟著文件,系統地學習一下,現記錄如下 對應文件的p1 p9 第一部分 概述 makefile,管理大型工程的原始碼,定義一系列規則。指定哪些檔案先編譯 後...
讀《跟我一起學Makefile》有感
其實在之前的工作中有很多的機會接觸到makefile,但是總是沒能拿出時間通讀其語法,我想這與自身不夠積極的態度是直接掛鉤的。先說說在這次的收穫 首先從最基本的語法規則到變數定義,熟悉了其最基本的工作流程 再者結合文中的示例,自己再實際練習,熟悉了其中個別函式及特殊規則的應用。在接觸到專案中的mak...