make常見規則解析(轉)

gugu99發表於2007-08-10
make常見規則解析(轉)[@more@]

  這是一段在Makefile中常見的規則

  clean:

  rm -r core *.o *.a tmp_make

  for i in *.c; do rm -f `basename $$i .c`.s; done

  (cd chr_drv; make clean)

  (cd blk_drv; make clean)

  (cd math; make clean)

  第一句的 rm -f core *. *.a tmp_make 作用只是刪除檔案,意思直白,沒什麼好說的。

  第二句 for 迴圈遍歷目錄下所有的檔案,將所有字尾名為.c檔名依次賦給i。然後執行do語句,當符合迴圈結束是執行done。可以說這裡的for和shell裡for語法是如此貌似。

  我們可以來做個實驗來驗證一下:

  $ mkdir test  #建立個實驗用的目錄

  $ cd test

  $ touch a.x   #建幾個實驗用的檔案

  $ touch b.x

  $ touch yy.x

  $ vi Makefile   #寫個實驗指令碼

  在檔案中寫入:

  clean:

  for i in *.x; do echo $$i; done

  寫好後,儲存退出。執行命令:

  $ make

  隨後可看到輸出的結果:

  for i in *.x;do echo $i;done

  a.x

  b.x

  yy.x

  看到結果,for語句實現的功能就很清楚了。

  對於結果,有一個怪異的就是,原來指令碼中的$$i,在輸出是就變成了$i。這時的for是不是就是一樣了。現在可以先做個結論,make處理指令碼可shell處理指令碼幾乎雷同,只是個別情況下要做變通。make會對$x進行擴充套件。比如:

  ec=echo

  test:

  $(ec) 'ddd'

  就可以在螢幕上看到輸出:

  echo 'ddd'

  ddd

  所以應該是make對Makefile進行處理,將其變成shell可執行的指令碼,最後由shell直譯器來執行有make翻譯過的指令碼。並且是翻譯一句然後shell執行一句,對於這個可以再做個驗證。

  e =echo

  prt=ls

  clean:

  $(prt)

  for i in *.x;do $e $$i;done

  其輸出為:

  ls

  a.sh a.x b.x Makefile yy.x

  for i in *.x;do echo $i;done

  a.x

  b.x

  yy.x

  可以看到,$(prt)被擴充套件後就立即執行了。後面的for也是這樣。

  到這裡開篇的那個例子算是解析完畢了。下面在看看Makefile中的規則定義,在make中的規則分為兩種,一種是顯示規則,另一種無可爭議的就是隱含規則了。

  顯示規則,定義如下

  目標檔案 : 依賴檔案

  生成目標檔案的規則

  隱含規則

  .原始檔副檔名.目標副檔名:

  生成目標檔案的規則

  在使用隱含規則時要使用一些內定宏來指定檔名:

  $@  全路徑的目標檔案

  $*  去除擴張名的全路徑的目標檔案

  $?  所有原始檔名

  $

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-939769/,如需轉載,請註明出處,否則將追究法律責任。

相關文章