当前位置: 首页 > 工具软件 > mmake > 使用案例 >

Android源代码编译命令m/mm/mmm/make分析

林项明
2023-12-01

function m()
{
    T=$(gettop)               //函数m调用函数gettop得到的是Android源代码根目录T
    if [ "$T" ]; then          // 判断  $T  是否存在
        make -C $T $@    //-C选项用来指定工作目录     $@  传递给脚本或函数的所有参数。
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
    fi
}


function mm()
{
    # If we're sitting in the root of the build tree, just do a
    # normal make.  
   //首先是判断当前目录是否就是Android源码根目录  ->判断方法是 即当前目录下是否存在一个build/core/envsetup.mk文件和一个Makefile文件
  // 如果是那么  mm作为普通 make 命令
    if [ -f build/core/envsetup.mk -a -f Makefile ]; then
        make $@
    else
        # Find the closest Android.mk file.
        T=$(gettop)
        local M=$(findmakefile)    //findmakefile从当前目录开始一直往上寻找是否存在一个Android.mk文件
        # 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 $@   
            // 将找到的Android.mk文件的相对路径设置给环境变量ONE_SHOT_MAKE,表示接下来要对它进行编译
            // all_modules就表示要对前面指定的Android.mk文件中定义的所有模块进行编译。
        fi
    fi
}


function mmm()
{
    T=$(gettop)
    if [ "$T" ]; then
        local MAKEFILE=
        local MODULES=
        local ARGS=
        local DIR TO_CHOP
        local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')  //将以横线“-”开头的字符串提取出来,并且保存在变量DASH_ARGS中
        local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') // 通过命令awk将执行命令mmm时指定的非选项参数提取出来,也就是将非以横线“-”开头的字符串提取出来,并且保存在变量DIRS中
        for DIR in $DIRS ; do
            MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'`  
            //第一个sed命令获得的是一系列以逗号分隔的模块名称列表
            //第二个sed命令用来将前面获得的以逗号分隔的模块名称列表转化为以空格分隔的模块名称列表
            //最后,获得的以空格分隔的模块名称列表保存在变量MODULES中。
            if [ "$MODULES" = "" ]; then
                MODULES=all_modules
            fi
            DIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'`
            if [ -f $DIR/Android.mk ]; then                     //如果获得 路径下面有 Android.mk 文件
                TO_CHOP=`(cd -P -- $T && pwd -P) | wc -c | tr -d ' '`  //获得源码绝对路径字符串长度
                TO_CHOP=`expr $TO_CHOP + 1`
                START=`PWD= /bin/pwd`    // 通过执行/bin/pwd命令获得当前执行命令mmm的目录
                MFILE=`echo $START | cut -c${TO_CHOP}-`   //当前目录START相对于Android源码根目录T的路径
                if [ "$MFILE" = "" ] ; then          //安卓源码根目录
                    MFILE=$DIR/Android.mk
                else                                          //安卓源码   非根目录
                    MFILE=$MFILE/$DIR/Android.mk
                fi
                MAKEFILE="$MAKEFILE $MFILE"  用空格连接 相对目录
            else
                if [ "$DIR" = snod ]; then
                    ARGS="$ARGS snod"   //表示忽略依赖性地重新打包system.img
                elif [ "$DIR" = showcommands ]; then
                    ARGS="$ARGS showcommands"  //显示编译过程中执行的命令
                elif [ "$DIR" = dist ]; then
                    ARGS="$ARGS dist"   //dist表示将编译后产生的发布文件拷贝到out/dist目录中
                elif [ "$DIR" = incrementaljavac ]; then
                    ARGS="$ARGS incrementaljavac"
                else
                    echo "No Android.mk in $DIR."
                    return 1
                fi
            fi
        done
        ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS $MODULES $ARGS
    else
        echo "Couldn't locate the top of the tree.  Try setting TOP."
    fi
}


参考
Android源代码编译命令m/mm/mmm/make分析

 类似资料: