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 ifeq ($(strip $(LOCAL_ADDRESS_SANITIZER)),true)
    128   LOCAL_CLANG := true
    129   LOCAL_CFLAGS += $(ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS)
    130   LOCAL_LDFLAGS += $(ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS)
    131   LOCAL_SHARED_LIBRARIES += $(ADDRESS_SANITIZER_CONFIG_EXTRA_SHARED_LIBRARIES)
    132   LOCAL_STATIC_LIBRARIES += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES)
    133 endif
    134 
    135 my_compiler_dependencies :=
    136 ifeq ($(strip $(LOCAL_CLANG)),true)
    137   LOCAL_CFLAGS += $(CLANG_CONFIG_EXTRA_CFLAGS)
    138   LOCAL_LDFLAGS += $(CLANG_CONFIG_EXTRA_LDFLAGS)
    139   my_compiler_dependencies := $(CLANG) $(CLANG_CXX)
    140 endif
    141 
    142 ####################################################
    143 ## Add FDO flags if FDO is turned on and supported
    144 ####################################################
    145 ifeq ($(strip $(LOCAL_NO_FDO_SUPPORT)),)
    146   LOCAL_CFLAGS += $(TARGET_FDO_CFLAGS)
    147   LOCAL_CPPFLAGS += $(TARGET_FDO_CFLAGS)
    148   LOCAL_LDFLAGS += $(TARGET_FDO_CFLAGS)
    149 endif
    150 
    151 ###########################################################
    152 ## Explicitly declare assembly-only __ASSEMBLY__ macro for
    153 ## assembly source
    154 ###########################################################
    155 LOCAL_ASFLAGS += -D__ASSEMBLY__
    156 
    157 ###########################################################
    158 ## Define PRIVATE_ variables from global vars
    159 ###########################################################
    160 ifeq ($(strip $(LOCAL_CLANG)),true)
    161 my_target_global_cflags := $(TARGET_GLOBAL_CLANG_FLAGS)
    162 else
    163 my_target_global_cflags := $(TARGET_GLOBAL_CFLAGS)
    164 endif
    165 
    166 ifdef LOCAL_NDK_VERSION
    167 my_target_project_includes :=
    168 my_target_c_includes := $(my_ndk_stl_include_path) $(my_ndk_version_root)/usr/include
    169 # TODO: more reliable way to remove platform stuff.
    170 my_target_global_cflags := $(filter-out -include -I system/%, $(my_target_global_cflags))
    171 my_target_global_cppflags := $(filter-out -include -I system/%, $(TARGET_GLOBAL_CPPFLAGS))
    172 else
    173 my_target_project_includes := $(TARGET_PROJECT_INCLUDES)
    174 my_target_c_includes := $(TARGET_C_INCLUDES)
    175 my_target_global_cflags := $(my_target_global_cflags)
    176 my_target_global_cppflags := $(TARGET_GLOBAL_CPPFLAGS)
    177 ifeq ($(strip $(LOCAL_CLANG)),true)
    178   my_target_c_includes += $(CLANG_CONFIG_EXTRA_TARGET_C_INCLUDES)
    179 endif
    180 endif
    181 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_PROJECT_INCLUDES := $(my_target_project_includes)
    182 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_C_INCLUDES := $(my_target_c_includes)
    183 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(my_target_global_cflags)
    184 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CPPFLAGS := $(my_target_global_cppflags)
    185 
    186 ###########################################################
    187 ## Define PRIVATE_ variables used by multiple module types
    188 ###########################################################
    189 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_DEFAULT_COMPILER_FLAGS := \
    190     $(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS))
    191 
    192 ifeq ($(strip $(LOCAL_CC)),)
    193   ifeq ($(strip $(LOCAL_CLANG)),true)
    194     LOCAL_CC := $(CLANG)
    195   else
    196     LOCAL_CC := $($(my_prefix)CC)
    197   endif
    198 endif
    199 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(LOCAL_CC)
    200 
    201 ifeq ($(strip $(LOCAL_CXX)),)
    202   ifeq ($(strip $(LOCAL_CLANG)),true)
    203     LOCAL_CXX := $(CLANG_CXX)
    204   else
    205     LOCAL_CXX := $($(my_prefix)CXX)
    206   endif
    207 endif
    208 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(LOCAL_CXX)
    209 
    210 # TODO: support a mix of standard extensions so that this isn't necessary
    211 LOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION))
    212 ifeq ($(LOCAL_CPP_EXTENSION),)
    213   LOCAL_CPP_EXTENSION := .cpp
    214 endif
    215 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPP_EXTENSION := $(LOCAL_CPP_EXTENSION)
    216 
    217 # Certain modules like libdl have to have symbols resolved at runtime and blow
    218 # up if --no-undefined is passed to the linker.
    219 ifeq ($(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS)),)
    220 ifeq ($(strip $(LOCAL_ALLOW_UNDEFINED_SYMBOLS)),)
    221   LOCAL_LDFLAGS := $(LOCAL_LDFLAGS) $($(my_prefix)NO_UNDEFINED_LDFLAGS)
    222 endif
    223 endif
    224 
    225 ifeq (true,$(LOCAL_GROUP_STATIC_LIBRARIES))
    226 $(LOCAL_BUILT_MODULE): PRIVATE_GROUP_STATIC_LIBRARIES := true
    227 else
    228 $(LOCAL_BUILT_MODULE): PRIVATE_GROUP_STATIC_LIBRARIES :=
    229 endif
    230 
    231 ###########################################################
    232 ## Define arm-vs-thumb-mode flags.
    233 ###########################################################
    234 LOCAL_ARM_MODE := $(strip $(LOCAL_ARM_MODE))
    235 ifeq ($(TARGET_ARCH),arm)
    236 arm_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),arm)
    237 normal_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),thumb)
    238 
    239 # Read the values from something like TARGET_arm_CFLAGS or
    240 # TARGET_thumb_CFLAGS.  HOST_(arm|thumb)_CFLAGS values aren't
    241 # actually used (although they are usually empty).
    242 ifeq ($(strip $(LOCAL_CLANG)),true)
    243 arm_objects_cflags := $($(my_prefix)$(arm_objects_mode)_CLANG_CFLAGS)
    244 normal_objects_cflags := $($(my_prefix)$(normal_objects_mode)_CLANG_CFLAGS)
    245 else
    246 arm_objects_cflags := $($(my_prefix)$(arm_objects_mode)_CFLAGS)
    247 normal_objects_cflags := $($(my_prefix)$(normal_objects_mode)_CFLAGS)
    248 endif
    249 
    250 else
    251 arm_objects_mode :=
    252 normal_objects_mode :=
    253 arm_objects_cflags :=
    254 normal_objects_cflags :=
    255 endif
    256 
    257 ###########################################################
    258 ## Define per-module debugging flags.  Users can turn on
    259 ## debugging for a particular module by setting DEBUG_MODULE_ModuleName
    260 ## to a non-empty value in their environment or buildspec.mk,
    261 ## and setting HOST_/TARGET_CUSTOM_DEBUG_CFLAGS to the
    262 ## debug flags that they want to use.
    263 ###########################################################
    264 ifdef DEBUG_MODULE_$(strip $(LOCAL_MODULE))
    265   debug_cflags := $($(my_prefix)CUSTOM_DEBUG_CFLAGS)
    266 else
    267   debug_cflags :=
    268 endif
    269 
    270 ###########################################################
    271 ## Stuff source generated from one-off tools
    272 ###########################################################
    273 $(LOCAL_GENERATED_SOURCES): PRIVATE_MODULE := $(LOCAL_MODULE)
    274 
    275 ALL_GENERATED_SOURCES += $(LOCAL_GENERATED_SOURCES)
    276 
    277 
    278 ###########################################################
    279 ## Compile the .proto files to .cc and then to .o
    280 ###########################################################
    281 proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES))
    282 proto_generated_objects :=
    283 proto_generated_headers :=
    284 ifneq ($(proto_sources),)
    285 proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources))
    286 proto_generated_cc_sources_dir := $(intermediates)/proto
    287 proto_generated_cc_sources := $(addprefix $(proto_generated_cc_sources_dir)/, \
    288     $(patsubst %.proto,%.pb.cc,$(proto_sources_fullpath)))
    289 proto_generated_objects := $(patsubst %.cc,%.o, $(proto_generated_cc_sources))
    290 
    291 $(proto_generated_cc_sources): PRIVATE_PROTO_INCLUDES := $(TOP)
    292 $(proto_generated_cc_sources): PRIVATE_PROTO_CC_OUTPUT_DIR := $(proto_generated_cc_sources_dir)
    293 $(proto_generated_cc_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS)
    294 $(proto_generated_cc_sources): $(proto_generated_cc_sources_dir)/%.pb.cc: %.proto $(PROTOC)
    295 	$(transform-proto-to-cc)
    296 
    297 proto_generated_headers := $(patsubst %.pb.cc,%.pb.h, $(proto_generated_cc_sources))
    298 $(proto_generated_headers): $(proto_generated_cc_sources_dir)/%.pb.h: $(proto_generated_cc_sources_dir)/%.pb.cc
    299 
    300 $(proto_generated_cc_sources): PRIVATE_ARM_MODE := $(normal_objects_mode)
    301 $(proto_generated_cc_sources): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    302 $(proto_generated_objects): $(proto_generated_cc_sources_dir)/%.o: $(proto_generated_cc_sources_dir)/%.cc $(proto_generated_headers)
    303 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    304 -include $(proto_generated_objects:%.o=%.P)
    305 
    306 LOCAL_C_INCLUDES += external/protobuf/src $(proto_generated_cc_sources_dir)
    307 LOCAL_CFLAGS += -DGOOGLE_PROTOBUF_NO_RTTI
    308 ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),full)
    309 LOCAL_STATIC_LIBRARIES += libprotobuf-cpp-2.3.0-full
    310 else
    311 LOCAL_STATIC_LIBRARIES += libprotobuf-cpp-2.3.0-lite
    312 endif
    313 endif
    314 
    315 
    316 ###########################################################
    317 ## YACC: Compile .y files to .cpp and the to .o.
    318 ###########################################################
    319 
    320 yacc_sources := $(filter %.y,$(LOCAL_SRC_FILES))
    321 yacc_cpps := $(addprefix \
    322     $(intermediates)/,$(yacc_sources:.y=$(LOCAL_CPP_EXTENSION)))
    323 yacc_headers := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.h)
    324 yacc_objects := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.o)
    325 
    326 ifneq ($(strip $(yacc_cpps)),)
    327 $(yacc_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
    328     $(TOPDIR)$(LOCAL_PATH)/%.y \
    329     $(lex_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    330 	$(call transform-y-to-cpp,$(PRIVATE_CPP_EXTENSION))
    331 $(yacc_headers): $(intermediates)/%.h: $(intermediates)/%$(LOCAL_CPP_EXTENSION)
    332 
    333 $(yacc_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    334 $(yacc_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    335 $(yacc_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION)
    336 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    337 endif
    338 
    339 ###########################################################
    340 ## LEX: Compile .l files to .cpp and then to .o.
    341 ###########################################################
    342 
    343 lex_sources := $(filter %.l,$(LOCAL_SRC_FILES))
    344 lex_cpps := $(addprefix \
    345     $(intermediates)/,$(lex_sources:.l=$(LOCAL_CPP_EXTENSION)))
    346 lex_objects := $(lex_cpps:$(LOCAL_CPP_EXTENSION)=.o)
    347 
    348 ifneq ($(strip $(lex_cpps)),)
    349 $(lex_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
    350     $(TOPDIR)$(LOCAL_PATH)/%.l
    351 	$(transform-l-to-cpp)
    352 
    353 $(lex_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    354 $(lex_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    355 $(lex_objects): $(intermediates)/%.o: \
    356     $(intermediates)/%$(LOCAL_CPP_EXTENSION) \
    357     $(LOCAL_ADDITIONAL_DEPENDENCIES) \
    358     $(yacc_headers)
    359 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    360 endif
    361 
    362 ###########################################################
    363 ## C++: Compile .cpp files to .o.
    364 ###########################################################
    365 
    366 # we also do this on host modules, even though
    367 # it's not really arm, because there are files that are shared.
    368 cpp_arm_sources    := $(patsubst %$(LOCAL_CPP_EXTENSION).arm,%$(LOCAL_CPP_EXTENSION),$(filter %$(LOCAL_CPP_EXTENSION).arm,$(LOCAL_SRC_FILES)))
    369 cpp_arm_objects    := $(addprefix $(intermediates)/,$(cpp_arm_sources:$(LOCAL_CPP_EXTENSION)=.o))
    370 
    371 cpp_normal_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_SRC_FILES))
    372 cpp_normal_objects := $(addprefix $(intermediates)/,$(cpp_normal_sources:$(LOCAL_CPP_EXTENSION)=.o))
    373 
    374 $(cpp_arm_objects):    PRIVATE_ARM_MODE := $(arm_objects_mode)
    375 $(cpp_arm_objects):    PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
    376 $(cpp_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    377 $(cpp_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    378 
    379 cpp_objects        := $(cpp_arm_objects) $(cpp_normal_objects)
    380 
    381 ifneq ($(strip $(cpp_objects)),)
    382 $(cpp_objects): $(intermediates)/%.o: \
    383     $(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \
    384     $(yacc_cpps) $(proto_generated_headers) $(my_compiler_dependencies) \
    385     $(LOCAL_ADDITIONAL_DEPENDENCIES)
    386 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    387 -include $(cpp_objects:%.o=%.P)
    388 endif
    389 
    390 ###########################################################
    391 ## C++: Compile generated .cpp files to .o.
    392 ###########################################################
    393 
    394 gen_cpp_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_GENERATED_SOURCES))
    395 gen_cpp_objects := $(gen_cpp_sources:%$(LOCAL_CPP_EXTENSION)=%.o)
    396 
    397 ifneq ($(strip $(gen_cpp_objects)),)
    398 # Compile all generated files as thumb.
    399 # TODO: support compiling certain generated files as arm.
    400 $(gen_cpp_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    401 $(gen_cpp_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    402 $(gen_cpp_objects): $(intermediates)/%.o: \
    403     $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) \
    404     $(proto_generated_headers)  $(my_compiler_dependencies) \
    405     $(LOCAL_ADDITIONAL_DEPENDENCIES)
    406 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    407 -include $(gen_cpp_objects:%.o=%.P)
    408 endif
    409 
    410 ###########################################################
    411 ## S: Compile generated .S and .s files to .o.
    412 ###########################################################
    413 
    414 gen_S_sources := $(filter %.S,$(LOCAL_GENERATED_SOURCES))
    415 gen_S_objects := $(gen_S_sources:%.S=%.o)
    416 
    417 ifneq ($(strip $(gen_S_sources)),)
    418 $(gen_S_objects): $(intermediates)/%.o: $(intermediates)/%.S \
    419     $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    420 	$(transform-$(PRIVATE_HOST)s-to-o)
    421 -include $(gen_S_objects:%.o=%.P)
    422 endif
    423 
    424 gen_s_sources := $(filter %.s,$(LOCAL_GENERATED_SOURCES))
    425 gen_s_objects := $(gen_s_sources:%.s=%.o)
    426 
    427 ifneq ($(strip $(gen_s_objects)),)
    428 $(gen_s_objects): $(intermediates)/%.o: $(intermediates)/%.s \
    429     $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    430 	$(transform-$(PRIVATE_HOST)s-to-o-no-deps)
    431 -include $(gen_s_objects:%.o=%.P)
    432 endif
    433 
    434 gen_asm_objects := $(gen_S_objects) $(gen_s_objects)
    435 
    436 ###########################################################
    437 ## C: Compile .c files to .o.
    438 ###########################################################
    439 
    440 c_arm_sources    := $(patsubst %.c.arm,%.c,$(filter %.c.arm,$(LOCAL_SRC_FILES)))
    441 c_arm_objects    := $(addprefix $(intermediates)/,$(c_arm_sources:.c=.o))
    442 
    443 c_normal_sources := $(filter %.c,$(LOCAL_SRC_FILES))
    444 c_normal_objects := $(addprefix $(intermediates)/,$(c_normal_sources:.c=.o))
    445 
    446 $(c_arm_objects):    PRIVATE_ARM_MODE := $(arm_objects_mode)
    447 $(c_arm_objects):    PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
    448 $(c_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    449 $(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    450 
    451 c_objects        := $(c_arm_objects) $(c_normal_objects)
    452 
    453 ifneq ($(strip $(c_objects)),)
    454 $(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(proto_generated_headers) \
    455     $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    456 	$(transform-$(PRIVATE_HOST)c-to-o)
    457 -include $(c_objects:%.o=%.P)
    458 endif
    459 
    460 ###########################################################
    461 ## C: Compile generated .c files to .o.
    462 ###########################################################
    463 
    464 gen_c_sources := $(filter %.c,$(LOCAL_GENERATED_SOURCES))
    465 gen_c_objects := $(gen_c_sources:%.c=%.o)
    466 
    467 ifneq ($(strip $(gen_c_objects)),)
    468 # Compile all generated files as thumb.
    469 # TODO: support compiling certain generated files as arm.
    470 $(gen_c_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    471 $(gen_c_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    472 $(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) \
    473     $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    474 	$(transform-$(PRIVATE_HOST)c-to-o)
    475 -include $(gen_c_objects:%.o=%.P)
    476 endif
    477 
    478 ###########################################################
    479 ## ObjC: Compile .m files to .o
    480 ###########################################################
    481 
    482 objc_sources := $(filter %.m,$(LOCAL_SRC_FILES))
    483 objc_objects := $(addprefix $(intermediates)/,$(objc_sources:.m=.o))
    484 
    485 ifneq ($(strip $(objc_objects)),)
    486 $(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(proto_generated_headers) \
    487     $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    488 	$(transform-$(PRIVATE_HOST)m-to-o)
    489 -include $(objc_objects:%.o=%.P)
    490 endif
    491 
    492 ###########################################################
    493 ## AS: Compile .S files to .o.
    494 ###########################################################
    495 
    496 asm_sources_S := $(filter %.S,$(LOCAL_SRC_FILES))
    497 asm_objects_S := $(addprefix $(intermediates)/,$(asm_sources_S:.S=.o))
    498 
    499 ifneq ($(strip $(asm_objects_S)),)
    500 $(asm_objects_S): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.S \
    501     $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    502 	$(transform-$(PRIVATE_HOST)s-to-o)
    503 -include $(asm_objects_S:%.o=%.P)
    504 endif
    505 
    506 asm_sources_s := $(filter %.s,$(LOCAL_SRC_FILES))
    507 asm_objects_s := $(addprefix $(intermediates)/,$(asm_sources_s:.s=.o))
    508 
    509 ifneq ($(strip $(asm_objects_s)),)
    510 $(asm_objects_s): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.s \
    511     $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
    512 	$(transform-$(PRIVATE_HOST)s-to-o-no-deps)
    513 -include $(asm_objects_s:%.o=%.P)
    514 endif
    515 
    516 asm_objects := $(asm_objects_S) $(asm_objects_s)
    517 
    518 
    519 ####################################################
    520 ## Import includes
    521 ####################################################
    522 import_includes := $(intermediates)/import_includes
    523 import_includes_deps := $(strip \
    524     $(foreach l, $(installed_shared_library_module_names), \
    525       $(call intermediates-dir-for,SHARED_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE))/export_includes) \
    526     $(foreach l, $(LOCAL_STATIC_LIBRARIES) $(LOCAL_WHOLE_STATIC_LIBRARIES), \
    527       $(call intermediates-dir-for,STATIC_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE))/export_includes))
    528 $(import_includes) : $(import_includes_deps)
    529 	@echo Import includes file: $@
    530 	$(hide) mkdir -p $(dir $@) && rm -f $@
    531 ifdef import_includes_deps
    532 	$(hide) for f in $^; do \
    533 	  cat $$f >> $@; \
    534 	done
    535 else
    536 	$(hide) touch $@
    537 endif
    538 
    539 ###########################################################
    540 ## Common object handling.
    541 ###########################################################
    542 
    543 # some rules depend on asm_objects being first.  If your code depends on
    544 # being first, it's reasonable to require it to be assembly
    545 all_objects := \
    546     $(asm_objects) \
    547     $(cpp_objects) \
    548     $(gen_cpp_objects) \
    549     $(gen_asm_objects) \
    550     $(c_objects) \
    551     $(gen_c_objects) \
    552     $(objc_objects) \
    553     $(yacc_objects) \
    554     $(lex_objects) \
    555     $(proto_generated_objects) \
    556     $(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES))
    557 
    558 LOCAL_C_INCLUDES += $(TOPDIR)$(LOCAL_PATH) $(intermediates)
    559 
    560 ifndef LOCAL_NDK_VERSION
    561   LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
    562 endif
    563 
    564 $(all_objects) : | $(LOCAL_GENERATED_SOURCES) $(import_includes)
    565 ALL_C_CPP_ETC_OBJECTS += $(all_objects)
    566 
    567 ###########################################################
    568 ## Copy headers to the install tree
    569 ###########################################################
    570 include $(BUILD_COPY_HEADERS)
    571 
    572 ###########################################################
    573 # Standard library handling.
    574 ###########################################################
    575 
    576 ###########################################################
    577 # The list of libraries that this module will link against are in
    578 # these variables.  Each is a list of bare module names like "libc libm".
    579 #
    580 # LOCAL_SHARED_LIBRARIES
    581 # LOCAL_STATIC_LIBRARIES
    582 # LOCAL_WHOLE_STATIC_LIBRARIES
    583 #
    584 # We need to convert the bare names into the dependencies that
    585 # we'll use for LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE.
    586 # LOCAL_BUILT_MODULE should depend on the BUILT versions of the
    587 # libraries, so that simply building this module doesn't force
    588 # an install of a library.  Similarly, LOCAL_INSTALLED_MODULE
    589 # should depend on the INSTALLED versions of the libraries so
    590 # that they get installed when this module does.
    591 ###########################################################
    592 # NOTE:
    593 # WHOLE_STATIC_LIBRARIES are libraries that are pulled into the
    594 # module without leaving anything out, which is useful for turning
    595 # a collection of .a files into a .so file.  Linking against a
    596 # normal STATIC_LIBRARY will only pull in code/symbols that are
    597 # referenced by the module. (see gcc/ld's --whole-archive option)
    598 ###########################################################
    599 
    600 # Get the list of BUILT libraries, which are under
    601 # various intermediates directories.
    602 so_suffix := $($(my_prefix)SHLIB_SUFFIX)
    603 a_suffix := $($(my_prefix)STATIC_LIB_SUFFIX)
    604 
    605 ifdef LOCAL_NDK_VERSION
    606 built_shared_libraries := \
    607     $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
    608       $(addsuffix $(so_suffix), \
    609         $(LOCAL_SHARED_LIBRARIES)))
    610 
    611 my_system_shared_libraries_fullpath := \
    612     $(my_ndk_stl_shared_lib_fullpath) \
    613     $(addprefix $(my_ndk_version_root)/usr/lib/, \
    614         $(addsuffix $(so_suffix), $(LOCAL_SYSTEM_SHARED_LIBRARIES)))
    615 
    616 built_shared_libraries += $(my_system_shared_libraries_fullpath)
    617 LOCAL_SHARED_LIBRARIES += $(LOCAL_SYSTEM_SHARED_LIBRARIES)
    618 else
    619 LOCAL_SHARED_LIBRARIES += $(LOCAL_SYSTEM_SHARED_LIBRARIES)
    620 built_shared_libraries := \
    621     $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
    622       $(addsuffix $(so_suffix), \
    623         $(LOCAL_SHARED_LIBRARIES)))
    624 endif
    625 
    626 built_static_libraries := \
    627     $(foreach lib,$(LOCAL_STATIC_LIBRARIES), \
    628       $(call intermediates-dir-for, \
    629         STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix))
    630 
    631 ifdef LOCAL_NDK_VERSION
    632 built_static_libraries += $(my_ndk_stl_static_lib)
    633 endif
    634 
    635 built_whole_libraries := \
    636     $(foreach lib,$(LOCAL_WHOLE_STATIC_LIBRARIES), \
    637       $(call intermediates-dir-for, \
    638         STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix))
    639 
    640 # We don't care about installed static libraries, since the
    641 # libraries have already been linked into the module at that point.
    642 # We do, however, care about the NOTICE files for any static
    643 # libraries that we use. (see notice_files.mk)
    644 
    645 installed_static_library_notice_file_targets := \
    646     $(foreach lib,$(LOCAL_STATIC_LIBRARIES) $(LOCAL_WHOLE_STATIC_LIBRARIES), \
    647       NOTICE-$(if $(LOCAL_IS_HOST_MODULE),HOST,TARGET)-STATIC_LIBRARIES-$(lib))
    648 
    649 # Default is -fno-rtti.
    650 ifeq ($(strip $(LOCAL_RTTI_FLAG)),)
    651 LOCAL_RTTI_FLAG := -fno-rtti
    652 endif
    653 
    654 ###########################################################
    655 # Rule-specific variable definitions
    656 ###########################################################
    657 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)
    658 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(LOCAL_ASFLAGS)
    659 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS := $(LOCAL_CFLAGS)
    660 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS := $(LOCAL_CPPFLAGS)
    661 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)
    662 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)
    663 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(LOCAL_C_INCLUDES)
    664 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_IMPORT_INCLUDES := $(import_includes)
    665 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDFLAGS := $(LOCAL_LDFLAGS)
    666 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(LOCAL_LDLIBS)
    667 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_CRT := $(LOCAL_NO_CRT)
    668 
    669 # this is really the way to get the files onto the command line instead
    670 # of using $^, because then LOCAL_ADDITIONAL_DEPENDENCIES doesn't work
    671 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_SHARED_LIBRARIES := $(built_shared_libraries)
    672 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_STATIC_LIBRARIES := $(built_static_libraries)
    673 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES := $(built_whole_libraries)
    674 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_OBJECTS := $(all_objects)
    675 
    676 ###########################################################
    677 # Define library dependencies.
    678 ###########################################################
    679 # all_libraries is used for the dependencies on LOCAL_BUILT_MODULE.
    680 all_libraries := \
    681     $(built_shared_libraries) \
    682     $(built_static_libraries) \
    683     $(built_whole_libraries)
    684 
    685 # Also depend on the notice files for any static libraries that
    686 # are linked into this module.  This will force them to be installed
    687 # when this module is.
    688 $(LOCAL_INSTALLED_MODULE): | $(installed_static_library_notice_file_targets)
    689 
    690 ###########################################################
    691 # Export includes
    692 ###########################################################
    693 export_includes := $(intermediates)/export_includes
    694 $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(LOCAL_EXPORT_C_INCLUDE_DIRS)
    695 $(export_includes) : $(LOCAL_MODULE_MAKEFILE)
    696 	@echo Export includes file: $< -- $@
    697 	$(hide) mkdir -p $(dir $@) && rm -f $@
    698 ifdef LOCAL_EXPORT_C_INCLUDE_DIRS
    699 	$(hide) for d in $(PRIVATE_EXPORT_C_INCLUDE_DIRS); do \
    700 	        echo "-I $$d" >> $@; \
    701 	        done
    702 else
    703 	$(hide) touch $@
    704 endif
    705 
    706 # Make sure export_includes gets generated when you are running mm/mmm
    707 $(LOCAL_BUILT_MODULE) : | $(export_includes)
    708