makefile中的shell語法
【原文: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一定要注意。
原文:
相關文章
- 編譯器有關的Makefile語法編譯
- 一文學完makefile語法
- shell基本語法
- makefile--if條件判斷語句的語法與使用
- Shell語法規範
- shell 語法介紹
- 【指令碼】shell語法指令碼
- shell 語法 乾貨
- 轉 關於shell中if 語法結構的廣泛誤解
- makefile--偽目標語法與程式設計例項程式設計
- Shell第三篇:基本語法
- Linux Shell語法速查表Linux
- shell特定變數和Makefile中自動化變數的對比記憶變數
- Javascript中的with語法JavaScript
- Makefile之大型工程專案子目錄Makefile的一種通用寫法
- 如何在 Shell 指令碼中執行語法檢查除錯模式指令碼除錯模式
- [zz]makefile寫法簡單示例
- Linux系統程式設計(13)——Shell的基本語法Linux程式設計
- shell中如何處理兩個數的減法
- Java 中的語法糖,真甜。Java
- django中嵌入html的語法DjangoHTML
- react中的jsx語法ReactJS
- 新建一個最小的Makefile工程(C語言)C語言
- C語言的本質(36)——makefile基礎C語言
- shell程式設計中的控制判斷語句程式設計
- Linux-Shell語法(5)-常用命令Linux
- 詳解中括號語法及點語法
- goto 語法在 PHP 中的使用GoPHP
- java中的try-with-resource語法Java
- MySQL語法中=與:=的區別MySql
- scala 在vim中的語法高亮
- Makefile中幾種賦值(= := ?= +=)賦值
- shell排序法排序
- shell if 寫法
- Typora中的markdown語法的學習
- C語言的本質(38)——makefile之變數C語言變數
- Shell 語法 if 、 case 、for 、 while、 until 、select 、repeat、子函式While函式
- 史上最全shell指令碼程式設計語法上冊指令碼程式設計