參考:http://blog.csdn.net/yusiguyuan/article/details/16951413
在Makefile中寫shell代碼有點詭異,和不同的shell文法不太一樣,如果不了解,看Makefile會莫名其妙。下面總結了一些。
1:盡在Makefile檔案的目标項冒号後的另起一行的代碼才是shell代碼。
eg:
xx = xx1 // 這裡時makefile代碼
yy:xx = xx2 // 這是是makefile代碼,makefile允許變量指派時,'='号兩邊留白格
yy:
xx=xx3 // 隻有這裡是shell代碼 ,shell不允許‘=’号兩邊有空格哦。
有一個例外:
xx=$(shell 這裡的代碼也是shell代碼)
2.
在makefile中隻能在target中調用shell腳本,如果指令放在了target之前,腳本執行後會報錯。所有指令必須放在target之後,并且用tab鍵起行。
比如:
rm -rf ...
all:
...
makefile: *** commands commence before first target。 停止。
正确如下:
eg:
var=foo
all:
@echo $(var)
3.
Makefile中的shell,每一行是一個程序,不同行之間變量值不能傳遞。如果你要讓上一條指令的結果應用到下一條指令時,應該使用分号分隔這兩條指令。比如第一條指令是cd,第二條指令在第一條的基礎上運作,需要把兩個指令寫在一行并用;分隔。
錯誤執行個體:
all:
cd /home/joan/
pwd
結果:pwd并沒有列印joan目錄下的路徑,而是腳本所在目錄的。正确寫法:
all:
cd /home/joan/;pwd
4、Makefile中所有以$打頭的單詞都會被解釋成Makefile中的變量。如果你需要調用shell中的變量(或者正規表達式中錨定句位$),都需要加兩個$符号($$)。執行個體如下:
PATH="/data/"
all:
echo ${PATH}
echo $$PATH
列印結果:
echo "/data/"
/data/
echo $PATH
"/data/"
對于第4點的說法表示懷疑。兩個$$在一起表示一個真實的“$”,第二個echo輸出echo $PATH 由于 $PATH為"/data/"故列印"/data/"