? 筆者常年在Linux環(huán)境編程,經(jīng)常在項(xiàng)目中與Makefile打交道,最近總結(jié)了幾個(gè)Makefile的小的知識(shí)點(diǎn),分享給大家。
通過(guò)閱讀本文,你將了解到以下知識(shí):
- 1.Makefilke中的.PHONY的作用
- 2.Makefile中的各種賦值運(yùn)算符號(hào)(= 、:= 、+= 、?=)的區(qū)別
Makefilke中的.PHONY的作用
先給大家一個(gè)簡(jiǎn)單的Makefile,如下:
# This is a Makefile for learning makefile knowledge !!!
# Knowledge point:
# 1. What's the usage of ".PHONY" ?
# 2. What's the diffirences between "=", ":=", "?=", and "+=" ?
TEST_VARIABLE = "123"
TEST_VARIABLE ?= "456"
TEST_VARIABLE += "789"
all: some_targets
# Simulate to create the lastest target file.
@touch target_final_file && echo create target_final_file ...
@echo Make all targets done !!!
@echo ""
# @echo "TEST_VARIABLE=$(TEST_VARIABLE)"
@echo ""
TEST_VARIABLE := "abc"
some_targets:
# Simulate to create some target files.
@touch target_file1 && echo create target_file1 ...
@touch target_file2 && echo create target_file2 ...
@touch target_file3 && echo create target_file3 ...
@echo ""
# @echo "TEST_VARIABLE=$(TEST_VARIABLE)"
@echo ""
clean:
@echo Clean builded project.
@rm -rf target_file1 target_file2 target_file3 target_final_file
#.PHONY: clean some_targets
這個(gè)Makefile很簡(jiǎn)單,Makefile的同級(jí)路徑,輸入make命令,則生成4個(gè)目標(biāo)文件target_file1 target_file2 target_file3 target_final_file;執(zhí)行make clean則刪除這4個(gè)生成的目標(biāo)文件。執(zhí)行效果如下圖所示:
看樣子沒(méi)有任何問(wèn)題,那么如果在Makefile同級(jí)目錄有一個(gè)叫clean的文件呢?我們?cè)囅聲?huì)發(fā)生什么?
從演示的效果看,make clean就報(bào)錯(cuò)了,為啥會(huì) “up to date"呢?還是不是因?yàn)椤癱lean”這個(gè)文件的存在。
原來(lái)Makefile中的TARGET默認(rèn)是個(gè)“文件”,如果不使用.PHONY指定一個(gè)TARGET是非文件的話,當(dāng)有一個(gè)與該TARGET同名的文件存在時(shí),執(zhí)行這個(gè)TARGET的編譯命令就會(huì)報(bào)錯(cuò),如上面的例子,這個(gè)TARGET就是clean。
由此可見(jiàn),.PHONY的作用就是申明一個(gè)TARGET是“偽TARGET”,不用為生成任何文件,自然不用檢查與其同名的文件。
我們測(cè)試下,加上.PHONY申明后的結(jié)果:
與我們預(yù)想的一樣,make clean順利執(zhí)行,生成的target文件刪除成功。
Makefile中的各種賦值運(yùn)算符號(hào)的區(qū)別
在Makefile的規(guī)則寫法中,變量的賦值運(yùn)算,有以下幾種方式:
TEST_VARIABLE = "123"
TEST_VARIABLE ?= "456"
TEST_VARIABLE += "789"
TEST_VARIABLE := "abc"
我們先給出結(jié)論:
= 是延緩賦值,語(yǔ)句執(zhí)行時(shí),才會(huì)運(yùn)算賦值,比如VARIABLE = `ls -al` ,只有當(dāng)使用到VARIABLE變量的時(shí)候,才會(huì)去執(zhí)行 ls -al命令求得VARIABLE的值。
?= 是判斷賦值,即當(dāng)變量在此之前沒(méi)有被賦值才會(huì)去執(zhí)行賦值,這個(gè)可以防止變量被多次賦值,或變量被覆蓋的情況。
+= 是疊加賦值,即變量在執(zhí)行+=運(yùn)算后,會(huì)保留之前的值,同時(shí)會(huì)新增新加入的內(nèi)容,這個(gè)常用于對(duì)字符串的處理,可以等同于字符串的追加操作。
:= 是立即賦值,即變量會(huì)被立即執(zhí)行,比如VARIABLE := `ls -al` 在第一個(gè)出現(xiàn)這個(gè)語(yǔ)句的地方,就會(huì)被執(zhí)行l(wèi)s -la,之后都不會(huì)再執(zhí)行了,而是直接使用VARIABLE的值;它與 = 的最大區(qū)別,就是一個(gè)是【立即】,一個(gè)是【延緩】;適用于不同的應(yīng)用場(chǎng)景。
以上就是集中賦值運(yùn)算的對(duì)比和區(qū)別,下面分析下開(kāi)頭給出的Makefile實(shí)踐下。
這個(gè)是因?yàn)門EST_VARIABLE變量最后是用:=賦值的,所有它是最后生效的。其他幾種賦值的效果,留給讀者去驗(yàn)證下吧。
如有疑問(wèn),歡迎在評(píng)論席指出。@_@
延伸閱讀:
【Linux + Makefile】簡(jiǎn)單實(shí)用的Makefile模板來(lái)了
【Linux + Makefile】Makefile的高階用法:解決C文件包含的頭文件修改了,但C文件不重新編譯的問(wèn)題
【Linux + Makefile】十分鐘教你學(xué)會(huì)Makefile的FORCE
?審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209331 -
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19181 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40085
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論