Android.mk 初步了解


当我们在android源代码目录中的external/hello/目录下运行mm命令时。就会执行mm函数,这个函数定义在android源代码根目录下的build目录中的envsetup.sh脚本文件中,是一段控制脚本。

function mm()
{
    # If we're sitting in the root of the build tree, just do a
    # normal make.
    if [ -f build/core/envsetup.mk -a -f Makefile ]; then
        make $@
    else
        # Find the closest Android.mk file.
        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
}

红色部分就开始调用make拉,不过这时候还没有进入到我们hello模块的Android.mk,而是进入到了android顶层目录的makefile,这是由make后面的 -C $T 指定的,因为T的值打印出来就是android顶层目录的路径!

那么什么时候才开始进入模块自己的Android.mk呢?继续往下追踪发现,android顶层目录下的Makefile只有三行:

### DO NOT EDIT THIS FILE ###
include build/core/main.mk
### DO NOT EDIT THIS FILE ###

它只是将另一个main.mk文件的内容包含进来了,这个文件在android顶层目录下的/build/core/目录下,虽然文件后缀为mk,但被makefile文件包含进来后还是按照makefile文件的格式来解析。(这是我推测的,不过应该就是这样)

然后再进入main.mk查看,其中有一段如下:
include $(ONE_SHOT_MAKEFILE)

这个ONE_SHOT_MAKEFILE变量的值就是我们的模块的Android.mk文件的路径。。这个变量的赋值就是在envsetup.sh脚本的mm函数中:ONE_SHOT_MAKEFILE=$M 这个M变量的值就是Android.mk文件的路径。它是在

mm函数里的local M=$(findmakefile)里赋值的。

然后就进入到我们自己写的Android.mk文件,内容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES:= hello.c
LOCAL_MODULE_TAGS:= optional
include $(BUILD_SHARED_LIBRARY)

前面几行主要就是给几个变量赋值,这些变量是由Android编译系统自己定义的,Android编译系统就是android顶层目录下的/build/目录下的一系列文件。我们的Android.mk文件在被include进来之前,这些变量就已经在别的文件中创建好了。最后一行又include进来一个$(BUILD_SHARED_LIBRARY),这又是一个.mk文件。。BUILD_SHARED_LIBRARY的值为/build/core/shared_library.mk因此 相当于include /build/core/shared_library.mk

这个shared_library.mk是在/build/core/目录下的,它是属于android编译系统的一个文件。

再跟踪这个shared_library.mk 其中有一行:include $(BUILD_SYSTEM)/dynamic_binary.mk,这也是android编译系统的一个文件,位于/build/core/目录下。

进入dynamic_binary.mk文件查看,有一行:include $(BUILD_SYSTEM)/binary.mk,它在同样的目录中,再查看这个文件,这个文件就开始调用gcc编译器准备编译我们的hello模块拉,它怎么知道要编译我们的hello模块呢?编译要依赖哪些源文件呢?前面已经在Android.mk中给出了。

被转原文

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += \
    $(LOCAL_PATH)/include \
    $(TOP)/frameworks/native/include \
    $(TOP)/external/stlport/stlport \
     bionic
    #bionic/libstdc++/include

LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libutils \
    libstdc++ \
    libc++ 

LOCAL_SRC_FILES := \
    input.c

LOCAL_MODULE      := LXYIN
LOCAL_MODULE_TAGS := optional 
include $(BUILD_EXECUTABLE)

LOCAL_PATH := $(call my-dir)
Android.mk 文件必须先定义 LOCAL_PATH 变量,表示源文件在开发树中的位置;
编译系统提供的宏函数 my-dir 将返回当前 Android.mk 文件本身所在的目录的路径。
include $(CLEAR_VARS)

device/qcom/common/generate_extra_images.mk
build/core/main.mk
两个文件中 .PHONY 定义了make指令后边的内容

posted @ 2021-12-23 14:58  月的光景  阅读(247)  评论(0)    收藏  举报