本系列(makefile)文章,從零基礎(chǔ)開(kāi)始,通過(guò)實(shí)驗(yàn)逐步分析makefile的語(yǔ)法特性,并最終打造一個(gè)可復(fù)用、可移植的專(zhuān)業(yè)編譯環(huán)境。
參考:
1.DT 唐老師門(mén)徒計(jì)劃課程
2.GNU make 手冊(cè):http://www.gnu.org/software/make/manual/make.html
10多年的三亞網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整三亞建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“三亞網(wǎng)站設(shè)計(jì)”,“三亞網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
hello: // 目標(biāo)
echo “hello makefile” // 實(shí)現(xiàn)目標(biāo)要執(zhí)行的命令,注意行首是一個(gè)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)(第一個(gè)目標(biāo))
Makefile 用于定義源文件和依賴(lài)關(guān)系,說(shuō)明如何編譯各個(gè)源文件并生成可執(zhí)行文件
依賴(lài)的定義:
targets:prerequests; command1
Command2
targets // 通常是需要生成的目標(biāo)文件名,make所需要執(zhí)行的命令名稱(chēng)
prerequisite // 當(dāng)前目標(biāo)所依賴(lài)的其他目標(biāo)或文件
command // 完成目標(biāo)所需要的命令
當(dāng)目標(biāo)對(duì)應(yīng)的文件不存在,執(zhí)行對(duì)應(yīng)命令
當(dāng)依賴(lài)在時(shí)間上比目標(biāo)更新,執(zhí)行對(duì)應(yīng)命令
當(dāng)依賴(lài)關(guān)系發(fā)生時(shí),對(duì)比依賴(lài)鏈上每一個(gè)目標(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)對(duì)應(yīng)著一個(gè)文件,make會(huì)比較文件和依賴(lài)關(guān)系的新舊關(guān)系,決定執(zhí)行是否執(zhí)行命令,make以文件處理作為第一優(yōu)先級(jí)。
所以當(dāng)出現(xiàn)和目標(biāo)同名的文件時(shí),則在文件不被更新的前提下,目標(biāo)不會(huì)被執(zhí)行
通過(guò)PHONY關(guān)鍵字聲明一個(gè)偽目標(biāo),偽目標(biāo)不對(duì)應(yīng)任何實(shí)際的文件,不管偽目標(biāo)的依賴(lài)時(shí)否更新,命令總是執(zhí)行。
偽目標(biāo)的語(yǔ)法:先聲明,后使用
本質(zhì):偽目標(biāo)是make中特殊的目標(biāo):.PHONY的依賴(lài)
.PHONY : clean
clean :
rm *.o hello.out -rf
規(guī)則調(diào)用,模擬C語(yǔ)言函數(shù)的概念。
原理:當(dāng)一個(gè)目標(biāo)的依賴(lài)包含偽目標(biāo)時(shí),偽目標(biāo)所定義的命令總是會(huì)被執(zhí)行。
.PHONY : rebuild clean all
rebuild : clean all
all : hello.out
clean :
rm *.o hello.out -rf
原理:如果一個(gè)規(guī)則沒(méi)有命令或者依賴(lài),并且他的目標(biāo)不是一個(gè)存在的文件名,在執(zhí)行此規(guī)則是,目標(biāo)總會(huì)被認(rèn)為是最新的。
clean : FORCE
rm *.o hello.out -rf
FORCE :