Makefile與shell指令碼區別
在Makefile可以呼叫shell指令碼,但是Makefile和shell指令碼是不同的。本文試著歸納一下Makefile和shell指令碼的不同。 1、 shell中所有引用以$打頭的變數其後要加{},而在Makefile中的變數是以$打頭的後加()。例項如下: Makefile PATH="/data/" SUBPATH=$(PATH)
Shell PATH="/data/" SUBPATH=${PATH}
2、Makefile中所有以$打頭的單詞都會被解釋成Makefile中的變數。如果你需要呼叫shell中的變數(或者正則表示式中錨定句位$),都需要加兩個$符號($$)。例項如下:
PATH="/data/"
all: echo ${PATH} echo $$PATH例子中的第一個${PATH}引用的是Makefile中的變數,而不是shell中的PATH環境變數,後者引用的事Shell中的PATH環境變數。
3、萬用字元區別 shell 中萬用字元*表示所有的字元 Makefile 中萬用字元%表示所有的字元
4、在Makefile中只能在target中呼叫Shell指令碼,其他地方是不能輸出的。比如如下程式碼就是沒有任何輸出:
VAR="Hello" echo "$VAR"
all: .....以上程式碼任何時候都不會輸出,沒有在target內,如果上述程式碼改為如下:
VAR="Hello"
all: echo "$VAR" .....以上程式碼,在make all的時候將會執行echo命令。
5、在Makefile中執行shell命令,一行建立一個程序來執行。這也是為什麼很多Makefile中有很多行的末尾都是“; \”,以此來保證程式碼是一行而不是多行,這樣Makefile可以在一個程序中執行,例如:
SUBDIR=src example all: @for subdir in $(SUBDIR); \ do\ echo "building "; \ done上述可以看出for迴圈中每行都是以”; \”結尾的。