1. 程式人生 > >Makefile與shell指令碼區別

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迴圈中每行都是以”; \”結尾的。