介紹
Makefile是一個在殼層環境(shell, ex: bash, tcsh,...)執行的程式,主要是被拿來做編譯程式碼使用,例如用Dev C++的開發環境來寫C語言,就可能會看到有個檔案叫"makefile" (介紹網址),用來幫你編譯出最終的程式。運作概念
makefile運作(設計)的概念與一般程式、腳本程式(shell script, ex: tcsh, bash)不同,一般程式語言的執行流程多是從頭到尾,從上到下,從腳本的第一行執行到最後一行,而程式流程裡就會由流程控制的if, switch, while, for loop來控制程式碼如何執行,並透過函式(function)、任務(task)等功能來重複執行某些需要重複執行的工作。例如流程是
==> a產生b, a+b產生c,c*a產生d,而d是最終需要的東西。
簡單流程就會寫成:
#1 b = a
#2 c = a+b
#3 d = c*a
#4 output d
思考邏緝就是上述 ==>所寫的那樣。但makefile的邏輯是反過來看的,寫makefile注重的是"最終要的是什麼",也就是任務目標,知道任務目標後再來找尋"需要哪些東西"。
所以makefile流程會是
==> 最終要產生d,所以需要c和a,因為需要c,所以需要 a和b。所以會寫成
#1 d: c a
#2 target = depend1 * depend2
#3 c: a b
#4 target = depend1 + depend2
第一行指的是說要產生d,需要c和a,d就是目標(target);d的相依物(dependency),也就是指產生d所必要的材料,就是c和 a,然後透過第二行的步驟產生d。而第三、四行功能也類似,只是產生target所做的運算不同。
所以寫makefile基本上是以"目標"為出發點來寫的。這樣有個好處是,假如我要的最終目標是c而不是d,使用make file的話,腳本完全不用修改,只要告訴makefile說"我要的最終目標是c"那它就會去找a和b,來output c,而不像一般腳本語言的思考方式,要修改程式把最終要輸出的東西改成c。
功能整理
規則
target [target2 ... ] : [dependency1 ... 2 ... 3 ...] # ('#'為註解,中括號代表裡面的項目為選擇性)(tab開頭代表指令)[@,-]command1
基本特殊變數
巨集指令
glob目標
網路資源:
- 別人的網誌:http://maxubuntu.blogspot.tw/2010/02/makefile.html
- 中文make manual(文件):https://drive.google.com/
- GNU make 官方資料(英文):https://www.gnu.org/software/make/manual/