1.检查版本号,设置环境变量(BUILD_SYSTEM)和缺省的目标。
$(MAKE_VERSION) >= 3.81,
BUILD_SYSTEM= build/core
2.包含文件BUILD_SYSTEM/config.mk。
根据配置信息和主机目标机信息,设置一些变量。
3.包含文件BUILD_SYSTEM/cleanbuild.mk。
如果当前配置改变,强制删除上次的编译结果
4.包含文件OUT_DIR/versions_check.mk。
就设置了VERSIONS_CHECKED。如果版本序号改变,即VERSION_CHECK_SEQUENCE_NUMBER!=VERSIONS_CHECKED,检查文件系统是否大小写不敏感。文件路径上是否没有空格。JAVA,JAVAC的版本是否是1.6。
5.包含文件BUILD_SYSTEM/definitions.mk。
定义了很多函数供makefile文件系统使用。
主要的是transform-xxx-to-xxx的形式,比如transform-cpp-to-o。并定义了一个make目标dist,额外的拷贝一些重要的文件到目标文件夹。
6.根据TARGE_BUILD_VARIANT,设置tags_to_install,ADDITIONAL_DEFAULT_PROPERTIES
TARGE_BUILD_VARIANT | tags_to_install | ADDITIONAL_DEFAULT_PROPERTIES |
---|---|---|
user | user | ro.secure=1 ro.allow.mock.location=0 |
eng | user debug eng | ro.setupwizard.mode=OPTIONAL |
tests | user debug eng | |
sdk | user debug eng | xmpp.auto-presence=true ro.config.nocheckin=yes |
user debug | user debug | ro.sercure=1 dalvik.vm.lockprof.threshold=500 ro.allow.mock.location=0ro.debuggable=1 persist.service.adb=1 |
7.如果MAKECMDGOALS不包含clean,clobber,dataclean,installclean,根据不同的主机平台和处理器品平台,包含进要编译的模块,设置subdirs。
8.通过build/tools/findleaves.py,把subdirs目录下的Android.mk存在subdirs_makefiles。并包含这些文件。如果使用mm命令,只包含当前目录下的Android.mk。
9.根据tags_to_install和is_sdk_build,设置哪些模块需要安装,并存入modules_to_install.
get-tagged-modules
# Given an accept and reject list, find the matching
# set of targets. If a target has multiple tags and
# any of them are rejected, the target is rejected.
# Reject overrides accept.
# $(1): list of tags to accept
# $(2): list of tags to reject
#TODO(dbort): do $(if $(strip $(1)),$(1),$(ALL_MODULE_TAGS))
#TODO(jbq): as of 20100106 nobody uses the second parameter
define get-tagged-modules
$(filter-out \
$(call modules-for-tag-list,$(2)), \
$(call modules-for-tag-list,$(1)))
endef
Module-installed-files $1 $1一般的是一个短的模块名,比如framework,Browers,返回这个模块的目标文件路径
10.包含:$(BUILD_SYSTEM)/Makefile。主要是定义了一些伪目标。
11.定义modules_to_check
文件路径列表,若模块没有定义LOCAL_DONT_CHECK_MODULE,会把生成目标的规则加入到这个变量,以便在modules_to_install后检查目标是否生成成功,目标不存在的话再次生成目标。
12.定义一些make target
target | 说明 | |
---|---|---|
.PHONY:checkbuilt | 生成没有定义LOCAL_DONT_CHECK_MODULE的模块并拷贝到系统目录 | |
.PHONY:prebuilt | 拷贝预遍野的文件(比如用include prebuild.mk编译的)到系统目录 | |
.PHONY: files | 生成所有目标文件(包括:prebuile,modules-to-install,modules-to-check,INSTALLED_ANDROID_INFO_TXT_TARGET)并拷贝到系统目录。INSTALLED_ANDROID_INFO_TXT_TARGET在build/target/board/Android.mk定义=out/target/product/**/android-info.txt | |
.PHONY: ramdisk | 生成ramdisk.img(PRODUCT_OUT)/root | (PRODUCT_OUT)/ramdisk.img |
.PHONY: systemimage | 生成system.img | |
.PHONY: userdataimage) | 生成data.img | |
.PHONY: \ bootimage | 生成boot.img (HOST_OUT_EXECUTABLES)/mkbootimg --kernel (PRODUCT_OUT)/ramdisk.img >$(PRODUCT_OUT)/boot.img | |
.PHONY: recoveryimage | 生成ramdisk-recovery.img (PRODUCT_OUT)/kernel –ramdisk(PRODUCT_OUT)/recovery.img | |
.PHONY: droidcoredroidcore: files systemimage | 生成整个系统system.img ramdisk.img/boot.img ramdisk-recovery.img recovery.img userdata.img installed-files.txt | |
.PHONY: apps_only | 生成TARGET_BUILD_APPS指定的APPS模块.若TARGET_BUILD_APPS包含all就编译全部APPS模块droid 默认target。ifneq ($(TARGET_BUILD_APPS),) droid: apps_onlyelse droid:droidcore | |
.PHONY: sdk | 生成sdk | |
.PHONY: clean. | PHONY: clobber 删除生成文件 | |
.PHONY: modules | 显示所有模块名 | |
.PHONY: showcommands | 显示命令 |