Android 编译脚本小解析。(include-path-for 解析)

来源:互联网 发布:怎么制作抽奖软件 编辑:程序博客网 时间:2024/05/17 09:03

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