變數的應用(下)
1. 環境變數(全域性變數)
- makefile中能夠直接使用環境變數的值
定義了同名變數,環境變數將被覆蓋
執行make時指定"-e"選項,優先使用環境變數
示例1
LOGNAME := other
test :
@echo "LOGNAME => $(LOGNAME)"
複製程式碼
![直接使用環境變數的值](https://i.iter01.com/images/675d35b4c002140f1d643afe3fdc387779578ba1cab99eb3ddc22746e920e996.png)
2. 變數在不同makefile之間的傳遞方式
- 直接在外部定義環境變數進行傳遞
- 使用export定義變數進行傳遞(定義臨時環境變數)
- 定義make命令列變數進行傳遞(推薦)
示例2_1--直接在外部定義環境變數進行傳遞 makefile
LOGNAME := other
test :
@echo "LOGNAME => $(LOGNAME)"
@echo "make another file"
@$(MAKE) -f makefile2
複製程式碼
makefile2
test :
@echo "LOGNAME => $(LOGNAME)"
複製程式碼
![直接在外部定義環境變數進行傳遞](https://i.iter01.com/images/d1f8c010ebed3e3e3c635d7e7271066c647839672a7495ac1b9cceeadb18721a.png)
示例2_2--多個檔案呼叫同一個變數不使用export makefile
var := var_start
test :
@echo "make another file"
@$(MAKE) -f makefile2
複製程式碼
makefile2
test :
@echo "var => $(var)"
複製程式碼
![多個檔案呼叫同一個變數不使用export](https://i.iter01.com/images/e3c33a381a2a91e6c96586e12a6d8d4af9db002335270f338363f2ace3a3ea3c.png)
示例2_3--使用export定義變數進行傳遞 makefile
export var := var_start
test :
@echo "make another file"
@$(MAKE) -f makefile2
複製程式碼
makefile2
test :
@echo "var => $(var)"
複製程式碼
![使用export定義變數進行傳遞](https://i.iter01.com/images/c65afb9cdcffc9b54121e617f05a071731eb2b9c18ca2400db43027749f6d4b8.png)
示例2_4--定義make命令列變數進行傳遞 makefile
var := var_start
test :
@echo "make another file"
@$(MAKE) -f makefile2
@$(MAKE) -f makefile2 var:=$(var)
複製程式碼
makefile2
test :
@echo "var => $(var)"
複製程式碼
![定義make命令列變數進行傳遞*](https://i.iter01.com/images/8ac3b8bf35fada589f5250c896acabdb3c95c1e291a8b5dae15c40da05baa66f.png)
3. 目標變數(區域性變數)
- 作用域只在指定目標及連帶規則中
target : name <assignment> value
target : override name <assignment> value
複製程式碼
示例3_1-目標變數,無依賴關係
var := var_start
test : var := var_test
test :
@echo "test:"
@echo "var => $(var)"
another :
@echo "another:"
@echo "var => $(var)"
複製程式碼
![目標變數,無依賴關係](https://i.iter01.com/images/a13900c5558fc625ff9d5b80e32f91d3f1f5ae5645e14c6e1c9be82918a9004b.png)
示例3_2-目標變數,連帶依賴
var := var_start
test : var := var_test
test : another
@echo "test:"
@echo "var => $(var)"
another :
@echo "another:"
@echo "var => $(var)"
複製程式碼
![目標變數,連帶依賴](https://i.iter01.com/images/0ed4422b054fc1f37e29a8f9a02ed05bab8faaaabc781d3caa07331b8085a8d0.png)
4. 模式變數
- 模式變數是目標變數的擴充套件
- 作用域只在符合模式的目標及連帶規則中
pattern : name <assignment> value
pattern : override name <assignment> value
複製程式碼
示例4_1-模式變數-無依賴關係
new := new_start
%e : override new := new_test
test :
@echo "test:"
@echo "new => $(new)"
another :
@echo "another:"
@echo "new => $(new)"
rule :
@echo "rule:"
@echo "new => $(new)"
複製程式碼
![模式變數-無依賴關係](https://i.iter01.com/images/aa8f080049570085a3b4f22b4547fdc1ef1685bc03f0a9bd16098cf95938df89.png)
new := new_start
%e : override new := new_test
test : another
@echo "test:"
@echo "new => $(new)"
another :
@echo "another:"
@echo "new => $(new)"
rule :
@echo "rule:"
@echo "new => $(new)"
複製程式碼
![模式變數-連帶依賴](https://i.iter01.com/images/16a1af4894168ce07d406b22ced6b1d5b6f9718a9df87dfcc3de716d0d038296.png)
小結
- makefile中的三種變數:
- 全域性變數:makefile外部定義的環境變數
- 檔案變數:makefile中定義的變數
- 區域性變數:指定目標的變數