make
?—— 項目的關節(jié)
一個中型或大型項目,通常由許多文件組成模塊,又由各個模塊組成整個系統(tǒng),將各個文件、模塊構建為系統(tǒng)的方式,一直是項目管理中的要點。make
是一個傳統(tǒng)——但是流行的構建工具,Makefile
是其定義規(guī)則的文件,其中定義的規(guī)則就像關節(jié),將項目中的各部分靈活而有序地組織在一起。
基本語法
Makefile
的核心是規(guī)則,其由一系列規(guī)則組成,每個規(guī)則的基本語法如下:
target:?prerequisites
????recipe
-
target:目標,即要創(chuàng)建或更新的文件,也可以是一個偽目標(不對應實際文件,用于執(zhí)行特定操作)。 -
prerequisites:依賴項,是目標所依賴的文件或其他目標。當依賴項中的任何一個發(fā)生改變時, make
會認為目標需要更新,并執(zhí)行對應的規(guī)則命令。 -
recipe:規(guī)則命令序列,是為了創(chuàng)建或更新目標而需要執(zhí)行的命令,必須以制表符(Tab)開頭。
除此之外,Makefile
還有一些作為腳本必要且實用的功能,以下的實際案例將進一步說明。
C語言項目構建案例
CC?=?gcc
CFLAGS?=?-Wall?-g
all:?myprogram
myprogram:?main.o?utils.o
????$(CC)?$(CFLAGS)?-o?myprogram?main.o?utils.o
main.o:?main.c?utils.h
????$(CC)?$(CFLAGS)?-c?main.c
utils.o:?utils.c?utils.h
????$(CC)?$(CFLAGS)?-c?utils.c
clean:
????rm?-f?*.o?myprogram
以上Makefile
編寫了5條規(guī)則。
1. all
make
默認會執(zhí)行Makefile
里首個規(guī)則的目標,此目標通常被稱作默認目標。一般而言,會把all
作為默認目標,該目標依賴于項目中的其他主要目標,以此來確保所有必要的文件都能被構建。
make
也可手動指定構建目標,如:
make?all
make?clean
make?main.o
2. myprogram
myprogram
目標有2個依賴項main.o
和utils.o
,若依賴項已構建完畢,則會執(zhí)行recipe
部分所定義的命令,將.o
文件通過gcc
鏈接為可執(zhí)行文件myprogram
。
對于每個目標,make
會檢查其依賴項是否存在或者是否有更新。若依賴項不存在,make
會嘗試構建這些依賴項;若依賴項的修改時間比目標新,make
會認為目標需要更新,進而執(zhí)行該目標對應的規(guī)則命令。
3. main.o
若main.c
或utils.h
文件有更新,則根據recipe
定義的命令,通過gcc
編譯生成main.o
。
4. utils.o
同main.o
。
5. clean
目標可以是文件,也可以是一個偽目標,偽目標可通過.PHONY
聲明,確保即使存在同名文件,make
也會執(zhí)行對應的規(guī)則。(案例中由于不存在與目標all/clean同名文件,故省略.PHONY
聲明)
.PHONY:?all?clean
all:?myprogram
clean:
????rm?-f?*.o?myprogram
當執(zhí)行偽目標時,make
會直接執(zhí)行該目標對應的規(guī)則命令,而不會檢查文件的修改時間.
更進一步
Makefile
作為一種構建腳本,可以像shell
那樣,在recipe
中直接編寫命令,比如調用Python
腳本。
C
和Python
混合項目案例
假設項目中有一個C程序和一個Python腳本,C程序生成的數據會被Python腳本處理。
project/
├── main.c
├── process.py
└── Makefile
#?定義編譯器和編譯選項
CC?=?gcc
CFLAGS?=?-Wall?-g
#?定義目標
all:?data.txt?result.txt
#?編譯?C?程序并生成數據文件
data.txt:?main
????./main?>?data.txt
main:?main.c
????$(CC)?$(CFLAGS)?-o?main?main.c
#?使用?Python?腳本處理數據文件
result.txt:?data.txt?process.py
????python3?process.py?data.txt?>?result.txt
#?清理生成的文件
clean:
????rm?-f?main?data.txt?result.txt
結語
Makefile
還有一些常用的高級語法,后續(xù)有機會我會再開一篇文章介紹。感興趣的朋友可以點贊支持哦~
參考資料
GNU make:?https://www.gnu.org/software/make/manual/make.html