一下摘錄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!