本系列(makefile)文章,從零基礎(chǔ)開始,通過實驗逐步分析makefile的語法特性,并最終打造一個可復(fù)用、可移植的專業(yè)編譯環(huán)境。
參考:
1.DT 唐老師門徒計劃課程
2.GNU make 手冊:http://www.gnu.org/software/make/manual/make.html
hello: // 目標(biāo)
echo “hello makefile” // 實現(xiàn)目標(biāo)要執(zhí)行的命令,注意行首是一個table(\t)
make -f mf.txt hello // -f表示指定mf.txt文件為規(guī)則定義文件(Makefile),并執(zhí)行文件里的hello目標(biāo)
make // 執(zhí)行默認(rèn)規(guī)則定義文件(Makefile/makefile)中的默認(rèn)目標(biāo)(第一個目標(biāo))
Makefile 用于定義源文件和依賴關(guān)系,說明如何編譯各個源文件并生成可執(zhí)行文件
依賴的定義:
targets:prerequests; command1
Command2
targets // 通常是需要生成的目標(biāo)文件名,make所需要執(zhí)行的命令名稱
prerequisite // 當(dāng)前目標(biāo)所依賴的其他目標(biāo)或文件
command // 完成目標(biāo)所需要的命令
當(dāng)目標(biāo)對應(yīng)的文件不存在,執(zhí)行對應(yīng)命令
當(dāng)依賴在時間上比目標(biāo)更新,執(zhí)行對應(yīng)命令
當(dāng)依賴關(guān)系發(fā)生時,對比依賴鏈上每一個目標(biāo)
hello.out all : func.o main.o
gcc -o hello.out func.o main.o
func.o : func.c
gcc -o func.o -c func.c
main.o : main.c
gcc -o main.o -c main.c
默認(rèn)情況下,make認(rèn)為目標(biāo)對應(yīng)著一個文件,make會比較文件和依賴關(guān)系的新舊關(guān)系,決定執(zhí)行是否執(zhí)行命令,make以文件處理作為第一優(yōu)先級。
所以當(dāng)出現(xiàn)和目標(biāo)同名的文件時,則在文件不被更新的前提下,目標(biāo)不會被執(zhí)行
通過PHONY關(guān)鍵字聲明一個偽目標(biāo),偽目標(biāo)不對應(yīng)任何實際的文件,不管偽目標(biāo)的依賴時否更新,命令總是執(zhí)行。
偽目標(biāo)的語法:先聲明,后使用
本質(zhì):偽目標(biāo)是make中特殊的目標(biāo):.PHONY的依賴
.PHONY : clean
clean :
rm *.o hello.out -rf
規(guī)則調(diào)用,模擬C語言函數(shù)的概念。
原理:當(dāng)一個目標(biāo)的依賴包含偽目標(biāo)時,偽目標(biāo)所定義的命令總是會被執(zhí)行。
.PHONY : rebuild clean all
rebuild : clean all
all : hello.out
clean :
rm *.o hello.out -rf
原理:如果一個規(guī)則沒有命令或者依賴,并且他的目標(biāo)不是一個存在的文件名,在執(zhí)行此規(guī)則是,目標(biāo)總會被認(rèn)為是最新的。
clean : FORCE
rm *.o hello.out -rf
FORCE :
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。