android编译系统 - pathmap.mk

本文解析了Android源码中build/core/pathmap.mk文件内的宏函数include-path-for。该宏利用make的内建函数处理路径映射,实现从短名称查找对应目录路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

如:$(callinclude-path-for,短名)

#

#Amappingfromshorthandnamestoincludedirectories.

#"短名:路径"对列表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

#

#Returnsthepathtotherequestedmodule'sincludedirectory,

#relativetotherootofthesourcetree.Doesnothandleexternal

#modules.

#

#$(1):alistofmodules(orothernamedentities)tofindtheincludesfor

#

defineinclude-path-for

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

endef

上面的宏函数include-path-for使用了3个make内嵌函数:foreachpatsubstfilter

foreach:

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

$(foreachVAR,LIST,TEXT)

include-path-for宏函数中:

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

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

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

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

for(intn,inti=0;i<number(LIST);i++)

{

n=LIST第一个字符串;

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

LIST丢掉第一个字符串

}

filter

过滤函数,$(filterPATTERN…,TEXT)

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

sources:=foo.cbar.cbaz.sugh.h

foo:$(sources)

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

返回值为“foo.cbar.cbaz.s”。

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

patsubst:

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

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

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

返回替换后的新字符串。

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

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

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

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

JNI_H_INCLUDE:=$(callinclude-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,foobar)

返回值为“foo.cbar.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:=\

$(addprefixframeworks/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\

关于GUNmake内嵌函数调用说明:

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

$(FUNCTIONARGUMENTS)

或者:

${FUNCTIONARGUMENTS}

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

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

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

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

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

参考:

1.http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html#content

GUNmake中文手册

http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-08.html

make的内嵌函数

2.Androidsourcescode

/build/core/pathmap.mk

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值