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 循環(huán)遍歷目錄下所有的文件,將所有后綴名為.c文件名依次賦給i。然后執(zhí)行do語句,當符合循環(huán)結(jié)束是執(zhí)行done??梢哉f這里的for和shell里for語法是如此貌似。
我們可以來做個實驗來驗證一下:
$ mkdir test #建立個實驗用的目錄
$ cd test
$ touch a.x #建幾個實驗用的文件
$ touch b.x
$ touch yy.x
$ vi Makefile #寫個實驗?zāi)_本
在文件中寫入:
clean:
for i in *.x; do echo $$i; done
寫好后,保存退出。運行命令:
$ make
隨后可看到輸出的結(jié)果:
for i in *.x;do echo $i;done
a.x
b.x
yy.x
看到結(jié)果,for語句實現(xiàn)的功能就很清楚了。
對于結(jié)果,有一個怪異的就是,原來腳本中的$$i,在輸出是就變成了$i。這時的for是不是就是一樣了。現(xiàn)在可以先做個結(jié)論,make處理腳本可shell處理腳本幾乎雷同,只是個別情況下要做變通。make會對$x進行擴展。比如:
ec=echo
test:
$(ec) 'ddd'
就可以在屏幕上看到輸出:
echo 'ddd'
ddd
所以應(yīng)該是make對Makefile進行處理,將其變成shell可執(zhí)行腳本,最后由shell解釋器來執(zhí)行有make翻譯過的腳本。并且是翻譯一句然后shell執(zhí)行一句,對于這個可以再做個驗證。
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)被擴展后就立即執(zhí)行了。后面的for也是這樣。
到這里開篇的那個例子算是解析完畢了。下面在看看Makefile中的規(guī)則定義,在make中的規(guī)則分為兩種,一種是顯示規(guī)則,另一種無可爭議的就是隱含規(guī)則了。
顯示規(guī)則,定義如下
目標文件 : 依賴文件
生成目標文件的規(guī)則
隱含規(guī)則
.源文件擴展名.目標文件擴展名:
生成目標文件的規(guī)則
在使用隱含規(guī)則時要使用一些內(nèi)定宏來指定文件名:
$@ 全路徑的目標文件
$* 去除擴張名的全路徑的目標文件
$? 所有源文件名
$< 源文件名