大概只要知道Makefile的人,都知道Makefile可以調用Shell指令碼。但是在實際使用時,並不那麼簡單,一些模稜兩可的地方可能會讓你抓狂。你若不信,可以先看幾個例子,想象一下這些這些例子會列印什麼內容,記下你想象的結果,然後在電腦上運行這些例子,對照看一下。
樣本一:
if [ "$(BUILD)" = "debug" ]; then echo "build debug"; else echo "build release"; fi
all:
echo "done"
樣本二:
all:
@CC=arm-linux-gcc
@echo $(CC)
樣本三:
CC=arm-linux-gcc
all:
@echo $(CC)
樣本四:
SUBDIR=src example
all:
@for subdir in $(SUBDIR); /
do/
echo "building " $(subdir); /
done
說明:
1. Shell指令碼在target裡才有效,其它地方都被忽略掉了。所以樣本一中,”build debug”之類的字串根本列印不出來。樣本一的正確寫法是:
樣本一:
all:
if [ "$(BUILD)" = "debug" ]; then echo "build debug"; else echo "build release"; fi
echo "done"
2. make把每一行Shell指令碼當作一個獨立的單元,它們在單獨的進程中運行。樣本二中,兩行Shell指令碼在兩個莫不相干的進程裡運行,第一個進程把CC設定為arm-linux-gcc,第二個進程是不知道的,所以列印的結果自然不是arm-linux-gcc了。樣本二的正確寫法是:
樣本二:
all:
@CC=arm-linux-gcc; echo $(CC)
或者:
all:
@CC=arm-linux-gcc; /
echo $(CC)
3. make在調用Shell之前先進行預先處理,即展開所有Makefile的變數和函數。這些變數和函數都以$開頭。樣本三中,Shell拿的指令碼實際上是echo arm-linux-gcc,所以列印結果正確。
4. make預先處理時,所有以$開頭的,它都不會放過。要想引用Shell自己的變數,應該以$$開頭。另外要注意,Shell自己的變數是不需要括弧的。樣本四的正確寫法是:
樣本四:
SUBDIR=src example
all:
@for subdir in $(SUBDIR); /
do/
echo "building " $$subdir; /
done
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/absurd/archive/2006/03/23/636418.aspx