參考:http://blog.csdn.net/wanglang3081/article/details/49423105正則表達式
(1)Makefile本質上來說也是shell腳本,即每條command都是shell進程,運行完shell進程都會退出。shell
(2)shell代碼行,若是有=的話,=兩邊不能有空格ui
(3)Makefile中的shell,每一行是一個進程,不一樣行之間變量值不能傳遞。因此,Makefile中的shell無論多長也要寫在一行。能夠用\來分行寫,格式更清晰一點。spa
SUBDIR=src example all: @for subdir in $(SUBDIR); / // 這裏往下是一行shell do/ echo "building " $$subdir; / done
(4) Makefile中的變量以$開頭,使用$(VAR)或${VAR}來引用變量的定義。 因此,爲了不和shell的變量衝突,shell的變量以$$開頭。.net
注意:Makefile中在對一些簡單變量的引用,咱們也能夠不使用「()」和「{}」來標記變量名,而直接使用「$x」的格式來實現,此種用法僅限於變量名爲單字符的狀況。另外自動化變量也使用這種格 式。對於通常多字符變量的引用必須使用括號了標記,不然make將把變量名的首字母做爲做爲變量而不是整個字符串(「$PATH」在Makefile中其實是「$(P)ATH」)。這一點和shell中變量的引用方式不一樣。shell中變量的引用能夠是「${xx}」或者「$xx」格式。但在Makefile中多字符變量名的引用只能是「$(xx)」或者「${xx}」格式。code
CU_PROJECT_NAME := $(shell pwd |awk -F "/" '{print $$NF}' )
(5)在Makefile中只能在target中調用Shell腳本,其餘地方是不能輸出的。好比以下代碼就是沒有任何輸出。blog
VAR="Hello" echo "$(VAR)" all: .....
只要下面的纔有輸出進程
VAR="Hello" all: echo "$(VAR)" .....
(6)在Makefile中執行shell命令,一行建立一個進程來執行。這也是爲何不少Makefile中有不少行的末尾都是「; \」,以此來保證代碼是一行而不是多行,這樣Makefile能夠在一個進程中執行。字符串
for file in $(SRC_FILE);\ do\ gcov -b "$$file";\ done
(7)Makefile中全部以$打頭的單詞都會被解釋成Makefile中的變量。若是你須要調用shell中的變量(或者正則表達式中錨定句位$),都須要加兩個$符號($$)。get
PATH="/data/" all: echo ${PATH}/*Makefile中變量,即"/data"*/ echo $$PATH /*shell中的變量*/