天天看點

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