Home | History | Annotate | Download | only in core
      1 ###########################################################
      2 ## Standard rules for building binary object files from
      3 ## asm/c/cpp/yacc/lex source files.
      4 ##
      5 ## The list of object files is exported in $(all_objects).
      6 ###########################################################
      7 
      8 ######################################
      9 ## Sanity check for LOCAL_NDK_VERSION
     10 ######################################
     11 my_ndk_version_root :=
     12 ifdef LOCAL_NDK_VERSION
     13   ifdef LOCAL_IS_HOST_MODULE
     14     $(error $(LOCAL_PATH): LOCAL_NDK_VERSION can not be used in host module)
     15   endif
     16   ifneq ($(filter-out SHARED_LIBRARIES STATIC_LIBRARIES,$(LOCAL_MODULE_CLASS)),)
     17     $(error $(LOCAL_PATH): LOCAL_NDK_VERSION can only be used to build target shared/static libraries, \
     18           while your module is of class $(LOCAL_MODULE_CLASS))
     19   endif
     20   ifeq ($(filter $(LOCAL_NDK_VERSION),$(TARGET_AVAILABLE_NDK_VERSIONS)),)
     21     $(error $(LOCAL_PATH): Invalid LOCAL_NDK_VERSION '$(LOCAL_NDK_VERSION)' \
     22            Choices are $(TARGET_AVAILABLE_NDK_VERSIONS))
     23   endif
     24   ifndef LOCAL_SDK_VERSION
     25     $(error $(LOCAL_PATH): LOCAL_NDK_VERSION must be defined with LOCAL_SDK_VERSION)
     26   endif
     27   my_ndk_source_root := $(HISTORICAL_NDK_VERSIONS_ROOT)/android-ndk-r$(LOCAL_NDK_VERSION)/sources
     28   my_ndk_version_root := $(HISTORICAL_NDK_VERSIONS_ROOT)/android-ndk-r$(LOCAL_NDK_VERSION)/platforms/android-$(LOCAL_SDK_VERSION)/arch-$(TARGET_ARCH)
     29   ifeq ($(wildcard $(my_ndk_version_root)),)
     30     $(error $(LOCAL_PATH): ndk version root does not exist: $(my_ndk_version_root))
     31   endif
     32 
     33   # Set up the NDK stl variant. Starting from NDK-r5 the c++ stl resides in a separate location.
     34   # See ndk/docs/CPLUSPLUS-SUPPORT.html
     35   my_ndk_stl_include_path :=
     36   my_ndk_stl_shared_lib_fullpath :=
     37   my_ndk_stl_shared_lib :=
     38   my_ndk_stl_static_lib :=
     39   ifeq (,$(LOCAL_NDK_STL_VARIANT))
     40     LOCAL_NDK_STL_VARIANT := system
     41   endif
     42   ifneq (1,$(words $(filter system stlport_static stlport_shared gnustl_static, $(LOCAL_NDK_STL_VARIANT))))
     43     $(error $(LOCAL_PATH): Unkown LOCAL_NDK_STL_VARIANT $(LOCAL_NDK_STL_VARIANT))
     44   endif
     45   ifeq (system,$(LOCAL_NDK_STL_VARIANT))
     46     my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/system/include
     47     # for "system" variant, the shared library exists in the system library and -lstdc++ is added by default.
     48   else # LOCAL_NDK_STL_VARIANT is not system
     49   ifneq (,$(filter stlport_%, $(LOCAL_NDK_STL_VARIANT)))
     50     my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/stlport/stlport
     51     ifeq (stlport_static,$(LOCAL_NDK_STL_VARIANT))
     52       my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(TARGET_CPU_ABI)/libstlport_static.a
     53     else
     54       my_ndk_stl_shared_lib_fullpath := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(TARGET_CPU_ABI)/libstlport_shared.so
     55       my_ndk_stl_shared_lib := -lstlport_shared
     56     endif
     57   else
     58     # LOCAL_NDK_STL_VARIANT is gnustl_static
     59     my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI)/include \
     60                                $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/include
     61     my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI)/libstdc++.a
     62   endif
     63   endif
     64 endif
     65 
     66 ##################################################
     67 # Compute the dependency of the shared libraries
     68 ##################################################
     69 # On the target, we compile with -nostdlib, so we must add in the
     70 # default system shared libraries, unless they have requested not
     71 # to by supplying a LOCAL_SYSTEM_SHARED_LIBRARIES value.  One would
     72 # supply that, for example, when building libc itself.
     73 ifdef LOCAL_IS_HOST_MODULE
     74   ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
     75       LOCAL_SYSTEM_SHARED_LIBRARIES :=
     76   endif
     77 else
     78   ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
     79       LOCAL_SYSTEM_SHARED_LIBRARIES := $(TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES)
     80   endif
     81 endif
     82 
     83 # Logging used to be part of libcutils (target) and libutils (sim);
     84 # hack modules that use those other libs to also include liblog.
     85 # All of this complexity is to make sure that liblog only appears
     86 # once, and appears just before libcutils or libutils on the link
     87 # line.
     88 # TODO: remove this hack and change all modules to use liblog
     89 # when necessary.
     90 define insert-liblog
     91   $(if $(filter liblog,$(1)),$(1), \
     92     $(if $(filter libcutils,$(1)), \
     93       $(patsubst libcutils,liblog libcutils,$(1)) \
     94      , \
     95       $(patsubst libutils,liblog libutils,$(1)) \
     96      ) \
     97    )
     98 endef
     99 ifneq (,$(filter libcutils libutils,$(LOCAL_SHARED_LIBRARIES)))
    100   LOCAL_SHARED_LIBRARIES := $(call insert-liblog,$(LOCAL_SHARED_LIBRARIES))
    101 endif
    102 ifneq (,$(filter libcutils libutils,$(LOCAL_STATIC_LIBRARIES)))
    103   LOCAL_STATIC_LIBRARIES := $(call insert-liblog,$(LOCAL_STATIC_LIBRARIES))
    104 endif
    105 ifneq (,$(filter libcutils libutils,$(LOCAL_WHOLE_STATIC_LIBRARIES)))
    106   LOCAL_WHOLE_STATIC_LIBRARIES := $(call insert-liblog,$(LOCAL_WHOLE_STATIC_LIBRARIES))
    107 endif
    108 
    109 ifdef LOCAL_NDK_VERSION
    110   # Get the list of INSTALLED libraries as module names.
    111   # We can not compute the full path of the LOCAL_SHARED_LIBRARIES for
    112   # they may cusomize their install path with LOCAL_MODULE_PATH
    113   installed_shared_library_module_names := \
    114       $(LOCAL_SHARED_LIBRARIES)
    115 else
    116   installed_shared_library_module_names := \
    117       $(LOCAL_SYSTEM_SHARED_LIBRARIES) $(LOCAL_SHARED_LIBRARIES)
    118 endif
    119 # The real dependency will be added after all Android.mks are loaded and the install paths
    120 # of the shared libraries are determined.
    121 LOCAL_REQUIRED_MODULES += $(installed_shared_library_module_names)
    122 
    123 #######################################
    124 include $(BUILD_SYSTEM)/base_rules.mk
    125 #######################################
    126 
    127 ####################################################
    128 ## Add FDO flags if FDO is turned on and supported
    129 ####################################################
    130 ifeq ($(strip $(LOCAL_NO_FDO_SUPPORT)),)
    131   LOCAL_CFLAGS += $(TARGET_FDO_CFLAGS)
    132   LOCAL_CPPFLAGS += $(TARGET_FDO_CFLAGS)
    133   LOCAL_LDFLAGS += $(TARGET_FDO_CFLAGS)
    134 endif
    135 
    136 ###########################################################
    137 ## Explicitly declare assembly-only __ASSEMBLY__ macro for
    138 ## assembly source
    139 ###########################################################
    140 LOCAL_ASFLAGS += -D__ASSEMBLY__
    141 
    142 ###########################################################
    143 ## Define PRIVATE_ variables from global vars
    144 ###########################################################
    145 ifdef LOCAL_NDK_VERSION
    146 my_target_project_includes :=
    147 my_target_c_inclues := $(my_ndk_stl_include_path) $(my_ndk_version_root)/usr/include
    148 # TODO: more reliable way to remove platform stuff.
    149 my_target_global_cflags := $(filter-out -include -I system/%, $(TARGET_GLOBAL_CFLAGS))
    150 my_target_global_cppflags := $(filter-out -include -I system/%, $(TARGET_GLOBAL_CPPFLAGS))
    151 else
    152 my_target_project_includes := $(TARGET_PROJECT_INCLUDES)
    153 my_target_c_inclues := $(TARGET_C_INCLUDES)
    154 my_target_global_cflags := $(TARGET_GLOBAL_CFLAGS)
    155 my_target_global_cppflags := $(TARGET_GLOBAL_CPPFLAGS)
    156 endif
    157 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_PROJECT_INCLUDES := $(my_target_project_includes)
    158 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_C_INCLUDES := $(my_target_c_inclues)
    159 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(my_target_global_cflags)
    160 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CPPFLAGS := $(my_target_global_cppflags)
    161 
    162 ###########################################################
    163 ## Define PRIVATE_ variables used by multiple module types
    164 ###########################################################
    165 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_DEFAULT_COMPILER_FLAGS := \
    166 	$(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS))
    167 
    168 ifeq ($(strip $(LOCAL_CC)),)
    169   LOCAL_CC := $($(my_prefix)CC)
    170 endif
    171 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(LOCAL_CC)
    172 
    173 ifeq ($(strip $(LOCAL_CXX)),)
    174   LOCAL_CXX := $($(my_prefix)CXX)
    175 endif
    176 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(LOCAL_CXX)
    177 
    178 # TODO: support a mix of standard extensions so that this isn't necessary
    179 LOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION))
    180 ifeq ($(LOCAL_CPP_EXTENSION),)
    181   LOCAL_CPP_EXTENSION := .cpp
    182 endif
    183 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPP_EXTENSION := $(LOCAL_CPP_EXTENSION)
    184 
    185 # Certain modules like libdl have to have symbols resolved at runtime and blow
    186 # up if --no-undefined is passed to the linker.
    187 ifeq ($(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS)),)
    188 ifeq ($(strip $(LOCAL_ALLOW_UNDEFINED_SYMBOLS)),)
    189   LOCAL_LDFLAGS := $(LOCAL_LDFLAGS) $($(my_prefix)NO_UNDEFINED_LDFLAGS)
    190 endif
    191 endif
    192 
    193 ifeq (true,$(LOCAL_GROUP_STATIC_LIBRARIES))
    194 $(LOCAL_BUILT_MODULE): PRIVATE_GROUP_STATIC_LIBRARIES := true
    195 else
    196 $(LOCAL_BUILT_MODULE): PRIVATE_GROUP_STATIC_LIBRARIES :=
    197 endif
    198 
    199 ###########################################################
    200 ## Define arm-vs-thumb-mode flags.
    201 ###########################################################
    202 LOCAL_ARM_MODE := $(strip $(LOCAL_ARM_MODE))
    203 ifeq ($(TARGET_ARCH),arm)
    204 arm_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),arm)
    205 normal_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),thumb)
    206 
    207 # Read the values from something like TARGET_arm_CFLAGS or
    208 # TARGET_thumb_CFLAGS.  HOST_(arm|thumb)_CFLAGS values aren't
    209 # actually used (although they are usually empty).
    210 arm_objects_cflags := $($(my_prefix)$(arm_objects_mode)_CFLAGS)
    211 normal_objects_cflags := $($(my_prefix)$(normal_objects_mode)_CFLAGS)
    212 else
    213 arm_objects_mode :=
    214 normal_objects_mode :=
    215 arm_objects_cflags :=
    216 normal_objects_cflags :=
    217 endif
    218 
    219 ###########################################################
    220 ## Define per-module debugging flags.  Users can turn on
    221 ## debugging for a particular module by setting DEBUG_MODULE_ModuleName
    222 ## to a non-empty value in their environment or buildspec.mk,
    223 ## and setting HOST_/TARGET_CUSTOM_DEBUG_CFLAGS to the
    224 ## debug flags that they want to use.
    225 ###########################################################
    226 ifdef DEBUG_MODULE_$(strip $(LOCAL_MODULE))
    227   debug_cflags := $($(my_prefix)CUSTOM_DEBUG_CFLAGS)
    228 else
    229   debug_cflags :=
    230 endif
    231 
    232 ###########################################################
    233 ## Stuff source generated from one-off tools
    234 ###########################################################
    235 $(LOCAL_GENERATED_SOURCES): PRIVATE_MODULE := $(LOCAL_MODULE)
    236 
    237 ALL_GENERATED_SOURCES += $(LOCAL_GENERATED_SOURCES)
    238 
    239 
    240 ###########################################################
    241 ## Compile the .proto files to .cc and then to .o
    242 ###########################################################
    243 proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES))
    244 proto_generated_objects :=
    245 proto_generated_headers :=
    246 ifneq ($(proto_sources),)
    247 proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources))
    248 proto_generated_cc_sources_dir := $(intermediates)/proto
    249 proto_generated_cc_sources := $(addprefix $(proto_generated_cc_sources_dir)/, \
    250 	$(patsubst %.proto,%.pb.cc,$(proto_sources_fullpath)))
    251 proto_generated_objects := $(patsubst %.cc,%.o, $(proto_generated_cc_sources))
    252 
    253 $(proto_generated_cc_sources): PRIVATE_PROTO_INCLUDES := $(TOP)
    254 $(proto_generated_cc_sources): PRIVATE_PROTO_CC_OUTPUT_DIR := $(proto_generated_cc_sources_dir)
    255 $(proto_generated_cc_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS)
    256 $(proto_generated_cc_sources): $(proto_generated_cc_sources_dir)/%.pb.cc: %.proto $(PROTOC)
    257 	$(transform-proto-to-cc)
    258 
    259 proto_generated_headers := $(patsubst %.pb.cc,%.pb.h, $(proto_generated_cc_sources))
    260 $(proto_generated_headers): $(proto_generated_cc_sources_dir)/%.pb.h: $(proto_generated_cc_sources_dir)/%.pb.cc
    261 
    262 $(proto_generated_cc_sources): PRIVATE_ARM_MODE := $(normal_objects_mode)
    263 $(proto_generated_cc_sources): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    264 $(proto_generated_objects): $(proto_generated_cc_sources_dir)/%.o: $(proto_generated_cc_sources_dir)/%.cc
    265 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    266 -include $(proto_generated_objects:%.o=%.P)
    267 
    268 LOCAL_C_INCLUDES += external/protobuf/src $(proto_generated_cc_sources_dir)
    269 LOCAL_CFLAGS += -DGOOGLE_PROTOBUF_NO_RTTI
    270 ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),full)
    271 LOCAL_STATIC_LIBRARIES += libprotobuf-cpp-2.3.0-full
    272 else
    273 LOCAL_STATIC_LIBRARIES += libprotobuf-cpp-2.3.0-lite
    274 endif
    275 endif
    276 
    277 
    278 ###########################################################
    279 ## YACC: Compile .y files to .cpp and the to .o.
    280 ###########################################################
    281 
    282 yacc_sources := $(filter %.y,$(LOCAL_SRC_FILES))
    283 yacc_cpps := $(addprefix \
    284 	$(intermediates)/,$(yacc_sources:.y=$(LOCAL_CPP_EXTENSION)))
    285 yacc_headers := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.h)
    286 yacc_objects := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.o)
    287 
    288 ifneq ($(strip $(yacc_cpps)),)
    289 $(yacc_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
    290 		$(TOPDIR)$(LOCAL_PATH)/%.y \
    291 		$(lex_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    292 	$(call transform-y-to-cpp,$(PRIVATE_CPP_EXTENSION))
    293 $(yacc_headers): $(intermediates)/%.h: $(intermediates)/%$(LOCAL_CPP_EXTENSION)
    294 
    295 $(yacc_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    296 $(yacc_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    297 $(yacc_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION)
    298 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    299 endif
    300 
    301 ###########################################################
    302 ## LEX: Compile .l files to .cpp and then to .o.
    303 ###########################################################
    304 
    305 lex_sources := $(filter %.l,$(LOCAL_SRC_FILES))
    306 lex_cpps := $(addprefix \
    307 	$(intermediates)/,$(lex_sources:.l=$(LOCAL_CPP_EXTENSION)))
    308 lex_objects := $(lex_cpps:$(LOCAL_CPP_EXTENSION)=.o)
    309 
    310 ifneq ($(strip $(lex_cpps)),)
    311 $(lex_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
    312 		$(TOPDIR)$(LOCAL_PATH)/%.l
    313 	$(transform-l-to-cpp)
    314 
    315 $(lex_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    316 $(lex_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    317 $(lex_objects): $(intermediates)/%.o: \
    318 		$(intermediates)/%$(LOCAL_CPP_EXTENSION) \
    319 		$(LOCAL_ADDITIONAL_DEPENDENCIES) \
    320 		$(yacc_headers)
    321 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    322 endif
    323 
    324 ###########################################################
    325 ## C++: Compile .cpp files to .o.
    326 ###########################################################
    327 
    328 # we also do this on host modules, even though
    329 # it's not really arm, because there are files that are shared.
    330 cpp_arm_sources    := $(patsubst %$(LOCAL_CPP_EXTENSION).arm,%$(LOCAL_CPP_EXTENSION),$(filter %$(LOCAL_CPP_EXTENSION).arm,$(LOCAL_SRC_FILES)))
    331 cpp_arm_objects    := $(addprefix $(intermediates)/,$(cpp_arm_sources:$(LOCAL_CPP_EXTENSION)=.o))
    332 
    333 cpp_normal_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_SRC_FILES))
    334 cpp_normal_objects := $(addprefix $(intermediates)/,$(cpp_normal_sources:$(LOCAL_CPP_EXTENSION)=.o))
    335 
    336 $(cpp_arm_objects):    PRIVATE_ARM_MODE := $(arm_objects_mode)
    337 $(cpp_arm_objects):    PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
    338 $(cpp_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    339 $(cpp_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    340 
    341 cpp_objects        := $(cpp_arm_objects) $(cpp_normal_objects)
    342 
    343 ifneq ($(strip $(cpp_objects)),)
    344 $(cpp_objects): $(intermediates)/%.o: \
    345 		$(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \
    346 		$(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    347 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    348 -include $(cpp_objects:%.o=%.P)
    349 endif
    350 
    351 ###########################################################
    352 ## C++: Compile generated .cpp files to .o.
    353 ###########################################################
    354 
    355 gen_cpp_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_GENERATED_SOURCES))
    356 gen_cpp_objects := $(gen_cpp_sources:%$(LOCAL_CPP_EXTENSION)=%.o)
    357 
    358 ifneq ($(strip $(gen_cpp_objects)),)
    359 # Compile all generated files as thumb.
    360 # TODO: support compiling certain generated files as arm.
    361 $(gen_cpp_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    362 $(gen_cpp_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    363 $(gen_cpp_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    364 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    365 -include $(gen_cpp_objects:%.o=%.P)
    366 endif
    367 
    368 ###########################################################
    369 ## S: Compile generated .S and .s files to .o.
    370 ###########################################################
    371 
    372 gen_S_sources := $(filter %.S,$(LOCAL_GENERATED_SOURCES))
    373 gen_S_objects := $(gen_S_sources:%.S=%.o)
    374 
    375 ifneq ($(strip $(gen_S_sources)),)
    376 $(gen_S_objects): $(intermediates)/%.o: $(intermediates)/%.S $(LOCAL_ADDITIONAL_DEPENDENCIES)
    377 	$(transform-$(PRIVATE_HOST)s-to-o)
    378 -include $(gen_S_objects:%.o=%.P)
    379 endif
    380 
    381 gen_s_sources := $(filter %.s,$(LOCAL_GENERATED_SOURCES))
    382 gen_s_objects := $(gen_s_sources:%.s=%.o)
    383 
    384 ifneq ($(strip $(gen_s_objects)),)
    385 $(gen_s_objects): $(intermediates)/%.o: $(intermediates)/%.s $(LOCAL_ADDITIONAL_DEPENDENCIES)
    386 	$(transform-$(PRIVATE_HOST)s-to-o-no-deps)
    387 -include $(gen_s_objects:%.o=%.P)
    388 endif
    389 
    390 gen_asm_objects := $(gen_S_objects) $(gen_s_objects)
    391 
    392 ###########################################################
    393 ## C: Compile .c files to .o.
    394 ###########################################################
    395 
    396 c_arm_sources    := $(patsubst %.c.arm,%.c,$(filter %.c.arm,$(LOCAL_SRC_FILES)))
    397 c_arm_objects    := $(addprefix $(intermediates)/,$(c_arm_sources:.c=.o))
    398 
    399 c_normal_sources := $(filter %.c,$(LOCAL_SRC_FILES))
    400 c_normal_objects := $(addprefix $(intermediates)/,$(c_normal_sources:.c=.o))
    401 
    402 $(c_arm_objects):    PRIVATE_ARM_MODE := $(arm_objects_mode)
    403 $(c_arm_objects):    PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
    404 $(c_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    405 $(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    406 
    407 c_objects        := $(c_arm_objects) $(c_normal_objects)
    408 
    409 ifneq ($(strip $(c_objects)),)
    410 $(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    411 	$(transform-$(PRIVATE_HOST)c-to-o)
    412 -include $(c_objects:%.o=%.P)
    413 endif
    414 
    415 ###########################################################
    416 ## C: Compile generated .c files to .o.
    417 ###########################################################
    418 
    419 gen_c_sources := $(filter %.c,$(LOCAL_GENERATED_SOURCES))
    420 gen_c_objects := $(gen_c_sources:%.c=%.o)
    421 
    422 ifneq ($(strip $(gen_c_objects)),)
    423 # Compile all generated files as thumb.
    424 # TODO: support compiling certain generated files as arm.
    425 $(gen_c_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    426 $(gen_c_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    427 $(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    428 	$(transform-$(PRIVATE_HOST)c-to-o)
    429 -include $(gen_c_objects:%.o=%.P)
    430 endif
    431 
    432 ###########################################################
    433 ## ObjC: Compile .m files to .o
    434 ###########################################################
    435 
    436 objc_sources := $(filter %.m,$(LOCAL_SRC_FILES))
    437 objc_objects := $(addprefix $(intermediates)/,$(objc_sources:.m=.o))
    438 
    439 ifneq ($(strip $(objc_objects)),)
    440 $(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    441 	$(transform-$(PRIVATE_HOST)m-to-o)
    442 -include $(objc_objects:%.o=%.P)
    443 endif
    444 
    445 ###########################################################
    446 ## AS: Compile .S files to .o.
    447 ###########################################################
    448 
    449 asm_sources_S := $(filter %.S,$(LOCAL_SRC_FILES))
    450 asm_objects_S := $(addprefix $(intermediates)/,$(asm_sources_S:.S=.o))
    451 
    452 ifneq ($(strip $(asm_objects_S)),)
    453 $(asm_objects_S): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.S $(LOCAL_ADDITIONAL_DEPENDENCIES)
    454 	$(transform-$(PRIVATE_HOST)s-to-o)
    455 -include $(asm_objects_S:%.o=%.P)
    456 endif
    457 
    458 asm_sources_s := $(filter %.s,$(LOCAL_SRC_FILES))
    459 asm_objects_s := $(addprefix $(intermediates)/,$(asm_sources_s:.s=.o))
    460 
    461 ifneq ($(strip $(asm_objects_s)),)
    462 $(asm_objects_s): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.s $(LOCAL_ADDITIONAL_DEPENDENCIES)
    463 	$(transform-$(PRIVATE_HOST)s-to-o-no-deps)
    464 -include $(asm_objects_s:%.o=%.P)
    465 endif
    466 
    467 asm_objects := $(asm_objects_S) $(asm_objects_s)
    468 
    469 
    470 ###########################################################
    471 ## Common object handling.
    472 ###########################################################
    473 
    474 # some rules depend on asm_objects being first.  If your code depends on
    475 # being first, it's reasonable to require it to be assembly
    476 all_objects := \
    477 	$(asm_objects) \
    478 	$(cpp_objects) \
    479 	$(gen_cpp_objects) \
    480 	$(gen_asm_objects) \
    481 	$(c_objects) \
    482 	$(gen_c_objects) \
    483 	$(objc_objects) \
    484 	$(yacc_objects) \
    485 	$(lex_objects) \
    486 	$(proto_generated_objects) \
    487 	$(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES))
    488 
    489 LOCAL_C_INCLUDES += $(TOPDIR)$(LOCAL_PATH) $(intermediates) $(base_intermediates)
    490 
    491 ifndef LOCAL_NDK_VERSION
    492   LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
    493 endif
    494 
    495 $(all_objects) : | $(LOCAL_GENERATED_SOURCES)
    496 ALL_C_CPP_ETC_OBJECTS += $(all_objects)
    497 
    498 ###########################################################
    499 ## Copy headers to the install tree
    500 ###########################################################
    501 include $(BUILD_COPY_HEADERS)
    502 
    503 ###########################################################
    504 # Standard library handling.
    505 ###########################################################
    506 
    507 ###########################################################
    508 # The list of libraries that this module will link against are in
    509 # these variables.  Each is a list of bare module names like "libc libm".
    510 #
    511 # LOCAL_SHARED_LIBRARIES
    512 # LOCAL_STATIC_LIBRARIES
    513 # LOCAL_WHOLE_STATIC_LIBRARIES
    514 #
    515 # We need to convert the bare names into the dependencies that
    516 # we'll use for LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE.
    517 # LOCAL_BUILT_MODULE should depend on the BUILT versions of the
    518 # libraries, so that simply building this module doesn't force
    519 # an install of a library.  Similarly, LOCAL_INSTALLED_MODULE
    520 # should depend on the INSTALLED versions of the libraries so
    521 # that they get installed when this module does.
    522 ###########################################################
    523 # NOTE:
    524 # WHOLE_STATIC_LIBRARIES are libraries that are pulled into the
    525 # module without leaving anything out, which is useful for turning
    526 # a collection of .a files into a .so file.  Linking against a
    527 # normal STATIC_LIBRARY will only pull in code/symbols that are
    528 # referenced by the module. (see gcc/ld's --whole-archive option)
    529 ###########################################################
    530 
    531 # Get the list of BUILT libraries, which are under
    532 # various intermediates directories.
    533 so_suffix := $($(my_prefix)SHLIB_SUFFIX)
    534 a_suffix := $($(my_prefix)STATIC_LIB_SUFFIX)
    535 
    536 ifdef LOCAL_NDK_VERSION
    537 built_shared_libraries := \
    538     $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
    539       $(addsuffix $(so_suffix), \
    540         $(LOCAL_SHARED_LIBRARIES)))
    541 
    542 my_system_shared_libraries_fullpath := \
    543     $(my_ndk_stl_shared_lib_fullpath) \
    544     $(addprefix $(my_ndk_version_root)/usr/lib/, \
    545         $(addsuffix $(so_suffix), $(LOCAL_SYSTEM_SHARED_LIBRARIES)))
    546 
    547 built_shared_libraries += $(my_system_shared_libraries_fullpath)
    548 LOCAL_SHARED_LIBRARIES += $(LOCAL_SYSTEM_SHARED_LIBRARIES)
    549 else
    550 LOCAL_SHARED_LIBRARIES += $(LOCAL_SYSTEM_SHARED_LIBRARIES)
    551 built_shared_libraries := \
    552     $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
    553       $(addsuffix $(so_suffix), \
    554         $(LOCAL_SHARED_LIBRARIES)))
    555 endif
    556 
    557 built_static_libraries := \
    558     $(foreach lib,$(LOCAL_STATIC_LIBRARIES), \
    559       $(call intermediates-dir-for, \
    560         STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix))
    561 
    562 ifdef LOCAL_NDK_VERSION
    563 built_static_libraries += $(my_ndk_stl_static_lib)
    564 endif
    565 
    566 built_whole_libraries := \
    567     $(foreach lib,$(LOCAL_WHOLE_STATIC_LIBRARIES), \
    568       $(call intermediates-dir-for, \
    569         STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix))
    570 
    571 # We don't care about installed static libraries, since the
    572 # libraries have already been linked into the module at that point.
    573 # We do, however, care about the NOTICE files for any static
    574 # libraries that we use. (see notice_files.make)
    575 
    576 installed_static_library_notice_file_targets := \
    577     $(foreach lib,$(LOCAL_STATIC_LIBRARIES) $(LOCAL_WHOLE_STATIC_LIBRARIES), \
    578       NOTICE-$(if $(LOCAL_IS_HOST_MODULE),HOST,TARGET)-STATIC_LIBRARIES-$(lib))
    579 
    580 # Default is -fno-rtti.
    581 ifeq ($(strip $(LOCAL_RTTI_FLAG)),)
    582 LOCAL_RTTI_FLAG := -fno-rtti
    583 endif
    584 
    585 ###########################################################
    586 # Rule-specific variable definitions
    587 ###########################################################
    588 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)
    589 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(LOCAL_ASFLAGS)
    590 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS := $(LOCAL_CFLAGS)
    591 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS := $(LOCAL_CPPFLAGS)
    592 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)
    593 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)
    594 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(LOCAL_C_INCLUDES)
    595 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDFLAGS := $(LOCAL_LDFLAGS)
    596 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(LOCAL_LDLIBS)
    597 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_CRT := $(LOCAL_NO_CRT)
    598 
    599 # this is really the way to get the files onto the command line instead
    600 # of using $^, because then LOCAL_ADDITIONAL_DEPENDENCIES doesn't work
    601 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_SHARED_LIBRARIES := $(built_shared_libraries)
    602 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_STATIC_LIBRARIES := $(built_static_libraries)
    603 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES := $(built_whole_libraries)
    604 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_OBJECTS := $(all_objects)
    605 
    606 ###########################################################
    607 # Define library dependencies.
    608 ###########################################################
    609 # all_libraries is used for the dependencies on LOCAL_BUILT_MODULE.
    610 all_libraries := \
    611     $(built_shared_libraries) \
    612     $(built_static_libraries) \
    613     $(built_whole_libraries)
    614 
    615 # Also depend on the notice files for any static libraries that
    616 # are linked into this module.  This will force them to be installed
    617 # when this module is.
    618 $(LOCAL_INSTALLED_MODULE): | $(installed_static_library_notice_file_targets)
    619