u-boot Makefile結構分析

來源:互聯網
上載者:User

分析了一下u-boot1.3.2的Makefile,基本的結構如下:
    主目錄下有一個Makefile,一個config.mk,一個mkconfig指令碼。
  
(一) 首先使用者需要make
smdk2410_config,這樣Makefile會掉用mkconfig指令碼產生include/config.mk這裡麵包含了
ARCH,BOARD,CPU,SOC等變數,這些變數可以供其它的makefile使用,作為一個基本配置.
    如果還沒有掉用make
smdk2410_config,那麼include/config.mk是不存在的,這樣當make
all的時候,會出錯,因為Makefile裡會依據該檔案是否存在給all目標提供不同的規則和命令,當存在include/config.mk時,是
一些正常的規則,當不存在的時候,是出錯提示。
    mkconfig指令碼的作用不僅僅是產生include/config.mk檔案,他還依據使用者是否指定目標檔案夾來建立目錄,將產生的檔案放到非源碼的目錄。此外還產生一個include/config.h檔案,這個檔案很簡單,只有一句話:
    #include <$1.h> 當然這裡的$1時要被替換成不同的board名字的.這個取決於我們在主Makefile中xxxx_config目標中的xxxx是什麼. 這裡可以以smdk2410.h為例子.
    (二)在源碼目錄(而非include)還有一個內建的config.mk,

一般每個子目錄


的Makefile都要包含這個config.mk,因為這個config.mk裡面定義了一些變數,這些變數對這些子目錄的Makefile是有意義
的,如$obj, $src等都定義了子目錄的目標檔案和源碼路徑,這些是依據CURDIR變數來推算的,因為子目錄一般都是由父目錄掉用make
-C過來的,當進入子目錄開始make後,CURDIR自動就成為了當前的working
dir,因此就可以推算出當前子目錄的路徑。當然這個config.mk還有別的內容.包括:
    將不同CPU,BOARD目錄下的原有的config.mk包含進來。
    還有一個很重要的內容:
    CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) 
    這個定義就制定了在編譯的時候告訴編譯器產生的程式碼的基地址是TEXT_BASE,參看u-boot的relocation部分的資料。當然在串連的時候也需要指定這個值。即在串連參數裡指定TEXT_BASE:
    LDFLAGS += -Ttext $(TEXT_BASE)
    此外,還指定了串連指令碼 -T $(LDSCRIPT)
    最後這個檔案中包含一些規則,將.S轉換成.s的規則。由.S產生.o,由.c產生.o
    (三)include/autoconf.mk的作用.
   
它依賴於include/config.h檔案,因此要首先make
xxxx_config,以產生include/config.h。此外由於include/autoconf.mk的產生是通過將include
/common.h中的帶CONFIG_的宏篩選出來得到的,此外還產生了一個依賴檔案,且這個依賴檔案也是依據common.h產生的,這個依賴的目標
就是include/autoconf.mk,其第一個prerequsite就是include/common.h。而,common.h中
include了config.h,這樣可知include/autoconf.mk實際上依賴於config.h以及common.h中的依賴。
下面是Makefie中的一段節選:

# Auto-generate the autoconf.mk file (which is included by all makefiles)
# 因為autoconf.mk中包含了使用者自己定義在common.h中的一些宏
# This target actually generates 2 files; autoconf.mk and autoconf.mk.dep.
# the dep file is only include in this top level makefile to determine when
# to regenerate the autoconf.mk file. 之所以說可以告訴我們when to regenerate
# the autoconf.mk file,是因為在autoconf.mk檔案中包含autoconf.mk: common.h
# 這樣的依賴,一旦common.h改變了,autoconf.mk就的改變

# -M的意思是說產生dependency檔案.
# -MQ是用來指定產生的dependency檔案中的target是什麼,如不指定,模認為xxxx.o
# 即 gcc -M inlcude/common.h >$@.dep 產生的結果為:
# include/common.o : ... 即自動以.o為target,這不是我們想要的,我們想要
# autoconfig.mk作為target,因此要-MQ來手動指定,而且,include/common.h會自動
# 作為一個prequisite.
# 結果,common.h的依賴的所有的檔案,包括common.h都被寫入include/autoconf.mk.dep
# 檔案。這樣include/autoconf.mk依賴於common.h以及common.h中的一些依賴,而接下來
# 的一些要被編譯的target有全都依賴於include/autoconf.mk,因此,一旦common.h有所
# 修改,全部都的重新編譯.
# $(CPP) -dM file 會將file中使用的宏全部輸出到標準輸出.並且將前置處理器的預定義
# 宏也輸出了. 因此這裡有了一個查看於處理器自訂的宏的方法:
# touch foo.h; cpp -dM foo.h,因為foo.h是個空檔案,因此輸出的都是預定義宏.
# sed -n是quiet模式,sed使用tools/define2mk.sed指令碼來處理輸出的宏.將宏處理成
# 了一種適合make處理的autoconf的格式.而且只提取出了common.h中的#define CONFIG_XXX模式的宏,即使用者在common.h中自己定義的宏.
$(obj)include/autoconf.mk: $(obj)include/config.h $(VERSION_FILE)
    @$(XECHO) Generating include/autoconf.mk ; /
    set -e ; /
    : Generate the dependancies ; /
    $(CC) -M $(HOST_CFLAGS) $(CPPFLAGS) -MQ $@ include/common.h > $@.dep ; /
    : Extract the config macros ; /
    $(CPP) $(CFLAGS) -dM include/common.h | sed -n -f tools/scripts/define2mk.sed > $@
# 將由common.h產生的依賴規則包含進來,sinclude,就算沒有該檔案,也不會出錯.
sinclude $(obj)include/autoconf.mk.dep

    其它的規則總將include/autoconf.mk作為一個prerequsite,這樣一旦common.h或者config.h等有更新,整個工程都得重建.

(四)rules.mk的使用
   

在規則中,看到很多_depend,這個東西,其實是定義在rules.mk裡面的,在各個makefile裡面,包含了這個rules.mk,因此可以
通過make -C subdir _depend命令來產生位於各個subdir下的dependency檔案,然後產生的檔案有被包含進來。

    這個u-boot的makefile裡面還包含了許多有趣的命令,可以學習一下。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.