之前没怎么好好看过 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