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
 

 

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/absurd/archive/2006/03/23/636418.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.