本文由導學寶**:
每個目標裡都可以執行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
可以取消乙個變數的傳遞。也可以單獨使用取消傳遞所有的變數。
我們可以
用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
Makefile語法高階
迴圈條件 其他makefile基本語法 呼叫子makefile 類似函式 關鍵字有 ifeq,ifneq,ifdef,ifndef ifeq cc gcc cc o else cc o xx xx endif函式 含義 subst 字串替換函式 patsubst 模式字串替換函式 strip 去空格...
Makefile中的make命令使用 二
1.makefile中使用變數 可以看到 o 檔案的字串被重複了兩次,edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o gcc o edit main.o kbd.o command.o display.o...
Makefile高階篇之LD
如果沒有特別指定需要使用的ld檔案,連線階段就會使用gcc 的預設ld檔案 如果需要使用特別的ld 檔案,可以使用如下命令 arm linux ld tlink.lds sample1.o sample2.o main.o o hello.elf arm linux objcopy o binary...