Makefile簡介

Makefile簡介

背景

程序設計一般有一個固定的流程:編輯源代碼文件、將源代碼文件編譯成可執行文件以及對成果進行調試。make程序可讓將一個項目中的源文件編譯成可執行文件之類的工做自動化。make這個詞的意思是「製做」,你想製做什麼後面就加什麼參數,製做的方法也就是配方須要你指定,也就是makefile中的規則。shell

若是你會shell編程的話,你會發現上述功能寫個腳本也能作到。相對於腳本,make的優勢是:它能夠根據文件之間的依賴關係和時間戳判斷應該從新執行那些步驟,以產生須要的程序。有了這個信息,make能夠優化編譯的過程,跳過非必要的步驟。這樣是Make的核心優點。編程

如今有許多自動構建工具,用來產生makefile,好比cmake,qmake等。大部分人都不用手寫makefile,可是讀懂makefile的能力仍是要有的。函數

基本構成

基本上,makefile包含了一組用來編譯應用程序的規則,其它的元素都是爲了更好的描述規則。第一條規則被認爲是默認規則。
一項規則能夠分爲三個部分:工做目標(target),它的必要條件(prerequisite),以及所要執行的命令(command):工具

target:<prereq1> <prereq2> ...
      <commands>
  • 工做目標是make命令行能夠指定的參數,它能夠是一個須要建立的文件或者某個動做
  • 必要條件能夠有多個,用空白隔開
  • 命令是將被放到subshell中執行的命令,能夠有多行多條命令。每行必須以tab開頭。

make的工做機制很簡單。它首先未來自命令行的參數做爲工做目標,若是沒有指定,則取第一個規則中的目標,稱爲爲默認工做目標。而後按順序查找全部該目標依賴的文件,並依次把依賴文件做爲目標在makefile中查找相應的規則...按此遞歸下去造成依賴樹。樹的葉子節點在makefile中沒有相應的規則更新他們,因此他們必須是已經存在的,不然make報錯:所需文件不存在並且沒有更新他們的規則。(產生也視爲更新操做。)make的規則樹的搜索創建是先序遍歷過程,而規則的執行是後序遍歷過程。優化

規則的執行:若是某個必要條件比目標「新」,則將此規則的命令交給shell執行。而若是工做目標最「新」,則什麼也不作。命令只是一些shell程序,它並不必定須要產生一個叫作"target"的文件。targetprerequisites也並不必定要求是文件名。ui

這種要更新目標先更新必要條件的思想是Make的精髓所在。它保證工做步驟合理而且高效的執行。當某個文件發生改變時,只有依賴它的目標纔會被更新,也只有相應的命令會被執行。命令行

例子

假設有一個簡單的程序,包括兩個源文件main.c和lib.c,他們都包含了頭文件header1.h和header2.h,把編譯後造成的可執行程序命名爲prog,那麼makefile能夠寫爲:設計

all: prog

prog: main.o lib.o
    gcc -o prog main.o lib.o
    
main.o : main.c header1.h header2.h
    gcc -c main.c
  
lib.o : lib.c header1.h header2.h
    gcc -c lib.c

如今你只要執行make就會自動執行相應的shell命令把程序編譯好了。調試

固然這只是個說明makefile工做方式的簡單例子,並不比直接輸入編譯命令快多少。可是makefile能夠藉助變量、函數等工具完成很是複雜的規則描述,對於要反覆調試的程序顯然很是方便快捷。code

相關文章
相關標籤/搜索