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

    累積人氣

  • 7

    今日人氣

    1

    追蹤人氣

GNU MAKEFILE Part II

當我們在為project編寫makefile時,會定義makefile的規則 這些規則主要是用來可以generate出最後的可執行的binary code。或者是相關聯的所需檔案(如dependency file , lib file.....),也為規則定義了 Target,Prequisite,Commmand 這些definition 好讓make可以根據有相依性質的所有檔案以及gen code 的command產生出你所想要的image。

裡面所描述的規則群會有 target->dependency->target 的敘述,就是上一個target的dependency會是另一個rule的target,原因是我們開發比較大型的project時,往往需要眾多的library而這些library通常是某個lib or 可執行的binary所需要的depency files,而他們也是需要depend一堆c asm c++ .. code,因此在makefile就會看到這些有糾纏性質的rule。Make會根據裡面的rule形成Dependency graph,按照這個dependency graph就可以更新特定的target!!
這些rule會根據特定的性質分成五大部分
1. Explicit rule 
2. Pattern rule 
3. Builtin rule 
4. Suffix rule 
5. Static pattern rule

1.Explicit rule
以指定的特定檔案來作為rule的Target 和 Prequisite,且每個rule都可以有多個Target也就是多個target共用PrequisiteCommmand
---------------  U-BOOT example -----------------
prs200_config 
prs200_DDR_config 
prs200_highboot_config 
prs200_highboot_DDR_config: unconfig
------------------------------------------------------------------------------------

2.Pattern rule
很明顯的和explicit rule有著不同特型態的描述,透過pattern可以取得有共同特性的檔案(ex:c檔案都可以經由gcc編譯出相同名稱的的.o檔) 這樣我們就可以簡化對makefile的管理(不需要因為要新增一個可編譯檔,而去修改rule).

------------- GNU Make example --------------------------
%.o: %.c
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
-----------------------------------------------------------------

3.Builtin rule
這個則是make的內建規則,當make file內無定義輸出target所需要的command(必要條件時),make就會使用builtin rule來幫你建立所需要的command!!!

可以用這個argument(--print-data-base)讓make輸出內建規則。如果想要取消內建規則,可以透過pattern rule但是別加command !!
----------------Make builtin rule --------------------------
%.o: %.C
#  commands to execute (built-in):
 $(COMPILE.C) $(OUTPUT_OPTION) $<
---------------------------------------------------------------

4.Suffix rule
這個就不用介紹了因為這是比較過時的用法 有興趣的可以去GNU ORG上找線上DOCUMENT。

5.Static pattern rule
可以參考下面的語法說明,targets-pattern必須要match targets,透過wildcard(%)來取得字幹(ex: pattern 是 %.c targets是 test.c 則字幹就是'test'),利用字幹以及prereq-patterns得知prereq,使得make可以建立rule。
-----------------  Static pattern rule syntax ---------------
targets ... : targets-pattern : prereq-patterns
        commands

---------------  example ----------------------------------
objects = foo.o bar.o
     all: $(objects)
     $(objects): %.o: %.c     ----> $(objects): 就是targets  %.o:是targets-pattern %.c:
prereq-patterns
             $(CC) -c $(CFLAGS) $< -o $@

以上這個範例相當於
foo.o bar.o: foo.c bar.c
        $(CC) -c $(CFLAGS) $< -o $@
----------------------------------------------------------------

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