Linux Makefile與Shell的問題_伺服器其它

來源:互聯網
上載者:User

大概只要知道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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.