一下摘錄Makefile中調用shell的一段
install:
-if [ ! -e xxx ]; then sudo mkdir xxx; fi
注意,將上面的if語句寫到一行的話,必須在fi前面加上分號,否則會出現下面錯誤
unexpected end of file
下面轉一個相關文章
Makefile
與
Shell
的問題
大概只要知道
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
|
感謝,Thanks!