|
之前没怎么好好看过 Android build系统中的mk,找个命令包开刀和大家分享一下吧
include-path-for
【相当于函数原型】
define include-path-for #定义命令包, n 由调用者传递进来, 这个在 build/core/pathmap.mk
$(foreach n,$(1),$(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_INCL))))
endef
// pathmap_INCL 在 build/core/pathmap.mk 文件中有定义,最后使用的时候可以看到
【函数内实现的解析】
foreach 遍历, patsubst 字符串替换, filter 过滤函数
【函数调用】
这里以external\dbus\bus 下的Android.mk 调用为例:
...
LOCAL_C_INCLUDES:= \ $(call include-path-for, dbus)
...
调用命令包 include-path-for ,只有一个入参是 dbus
1. foreach 入参 dbus 替换 $(1), 那么根据 foreach 的语法,就是把字符串 dbus 保持到 n 中 然后交给 $(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_INCL))) 处理
2. patsubst
字符串替换, 这个函数需要3个参数 $(n):%, %, $(filter $(n):%,$(pathmap_INCL))
参数1 翻译一下就是 “dbus:任意长字符串”
参数2 任意长字符串
参数3 是一个字符过滤函数。(下面就需要先处理这个函数了)
3. filter
在 pathmap_INCL 中找类型是 “dbus:任意长” 的字符串 // pathmap_INCL 列在下面了,发现没有符合的字符串
所以参数3 最后得到的是空
回到一下函数2,这里得到的就是一个空。
继续回到函数1,这里最后得到的就是 dbus
所以
LOCAL_C_INCLUDES:= \ $(call include-path-for, dbus)
最后结果是
LOCAL_C_INCLUDES:= \ dbus
好吧太绕口了,多看看吧,
pathmap_INCL := \
bootloader:bootable/bootloader/legacy/include \
camera:system/media/camera/include \
corecg:external/skia/include/core \
dbus:external/dbus \
frameworks-base:frameworks/base/include \
frameworks-native:frameworks/native/include \
graphics:external/skia/include/core \
libc:bionic/libc/include \
libdrm1:frameworks/base/media/libdrm/mobile1/include \
libhardware:hardware/libhardware/include \
libhardware_legacy:hardware/libhardware_legacy/include \
libhost:build/libs/host/include \
libm:bionic/libm/include \
libnativehelper:libnativehelper/include \
libpagemap:system/extras/libpagemap/include \
libril:hardware/ril/include \
libstdc++:bionic/libstdc++/include \
libthread_db:bionic/libthread_db/include \
mkbootimg:system/core/mkbootimg \
opengl-tests-includes:frameworks/native/opengl/tests/include \
recovery:bootable/recovery \
system-core:system/core/include \
audio-effects:system/media/audio_effects/include \
audio-utils:system/media/audio_utils/include \
wilhelm:frameworks/wilhelm/include \
wilhelm-ut:frameworks/wilhelm/src/ut \
speex:external/speex/include |