1. 程式人生 > >make--變量 條件判斷 函數定義及調用

make--變量 條件判斷 函數定義及調用

UNC end bsp 註意 vpd 定義函數 包含 blog str

一.變量的高級主題

A.變量值的替換
1.使用指定字符(串)替換變量中的後綴字符(串)
2.語法格式:$(var:a=b) (將a替換成b)
a.替換表達式中不能有任何的空格
b.make中支持使用${}對變量進行取值
示例

src:=a.cc b.cc c.cc
obj:=$(src:cc=o)  

test:
    @echo "obj=>$(obj)"

輸出結果
技術分享圖片
由上圖可以看出變量值的替換
B.變量的模式替換
1.使用%保留變量值中的指定字符,替換其它字符
2.語法格式:$(var:a%b=x%y)
a.替換表達式中不能有任何的空格
b.make中支持使用${}對變量進行取值
示例

src:=a1b.c  a2b.c  a3b.c
obj:=$(src:a%b.c=x%y)  

test:
    @echo "obj=>$(obj)"

輸出結果
技術分享圖片
C.變量值的嵌套引用
1.一個變量名之中可以包含對其它變量的引用
2.嵌套引用的本質是使用一個變量表示另一個變量
如圖所示
技術分享圖片
D.命令行變量
1.運行make時,在命令行定義變量
2.命令行變量默認覆蓋makefile中定義的變量
示例及運行結果
技術分享圖片
E.override關鍵字
1.用於指示makefile中定義的變量不能被覆蓋
2.變量的定義和賦值需要使用override關鍵字
示例及運行結果
技術分享圖片
F.define關鍵字
1.用於在makefile中定義多行變量
2.多行變量的定義從變量名開始到endef結束
3.可使用override關鍵字防止變量被覆蓋
4.define定義的變量等價於使用=定義的變量
示例及運行結果
技術分享圖片

二.條件判斷語句

A.makefile中支持條件判斷語句
1.可以根據條件的值來決定make的執行
2.可以比較兩個不同變量或者變量和常量值
技術分享圖片
需要註意的是:條件判斷語句只能用於控制make實際執行的語句;但是,不能控制規則中命令的執行過程
技術分享圖片
條件判斷的關鍵字有四種:

關鍵字 功能
ifeq 判斷參數是否相等,相等為true,否則為false
ifneq 判斷參數是否不相等,不相等為true,否則為false
ifdef 判斷變量是否有值,有值為true,否則為false
ifndef 判斷變量是否沒有值,沒有值為true,否則為false

示例及運行結果![](https://s1.51cto.com/images/blog/201901/23/e62c12a72d738849e5901dc527cc2459.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

**註意:**
1.條件判斷語句之前可以有空格,但不能有Tab字符
2.在條件語句中不要使用自動變量($@,$^,$<)
br/>![](https://s1.51cto.com/images/blog/201901/23/e62c12a72d738849e5901dc527cc2459.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
**註意:**
1.條件判斷語句之前可以有空格,但不能有Tab字符
2.在條件語句中不要使用自動變量($@,$^,$<)
4.條件判斷類似C語言中的宏,預處理階段有效,執行階段無效
5.make在加載makefile時(首先計算表達式的值--賦值方式不同,計算方式不同;根據判斷語句的表達式決定執行的內容)

三.函數定義及調用

A.makefile中支持函數的概念
1.make解釋器提供了一系列的函數供makefile調用
2.在makefile在支持自定義函數實現,並調用執行
3.通過define關鍵字實現自定義函數
B.自定義函數的語法
技術分享圖片
深入理解自定義函數
1.自定義函數是一個多行變量,無法直接調用
2.自定義函數時一種過程調用,沒有任何的返回值
3.自定義函數用於定義命令集合,並應用於規則中
示例及運行結果
技術分享圖片
註意:$(call func2, mylove, dandanxiaohai)對應於func2中的三個參數,通過call進行調用
C.make解釋器中的預定義函數
1.make的函數提供了處理文件名,變量和命令的函數
2.可以在需要的地方調用函數來處理指定的參數
3.函數在調用的地方被替換為處理結果
預定義函數的調用
技術分享圖片
示例及運行結果

.PHONY : test

define func1
    @echo "My name is $(0)"
endef

define func2
    @echo "My name is $(0)"
endef

var1 := $(call func1)
var2 := $(call func2)
var3 := $(abspath ./)
var4 := $(abspath test.cpp)

test :
    @echo "var1 => $(var1)"
    @echo "var2 => $(var2)"
    @echo "var3 => $(var3)"
    @echo "var4 => $(var4)"

技術分享圖片
分析:
1.makefile中不支持真正意義上的自定義函數
2.自定義函數的本質時多行變量
3.預定義的call函數在調用時將參數傳遞給多行變量
4.自定義函數是call函數的實參,並在call中被執行

make--變量 條件判斷 函數定義及調用