build/core/pathmap.mk 文件定义了一个列表pathmap_INCL,列表中每项是"短名:路径"对。宏函数include-path-for将会使用这个列表,来通过短名获取相对于的路径,


如:$(call include-path-for,短名)


#


# A mapping from shorthand names to include directories.


# "短名: 路径"对列表pathmap_INCL


pathmap_INCL := \


bluedroid:system/bluetooth/bluedroid/include \


bluez-libs:external/bluez/libs/include \


bluez-utils:external/bluez/utils \


bootloader:bootable/bootloader/legacy/include \


corecg:external/skia/include/core \


dbus:external/dbus \


frameworks-base:frameworks/base/include \


graphics:external/skia/include/core \


libc:bionic/libc/include \


libdrm1:frameworks/base/media/libdrm/mobile1/include \


libdrm2:frameworks/base/media/libdrm/mobile2/include \


libhardware:hardware/libhardware/include \


libhardware_legacy:hardware/libhardware_legacy/include \


libhost:build/libs/host/include \


libm:bionic/libm/include \


libnativehelper:dalvik/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 \


recovery:bootable/recovery \


system-core:system/core/include








#


# Returns the path to the requested module's include directory,


# relative to the root of the source tree. Does not handle external


# modules.


#


# $(1): a list of modules (or other named entities) to find the includes for


#


define include-path-for


$(foreach n,$(1),$(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_INCL))))


endef





上面的宏函数include-path-for使用了3个make内嵌函数:foreach,patsubst,filter。





foreach:


它是一个循环函数,类似于Linux的shell中的for语句,语法格式如下:


$(foreach VAR, LIST, TEXT)


include-path-for宏函数中:


VAR = n (是一个临时变量,只在foreach函数上下文中有效)


LIST = $(1) ( 是call include-path-for 时传递进来的参数,可以使很多空格隔开的字符串)


TEXT = $(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_INCL))) (是每次循环时执行的表达式)


foreach函数和c语言中的如下格式的for循环类似:


for( int n, int i=0 ; i < number(LIST); i++)


{


n = LIST第一个字符串;


执行TEXT(引用n)表达式;


LIST丢掉第一个字符串


}





filter:


过滤函数,$(filter PATTERN…,TEXT)


过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词,保留所有符合此模式的单词。可以使用多个模式。模式中一般需要包含模式字符“%”。存在多个模式时,模式表达式之间使用空格分割。


sources := foo.c bar.c baz.s ugh.h


foo: $(sources)


cc $(filter %.c %.s,$(sources)) -o foo


返回值为“foo.c bar.c baz.s”。


$(filter $(n):%,$(pathmap_INCL)), 滤除掉pathmap_INCL列表中不属于以:隔开的字符串模式的字符串。


patsubst:


模式替换函数,语法格式:$(patsubst PATTERN, REPLACEMENT, TEXT)


搜索“TEXT”中以空格分开的单词,将符合模式“TATTERN”替换为“REPLACEMENT”。


参数“PATTERN”中可以使用模式通配符“%”来代表一个单词中的若干字符。如果参数“REPLACEMENT”中也包含一个“%”,那么“REPLACEMENT”中的“%”将是“TATTERN”中的那个“%”所代表的字符串。在“TATTERN”和“REPLACEMENT”中,只有第一个“%”被作为模式字符来处理,之后出现的不再作模式字符(作为一个字符)。在参数中如果需要将第一个出现的“%”作为字符本身而不作为模式字符时,可使用反斜杠“\”进行转义处理。


返回替换后的新字符串。


$(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_INCL)))


执行该表达式时,先展开$(n):%,然后展开$(filter $(n):%,$(pathmap_INCL))。


假如$(n) = libril,那么上面表达式简化成:


$(patsubst libril:%, %, $(pathmap_INCL)),最后返回:hardware/ril/include








JNI_H_INCLUDE := $(call include-path-for,libnativehelper)/nativehelper


# 调用用户自己定义的函数需要使用make内嵌call函数


# 返回值: dalvik/libnativehelper/include






FRAMEWORKS_BASE_SUBDIRS := \


$(addsuffix /java, \


core \


graphics \


im \


location \


media \


opengl \


sax \


telephony \


wifi \


)


addsuffix


加后缀函数,为“NAMES…”中的每一个文件名添加后缀“SUFFIX”。参数“NAMES…”为空格分割的文件名序列,将“SUFFIX”追加到此序列的每一个文件名的末尾。以单空格分割的添加了后缀“SUFFIX”的文件名序列。


$(addsuffix .c,foo bar)


返回值为“foo.c bar.c”


# FRAMEWORKS_BASE_SUBDIRS := \


core/java \


graphics/java \


im/java \


location/java \


media/java \


opengl/java \


sax/java \


telephony/java \


wifi/java \








FRAMEWORKS_BASE_JAVA_SRC_DIRS := \


$(addprefix frameworks/base/,$(FRAMEWORKS_BASE_SUBDIRS))





addprefix:


加前缀函数, 为“NAMES…”中的每一个文件名添加前缀“PREFIX”。参数“NAMES…”是空格分割的文件名序列,将“SUFFIX”添加到此序列的每一个文件名之前。以单空格分割的添加了前缀“PREFIX”的文件名序列。


# FRAMEWORKS_BASE_JAVA_SRC_DIRS := \


frameworks/base/core/java \


frameworks/base/graphics/java \


frameworks/base/im/java \


frameworks/base/location/java \


frameworks/base/media/java \


frameworks/base/opengl/java \


frameworks/base/sax/java \


frameworks/base/telephony/java \


frameworks/base/wifi/java \








关于GUN make内嵌函数调用说明:


GNU make函数的调用格式类似于变量的引用,以“$”开始表示一个引用。语法格式如下:


$(FUNCTION ARGUMENTS)


或者:


${FUNCTION ARGUMENTS}


1. 调用语法格式中“FUNCTION”是需要调用的函数名,它应该是make内嵌的函数名。对于用户自己的函数需要通过make的“call”函数来间接调用。


2. “ARGUMENTS”是函数的参数,参数和函数名之间使用若干个空格或者[tab]字符分割(建议使用一个空格,这样不仅使在书写上比较直观,更重要的是当你不能确定是否可以使用[Tab]的时候,避免不必要的麻烦);如果存在多个参数时,参数之间使用逗号“,”分开。


3. 以“$”开头,使用成对的圆括号或花括号把函数名和参数括起(在Makefile中,圆括号和花括号在任何地方必须成对出现)。参数中存在变量或者函数的引用时,对它们所使用的分界符(圆括号或者花括号)建议和引用函数的相同,不使用两种不同的括号。


4. 函数处理参数时,参数中如果存在对其它变量或者函数的引用,首先对这些引用进行展开得到参数的实际内容。而后才对它们进行处理。参数的展开顺序是按照参数的先后顺序来进行的。


5. 书写时,函数的参数不能出现逗号“,”和空格。这是因为逗号被作为多个参数的分隔符,前导空格会被忽略。在实际书写Makefile时,当有逗号或者空格作为函数的参数时,需要把它们赋值给一个变量,在函数的参数中引用这个变量来实现。

更多相关文章

  1. Android(安卓)RIL 架构学习总结
  2. android中短信协议与字段
  3. android 数据库 sqlite 操作
  4. android通过HTTP协议上传文件至远程服务器
  5. Android(安卓)C++ 线程使用
  6. 安卓基础学习(android studio)
  7. Android(安卓)RIL 架构学习总结 .
  8. Android(安卓)Property
  9. 终结篇:Android(安卓)startActivity原理分析(基于Android(安卓)8.

随机推荐

  1. 腾讯企业邮箱启用超大附件
  2. 货运物流移动端解决方案:为货运物流行业打
  3. 开发技巧 | mPaaS 小程序自定义事件,如何
  4. 农村的出路
  5. 排查指南 | mPaaS 小程序提示“网络不给
  6. 移动安全加固助力 App 实现全面、有效的
  7. 亚马逊品牌注册需要多少钱?
  8. MySQL第十二课 删除完全相同的数据
  9. 培训学前端编程有门槛吗?
  10. 快手私信xml消息名片图文卡片逆向破解如