讀到一篇文章"核心映像的形成——尋找第一個目标",作者在行文中提到了makefile目标覆寫,内容如下:
"好了,我們跳過若幹行變量定義,看到105行,我們的故事開始了:
105 # That's our default target when none is given on the command line
106 PHONY := _all
107 _all:
看到105行的注釋,如果make後什麼參數都沒有,就到這裡。在繼續往下走之前,我們先來看個前提條件,就是97行對KBUILD_SRC有個判斷,即KBUILD_SRC為空才會來到這裡。我們看到注釋,KBUILD_SRC當然是空的,是以我們敲擊make之後,首先來到的是第107行。
當然,你可以做個試驗,比如在107行後面添加一行,然後寫一個@echo “hello, world!”指令,看看make以後會不會列印出來。試驗的結果很令人詫異,什麼也沒有,看來我們的GNU make基本功還不紮實,還需要繼續刻苦學習。看到142行:
142 ifeq ($(KBUILD_EXTMOD),)
143 _all: all
144 else
145 _all: modules
146 endif
這裡怎麼又出現了一個_all目标呢?這裡引出一個非常重要的GNU make知識,那就是如果出現了相同的Target,那麼後面的Target将會把前面的Target覆寫,并且執行後一個Target的指令和依賴。是以,當你make的時候,雖然會首先來到107行的_all目标,但緊接着,make會發現後面143或145還有一個_all,那麼後面這一個_all就會覆寫它,是以我們看到142行。"
第一次見到這種規則,于是動手測試一下,手寫了一個over.mk
all:
@echo "first"
all:
@echo "second"
運作結果:
root@ubuntu:~# cd Desktop/
root@ubuntu:~/Desktop# make -f over.mk
over.mk:4: warning: overriding commands for target `all'
over.mk:2: warning: ignoring old commands for target `all'
second
root@ubuntu:~/Desktop#