1. 程式人生 > 實用技巧 >makefile中的shell語法 || Makefile中的@

makefile中的shell語法 || Makefile中的@

轉自:https://blog.csdn.net/JK198310/article/details/14163173

在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 =======================================================

Makefile中的@通常,make會把其要執行的命令列在命令執行前輸出到螢幕上。當我們用“@”字元在命令列前,那麼,這個命令將不被make顯示出來,最具代表性的例子是,我們用這個功能來像螢幕顯示一些資訊。如:


@echo正在編譯XXX模組......

當make執行時,會輸出“正在編譯XXX模組......”字串,但不會輸出命令,如果沒有“@”,那麼,make將輸出:

echo正在編譯XXX模組......
正在編譯XXX模組......

如果make執行時,帶入make引數“-n”或“--just-print”,那麼其只是顯示命令,但不會執行命令,這個功能很有利於我們除錯我們的Makefile,看看我們書寫的命令是執行起來是什麼樣子的或是什麼順序的。

而make引數“-s”或“--slient”則是全面禁止命令的顯示。