深入浅出Androidmakefile(5)--BUILD_HOST_EXECUTABLE

更新时间:2023-07-22 04:47:51 阅读: 评论:0

深⼊浅出Androidmakefile(5)--BUILD_HOST_EXECUTABLE
上⽂我们讲完LOCAL_STATIC_LIBRARIES,下⾯我们就⼀步步来梳理下。BUILD_HOST_EXECUTABLE
⼀、初识BUILD_HOST_EXECUTABLE
我们先看BUILD_HOST_EXECUTABLE的定义:
Makefile代码
1. build/core/config.mk:BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
展开即build/core/host_executable.mk
⼆、host_executable.mk
我们先看看host_executable.mk⽂件的注释:
Makefile代码
1. >>>>>>>>>>>####
2. ## Standard rules for building an executable file.
3. ##
4. ## Additional inputs from ba_rules.make:
5. ## None.
6. >>>>>>>>>>>####
注释中明确的说明了,这是个编译可执⾏⽂件的makefile,附加的输⼊来源于 ba_rules.make
Makefile代码
1. LOCAL_IS_HOST_MODULE := true
明确指出了LOCAL_IS_HOST_MODULE 为真,我们在做LOCAL_PATH分析时,多次使⽤到该变量,当时我们
是估计它肯定是为真,但是没有找到其具体的定义位置,看来就是此处了。
Makefile代码
1. ifeq ($(strip $(LOCAL_MODULE_CLASS)),)
2. LOCAL_MODULE_CLASS := EXECUTABLES
3. endif
因为模块的初始化部分调⽤了include $(CLEAR_VARS),所以$(LOCAL_MODULE_CLASS)的值肯定为空,此
处为其赋值为EXECUTABLES。此变量也是⽤在intermediates-dir-for函数中。
Makefile代码
1. ifeq ($(strip $(LOCAL_MODULE_SUFFIX)),)
2. LOCAL_MODULE_SUFFIX := $(HOST_EXECUTABLE_SUFFIX)
3. endif
同理$(LOCAL_MODULE_CLASS)的值肯定为空,因为这⾥是要编译成可执⾏⽂件,linux上可执⾏⽂件是没有后
缀的,换句话说,在此处 $(HOST_EXECUTABLE_SUFFIX)应该为空,该变量尚未初始化,所以必定为空。
下⾯⼜include了⼀个⽂件,include $(BUILD_SYSTEM)/binary.mk
但是打开这个⽂件,好家伙,600多⾏,怎么分析,不过看来⼤部分都是⼀些公共函数的定义。
我们先不管这个⽂件,继续下⾯分析。
黄山旅游住宿
Makefile代码
1. $(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries)
2.      $(transform-host-o-to-executable)
3.      $(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⽂件开始处的注释,我们⾸先去查看下ba_rules.make,我们发现在
ba_rules.make中有LOCAL_BUILT_MODULE变量的定义:
Makefile代码
1. LOCAL_BUILT_MODULE := $(built_module_path)/$(LOCAL_BUILT_MODULE_STEM)
$(built_module_path)的定义⼜来源于:
Makefile代码
1. # OVERRIDE_BUILT_MODULE_PATH is only allowed to be ud by the
2. # internal SHARED_LIBRARIES build files.
3. OVERRIDE_BUILT_MODULE_PATH := $(strip $(OVERRIDE_BUILT_MODULE_PATH))
4. ifdef OVERRIDE_BUILT_MODULE_PATH
5.  ifneq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES)
6.    $(error $(LOCAL_PATH): Illegal u of OVERRIDE_BUILT_MODULE_PATH)
曲昔派特胶囊7.  endif
8.  built_module_path := $(OVERRIDE_BUILT_MODULE_PATH)
9. el
10.  built_module_path := $(intermediates)
11. endif
根据注释,编译EXECUTABLES时OVERRIDE_BUILT_MODULE_PATH 为空,那么 built_module_pa
th := $(intermediates),⽽$(intermediates)我们之前已经分析过了,它会调⽤local-intermediates-dir
Makefile代码
1. intermediates := $(call local-intermediates-dir)
然后根据LOCAL_MODULE_CLASS 、LOCAL_MODULE 和LOCAL_IS_HOST_MODULE 返回⼀个字符串,在此处,它返回的是out/host/linux-x86/ob/EXECUTABLES/acp_intermediates
那么LOCAL_BUILT_MODULE的值就是out/host/linux-x86/ob/EXECUTABLES
/acp_intermediates/$(LOCAL_BUILT_MODULE_STEM),下⾯我们在看看 LOCAL_BUILT_MODULE_STEM 的定义
这个变量同样也在ba_rules.make中赋值:
Makefile代码
1. LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM))
2. ifeq ($(LOCAL_BUILT_MODULE_STEM),)
3.  LOCAL_BUILT_MODULE_STEM := $(LOCAL_INSTALLED_MODULE_STEM)
4. endif
同理,此处LOCAL_变量LOCAL_BUILT_MODULE_STEM 肯定为空,那么执
⾏ LOCAL_BUILT_MODULE_STEM := $(LOCAL_INSTALLED_MODULE_STEM)。
LOCAL_INSTALLED_MODULE_STEM在ba_rules.make中赋值:
Makefile代码
1. LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE_STEM)$(LOCAL_MODULE_SUFFIX)
LOCAL_MODULE_STEM在ba_rules.make中赋值:
Makefile代码
1. LOCAL_MODULE_STEM := $(strip $(LOCAL_MODULE_STEM))
2. ifeq ($(LOCAL_MODULE_STEM),)
3.  LOCAL_MODULE_STEM := $(LOCAL_MODULE)
4. endif
那么LOCAL_MODULE_STEM就为 $(LOCAL_MODULE),即acp
$(LOCAL_MODULE_SUFFIX)已经在host_executable.mk中讨讨论空,那么
LOCAL_INSTALLED_MODULE_STEM 同样为acp,LOCAL_BUILT_MODULE_STEM也为acp
经过上述分析,LOCAL_BUILT_MODULE⽬标的值为:out/host/linux-
x86/obj/EXECUTABLES/acp_intermediates/acp,和我们在上⾯的猜测是⼀致的。
四、all_objects和all_libraries
分析完$(LOCAL_BUILT_MODULE),我们来看看$(all_objects) 和$(all_libraries)依赖。
$(BUILD_SYSTEM)/binary.mk中有对all_objects的定义:
Makefile代码
1. all_objects := \
2.      $(asm_objects) \
3.      $(cpp_objects) \
大三自我总结4.      $(gen_cpp_objects) \
5.      $(gen_asm_objects) \
6.      $(c_objects) \
7.      $(gen_c_objects) \
8.      $(objc_objects) \
9.      $(yacc_objects) \
10.      $(lex_objects) \
11.      $(proto_generated_objects) \
12.      $(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES))
从 all_objects定义看出,它表⽰了所有的objects⽂件:asm_objects、cpp_objects、 gen_cpp_objects、
gen_asm_objects、c_objects、gen_c_objects、objc_objects等等,但是在此处我们只是关⼼$(c_objects)。c_objects⼜是由c_arm_objects和c_normal_objects构成:
Makefile代码
1. c_objects        := $(c_arm_objects) $(c_normal_objects)
在此处,$(c_arm_objects)为空, $(c_normal_objects)已经在分析LOCAL_SRC_FILES时得到其值为:
out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o
$(BUILD_SYSTEM)/binary.mk中同样有对all_libraries的定义:
Makefile代码
1. all_libraries := \
2.    $(built_shared_libraries) \
3.    $(built_static_libraries) \
4.    $(built_whole_libraries)
all_libraries 表⽰了所有的libraries⽂件:built_shared_libraries、built_static_libraries和 built_whole_libraries,不过此处我们只依赖了静态库$(built_static_libraries)。
我们在分析LOCAL_STATIC_LIBRARIES时,已经得到$(built_static_libraries)的值:out/host /linux-
x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a
因此,在编译$(LOCAL_BUILT_MODULE)⽬标时,我们依赖于:out/host/linux-
x86/obj/EXECUTABLES/acp_intermediates/acp.o和out/host/linux-
x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a两个⽬标。
讨论完⽬标和依赖后,我们来看⼀看执⾏的操作。
五、 $(transform-host-o-to-executable)
在build/core/definitions.mk中有该函数的定义:
Makefile代码
1. define transform-host-o-to-executable
2. @mkdir -p $(dir $@)
3. @echo "host Executable: $(PRIVATE_MODULE) ($@)"
4. $(transform-host-o-to-executable-inner)
5. endef
该函数只是创建了⼀下⽬标⽂件夹,输出⼀下⽬标,然后调⽤的还是$(transform-host-o-to-executable-inner)函数
但是请注意,在输出⽬标时,有⼀个$(PRIVATE_MODULE)变量,通过输出我们知道在此处
$(PRIVATE_MODULE)的值为acp。但是PRIVATE_MODULE变量的定义和使⽤⼜是在哪⾥呢?
⽬标all_objects依赖⽬标LOCAL_GENERATED_SOURCES
Makefile代码
1. $(all_objects) : | $(LOCAL_GENERATED_SOURCES)
LOCAL_GENERATED_SOURCES⽬标的依赖就是PRIVATE_MODULE
Makefile代码
1. $(LOCAL_GENERATED_SOURCES): PRIVATE_MODULE := $(LOCAL_MODULE)
此处PRIVATE_MODULE 定义为 $(LOCAL_MODULE)即acp
⾄于为什么还需要创建⼀个PRIVATE_MODULE 变量来表⽰当前的LOCAL_MODULE,我个⼈猜
测,LOCAL_MODULE变量⼀般⽤于内部使⽤,⽽PRIVATE_MODULE 变量可以⽤于全局
$(transform-host-o-to-executable-inner)
下⾯我们来看看transform-host-o-to-executable-inner函数的定义
Makefile代码
1. >>>>>>>>>>>####
2. ## Commands for running gcc to link a host executable
3. >>>>>>>>>>>####
4.
5. ifneq ($(HOST_CUSTOM_LD_COMMAND),true)
6. define transform-host-o-to-executable-inner
7. $(hide) $(PRIVATE_CXX) \
8.      -Wl,-rpath-link=$(HOST_OUT_INTERMEDIATE_LIBRARIES) \
9.      -Wl,-rpath,\$$ORIGIN/../lib \
10.      $(HOST_GLOBAL_LD_DIRS) \
11.      $(PRIVATE_LDFLAGS) \
12.      $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
13.          $(HOST_GLOBAL_LDFLAGS) \
14.      ) \
15.      $(PRIVATE_ALL_OBJECTS) \
16.      -Wl,--whole-archive \
17.      $(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
赞美别人
18.      -Wl,--no-whole-archive \
19.      $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
20.      $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
21.      $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
22.      $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
23.      -o $@ \
24.      $(PRIVATE_LDLIBS)
25. endef
26. endif
其中transform-host-o-to-executable-inner函数包含在ifneq ($(HOST_CUSTOM_LD_COMMAND),true)判断中,我们发现只有在darwin平台下,该值才为true。即此处还是会使⽤公共的transform-host-o-to-executable-inner函数定义。
在本函数中涉及到⼀下变量,其中有值的变量如下:
陈秋实
PRIVATE_CXX:                                        prebuilt/linux-x86/ccache/ccache g++
HOST_OUT_INTERMEDIATE_LIBRARIES:  out/host/linux-x86/obj/lib
HOST_GLOBAL_LD_DIRS:                        -Lout/host/linux-x86/obj/lib
PRIVATE_LDFLAGS:                                -Wl,--no-undefined
HOST_GLOBAL_LDFLAGS:                        -m32
PRIVATE_ALL_OBJECTS:                        out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o PRIVATE_ALL_STATIC_LIBRARIES:          out/host/linux-
x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a
上⾯变量中最关键的⼀个是PRIVATE_CXX,它定义在build/core/binary.mk:嘴唇干裂的小妙招
Makefile代码
1. $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(LOCAL_CXX)
LOCAL_CXX定义如下:
Makefile代码
1. ifeq ($(strip $(LOCAL_CXX)),)
2.  LOCAL_CXX := $($(my_prefix)CXX)
3. endif
my_prefix的定义如下:
Makefile代码
1. ifdef LOCAL_IS_HOST_MODULE
2.  my_prefix:=HOST_
3. el
4.  my_prefix:=TARGET_
丰胸古方5. endif
因此在编译acp时,LOCAL_CXX := $(HOST_CXX)
⽽HOST_CXX的定义并不在HOST_linux-x86.mk⽂件,⽽是在lect.mk⽂件中定义:
Makefile代码
1. $(combo_target)CXX := $(ccache) $($(combo_target)CXX)
因此:HOST_CXX 和TARGET_CXX 的值在lect.mk中已经有了定义,其值分别为:
HOST_CXX:    prebuilt/linux-x86/ccache/ccache g++
TARGET_CXX: prebuilt/linux-x86/ccache/ccache prebuilt/linux-x86/toolchain/arm-linux-androideabi-
thin比较级
4.4.x/bin/arm-linux-androideabi-g++
⽽HOST_CXX和TARGET_CXX的详细定义见下⾯:

本文发布于:2023-07-22 04:47:51,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1091464.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:定义   变量   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图