天天看點

makefile目标覆寫

    讀到一篇文章"核心映像的形成——尋找第一個目标",作者在行文中提到了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#      

繼續閱讀