在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
1、在makefile中只能在target中呼叫shell指令碼,其他地方是不能輸出的。比如如下**就是沒有任何輸出:
var="hello"以上**任何時候都不會輸出,沒有在target內,如果上述**改為如下:echo "$var"
all:
.....
var="hello"以上**,在make all的時候將會執行echo命令。all:
echo "$var"
.....
2、在makefile中執行shell命令,一行建立乙個程序來執行。這也是為什麼很多makefile中有很多行的末尾都是「; \」,以此來保證**是一行而不是多行,這樣makefile可以在乙個程序中執行,例如:
subdir=src example上述可以看出for迴圈中每行都是以」; \」結尾的。all:
@for subdir in $(subdir); \
do\echo "building "; \
done
3、makefile中所有以$打頭的單詞都會被解釋成makefile中的變數。如果你需要呼叫shell中的變數(或者正規表示式中錨定句位$),都需要加兩個$符號($$)。例項如下:
path="/data/"例子中的第乙個$引用的是makefile中的變數,而不是shell中的path環境變數,後者引用的事shell中的path環境變數。all:
echo $
echo $$path
dirs = src bin lib
all:
@for i in $(dirs); /
do /
echo " " $$i; /
done
dirs是makefile變數,i是shell變數
以上三點的是makefile呼叫shell應該注意的地方,寫makefile一定要注意。
原文:
Makefile中新增shell指令碼
makefile中可以加入shell指令碼語言,但是編寫形式不一樣,makefile中都是以行為單位的,所以必須將makefile中的shell指令碼通過 連線成一行。例如 if d hisi home src sdk modify hidrv v0a1 source osdrv kernel li...
Makefile中的變數和shell變數
我們在寫makefile時 多多少少會用到shell指令碼,對於變數的在shell中的使用有一些要注意的細節。讓我們從乙個簡單的makefile來看看。注意makefile中一定要有乙個目標,且一定要有乙個終極目標,若想要有多個目標應該設立乙個偽目標。如下 all hello hello2 hell...
Makefile 和 shell中的環境變數使用
makefile中可以通過 var 或者 的方式使用變數,詳細的講述大家可以參考 之前我一直以為這兩是一樣的,沒啥區別,直到我遇到了問題。因專案需求,需要移植lighttpd到arm平台,過程中需要設定toolchain的位置,如下 cd cc gcc ar ar ld ld strip strip...