上文我们讲完LOCAL_STATIC_LIBRARIES,下面我们就一步步来梳理下。BUILD_HOST_EXECUTABLE
一、 初识
BUILD_HOST_EXECUTABLE
我们先看BUILD_HOST_EXECUTABLE的定义:
build/core/config.mk:BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
展开即build/core/host_executable.mk
二、
host_executable.mk
我们先看看host_executable.mk文件的注释:
########################################################### ## Standard rules for building an executable file. ## ## Additional inputs from base_rules.make: ## None. ###########################################################
注释中明确的说明了,这是个编译可执行文件的makefile,附加的输入来源于 base_rules.make
LOCAL_IS_HOST_MODULE := true
明确指出了LOCAL_IS_HOST_MODULE 为真,我们在做LOCAL_PATH分析时,多次使用到该变量,当时我们是估计它肯定是为真,但是没有找到其具体的定义位置,看来就是此处了。
ifeq ($(strip $(LOCAL_MODULE_CLASS)),) LOCAL_MODULE_CLASS := EXECUTABLES endif
因为模块的初始化部分调用了include $(CLEAR_VARS),所以$(LOCAL_MODULE_CLASS)的值肯定为空,此处为其赋值为EXECUTABLES。此变量也是用在intermediates-dir-for函数中。
ifeq ($(strip $(LOCAL_MODULE_SUFFIX)),) LOCAL_MODULE_SUFFIX := $(HOST_EXECUTABLE_SUFFIX) endif
同理$(LOCAL_MODULE_CLASS)的值肯定为空,因为这里是要编译成可执行文件,linux上可执行文件是没有后缀的,换句话说,在此处 $(HOST_EXECUTABLE_SUFFIX)应该为空,该变量尚未初始化,所以必定为空。
下面又include了一个文件,include $(BUILD_SYSTEM)/binary.mk
但是打开这个文件,好家伙,600多行,怎么分析,不过看来大部分都是一些公共函数的定义。
我们先不管这个文件,继续下面分析。
$(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries) $(transform-host-o-to-executable) $(PRIVATE_POST_PROCESS_COMMAND)
紧 接着定义了一个目标$(LOCAL_BUILT_MODULE),这个目标依赖于$(all_objects)和$(all_libraries),执行 两个操作:$(transform-host-o-to-executable)和 $(PRIVATE_POST_PROCESS_COMMAND)
首 先,我们先猜测下$(LOCAL_BUILT_MODULE)目标的值,因为LOCAL_IS_HOST_MODULE = true、LOCAL_MODULE_CLASS := EXECUTABLES它肯定是要放在out/host/linux-x86/obj/EXECUTABLES目录下,而LOCAL_MODULE = acp,故肯定是在刚才的目录下创建acp_intermediates文件夹,而$(LOCAL_BUILT_MODULE)的值估计就是:
out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp 。下面我们就一步步分析下$(LOCAL_BUILT_MODULE)
三、
LOCAL_BUILT_MODULE
根据host_executable.mk文件开始处的注释,我们首先去查看下base_rules.make,我们发现在base_rules.make中有LOCAL_BUILT_MODULE变量的定义: