makefile進階(二)--命令

本文由導學寶轉自:http://blog.chinaunix.net/uid-26822401-id-3158097.html

每個目標裏都可以運行shell命令,每個命令前以[Tab]開頭,它不能是空格。
通常情況下,你執行的命令會在輸出中顯示出來,比如:
output:
    echo hello
運行make會有如下結果:
$ make output
echo hello
hello

有時我們不希望把執行的命令顯示出來,我們可以在命令前加上@符來隱藏這個命令
output:
    @echo hello
$ make output 
hello

make命令本身也帶有選項來隱藏所有命令的輸出,它是-s或--silent。與它相反的是-n或--just-print,它們只顯示命令卻不執行它們


注意makefile裏的命令是一行一行執行的,而且各行命令之間沒有瓜葛。比如你在某行cd一個目錄,下一行的命令不會受這個cd命令的影響:
testcd:
    cd src1
    pwd

$ make testcd
cd src1
pwd
/home/tommy/makefile

爲了關聯兩個命令,我們需要用;號或&&號把它們連接成一行
testcd:
    cd src1;pwd
    cd src1 && pwd
$ make testcd
cd src1;pwd
/home/tommy/makefile/src1
cd src1 && pwd
/home/tommy/makefile/src1

你應該能猜到;與&&的區別。分號不管什麼情況都會執行被連接的兩個命令,而&&只會在第一個成功的情況下才會執行後一個。舉個例子:

testcd:
    cd notexist ; pwd
    -cd notexist && pwd

$ make testcd 
cd notexist ; pwd
cd: 1: can't cd to notexist
/home/tommy/makefile
cd notexist && pwd
cd: 1: can't cd to notexist
make: [testcd] 錯誤 2 (忽略)

可以看到第一行裏的pwd繼續執行而第二行的沒有。注意第二行的cd命令前有一個-號,它是爲了使make忽略出錯的命令,否則make在執行命令出錯時會中斷退出。第一行之所以不需要-號的原因,是因爲該行的返回值由該行最後一個命令的返回值決定。由於第一行pwd返回成功,所以這行也視爲成功。

我們也可以使用.IGNORE聲明來忽略一個目標裏的所以錯誤。
.IGNORE: testcd
testcd:
    cd notexist ; pwd
    cd notexist && pwd

make有相應的忽略所有錯誤的選項-i或--ignore-errors。另一個選項是-k或--keep-going,它表示如果命令錯,那麼中斷當前的目標,但是繼續執行別的目標。


我們可以把make分成多個子系統,比如在子文件夾下放入別的makefile,然後用入下命令執行:
subsystem:
    cd subdir && $(MAKE) -w
它等價於:
subsystem:
    $(MAKE) -C subdir

-w或--print-directory選項會打印當前makefile的目錄,它的輸出爲:

$ make subsystem
cd subdir && make -w
make[1]: 正在進入目錄 `/home/tommy/subdir'
I'm sub system!
make[1]:正在離開目錄 `/home/tommy/subdir'

使用-C選項時,-w選項被被自動打開。如果-s被指定了,那麼-w選項會失效。當然,你可以根據需要指定合適的make選項。

我們要以把變量傳遞給子系統,通過export關鍵字。

比如:
var=val (或var:=val)
export var
等價於
export var=val(或var:=val)

同樣,
var+=val
export var
等價於
export var+=val

如果有一行單獨的export語句,那麼所有的變量(在export之前和之後的)都會被傳遞給子系統。

unexport <varname>可以取消一個變量的傳遞。也可以單獨使用取消傳遞所有的變量。


我們可以用define和endef把多個命令語句組合在一起,來重複使用。它被稱爲定義包。這類似於函數:
define print-info
    @echo "1--" $@
    @echo "2--" $@
endef

info-one:
    $(print-info)

info-two:
    $(print-info)
輸出的結果爲:
$ make info-one info-two
1-- info-one
2-- info-one
1-- info-two
2-- info-two

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章