makefile高階(二) 命令

2021-06-05 21:17:56 字數 2773 閱讀 4184

本文由導學寶**:

每個目標裡都可以執行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...