最近在研究android 的build系统,就是那个Makefile的详细组成,得知Android 的主Makefile文件是在main.mk这个文件下,并且知道droid是它的默认目标,但是,我看了下droid,这就是个空目标啊,啥都木有,木有依赖,木有命令,这怎么能生成整个整个android系统呢?源代码如下:# This is the default target.  It must be the first declared target.
.PHONY: droid
DEFAULT_GOAL := droid
$(DEFAULT_GOAL):# Used to force goals to build.  Only use for conditionally defined goals.
.PHONY: FORCE
FORCE:# Set up various standard variables based on configuration
# and host information.
include $(BUILD_SYSTEM)/config.mk这个droid目标后就是个什么FORCE目标了,它根本木有什么依赖啊,为什么网上会说依赖个什么800多行的droidcore目标?它怎么依赖上的啊?

解决方案 »

  1.   

    在编译之前要运行envsetup.sh和lunch来指定编译目标。建议你看看lunch函数的实现,就明白它是怎么export target的了。main.mk的主要作用是通过一系列的include把所有需要的.mk文件聚合起来。你读读《Embedded Android》的第四章:The Build System就会了解的比较深入了。
      

  2.   


    你可能误解我的意思了,envsetup.sh和lunch做的是一些配置工作,而droid的确是makefile的第一个目标,也就是说make=make droid,我现在就想知道droid这个目标没有依赖它怎么工作的,我也知道droid目标事实上就是依赖了droidcore这个目标,因为我公司把makefile文件改过,就是直接在冒号后显式依赖droidcore目标。但是android的正规源码就不这样做,这好像是涉及makefile语法,我现在就想知道它怎么跳过去的。
        你推荐那本书我粗略看了下那章,没有想要的东西。
      

  3.   

    那你再研究一下config.mk了:CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
    BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
    BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
    BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
    BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
    BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
    BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
    BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
    BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
    BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
    ....剩下的全部都是在这展开的,包括device/xxx下面的配置文件你一同研究一下么