T=$(gettop)
local M=$(findmakefile)
# Remove the path to top as the makefilepath needs to be relative
local M=`echo $M|sed 's:'$T'/::'`
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP."
elif [ ! "$M" ]; then
echo "Couldn't locate a makefile from the current directory."
else
ONE_SHOT_MAKEFILE=$M make -C $T all_modules $@
fi
fi
}
函数mm首先是判断当前目录是否就是Android源码根目录,即当前目录下是否存在一个build/core/envsetup.mk文件和一个Makefile文件。如果是的话,就将命令mm当作是一个普通的make命令来执行。否则的话,就调用函数findmakefile从当前目录开始一直往上寻找是否存在一个Android.mk文件。如果在寻找的过程中,发现了一个Android.mk文件,那么就获得它的绝对路径,并且停止上述寻找过程。
由于接下来执行make命令时,我们需要指定的是要编译的Android.mk文件的相对于Android源码根目录路径,因此函数mm需要将刚才找到的Android.mk绝对文件路径M中与Android源码根目录T相同的那部分路径去掉。这是通过sed命令来实现的,也就是将字符串M前面与字符串T相同的子串删掉。
最后,将找到的Android.mk文件的相对路径设置给环境变量ONE\_SHOT\_MAKE,表示接下来要对它进行编译。另外,函数mm还将make命令目标设置为all\_modules。这是什么意思呢?我们知道,一个Android.mk文件同时可以定义多个模块,因此,all\_modules就表示要对前面指定的Android.mk文件中定义的所有模块进行编译。
**函数mmm的实现如下所示:**
function mmm()
{
T= ( g e t t o p ) i f [ " (gettop) if [ " (gettop)if["T" ]; then
local MAKEFILE=
local MODULES=
local ARGS=
local DIR TO_CHOP
local DASH_ARGS= ( e c h o " (echo " (echo"@" | awk -v RS=" " -v ORS=" " ‘/^-.* / ′ ) l o c a l D I R S = /') local DIRS= /