makefile中的shell語法

查志強發表於2014-06-09

【原文:http://www.blogjava.net/jasmine214--love/archive/2012/01/10/368191.html

在Makefile中寫shell程式碼有點詭異,和不同的shell語法不太一樣,如果不瞭解,看Makefile會莫名其妙。下面總結了一些。

1:盡在Makefile檔案的目標項冒號後的另起一行的程式碼才是shell程式碼。
eg:
xx = xx1         // 這裡時makefile程式碼
yy:xx = xx2   // 這是是makefile程式碼,makefile允許變數賦值時,'='號兩邊留空格
yy:
    xx=xx3 // 只有這裡是shell程式碼 ,shell不允許‘=’號兩邊有空格哦。
有一個例外:
xx=$(shell 這裡的程式碼也是shell程式碼)

2:Makefile中的shell,每一行是一個程式,不同行之間變數值不能傳遞。所以,Makefile中的shell不管多長也要寫在一行。
eg:

SUBDIR=src example

all:

    @for subdir in $(SUBDIR); /      // 這裡往下是一行shell

    do/

        echo "building " $$subdir; /

    done



3:Makefile中的變數以$開頭, 所以,為了避免和shell的變數衝突,shell的變數以$$開頭
eg1:從當前目錄路徑中提取出 /application 或 /base_class 之前的部分
PROJECT_ROOT_DIR = $(shell pwd | awk -F'/application|/base_class' '{print $$1}')
eg2:上例中$$subdir就是shell中的變數, 而$(SUBDIR)是Makefile的中的變數

=============================================================================================

1、在Makefile中只能在target中呼叫Shell指令碼,其他地方是不能輸出的。比如如下程式碼就是沒有任何輸出:

VAR="Hello"
echo "$VAR"

all:
   .....

以上程式碼任何時候都不會輸出,沒有在target內,如果上述程式碼改為如下:

VAR="Hello"

all:
    echo "$VAR"
    .....

以上程式碼,在make all的時候將會執行echo命令。

2、在Makefile中執行shell命令,一行建立一個程式來執行。這也是為什麼很多Makefile中有很多行的末尾都是“;  \”,以此來保證程式碼是一行而不是多行,這樣Makefile可以在一個程式中執行,例如:

SUBDIR=src example
all:
    @for subdir in $(SUBDIR); \
    do\
        echo "building "; \
    done

上述可以看出for迴圈中每行都是以”; \”結尾的。

3、Makefile中所有以$打頭的單詞都會被解釋成Makefile中的變數。如果你需要呼叫shell中的變數(或者正規表示式中錨定句位$),都需要加兩個$符號($$)。例項如下:

PATH="/data/"

all:
    echo ${PATH}
    echo $$PATH

例子中的第一個${PATH}引用的是Makefile中的變數,而不是shell中的PATH環境變數,後者引用的事Shell中的PATH環境變數。

     以上三點的是Makefile呼叫shell應該注意的地方,寫Makefile一定要注意。


原文:
http://my.unix-center.net/~Simon_fu/?p=648


相關文章