9.6Makefile的語法

視頻教程???
通配符
假如一個(gè)目標(biāo)文件所依賴的依賴文件很多,那樣豈不是我們要寫很多規(guī)則,這顯然是不合乎常理的。
我們可以使用通配符,來解決這些問題。
我們對上節(jié)程序進(jìn)行修改代碼如下:?

%.o:表示所用的.o文件
%.c:表示所有的.c文件
$@:表示目標(biāo)
$<:表示第1個(gè)依賴文件
$^:表示所有依賴文件
我們來在該目錄下增加一個(gè)c.c文件,代碼如下:?

然后在main函數(shù)中調(diào)用修改Makefile,修改后的代碼如下:?

執(zhí)行:
make
結(jié)果:

運(yùn)行:
./test
結(jié)果:?

假想目標(biāo): .PHONY
1.我們想清除文件,我們在Makefile的結(jié)尾添加如下代碼就可以了:?

1).執(zhí)行make:生成第一個(gè)可執(zhí)行文件。
2).執(zhí)行make clean: 清除所有文件,即執(zhí)行:rm *.o test。
make后面可以帶上目標(biāo)名,也可以不帶,如果不帶目標(biāo)名的話它就想生成第一個(gè)規(guī)則里面的第一個(gè)目標(biāo)。
2.使用Makefile
執(zhí)行:make [目標(biāo)]
也可以不跟目標(biāo)名,若無目標(biāo)默認(rèn)第一個(gè)目標(biāo)。我們直接執(zhí)行make的時(shí)候,會(huì)在makefile里面找到第一個(gè)目標(biāo)然后執(zhí)行下面的指令生成第一個(gè)目標(biāo)。當(dāng)我們執(zhí)行make clean的時(shí)候,就會(huì)在Makefile里面找到clean這個(gè)目標(biāo),然后執(zhí)行里面的命令,這個(gè)寫法有些問題,原因是我們的目錄里面沒有clean這個(gè)文件,這個(gè)規(guī)則執(zhí)行的條件成立,他就會(huì)執(zhí)行下面的命令來刪除文件。
如果:該目錄下面有名為clean文件怎么辦呢?
我們在該目錄下創(chuàng)建一個(gè)名為“clean”的文件,然后重新執(zhí)行:make然后make clean,結(jié)果(會(huì)有下面的提示:):?
make: `clean' is up to date.
它根本沒有執(zhí)行我們的刪除操作,這是為什么呢?
我們之前說,一個(gè)規(guī)則能過執(zhí)行的條件:
1).目標(biāo)文件不存在
2).依賴文件比目標(biāo)新。?
現(xiàn)在我們的目錄里面有名為“clean”的文件,目標(biāo)文件是有的,并且沒有依賴文件,沒有辦法判斷依賴文件的時(shí)間。這種寫法會(huì)導(dǎo)致:有同名的"clean"文件時(shí),就沒有辦法執(zhí)行make clean操作。解決辦法:我們需要把目標(biāo)定義為假想目標(biāo),用關(guān)鍵字PHONY。?
.PHONY: clean ?//把clean定義為假想目標(biāo)。他就不會(huì)判斷名為“clean”的文件是否存在,
然后在Makfile結(jié)尾添加.PHONY: clean語句,重新執(zhí)行:make clean,就會(huì)執(zhí)行刪除操作。?
變量
在makefile中有兩種變量:
1)簡單變量(即時(shí)變量):
A?:= xxx ? # A的值即刻確定,在定義時(shí)即確定
對于即時(shí)變量使用“:=”表示,它的值在定義的時(shí)候已經(jīng)被確定了?
2)延時(shí)變量
B = xxx ? ?# B的值使用到時(shí)才確定
對于延時(shí)變量使用“=”表示。它只有在使用到的時(shí)候才確定,在定義/等于時(shí)并沒有 確定下來。?
想使用變量的時(shí)候使用“$”來引用,如果不想看到命令是,可以在命令的前面加上"@"符號,就不會(huì)顯示命令本身。當(dāng)我們執(zhí)行make命令的時(shí)候,make這個(gè)指令本身,會(huì)把整個(gè)Makefile讀進(jìn)去,進(jìn)行全部分析,然后解析里面的變量。常用的變量的定義如下:?
:=? ?# 即時(shí)變量
=? ? # 延時(shí)變量
?=? ?# 延時(shí)變量, 如果是第1次定義才起效, 如果在前面該變量已定義則忽略這句
+=? ?# 附加, 它是即時(shí)變量還是延時(shí)變量取決于前面的定義
?=:如果這個(gè)變量在前面已經(jīng)被定義了,這句話就不會(huì)起效果,
實(shí)例:?

執(zhí)行:
make
結(jié)果:?

分析:
1) A?:= $(C): A為即時(shí)變量,在定義時(shí)即確定,由于剛開始C的值為空,所以A的值也為空。
2) B = $(C): ?B為延時(shí)變量,只有使用到時(shí)它的值才確定,當(dāng)執(zhí)行make時(shí),會(huì)解析Makefile里面的所用變量,所以先解析C = abc,然后解析C += 123,此時(shí),C = abc 123,當(dāng)執(zhí)行:@echo B = $(B) B的值為 abc 123。
3) D??= weidongshan: D變量在前面沒有定義,所以D的值為weidongshan,如果在前面添加D = 100ask,最后D的值為100ask。
我們還可以通過命令行存入變量的值 例如:
執(zhí)行:
make D=123456
里面的D??= weidongshan這句話就不起作用了。
結(jié)果:?

視頻教程???
