【Linux + Makefile】Makefile中的.PHONY作用以及賦值運算(各種=符號)的區別

筆者常年在Linux環境編程,經常在項目中與Makefile打交道,最近總結了幾個Makefile的小的知識點,分享給大家。

通過閱讀本文,你將瞭解到以下知識:

  • 1.Makefilke中的.PHONY的作用
  • 2.Makefile中的各種賦值運算符號(=  、:= 、+=  、?=)的區別

Makefilke中的.PHONY的作用


先給大家一個簡單的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

這個Makefile很簡單,Makefile的同級路徑,輸入make命令,則生成4個目標文件target_file1 target_file2 target_file3 target_final_file;執行make clean則刪除這4個生成的目標文件。執行效果如下圖所示:

看樣子沒有任何問題,那麼如果在Makefile同級目錄有一個叫clean的文件呢?我們試下會發生什麼?

從演示的效果看,make clean就報錯了,爲啥會 “up to date" 呢?還是不是因爲“clean”這個文件的存在。

原來Makefile中的TARGET默認是個“文件”,如果不使用.PHONY指定一個TARGET是非文件的話,當有一個與該TARGET同名的文件存在時,執行這個TARGET的編譯命令就會報錯,如上面的例子,這個TARGET就是clean。

由此可見,.PHONY的作用就是申明一個TARGET是“僞TARGET”,不用爲生成任何文件,自然不用檢查與其同名的文件

我們測試下,加上.PHONY申明後的結果:

與我們預想的一樣,make clean順利執行,生成的target文件刪除成功。


Makefile中的各種賦值運算符號的區別


在Makefile的規則寫法中,變量的賦值運算,有以下幾種方式:

TEST_VARIABLE  = "123"
TEST_VARIABLE ?= "456"
TEST_VARIABLE += "789"
TEST_VARIABLE := "abc"

我們先給出結論:

= 是延緩賦值,語句執行時,纔會運算賦值,比如 VARIABLE = `ls -al` ,只有當使用到VARIABLE變量的時候,纔會去執行 ls -al命令求得VARIABLE的值。

?= 是判斷賦值,即當變量在此之前沒有被賦值纔會去執行賦值,這個可以防止變量被多次賦值,或變量被覆蓋的情況。

+= 是疊加賦值,即變量在執行+=運算後,會保留之前的值,同時會新增新加入的內容,這個常用於對字符串的處理,可以等同於字符串的追加操作。

:= 是立即賦值,即變量會被立即執行,比如 VARIABLE := `ls -al` 在第一個出現這個語句的地方,就會被執行ls -la,之後都不會再執行了,而是直接使用VARIABLE的值;它與 = 的最大區別,就是一個是【立即】,一個是【延緩】;適用於不同的應用場景。

以上就是集中賦值運算的對比和區別,下面分析下開頭給出的Makefile實踐下。

這個是因爲TEST_VARIABLE變量最後是用:=賦值的,所有它是最後生效的。其他幾種賦值的效果,留給讀者去驗證下吧。

如有疑問,歡迎在評論席指出。@_@ 

 


延伸閱讀:

【Linux + Makefile】簡單實用的Makefile模板來了

【Linux + Makefile】Makefile的高階用法:解決C文件包含的頭文件修改了,但C文件不重新編譯的問題

【Linux + Makefile】十分鐘教你學會Makefile的FORCE

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章