Makefile中的shell

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章