我們也說(shuō)說(shuō)Android.mk(2)
函數(shù)進(jìn)階教程 - 分支、循環(huán)扳剿、子程序
按照面向過(guò)程程序設(shè)計(jì)的標(biāo)準(zhǔn)流程,我們講完了順序結(jié)構(gòu)昼激,就要講分支庇绽、循環(huán)和子程序。下面我們就開(kāi)始講用于分支橙困、循環(huán)和子程序調(diào)用功能的函數(shù)瞧掺。
分支函數(shù)
要走分支,一定是要有條件要判斷凡傅。
在Makefile里辟狈,最主要的判斷就是看字符串能不能找到了。
通過(guò)findstring函數(shù)來(lái)進(jìn)行這個(gè)判斷夏跷,然后用if函數(shù)使用findstring函數(shù)的結(jié)果哼转。
例:
.PHONY : all5
bootoatfile := out/target/product/ali6753_65t_m0/dex_bootjars/system/framework/arm64/boot.oat
result_findString := $(findstring boot.oat,$(bootoatfile))
result_findString2 := $(findstring boot.oat,$(oatfile))
all5 :
$(if $(result_findString), @echo found boot.oat, @echo cannot find boot.oat)
$(if $(result_findString2), @echo found boot.oat, @echo cannot find boot.oat)
輸出:
found boot.oat
cannot find boot.oat
循環(huán)函數(shù)
Makefile中對(duì)于循環(huán)結(jié)構(gòu)的支持是foreach函數(shù)
語(yǔ)法格式為:$(foreach 變量,列表,對(duì)變量對(duì)操作)
這樣的循環(huán)在Android.mk中遍地都是,比如對(duì)模塊進(jìn)行遍歷槽华,對(duì)產(chǎn)品進(jìn)行遍歷等释簿。
我們看一個(gè)例子,這個(gè)例子寫(xiě)在build/core/main.mk中:
# A helper goal printing out install paths
.PHONY: GET-INSTALL-PATH
GET-INSTALL-PATH:
@$(foreach m, $(ALL_MODULES), $(if $(ALL_MODULES.$(m).INSTALLED), \
echo 'INSTALL-PATH: $(m) $(ALL_MODULES.$(m).INSTALLED)';))
再看一個(gè)更復(fù)雜一點(diǎn)的硼莽,加深一下印象:
# A static Java library needs to explicily set LOCAL_RESOURCE_DIR.
ifdef LOCAL_RESOURCE_DIR
need_compile_res := true
all_resources := $(strip \
$(foreach dir, $(LOCAL_RESOURCE_DIR), \
$(addprefix $(dir)/, \
$(patsubst res/%,%, \
$(call find-subdir-assets,$(dir)) \
) \
) \
))
子程序調(diào)用
makefile的子程序結(jié)構(gòu)當(dāng)然就是函數(shù)了庶溶。
定義函數(shù)很簡(jiǎn)單煮纵,就是定義一個(gè)變量就是了。參數(shù)可以用$(1),$(2)等等來(lái)表示
例:
isBootOat = $(findstring boot.oat,$(1))
調(diào)用的時(shí)候要注意偏螺,用call函數(shù)來(lái)調(diào)用行疏,call和函數(shù)名之間是空格,之后的參數(shù)要用逗號(hào)分隔套像。
我們看個(gè)簡(jiǎn)單的例子酿联,將前邊講過(guò)的findstring的功能封裝成一個(gè)函數(shù)。
例:
.PHONY : all6
isBootOat = $(findstring boot.oat,$(1))
all6 :
$(if $(call isBootOat,$(bootoatfile)), @echo found boot.oat, @echo cannot find boot.oat)
$(if $(call isBootOat,$(oatfile)), @echo found boot.oat, @echo cannot find boot.oat)
輸出:
$ make all6
found boot.oat
cannot find boot.oat