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

    累積人氣

  • 1

    今日人氣

    1

    追蹤人氣

GNU MAKEFILE Part III

$*  Target的主檔名( If the target is <samp>dir/a.foo.b</samp> and the target pattern is <samp>a.%.b</samp> then the stem is <samp>dir/foo</samp>)

1. Auto variable

make 內建變數的涵義

$@ Target的檔名

$% 程式庫成員中的檔名元素

$<  第一個prequeite的檔名

$?  Timestamp 在Target之後的Prequeite

$^  所有的Prequeite的檔名 但不包含重複部分

$+  所有的Prequeite的檔名

$(@D) $(<D)  指的是Target的檔案路徑

$(@F) $(<F)   指的是Target的檔案名稱

2. Phony Target

在makefile script內通常可以看到 .Phony這個關鍵字串 , 他的用途主要是用來讓make可以執行Programmer所設定的特殊程序(例如:清除之前build code所產生的obj or related files.).  .Phony 後面跟著 Target name 這樣可以讓GNU Make 得知folder下就算有與target相同名稱的檔案,這個target的command還是會跟著執行(不會出現 "xxx is up to date").

--------------------------------- GNU Make example ------------------------------------------------------
 .PHONY: cleanall cleanobj cleandiff
    
     cleanall : cleanobj cleandiff
             rm program
     cleanobj :
             rm *.o
     cleandiff :
             rm *.diff
----------------------------------------------------------------------------------------------------------------------

甚至我們可以透過Phony target的特色來做個make file 的help menu.
如下所示.
--------------------------------- GNU Make example ------------------------------------------------------
help:
    @$(ECHO) "---------------------"
    @$(ECHO) "Make sample"
    @$(ECHO) "---------------------"
    @$(ECHO) "The following targets are supported:"
    @$(ECHO) "   help      : This help"
    @$(ECHO) "   all       : Make lib and bin"
    @$(ECHO) "   clean     : Remove all autogenerated files."
----------------------------------------------------------------------------------------------------------------------

3. Auto generate dependent file.

當我們在開發程式時往往會撰寫header file方便讓其他程式檔可以去取得共用variable的定義,所以一但這個header file有經過修改,make就必須要負責重建依靠這個header fle的目標. 但是header file的撰寫方式很有可能是又包含其他的header file , 層層的包裹很難讓programmer手動去尋找相關聯檔.

我們可以透過GCC 來幫我們尋找出相關聯的HEADER FILEW .透過兩個參數("-M -I")可以取得程式碼內所需要include的header files!!
-------------------------------- GNU Make example ------------------------------------------------------
$ echo "#include<stdio.h>" > main.c
$ gcc -M main.c  > depend
main.o: main.c /usr/include/stdio.h /usr/include/_ansi.h ...........
---------------------------------------------------------------------------------------------------------------------
再 INCLUDE 剛剛的depend檔,即可透過make來監視這些有dependency關係的header file

-------------------------------- GNU Make example ------------------------------------------------------
include depend
---------------------------------------------------------------------------------------------------------------------

有一個make 的sample 可以加入自己的make file script ,這樣就不需要每次都要先gen出這個depend檔.透過下方的script則會產生main.d這個dependency的檔案裡頭會描述著下方的表示,透過這個rule代表.d可以順利被更新一但main,c 和一堆.h檔有被更改時.
main.o main.d :
main.c /usr/include/stdio.h /usr/include/_ansi.h ...........

-------------------------------- GNU Make example ------------------------------------------------------
#定義.c和.d的關係 使的.d檔可以依據程式碼檔案取得正確的dependence file
# 接下來的command敘述著如何產生正確的.d file, 經由sed 把match的pattern(
($*).o[ :]*)全部取代成(1.o $@ : ),後面那個替代的pattern代表
$*.o %.d :(ex: main.o main.d :)

%.d : %.c
    $(CC) -M $(CPPFLAGS) $< > $@.$$$$;
    sed 's,($*).o[ :]*,1.o $@ : ,g' < $@.$$$$ > $@;
    rm -f   $@.$$$$

 

 

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