makefile之巢狀shell命令
參考: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/"