android mm 到底执行了什么?
----------------------------------------
author: hjjdebug
date: 2015年 05月 08日 星期五 16:10:39 CST
email: hejinjing@tom.com
----------------------------------------
付实例介绍, 查看注释可以明白到底发生了什么。
mm()
if [ -f build/core/envsetup.mk -a -f Makefile ]; then
make $@;
else
T=$(gettop); # 获取顶层目录
local M=$(findmakefile); # 获取Android.mk 目录
local MODULES=;
local GET_INSTALL_PATH=;
local ARGS=;
local M=`echo $M|sed 's:'$T'/::'`; # 去除顶层目录,成相对路径
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP.";
else
if [ ! "$M" ]; then
echo "Couldn't locate a makefile from the current directory.";
else
for ARG in $@;
do
case $ARG in
GET-INSTALL-PATH)
GET_INSTALL_PATH=$ARG
;;
esac;
done;
if [ -n "$GET_INSTALL_PATH" ]; then
MODULES=;
ARGS=GET-INSTALL-PATH;
else
MODULES=all_modules; # MODULES 赋值 all_modules
ARGS=$@;
fi; # 进入顶层目录,指明makefile, 指明目标及参数
ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk $MODULES $ARGS;
fi;
fi;
fi
}
gettop ()
{
local TOPFILE=build/core/envsetup.mk;
if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ]; then #条件一般不满足,会走下面else
echo $TOP;
else
if [ -f $TOPFILE ]; then
PWD= /bin/pwd;
else
local HERE=$PWD; # 取到原始目录
T=;
while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
\cd ..; # 不满足条件,退一级目录
T=`PWD= /bin/pwd`; # T 保留当前路径
done;
\cd $HERE; # 重回原始目录
if [ -f "$T/$TOPFILE" ]; then
echo $T; # 打印顶层目录
fi;
fi;
fi
}
例如:
在 ~/myandroid/system/media/camera/src 下执行 gettop, 打印 /home/hjj/myandroid
findmakefile ()
{
TOPFILE=build/core/envsetup.mk;
local HERE=$PWD;
T=;
while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
T=`PWD= /bin/pwd`;
if [ -f "$T/Android.mk" ]; then
echo $T/Android.mk; # 找到了Android.mk 就打印,返回
\cd $HERE;
return;
fi;
\cd ..; # 未到顶层则退一级
done;
\cd $HERE
}
在 ~/myandroid/system/media/camera/src 下执行 gettop, 输出
/home/hjj/myandroid/system/media/camera/src/Android.mk
----------------------------------------
author: hjjdebug
date: 2015年 05月 08日 星期五 16:10:39 CST
email: hejinjing@tom.com
----------------------------------------
付实例介绍, 查看注释可以明白到底发生了什么。
mm()
if [ -f build/core/envsetup.mk -a -f Makefile ]; then
make $@;
else
T=$(gettop); # 获取顶层目录
local M=$(findmakefile); # 获取Android.mk 目录
local MODULES=;
local GET_INSTALL_PATH=;
local ARGS=;
local M=`echo $M|sed 's:'$T'/::'`; # 去除顶层目录,成相对路径
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP.";
else
if [ ! "$M" ]; then
echo "Couldn't locate a makefile from the current directory.";
else
for ARG in $@;
do
case $ARG in
GET-INSTALL-PATH)
GET_INSTALL_PATH=$ARG
;;
esac;
done;
if [ -n "$GET_INSTALL_PATH" ]; then
MODULES=;
ARGS=GET-INSTALL-PATH;
else
MODULES=all_modules; # MODULES 赋值 all_modules
ARGS=$@;
fi; # 进入顶层目录,指明makefile, 指明目标及参数
ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk $MODULES $ARGS;
fi;
fi;
fi
}
经注释, mm 秘密荡然无存。与自己知识融为一体。
另外: ONE_SHOT_MAKEFILE 专为mm 定义,进一步搜索本目录下编译的模块列表,具体看代码。
mmm 命令可以单独指明一个模块名称。这里不详述了。
gettop ()
{
local TOPFILE=build/core/envsetup.mk;
if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ]; then #条件一般不满足,会走下面else
echo $TOP;
else
if [ -f $TOPFILE ]; then
PWD= /bin/pwd;
else
local HERE=$PWD; # 取到原始目录
T=;
while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
\cd ..; # 不满足条件,退一级目录
T=`PWD= /bin/pwd`; # T 保留当前路径
done;
\cd $HERE; # 重回原始目录
if [ -f "$T/$TOPFILE" ]; then
echo $T; # 打印顶层目录
fi;
fi;
fi
}
例如:
在 ~/myandroid/system/media/camera/src 下执行 gettop, 打印 /home/hjj/myandroid
findmakefile ()
{
TOPFILE=build/core/envsetup.mk;
local HERE=$PWD;
T=;
while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
T=`PWD= /bin/pwd`;
if [ -f "$T/Android.mk" ]; then
echo $T/Android.mk; # 找到了Android.mk 就打印,返回
\cd $HERE;
return;
fi;
\cd ..; # 未到顶层则退一级
done;
\cd $HERE
}
在 ~/myandroid/system/media/camera/src 下执行 gettop, 输出
/home/hjj/myandroid/system/media/camera/src/Android.mk
另外还有一个问题, 我想显示出具体编译的命令,应该怎么做。
找啊找,终于找到你了。 showcommands
例如: mm showcommands
将显示完整编译命令。