1. 程式人生 > >Makefile中的shell用法

Makefile中的shell用法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

在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 exampleall:    @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一定要注意。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述