關於部落格
職場生活筆記....熱情依然在
  • 51771

    累積人氣

  • 7

    今日人氣

    1

    追蹤人氣

GNU MAKEFILE Part I

在Embedded Linux開發的愛好者們 對於makefile一定是相當的熟悉,我是最近才開始研究makefile的語法.  GNU MAKE這支程式主要是要用來讓程式設計師透過可撰寫的script來自動化的完成"SOURCE CODE TO EXECUTABLE IMAGE" 這個動作. 
而在make script內則描述著 原始碼 中間檔以及可執行檔的關係  甚至可以根據time stamp的
先後來選擇性的更新目標檔 !

以下是make script 的基本條件.

1.
Target .... :  Prereq.....
    Command ...........

Target:        
工作目標是一個必須被建造的檔案.
Prereq:        工作目標所依靠的對象  也是target被建構前所必須要存在的檔案.
Command:   Prereq存在時 所必須要執行的shell command(例如 gcc 1.c -o 1.out)
                      記的這個前面要有一個tab的位移!!


2.當 Preqtimestamp比Target還要新時 Make就會去執行Target所對應的command,並且認定工作目標已經完成更新動作.

------------------------------------------------------------------------------------

Makefile 可以在command line時就直接指定要更新的target對象 這範例可以在移植u-boot時看到
根據不同的target board可以下 make target_config 來初始一些設定config檔.

以下是u-boot範例(可以看到make也支援variable declaration)
smdk2410_config    :    unconfig
    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

// 透過相依特性的更新方法
make script的架構 採用top-down的方式 也就是說他每個target所依賴的preq 會在下方被定義成另一個target,當MAKE 去read script時如果發現target需要更新時(target不存在) 則會去下方去尋找以preq當作target的宣告 依序向下去做更新動作,讓下層的target被用來作為上層的target保持最新的狀態 !

以下是u-boot範例(可以看到最上層target的preq是最終要產出的檔案 , 依據top-down的架構因為要更新target所以相對的preq也跟著要依據下方的宣告跟著更新)

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
all:        $(ALL)

相簿設定
標籤設定
相簿狀態