1. 程式人生 > >makefile之巢狀shell命令

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/"