歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

常用命令之make常見規則解析

  這是一段在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=echotest:    $(ec) 'ddd'就可以在屏幕上看到輸出:    echo 'ddd'    ddd        所以應該是make對Makefile進行處理,將其變成shell可執行的腳本,最後由shell解釋器來執行有make翻譯過的腳本。並且是翻譯一句然後shell執行一句,對於這個可以再做個驗證。        e =echo    prt=lsclean:        $(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中的規則分為兩種,一種是顯示規則,另一種無可爭議的就是隱含規則了。    顯示規則,定義如下目標文件 : 依賴文件    生成目標文件的規則        隱含規則.源文件擴展名.目標文件擴展名:    生成目標文件的規則    在使用隱含規則時要使用一些內定宏來指定文件名:    $@    全路徑的目標文件    $*    去除擴張名的全路徑的目標文件    $?    所有源文件名    $<    源文件名


[1] 



Copyright © Linux教程網 All Rights Reserved