Home | History | Annotate | Download | only in core
      1 ###########################################################
      2 ## Standard rules for building binary object files from
      3 ## asm/c/cpp/yacc/lex/etc source files.
      4 ##
      5 ## The list of object files is exported in $(all_objects).
      6 ###########################################################
      7 
      8 #######################################
      9 include $(BUILD_SYSTEM)/base_rules.mk
     10 #######################################
     11 
     12 ##################################################
     13 # Compute the dependency of the shared libraries
     14 ##################################################
     15 # On the target, we compile with -nostdlib, so we must add in the
     16 # default system shared libraries, unless they have requested not
     17 # to by supplying a LOCAL_SYSTEM_SHARED_LIBRARIES value.  One would
     18 # supply that, for example, when building libc itself.
     19 ifdef LOCAL_IS_HOST_MODULE
     20   ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
     21       my_system_shared_libraries :=
     22   else
     23       my_system_shared_libraries := $(LOCAL_SYSTEM_SHARED_LIBRARIES)
     24   endif
     25 else
     26   ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
     27       my_system_shared_libraries := libc libm
     28   else
     29       my_system_shared_libraries := $(LOCAL_SYSTEM_SHARED_LIBRARIES)
     30   endif
     31 endif
     32 
     33 # The following LOCAL_ variables will be modified in this file.
     34 # Because the same LOCAL_ variables may be used to define modules for both 1st arch and 2nd arch,
     35 # we can't modify them in place.
     36 my_src_files := $(LOCAL_SRC_FILES)
     37 my_src_files_exclude := $(LOCAL_SRC_FILES_EXCLUDE)
     38 my_static_libraries := $(LOCAL_STATIC_LIBRARIES)
     39 my_whole_static_libraries := $(LOCAL_WHOLE_STATIC_LIBRARIES)
     40 my_shared_libraries := $(LOCAL_SHARED_LIBRARIES)
     41 my_cflags := $(LOCAL_CFLAGS)
     42 my_conlyflags := $(LOCAL_CONLYFLAGS)
     43 my_cppflags := $(LOCAL_CPPFLAGS)
     44 my_cflags_no_override := $(GLOBAL_CFLAGS_NO_OVERRIDE)
     45 my_cppflags_no_override := $(GLOBAL_CPPFLAGS_NO_OVERRIDE)
     46 my_ldflags := $(LOCAL_LDFLAGS)
     47 my_ldlibs := $(LOCAL_LDLIBS)
     48 my_asflags := $(LOCAL_ASFLAGS)
     49 my_cc := $(LOCAL_CC)
     50 my_cc_wrapper := $(CC_WRAPPER)
     51 my_cxx := $(LOCAL_CXX)
     52 my_cxx_wrapper := $(CXX_WRAPPER)
     53 my_c_includes := $(LOCAL_C_INCLUDES)
     54 my_generated_sources := $(LOCAL_GENERATED_SOURCES)
     55 my_native_coverage := $(LOCAL_NATIVE_COVERAGE)
     56 my_additional_dependencies := $(LOCAL_MODULE_MAKEFILE_DEP) $(LOCAL_ADDITIONAL_DEPENDENCIES)
     57 my_export_c_include_dirs := $(LOCAL_EXPORT_C_INCLUDE_DIRS)
     58 
     59 ifdef LOCAL_IS_HOST_MODULE
     60 my_allow_undefined_symbols := true
     61 else
     62 my_allow_undefined_symbols := $(strip $(LOCAL_ALLOW_UNDEFINED_SYMBOLS))
     63 endif
     64 
     65 my_ndk_sysroot :=
     66 my_ndk_sysroot_include :=
     67 my_ndk_sysroot_lib :=
     68 ifdef LOCAL_SDK_VERSION
     69   ifdef LOCAL_NDK_VERSION
     70     $(error $(LOCAL_PATH): LOCAL_NDK_VERSION is now retired.)
     71   endif
     72   ifdef LOCAL_IS_HOST_MODULE
     73     $(error $(LOCAL_PATH): LOCAL_SDK_VERSION cannot be used in host module)
     74   endif
     75   my_ndk_source_root := $(HISTORICAL_NDK_VERSIONS_ROOT)/current/sources
     76   my_ndk_sysroot := $(HISTORICAL_NDK_VERSIONS_ROOT)/current/platforms/android-$(LOCAL_SDK_VERSION)/arch-$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)
     77   my_ndk_sysroot_include := $(my_ndk_sysroot)/usr/include
     78 
     79   # x86_64 and and mips64 are both multilib toolchains, so their libraries are
     80   # installed in /usr/lib64. Aarch64, on the other hand, is not a multilib
     81   # compiler, so its libraries are in /usr/lib.
     82   #
     83   # Mips32r6 is yet another variation, with libraries installed in libr6.
     84   #
     85   # For the rest, the libraries are installed simply to /usr/lib.
     86   ifneq (,$(filter x86_64 mips64,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)))
     87     my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/lib64
     88   else ifeq (mips32r6,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH_VARIANT))
     89     my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/libr6
     90   else
     91     my_ndk_sysroot_lib := $(my_ndk_sysroot)/usr/lib
     92   endif
     93 
     94   # The bionic linker now has support for packed relocations and gnu style
     95   # hashes (which are much faster!), but shipping to older devices requires
     96   # the old style hash. Fortunately, we can build with both and it'll work
     97   # anywhere.
     98   #
     99   # This is not currently supported on MIPS architectures.
    100   ifeq (,$(filter mips mips64,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)))
    101     my_ldflags += -Wl,--hash-style=both
    102   endif
    103 
    104   # We don't want to expose the relocation packer to the NDK just yet.
    105   LOCAL_PACK_MODULE_RELOCATIONS := false
    106 
    107   # Set up the NDK stl variant. Starting from NDK-r5 the c++ stl resides in a separate location.
    108   # See ndk/docs/CPLUSPLUS-SUPPORT.html
    109   my_ndk_stl_include_path :=
    110   my_ndk_stl_shared_lib_fullpath :=
    111   my_ndk_stl_shared_lib :=
    112   my_ndk_stl_static_lib :=
    113   my_ndk_stl_cppflags :=
    114   my_cpu_variant := $(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)
    115   ifeq (mips32r6,$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH_VARIANT))
    116     my_cpu_variant := mips32r6
    117   endif
    118   LOCAL_NDK_STL_VARIANT := $(strip $(LOCAL_NDK_STL_VARIANT))
    119   ifeq (,$(LOCAL_NDK_STL_VARIANT))
    120     LOCAL_NDK_STL_VARIANT := system
    121   endif
    122   ifneq (1,$(words $(filter none system stlport_static stlport_shared c++_static c++_shared gnustl_static, $(LOCAL_NDK_STL_VARIANT))))
    123     $(error $(LOCAL_PATH): Unknown LOCAL_NDK_STL_VARIANT $(LOCAL_NDK_STL_VARIANT))
    124   endif
    125   ifeq (system,$(LOCAL_NDK_STL_VARIANT))
    126     my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/system/include
    127     my_system_shared_libraries += libstdc++
    128   else # LOCAL_NDK_STL_VARIANT is not system
    129   ifneq (,$(filter stlport_%, $(LOCAL_NDK_STL_VARIANT)))
    130     my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/stlport/stlport
    131     my_system_shared_libraries += libstdc++
    132     ifeq (stlport_static,$(LOCAL_NDK_STL_VARIANT))
    133       my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(my_cpu_variant)/libstlport_static.a
    134     else
    135       my_ndk_stl_shared_lib_fullpath := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(my_cpu_variant)/libstlport_shared.so
    136       my_ndk_stl_shared_lib := -lstlport_shared
    137     endif
    138   else # LOCAL_NDK_STL_VARIANT is not stlport_* either
    139   ifneq (,$(filter c++_%, $(LOCAL_NDK_STL_VARIANT)))
    140     my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/llvm-libc++/libcxx/include \
    141                                $(my_ndk_source_root)/cxx-stl/llvm-libc++/gabi++/include \
    142                                $(my_ndk_source_root)/android/support/include
    143     ifeq (c++_static,$(LOCAL_NDK_STL_VARIANT))
    144       my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libc++_static.a
    145     else
    146       my_ndk_stl_shared_lib_fullpath := $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libc++_shared.so
    147       my_ndk_stl_shared_lib := -lc++_shared
    148     endif
    149     my_ndk_stl_cppflags := -std=c++11
    150   else # LOCAL_NDK_STL_VARIANT is not c++_* either
    151   ifneq (,$(filter gnustl_%, $(LOCAL_NDK_STL_VARIANT)))
    152     my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/$($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_GCC_VERSION)/libs/$(my_cpu_variant)/include \
    153                                $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/$($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_GCC_VERSION)/include
    154     my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/$($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_NDK_GCC_VERSION)/libs/$(my_cpu_variant)/libgnustl_static.a
    155   else # LOCAL_NDK_STL_VARIANT must be none
    156     # Do nothing.
    157   endif
    158   endif
    159   endif
    160   endif
    161 endif
    162 
    163 # MinGW spits out warnings about -fPIC even for -fpie?!) being ignored because
    164 # all code is position independent, and then those warnings get promoted to
    165 # errors.
    166 ifneq ($($(my_prefix)OS),windows)
    167 ifeq ($(LOCAL_MODULE_CLASS),EXECUTABLES)
    168 my_cflags += -fpie
    169 else
    170 my_cflags += -fPIC
    171 endif
    172 endif
    173 
    174 ifdef LOCAL_IS_HOST_MODULE
    175 my_src_files += $(LOCAL_SRC_FILES_$($(my_prefix)OS)) $(LOCAL_SRC_FILES_$($(my_prefix)OS)_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))
    176 my_static_libraries += $(LOCAL_STATIC_LIBRARIES_$($(my_prefix)OS))
    177 my_shared_libraries += $(LOCAL_SHARED_LIBRARIES_$($(my_prefix)OS))
    178 my_cflags += $(LOCAL_CFLAGS_$($(my_prefix)OS))
    179 my_cppflags += $(LOCAL_CPPFLAGS_$($(my_prefix)OS))
    180 my_ldflags += $(LOCAL_LDFLAGS_$($(my_prefix)OS))
    181 my_ldlibs += $(LOCAL_LDLIBS_$($(my_prefix)OS))
    182 my_asflags += $(LOCAL_ASFLAGS_$($(my_prefix)OS))
    183 my_c_includes += $(LOCAL_C_INCLUDES_$($(my_prefix)OS))
    184 my_generated_sources += $(LOCAL_GENERATED_SOURCES_$($(my_prefix)OS))
    185 endif
    186 
    187 my_src_files += $(LOCAL_SRC_FILES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_SRC_FILES_$(my_32_64_bit_suffix))
    188 my_src_files_exclude += $(LOCAL_SRC_FILES_EXCLUDE_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_SRC_FILES_EXCLUDE_$(my_32_64_bit_suffix))
    189 my_shared_libraries += $(LOCAL_SHARED_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_SHARED_LIBRARIES_$(my_32_64_bit_suffix))
    190 my_cflags += $(LOCAL_CFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CFLAGS_$(my_32_64_bit_suffix))
    191 my_cppflags += $(LOCAL_CPPFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CPPFLAGS_$(my_32_64_bit_suffix))
    192 my_ldflags += $(LOCAL_LDFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_LDFLAGS_$(my_32_64_bit_suffix))
    193 my_asflags += $(LOCAL_ASFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_ASFLAGS_$(my_32_64_bit_suffix))
    194 my_c_includes += $(LOCAL_C_INCLUDES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_C_INCLUDES_$(my_32_64_bit_suffix))
    195 my_generated_sources += $(LOCAL_GENERATED_SOURCES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_GENERATED_SOURCES_$(my_32_64_bit_suffix))
    196 
    197 my_missing_exclude_files := $(filter-out $(my_src_files),$(my_src_files_exclude))
    198 ifneq ($(my_missing_exclude_files),)
    199 $(warning Files are listed in LOCAL_SRC_FILES_EXCLUDE but not LOCAL_SRC_FILES)
    200 $(error $(my_missing_exclude_files))
    201 endif
    202 my_src_files := $(filter-out $(my_src_files_exclude),$(my_src_files))
    203 
    204 my_clang := $(strip $(LOCAL_CLANG))
    205 ifdef LOCAL_CLANG_$(my_32_64_bit_suffix)
    206 my_clang := $(strip $(LOCAL_CLANG_$(my_32_64_bit_suffix)))
    207 endif
    208 ifdef LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)
    209 my_clang := $(strip $(LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)))
    210 endif
    211 
    212 # clang is enabled by default for host builds
    213 # enable it unless we've specifically disabled clang above
    214 ifdef LOCAL_IS_HOST_MODULE
    215     ifneq ($($(my_prefix)OS),windows)
    216     ifeq ($(my_clang),)
    217         my_clang := true
    218     endif
    219     endif
    220 # Add option to make gcc the default for device build
    221 else ifeq ($(USE_CLANG_PLATFORM_BUILD),false)
    222     ifeq ($(my_clang),)
    223         my_clang := false
    224     endif
    225 else ifeq ($(my_clang),)
    226     my_clang := true
    227 endif
    228 
    229 my_cpp_std_version := -std=gnu++14
    230 
    231 ifneq ($(my_clang),true)
    232     # GCC uses an invalid C++14 ABI (emits calls to
    233     # __cxa_throw_bad_array_length, which is not a valid C++ RT ABI).
    234     # http://b/25022512
    235     my_cpp_std_version := -std=gnu++11
    236 endif
    237 
    238 ifdef LOCAL_SDK_VERSION
    239     # The NDK handles this itself.
    240     my_cpp_std_version :=
    241 endif
    242 
    243 ifdef LOCAL_IS_HOST_MODULE
    244     ifneq ($(my_clang),true)
    245         # The host GCC doesn't support C++14 (and is deprecated, so likely
    246         # never will). Build these modules with C++11.
    247         my_cpp_std_version := -std=gnu++11
    248     endif
    249 endif
    250 
    251 my_cppflags := $(my_cpp_std_version) $(my_cppflags)
    252 
    253 
    254 # arch-specific static libraries go first so that generic ones can depend on them
    255 my_static_libraries := $(LOCAL_STATIC_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_STATIC_LIBRARIES_$(my_32_64_bit_suffix)) $(my_static_libraries)
    256 my_whole_static_libraries := $(LOCAL_WHOLE_STATIC_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_WHOLE_STATIC_LIBRARIES_$(my_32_64_bit_suffix)) $(my_whole_static_libraries)
    257 
    258 include $(BUILD_SYSTEM)/cxx_stl_setup.mk
    259 
    260 # Add static HAL libraries
    261 ifdef LOCAL_HAL_STATIC_LIBRARIES
    262 $(foreach lib, $(LOCAL_HAL_STATIC_LIBRARIES), \
    263     $(eval b_lib := $(filter $(lib).%,$(BOARD_HAL_STATIC_LIBRARIES)))\
    264     $(if $(b_lib), $(eval my_static_libraries += $(b_lib)),\
    265                    $(eval my_static_libraries += $(lib).default)))
    266 b_lib :=
    267 endif
    268 
    269 ifneq ($(strip $(CUSTOM_$(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)LINKER)),)
    270   my_linker := $(CUSTOM_$(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)LINKER)
    271 else
    272   my_linker := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LINKER)
    273 endif
    274 
    275 include $(BUILD_SYSTEM)/config_sanitizers.mk
    276 
    277 # Add in libcompiler_rt for all regular device builds
    278 ifeq (,$(LOCAL_SDK_VERSION)$(WITHOUT_LIBCOMPILER_RT))
    279   my_static_libraries += $(COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES)
    280 endif
    281 
    282 ####################################################
    283 ## Add FDO flags if FDO is turned on and supported
    284 ## Please note that we will do option filtering during FDO build.
    285 ## i.e. Os->O2, remove -fno-early-inline and -finline-limit.
    286 ##################################################################
    287 my_fdo_build :=
    288 ifneq ($(filter true always, $(LOCAL_FDO_SUPPORT)),)
    289   ifeq ($(BUILD_FDO_INSTRUMENT),true)
    290     my_cflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_INSTRUMENT_CFLAGS)
    291     my_ldflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_INSTRUMENT_LDFLAGS)
    292     my_fdo_build := true
    293   else ifneq ($(filter true,$(BUILD_FDO_OPTIMIZE))$(filter always,$(LOCAL_FDO_SUPPORT)),)
    294     my_cflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_OPTIMIZE_CFLAGS)
    295     my_fdo_build := true
    296   endif
    297   # Disable ccache (or other compiler wrapper) except gomacc, which
    298   # can handle -fprofile-use properly.
    299   my_cc_wrapper := $(filter $(GOMA_CC),$(my_cc_wrapper))
    300   my_cxx_wrapper := $(filter $(GOMA_CC),$(my_cxx_wrapper))
    301 endif
    302 
    303 ###########################################################
    304 ## Explicitly declare assembly-only __ASSEMBLY__ macro for
    305 ## assembly source
    306 ###########################################################
    307 my_asflags += -D__ASSEMBLY__
    308 
    309 
    310 ###########################################################
    311 ## Define PRIVATE_ variables from global vars
    312 ###########################################################
    313 ifndef LOCAL_IS_HOST_MODULE
    314 ifdef LOCAL_SDK_VERSION
    315 my_target_project_includes :=
    316 my_target_c_includes := $(my_ndk_stl_include_path) $(my_ndk_sysroot_include)
    317 my_target_global_cppflags := $(my_ndk_stl_cppflags)
    318 else
    319 my_target_project_includes := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_PROJECT_INCLUDES)
    320 my_target_c_includes := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_C_INCLUDES)
    321 my_target_global_cppflags :=
    322 endif # LOCAL_SDK_VERSION
    323 
    324 ifeq ($(my_clang),true)
    325 my_target_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CFLAGS)
    326 my_target_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CONLYFLAGS)
    327 my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CPPFLAGS)
    328 my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_LDFLAGS)
    329 else
    330 my_target_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CFLAGS)
    331 my_target_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CONLYFLAGS)
    332 my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CPPFLAGS)
    333 my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LDFLAGS)
    334 endif # my_clang
    335 
    336 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_PROJECT_INCLUDES := $(my_target_project_includes)
    337 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_C_INCLUDES := $(my_target_c_includes)
    338 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(my_target_global_cflags)
    339 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CONLYFLAGS := $(my_target_global_conlyflags)
    340 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CPPFLAGS := $(my_target_global_cppflags)
    341 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_LDFLAGS := $(my_target_global_ldflags)
    342 
    343 else # LOCAL_IS_HOST_MODULE
    344 
    345 ifeq ($(my_clang),true)
    346 my_host_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_$(my_prefix)GLOBAL_CFLAGS)
    347 my_host_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_$(my_prefix)GLOBAL_CONLYFLAGS)
    348 my_host_global_cppflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_$(my_prefix)GLOBAL_CPPFLAGS)
    349 my_host_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_$(my_prefix)GLOBAL_LDFLAGS)
    350 my_host_c_includes := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)C_INCLUDES)
    351 else
    352 my_host_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_CFLAGS)
    353 my_host_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_CONLYFLAGS)
    354 my_host_global_cppflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_CPPFLAGS)
    355 my_host_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)GLOBAL_LDFLAGS)
    356 my_host_c_includes := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)C_INCLUDES)
    357 endif # my_clang
    358 
    359 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_C_INCLUDES := $(my_host_c_includes)
    360 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_GLOBAL_CFLAGS := $(my_host_global_cflags)
    361 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_GLOBAL_CONLYFLAGS := $(my_host_global_conlyflags)
    362 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_GLOBAL_CPPFLAGS := $(my_host_global_cppflags)
    363 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HOST_GLOBAL_LDFLAGS := $(my_host_global_ldflags)
    364 endif # LOCAL_IS_HOST_MODULE
    365 
    366 # To enable coverage for a given module, set LOCAL_NATIVE_COVERAGE=true and
    367 # build with NATIVE_COVERAGE=true in your enviornment. Note that the build
    368 # system is not sensitive to changes to NATIVE_COVERAGE, so you should do a
    369 # clean build of your module after toggling it.
    370 ifeq ($(NATIVE_COVERAGE),true)
    371     ifeq ($(my_native_coverage),true)
    372         # Note that clang coverage doesn't play nicely with acov out of the box.
    373         # Clang apparently generates .gcno files that aren't compatible with
    374         # gcov-4.8.  This can be solved by installing gcc-4.6 and invoking lcov
    375         # with `--gcov-tool /usr/bin/gcov-4.6`.
    376         #
    377         # http://stackoverflow.com/questions/17758126/clang-code-coverage-invalid-output
    378         my_cflags += --coverage -O0
    379         my_ldflags += --coverage
    380     endif
    381 else
    382     my_native_coverage := false
    383 endif
    384 
    385 ifeq ($(my_clang),true)
    386     my_coverage_lib := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBPROFILE_RT)
    387 else
    388     my_coverage_lib := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_LIBGCOV)
    389 endif
    390 
    391 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_COVERAGE_LIB := $(my_coverage_lib)
    392 
    393 ###########################################################
    394 ## Define PRIVATE_ variables used by multiple module types
    395 ###########################################################
    396 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_DEFAULT_COMPILER_FLAGS := \
    397     $(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS))
    398 
    399 ifeq ($(strip $(WITH_SYNTAX_CHECK)),)
    400   LOCAL_NO_SYNTAX_CHECK := true
    401 endif
    402 
    403 ifeq ($(strip $(WITH_STATIC_ANALYZER)),)
    404   LOCAL_NO_STATIC_ANALYZER := true
    405 endif
    406 
    407 # Clang does not recognize all gcc flags.
    408 # Use static analyzer only if clang is used.
    409 ifneq ($(my_clang),true)
    410   LOCAL_NO_STATIC_ANALYZER := true
    411 endif
    412 
    413 ifneq ($(strip $(LOCAL_IS_HOST_MODULE)),)
    414   my_syntax_arch := host
    415 else
    416   my_syntax_arch := $(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)
    417 endif
    418 
    419 ifeq ($(strip $(my_cc)),)
    420   ifeq ($(my_clang),true)
    421     my_cc := $(CLANG)
    422   else
    423     my_cc := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)CC)
    424   endif
    425   my_cc := $(my_cc_wrapper) $(my_cc)
    426 endif
    427 
    428 ifneq ($(LOCAL_NO_STATIC_ANALYZER),true)
    429   my_cc := CCC_CC=$(CLANG) CLANG=$(CLANG) \
    430            $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer
    431 else
    432 ifneq ($(LOCAL_NO_SYNTAX_CHECK),true)
    433   my_cc := $(my_cc) -fsyntax-only
    434 endif
    435 endif
    436 
    437 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(my_cc)
    438 
    439 ifeq ($(strip $(my_cxx)),)
    440   ifeq ($(my_clang),true)
    441     my_cxx := $(CLANG_CXX)
    442   else
    443     my_cxx := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)CXX)
    444   endif
    445   my_cxx := $(my_cxx_wrapper) $(my_cxx)
    446 endif
    447 
    448 ifneq ($(LOCAL_NO_STATIC_ANALYZER),true)
    449   my_cxx := CCC_CXX=$(CLANG_CXX) CLANG_CXX=$(CLANG_CXX) \
    450             $(SYNTAX_TOOLS_PREFIX)/c++-analyzer
    451 else
    452 ifneq ($(LOCAL_NO_SYNTAX_CHECK),true)
    453   my_cxx := $(my_cxx) -fsyntax-only
    454 endif
    455 endif
    456 
    457 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LINKER := $(my_linker)
    458 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(my_cxx)
    459 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CLANG := $(my_clang)
    460 
    461 # TODO: support a mix of standard extensions so that this isn't necessary
    462 LOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION))
    463 ifeq ($(LOCAL_CPP_EXTENSION),)
    464   LOCAL_CPP_EXTENSION := .cpp
    465 endif
    466 
    467 # Certain modules like libdl have to have symbols resolved at runtime and blow
    468 # up if --no-undefined is passed to the linker.
    469 ifeq ($(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS)),)
    470 ifeq ($(my_allow_undefined_symbols),)
    471   my_ldflags +=  $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)NO_UNDEFINED_LDFLAGS)
    472 endif
    473 endif
    474 
    475 ifeq (true,$(LOCAL_GROUP_STATIC_LIBRARIES))
    476 $(LOCAL_BUILT_MODULE): PRIVATE_GROUP_STATIC_LIBRARIES := true
    477 else
    478 $(LOCAL_BUILT_MODULE): PRIVATE_GROUP_STATIC_LIBRARIES :=
    479 endif
    480 
    481 ###########################################################
    482 ## Define arm-vs-thumb-mode flags.
    483 ###########################################################
    484 LOCAL_ARM_MODE := $(strip $(LOCAL_ARM_MODE))
    485 ifeq ($($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH),arm)
    486 arm_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),arm)
    487 normal_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),thumb)
    488 
    489 # Read the values from something like TARGET_arm_CFLAGS or
    490 # TARGET_thumb_CFLAGS.  HOST_(arm|thumb)_CFLAGS values aren't
    491 # actually used (although they are usually empty).
    492 arm_objects_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)$(arm_objects_mode)_CFLAGS)
    493 normal_objects_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)$(normal_objects_mode)_CFLAGS)
    494 ifeq ($(my_clang),true)
    495 arm_objects_cflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(arm_objects_cflags))
    496 normal_objects_cflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(normal_objects_cflags))
    497 endif
    498 
    499 else
    500 arm_objects_mode :=
    501 normal_objects_mode :=
    502 arm_objects_cflags :=
    503 normal_objects_cflags :=
    504 endif
    505 
    506 ###########################################################
    507 ## Define per-module debugging flags.  Users can turn on
    508 ## debugging for a particular module by setting DEBUG_MODULE_ModuleName
    509 ## to a non-empty value in their environment or buildspec.mk,
    510 ## and setting HOST_/TARGET_CUSTOM_DEBUG_CFLAGS to the
    511 ## debug flags that they want to use.
    512 ###########################################################
    513 ifdef DEBUG_MODULE_$(strip $(LOCAL_MODULE))
    514   debug_cflags := $($(my_prefix)CUSTOM_DEBUG_CFLAGS)
    515 else
    516   debug_cflags :=
    517 endif
    518 
    519 ####################################################
    520 ## Keep track of src -> obj mapping
    521 ####################################################
    522 
    523 my_tracked_gen_files :=
    524 my_tracked_src_files :=
    525 
    526 ###########################################################
    527 ## Stuff source generated from one-off tools
    528 ###########################################################
    529 $(my_generated_sources): PRIVATE_MODULE := $(my_register_name)
    530 
    531 my_gen_sources_copy := $(patsubst $(generated_sources_dir)/%,$(intermediates)/%,$(filter $(generated_sources_dir)/%,$(my_generated_sources)))
    532 
    533 $(my_gen_sources_copy): $(intermediates)/% : $(generated_sources_dir)/% | $(ACP)
    534 	@echo "Copy: $@"
    535 	$(copy-file-to-target)
    536 
    537 my_generated_sources := $(patsubst $(generated_sources_dir)/%,$(intermediates)/%,$(my_generated_sources))
    538 
    539 # Generated sources that will actually produce object files.
    540 # Other files (like headers) are allowed in LOCAL_GENERATED_SOURCES,
    541 # since other compiled sources may depend on them, and we set up
    542 # the dependencies.
    543 my_gen_src_files := $(filter %.c %$(LOCAL_CPP_EXTENSION) %.S %.s,$(my_generated_sources))
    544 
    545 ALL_GENERATED_SOURCES += $(my_generated_sources)
    546 
    547 ####################################################
    548 ## Compile RenderScript with reflected C++
    549 ####################################################
    550 
    551 renderscript_sources := $(filter %.rs %.fs,$(my_src_files))
    552 
    553 ifneq (,$(renderscript_sources))
    554 
    555 renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sources))
    556 RenderScript_file_stamp := $(intermediates)/RenderScriptCPP.stamp
    557 renderscript_intermediate := $(intermediates)/renderscript
    558 
    559 renderscript_target_api :=
    560 
    561 ifneq (,$(LOCAL_RENDERSCRIPT_TARGET_API))
    562 renderscript_target_api := $(LOCAL_RENDERSCRIPT_TARGET_API)
    563 else
    564 ifneq (,$(LOCAL_SDK_VERSION))
    565 # Set target-api for LOCAL_SDK_VERSIONs other than current.
    566 ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION)))
    567 renderscript_target_api := $(LOCAL_SDK_VERSION)
    568 endif
    569 endif  # LOCAL_SDK_VERSION is set
    570 endif  # LOCAL_RENDERSCRIPT_TARGET_API is set
    571 
    572 
    573 ifeq ($(LOCAL_RENDERSCRIPT_CC),)
    574 LOCAL_RENDERSCRIPT_CC := $(LLVM_RS_CC)
    575 endif
    576 
    577 # Turn on all warnings and warnings as errors for RS compiles.
    578 # This can be disabled with LOCAL_RENDERSCRIPT_FLAGS := -Wno-error
    579 renderscript_flags := -Wall -Werror
    580 renderscript_flags += $(LOCAL_RENDERSCRIPT_FLAGS)
    581 # -m32 or -m64
    582 renderscript_flags += -m$(my_32_64_bit_suffix)
    583 
    584 renderscript_includes := \
    585     $(TOPDIR)external/clang/lib/Headers \
    586     $(TOPDIR)frameworks/rs/scriptc \
    587     $(LOCAL_RENDERSCRIPT_INCLUDES)
    588 
    589 ifneq ($(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE),)
    590 renderscript_includes := $(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE)
    591 endif
    592 
    593 bc_dep_files := $(addprefix $(renderscript_intermediate)/, \
    594     $(patsubst %.fs,%.d, $(patsubst %.rs,%.d, $(notdir $(renderscript_sources)))))
    595 
    596 $(RenderScript_file_stamp): PRIVATE_RS_INCLUDES := $(renderscript_includes)
    597 $(RenderScript_file_stamp): PRIVATE_RS_CC := $(LOCAL_RENDERSCRIPT_CC)
    598 $(RenderScript_file_stamp): PRIVATE_RS_FLAGS := $(renderscript_flags)
    599 $(RenderScript_file_stamp): PRIVATE_RS_SOURCE_FILES := $(renderscript_sources_fullpath)
    600 $(RenderScript_file_stamp): PRIVATE_RS_OUTPUT_DIR := $(renderscript_intermediate)
    601 $(RenderScript_file_stamp): PRIVATE_RS_TARGET_API := $(renderscript_target_api)
    602 $(RenderScript_file_stamp): PRIVATE_DEP_FILES := $(bc_dep_files)
    603 $(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(LOCAL_RENDERSCRIPT_CC)
    604 	$(transform-renderscripts-to-cpp-and-bc)
    605 
    606 # include the dependency files (.d/.P) generated by llvm-rs-cc.
    607 $(call include-depfile,$(RenderScript_file_stamp).P,$(RenderScript_file_stamp))
    608 
    609 LOCAL_INTERMEDIATE_TARGETS += $(RenderScript_file_stamp)
    610 
    611 rs_generated_cpps := $(addprefix \
    612     $(renderscript_intermediate)/ScriptC_,$(patsubst %.fs,%.cpp, $(patsubst %.rs,%.cpp, \
    613     $(notdir $(renderscript_sources)))))
    614 
    615 $(call track-src-file-gen,$(renderscript_sources),$(rs_generated_cpps))
    616 
    617 # This is just a dummy rule to make sure gmake doesn't skip updating the dependents.
    618 $(rs_generated_cpps) : $(RenderScript_file_stamp)
    619 	@echo "Updated RS generated cpp file $@."
    620 	$(hide) touch $@
    621 
    622 my_c_includes += $(renderscript_intermediate)
    623 my_generated_sources += $(rs_generated_cpps)
    624 
    625 endif
    626 
    627 
    628 ###########################################################
    629 ## Compile the .proto files to .cc (or .c) and then to .o
    630 ###########################################################
    631 proto_sources := $(filter %.proto,$(my_src_files))
    632 proto_generated_objects :=
    633 proto_generated_headers :=
    634 ifneq ($(proto_sources),)
    635 proto_generated_sources_dir := $(generated_sources_dir)/proto
    636 proto_generated_obj_dir := $(intermediates)/proto
    637 
    638 ifneq (,$(filter nanopb-c nanopb-c-enable_malloc, $(LOCAL_PROTOC_OPTIMIZE_TYPE)))
    639 my_proto_source_suffix := .c
    640 my_proto_c_includes := external/nanopb-c
    641 my_protoc_flags := --nanopb_out=$(proto_generated_sources_dir) \
    642     --plugin=external/nanopb-c/generator/protoc-gen-nanopb
    643 else
    644 my_proto_source_suffix := .cc
    645 my_proto_c_includes := external/protobuf/src
    646 my_cflags += -DGOOGLE_PROTOBUF_NO_RTTI
    647 my_protoc_flags := --cpp_out=$(proto_generated_sources_dir)
    648 endif
    649 my_proto_c_includes += $(proto_generated_sources_dir)
    650 
    651 proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources))
    652 proto_generated_sources := $(addprefix $(proto_generated_sources_dir)/, \
    653     $(patsubst %.proto,%.pb$(my_proto_source_suffix),$(proto_sources_fullpath)))
    654 proto_generated_headers := $(patsubst %.pb$(my_proto_source_suffix),%.pb.h, $(proto_generated_sources))
    655 proto_generated_objects := $(addprefix $(proto_generated_obj_dir)/, \
    656     $(patsubst %.proto,%.pb.o,$(proto_sources_fullpath)))
    657 $(call track-src-file-obj,$(proto_sources),$(proto_generated_objects))
    658 
    659 # Ensure the transform-proto-to-cc rule is only defined once in multilib build.
    660 ifndef $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined
    661 $(proto_generated_sources): PRIVATE_PROTO_INCLUDES := $(TOP)
    662 $(proto_generated_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) $(my_protoc_flags)
    663 $(proto_generated_sources): $(proto_generated_sources_dir)/%.pb$(my_proto_source_suffix): %.proto $(PROTOC)
    664 	$(transform-proto-to-cc)
    665 
    666 # This is just a dummy rule to make sure gmake doesn't skip updating the dependents.
    667 $(proto_generated_headers): $(proto_generated_sources_dir)/%.pb.h: $(proto_generated_sources_dir)/%.pb$(my_proto_source_suffix)
    668 	@echo "Updated header file $@."
    669 	$(hide) touch $@
    670 
    671 $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true
    672 endif  # transform-proto-to-cc rule included only once
    673 
    674 $(proto_generated_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    675 $(proto_generated_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    676 $(proto_generated_objects): $(proto_generated_obj_dir)/%.o: $(proto_generated_sources_dir)/%$(my_proto_source_suffix) $(proto_generated_headers)
    677 ifeq ($(my_proto_source_suffix),.c)
    678 	$(transform-$(PRIVATE_HOST)c-to-o)
    679 else
    680 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    681 endif
    682 $(call include-depfiles-for-objs, $(proto_generated_objects))
    683 
    684 my_c_includes += $(my_proto_c_includes)
    685 # Auto-export the generated proto source dir.
    686 my_export_c_include_dirs += $(my_proto_c_includes)
    687 
    688 ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nanopb-c-enable_malloc)
    689     my_static_libraries += libprotobuf-c-nano-enable_malloc
    690 else ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nanopb-c)
    691     my_static_libraries += libprotobuf-c-nano
    692 else ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),full)
    693     ifdef LOCAL_SDK_VERSION
    694         my_static_libraries += libprotobuf-cpp-full-ndk
    695     else
    696         my_shared_libraries += libprotobuf-cpp-full
    697     endif
    698 else
    699     ifdef LOCAL_SDK_VERSION
    700         my_static_libraries += libprotobuf-cpp-lite-ndk
    701     else
    702         my_shared_libraries += libprotobuf-cpp-lite
    703     endif
    704 endif
    705 endif  # $(proto_sources) non-empty
    706 
    707 ###########################################################
    708 ## Compile the .dbus-xml files to c++ headers
    709 ###########################################################
    710 dbus_definitions := $(filter %.dbus-xml,$(my_src_files))
    711 dbus_generated_headers :=
    712 ifneq ($(dbus_definitions),)
    713 
    714 dbus_definition_paths := $(addprefix $(LOCAL_PATH)/,$(dbus_definitions))
    715 dbus_service_config := $(filter %dbus-service-config.json,$(my_src_files))
    716 dbus_service_config_path := $(addprefix $(LOCAL_PATH)/,$(dbus_service_config))
    717 
    718 # Mark these source files as not producing objects
    719 $(call track-src-file-obj,$(dbus_definitions) $(dbus_service_config),)
    720 
    721 dbus_gen_dir := $(generated_sources_dir)/dbus_bindings
    722 
    723 ifdef LOCAL_DBUS_PROXY_PREFIX
    724 dbus_header_dir := $(dbus_gen_dir)/include/$(LOCAL_DBUS_PROXY_PREFIX)
    725 dbus_headers := dbus-proxies.h
    726 else
    727 dbus_header_dir := $(dbus_gen_dir)
    728 dbus_headers := $(patsubst %.dbus-xml,%.h,$(dbus_definitions))
    729 endif
    730 dbus_generated_headers := $(addprefix $(dbus_header_dir)/,$(dbus_headers))
    731 
    732 # Ensure that we only define build rules once in multilib builds.
    733 ifndef $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined
    734 $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined := true
    735 
    736 $(dbus_generated_headers): PRIVATE_MODULE := $(LOCAL_MODULE)
    737 $(dbus_generated_headers): PRIVATE_DBUS_SERVICE_CONFIG := $(dbus_service_config_path)
    738 $(dbus_generated_headers) : $(dbus_service_config_path) $(DBUS_GENERATOR)
    739 ifdef LOCAL_DBUS_PROXY_PREFIX
    740 $(dbus_generated_headers) : $(dbus_definition_paths)
    741 	$(generate-dbus-proxies)
    742 else
    743 $(dbus_generated_headers) : $(dbus_header_dir)/%.h : $(LOCAL_PATH)/%.dbus-xml
    744 	$(generate-dbus-adaptors)
    745 endif  # $(LOCAL_DBUS_PROXY_PREFIX)
    746 endif  # $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_dbus_bindings_defined
    747 
    748 ifdef LOCAL_DBUS_PROXY_PREFIX
    749 # Auto-export the generated dbus proxy directory.
    750 my_export_c_include_dirs += $(dbus_gen_dir)/include
    751 my_c_includes += $(dbus_gen_dir)/include
    752 else
    753 my_export_c_include_dirs += $(dbus_header_dir)
    754 my_c_includes += $(dbus_header_dir)
    755 endif  # $(LOCAL_DBUS_PROXY_PREFIX)
    756 
    757 my_generated_sources += $(dbus_generated_headers)
    758 
    759 endif  # $(dbus_definitions) non-empty
    760 
    761 
    762 ###########################################################
    763 ## AIDL: Compile .aidl files to .cpp and .h files
    764 ###########################################################
    765 aidl_src := $(strip $(filter %.aidl,$(my_src_files)))
    766 aidl_gen_cpp :=
    767 ifneq ($(aidl_src),)
    768 
    769 # Use the intermediates directory to avoid writing our own .cpp -> .o rules.
    770 aidl_gen_cpp_root := $(intermediates)/aidl-generated/src
    771 aidl_gen_include_root := $(intermediates)/aidl-generated/include
    772 
    773 # Multi-architecture builds have distinct intermediates directories.
    774 # Thus we'll actually generate source for each architecture.
    775 $(foreach s,$(aidl_src),\
    776     $(eval $(call define-aidl-cpp-rule,$(s),$(aidl_gen_cpp_root),aidl_gen_cpp)))
    777 $(foreach cpp,$(aidl_gen_cpp), \
    778     $(call include-depfile,$(addsuffix .aidl.P,$(basename $(cpp))),$(cpp)))
    779 $(call track-src-file-gen,$(aidl_src),$(aidl_gen_cpp))
    780 
    781 $(aidl_gen_cpp) : PRIVATE_MODULE := $(LOCAL_MODULE)
    782 $(aidl_gen_cpp) : PRIVATE_HEADER_OUTPUT_DIR := $(aidl_gen_include_root)
    783 $(aidl_gen_cpp) : PRIVATE_AIDL_FLAGS := $(addprefix -I,$(LOCAL_AIDL_INCLUDES))
    784 
    785 # Add generated headers to include paths.
    786 my_c_includes += $(aidl_gen_include_root)
    787 my_export_c_include_dirs += $(aidl_gen_include_root)
    788 # Pick up the generated C++ files later for transformation to .o files.
    789 my_generated_sources += $(aidl_gen_cpp)
    790 
    791 endif  # $(aidl_src) non-empty
    792 
    793 ###########################################################
    794 ## Compile the .vts files to .cc (or .c) and then to .o
    795 ###########################################################
    796 
    797 vts_src := $(strip $(filter %.vts,$(my_src_files)))
    798 vts_gen_cpp :=
    799 ifneq ($(vts_src),)
    800 
    801 # Use the intermediates directory to avoid writing our own .cpp -> .o rules.
    802 vts_gen_cpp_root := $(intermediates)/vts-generated/src
    803 vts_gen_include_root := $(intermediates)/vts-generated/include
    804 
    805 # Multi-architecture builds have distinct intermediates directories.
    806 # Thus we'll actually generate source for each architecture.
    807 $(foreach s,$(vts_src),\
    808     $(eval $(call define-vts-cpp-rule,$(s),$(vts_gen_cpp_root),vts_gen_cpp)))
    809 $(foreach cpp,$(vts_gen_cpp), \
    810     $(call include-depfile,$(addsuffix .vts.P,$(basename $(cpp))),$(cpp)))
    811 $(call track-src-file-gen,$(vts_src),$(vts_gen_cpp))
    812 
    813 $(vts_gen_cpp) : PRIVATE_MODULE := $(LOCAL_MODULE)
    814 $(vts_gen_cpp) : PRIVATE_HEADER_OUTPUT_DIR := $(vts_gen_include_root)
    815 $(vts_gen_cpp) : PRIVATE_VTS_FLAGS := $(addprefix -I,$(LOCAL_VTS_INCLUDES))
    816 
    817 # Add generated headers to include paths.
    818 my_c_includes += $(vts_gen_include_root)
    819 my_export_c_include_dirs += $(vts_gen_include_root)
    820 # Pick up the generated C++ files later for transformation to .o files.
    821 my_generated_sources += $(vts_gen_cpp)
    822 
    823 endif  # $(vts_src) non-empty
    824 
    825 ###########################################################
    826 ## YACC: Compile .y/.yy files to .c/.cpp and then to .o.
    827 ###########################################################
    828 
    829 y_yacc_sources := $(filter %.y,$(my_src_files))
    830 y_yacc_cs := $(addprefix \
    831     $(intermediates)/,$(y_yacc_sources:.y=.c))
    832 ifneq ($(y_yacc_cs),)
    833 $(y_yacc_cs): $(intermediates)/%.c: \
    834     $(TOPDIR)$(LOCAL_PATH)/%.y \
    835     $(my_additional_dependencies)
    836 	$(call transform-y-to-c-or-cpp)
    837 $(call track-src-file-gen,$(y_yacc_sources),$(y_yacc_cs))
    838 
    839 my_generated_sources += $(y_yacc_cs)
    840 endif
    841 
    842 yy_yacc_sources := $(filter %.yy,$(my_src_files))
    843 yy_yacc_cpps := $(addprefix \
    844     $(intermediates)/,$(yy_yacc_sources:.yy=$(LOCAL_CPP_EXTENSION)))
    845 ifneq ($(yy_yacc_cpps),)
    846 $(yy_yacc_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
    847     $(TOPDIR)$(LOCAL_PATH)/%.yy \
    848     $(my_additional_dependencies)
    849 	$(call transform-y-to-c-or-cpp)
    850 $(call track-src-file-gen,$(yy_yacc_sources),$(yy_yacc_cpps))
    851 
    852 my_generated_sources += $(yy_yacc_cpps)
    853 endif
    854 
    855 ###########################################################
    856 ## LEX: Compile .l/.ll files to .c/.cpp and then to .o.
    857 ###########################################################
    858 
    859 l_lex_sources := $(filter %.l,$(my_src_files))
    860 l_lex_cs := $(addprefix \
    861     $(intermediates)/,$(l_lex_sources:.l=.c))
    862 ifneq ($(l_lex_cs),)
    863 $(l_lex_cs): $(intermediates)/%.c: \
    864     $(TOPDIR)$(LOCAL_PATH)/%.l
    865 	$(transform-l-to-c-or-cpp)
    866 $(call track-src-file-gen,$(l_lex_sources),$(l_lex_cs))
    867 
    868 my_generated_sources += $(l_lex_cs)
    869 endif
    870 
    871 ll_lex_sources := $(filter %.ll,$(my_src_files))
    872 ll_lex_cpps := $(addprefix \
    873     $(intermediates)/,$(ll_lex_sources:.ll=$(LOCAL_CPP_EXTENSION)))
    874 ifneq ($(ll_lex_cpps),)
    875 $(ll_lex_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
    876     $(TOPDIR)$(LOCAL_PATH)/%.ll
    877 	$(transform-l-to-c-or-cpp)
    878 $(call track-src-file-gen,$(ll_lex_sources),$(ll_lex_cpps))
    879 
    880 my_generated_sources += $(ll_lex_cpps)
    881 endif
    882 
    883 ###########################################################
    884 ## C++: Compile .cpp files to .o.
    885 ###########################################################
    886 
    887 # we also do this on host modules, even though
    888 # it's not really arm, because there are files that are shared.
    889 cpp_arm_sources := $(patsubst %$(LOCAL_CPP_EXTENSION).arm,%$(LOCAL_CPP_EXTENSION),$(filter %$(LOCAL_CPP_EXTENSION).arm,$(my_src_files)))
    890 dotdot_arm_sources := $(filter ../%,$(cpp_arm_sources))
    891 cpp_arm_sources := $(filter-out ../%,$(cpp_arm_sources))
    892 cpp_arm_objects := $(addprefix $(intermediates)/,$(cpp_arm_sources:$(LOCAL_CPP_EXTENSION)=.o))
    893 $(call track-src-file-obj,$(patsubst %,%.arm,$(cpp_arm_sources)),$(cpp_arm_objects))
    894 
    895 # For source files starting with ../, we remove all the ../ in the object file path,
    896 # to avoid object file escaping the intermediate directory.
    897 dotdot_arm_objects :=
    898 $(foreach s,$(dotdot_arm_sources),\
    899   $(eval $(call compile-dotdot-cpp-file,$(s),\
    900   $(yacc_cpps) $(proto_generated_headers) $(my_additional_dependencies),\
    901   dotdot_arm_objects)))
    902 $(call track-src-file-obj,$(patsubst %,%.arm,$(dotdot_arm_sources)),$(dotdot_arm_objects))
    903 
    904 dotdot_sources := $(filter ../%$(LOCAL_CPP_EXTENSION),$(my_src_files))
    905 dotdot_objects :=
    906 $(foreach s,$(dotdot_sources),\
    907   $(eval $(call compile-dotdot-cpp-file,$(s),\
    908     $(yacc_cpps) $(proto_generated_headers) $(my_additional_dependencies),\
    909     dotdot_objects)))
    910 $(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects))
    911 
    912 cpp_normal_sources := $(filter-out ../%,$(filter %$(LOCAL_CPP_EXTENSION),$(my_src_files)))
    913 cpp_normal_objects := $(addprefix $(intermediates)/,$(cpp_normal_sources:$(LOCAL_CPP_EXTENSION)=.o))
    914 $(call track-src-file-obj,$(cpp_normal_sources),$(cpp_normal_objects))
    915 
    916 $(dotdot_arm_objects) $(cpp_arm_objects): PRIVATE_ARM_MODE := $(arm_objects_mode)
    917 $(dotdot_arm_objects) $(cpp_arm_objects): PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
    918 $(dotdot_objects) $(cpp_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    919 $(dotdot_objects) $(cpp_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    920 
    921 cpp_objects        := $(cpp_arm_objects) $(cpp_normal_objects)
    922 
    923 ifneq ($(strip $(cpp_objects)),)
    924 $(cpp_objects): $(intermediates)/%.o: \
    925     $(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \
    926     $(yacc_cpps) $(proto_generated_headers) \
    927     $(my_additional_dependencies)
    928 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    929 $(call include-depfiles-for-objs, $(cpp_objects))
    930 endif
    931 
    932 cpp_objects += $(dotdot_arm_objects) $(dotdot_objects)
    933 
    934 ###########################################################
    935 ## C++: Compile generated .cpp files to .o.
    936 ###########################################################
    937 
    938 gen_cpp_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(my_generated_sources))
    939 gen_cpp_objects := $(gen_cpp_sources:%$(LOCAL_CPP_EXTENSION)=%.o)
    940 $(call track-gen-file-obj,$(gen_cpp_sources),$(gen_cpp_objects))
    941 
    942 ifneq ($(strip $(gen_cpp_objects)),)
    943 # Compile all generated files as thumb.
    944 # TODO: support compiling certain generated files as arm.
    945 $(gen_cpp_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
    946 $(gen_cpp_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    947 $(gen_cpp_objects): $(intermediates)/%.o: \
    948     $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) \
    949     $(proto_generated_headers) \
    950     $(my_additional_dependencies)
    951 	$(transform-$(PRIVATE_HOST)cpp-to-o)
    952 $(call include-depfiles-for-objs, $(gen_cpp_objects))
    953 endif
    954 
    955 ###########################################################
    956 ## S: Compile generated .S and .s files to .o.
    957 ###########################################################
    958 
    959 gen_S_sources := $(filter %.S,$(my_generated_sources))
    960 gen_S_objects := $(gen_S_sources:%.S=%.o)
    961 $(call track-gen-file-obj,$(gen_S_sources),$(gen_S_objects))
    962 
    963 ifneq ($(strip $(gen_S_sources)),)
    964 $(gen_S_objects): $(intermediates)/%.o: $(intermediates)/%.S \
    965     $(my_additional_dependencies)
    966 	$(transform-$(PRIVATE_HOST)s-to-o)
    967 $(call include-depfiles-for-objs, $(gen_S_objects))
    968 endif
    969 
    970 gen_s_sources := $(filter %.s,$(my_generated_sources))
    971 gen_s_objects := $(gen_s_sources:%.s=%.o)
    972 $(call track-gen-file-obj,$(gen_s_sources),$(gen_s_objects))
    973 
    974 ifneq ($(strip $(gen_s_objects)),)
    975 $(gen_s_objects): $(intermediates)/%.o: $(intermediates)/%.s \
    976     $(my_additional_dependencies)
    977 	$(transform-$(PRIVATE_HOST)s-to-o-no-deps)
    978 endif
    979 
    980 gen_asm_objects := $(gen_S_objects) $(gen_s_objects)
    981 $(gen_asm_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
    982 
    983 ###########################################################
    984 ## o: Include generated .o files in output.
    985 ###########################################################
    986 
    987 gen_o_objects := $(filter %.o,$(my_generated_sources))
    988 
    989 ###########################################################
    990 ## C: Compile .c files to .o.
    991 ###########################################################
    992 
    993 c_arm_sources := $(patsubst %.c.arm,%.c,$(filter %.c.arm,$(my_src_files)))
    994 dotdot_arm_sources := $(filter ../%,$(c_arm_sources))
    995 c_arm_sources := $(filter-out ../%,$(c_arm_sources))
    996 c_arm_objects := $(addprefix $(intermediates)/,$(c_arm_sources:.c=.o))
    997 $(call track-src-file-obj,$(patsubst %,%.arm,$(c_arm_sources)),$(c_arm_objects))
    998 
    999 # For source files starting with ../, we remove all the ../ in the object file path,
   1000 # to avoid object file escaping the intermediate directory.
   1001 dotdot_arm_objects :=
   1002 $(foreach s,$(dotdot_arm_sources),\
   1003   $(eval $(call compile-dotdot-c-file,$(s),\
   1004     $(yacc_cpps) $(proto_generated_headers) $(my_additional_dependencies),\
   1005     dotdot_arm_objects)))
   1006 $(call track-src-file-obj,$(patsubst %,%.arm,$(dotdot_arm_sources)),$(dotdot_arm_objects))
   1007 
   1008 dotdot_sources := $(filter ../%.c, $(my_src_files))
   1009 dotdot_objects :=
   1010 $(foreach s, $(dotdot_sources),\
   1011   $(eval $(call compile-dotdot-c-file,$(s),\
   1012     $(yacc_cpps) $(proto_generated_headers) $(my_additional_dependencies),\
   1013     dotdot_objects)))
   1014 $(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects))
   1015 
   1016 c_normal_sources := $(filter-out ../%,$(filter %.c,$(my_src_files)))
   1017 c_normal_objects := $(addprefix $(intermediates)/,$(c_normal_sources:.c=.o))
   1018 $(call track-src-file-obj,$(c_normal_sources),$(c_normal_objects))
   1019 
   1020 $(dotdot_arm_objects) $(c_arm_objects): PRIVATE_ARM_MODE := $(arm_objects_mode)
   1021 $(dotdot_arm_objects) $(c_arm_objects): PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
   1022 $(dotdot_objects) $(c_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
   1023 $(dotdot_objects) $(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
   1024 
   1025 c_objects        := $(c_arm_objects) $(c_normal_objects)
   1026 
   1027 ifneq ($(strip $(c_objects)),)
   1028 $(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(proto_generated_headers) \
   1029     $(my_additional_dependencies)
   1030 	$(transform-$(PRIVATE_HOST)c-to-o)
   1031 $(call include-depfiles-for-objs, $(c_objects))
   1032 endif
   1033 
   1034 c_objects += $(dotdot_arm_objects) $(dotdot_objects)
   1035 
   1036 ###########################################################
   1037 ## C: Compile generated .c files to .o.
   1038 ###########################################################
   1039 
   1040 gen_c_sources := $(filter %.c,$(my_generated_sources))
   1041 gen_c_objects := $(gen_c_sources:%.c=%.o)
   1042 $(call track-gen-file-obj,$(gen_c_sources),$(gen_c_objects))
   1043 
   1044 ifneq ($(strip $(gen_c_objects)),)
   1045 # Compile all generated files as thumb.
   1046 # TODO: support compiling certain generated files as arm.
   1047 $(gen_c_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
   1048 $(gen_c_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
   1049 $(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) \
   1050     $(my_additional_dependencies)
   1051 	$(transform-$(PRIVATE_HOST)c-to-o)
   1052 $(call include-depfiles-for-objs, $(gen_c_objects))
   1053 endif
   1054 
   1055 ###########################################################
   1056 ## ObjC: Compile .m files to .o
   1057 ###########################################################
   1058 
   1059 objc_sources := $(filter %.m,$(my_src_files))
   1060 objc_objects := $(addprefix $(intermediates)/,$(objc_sources:.m=.o))
   1061 $(call track-src-file-obj,$(objc_sources),$(objc_objects))
   1062 
   1063 ifneq ($(strip $(objc_objects)),)
   1064 $(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(proto_generated_headers) \
   1065     $(my_additional_dependencies)
   1066 	$(transform-$(PRIVATE_HOST)m-to-o)
   1067 $(call include-depfiles-for-objs, $(objc_objects))
   1068 endif
   1069 
   1070 ###########################################################
   1071 ## ObjC++: Compile .mm files to .o
   1072 ###########################################################
   1073 
   1074 objcpp_sources := $(filter %.mm,$(my_src_files))
   1075 objcpp_objects := $(addprefix $(intermediates)/,$(objcpp_sources:.mm=.o))
   1076 $(call track-src-file-obj,$(objcpp_sources),$(objcpp_objects))
   1077 
   1078 ifneq ($(strip $(objcpp_objects)),)
   1079 $(objcpp_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.mm $(yacc_cpps) $(proto_generated_headers) \
   1080     $(my_additional_dependencies)
   1081 	$(transform-$(PRIVATE_HOST)mm-to-o)
   1082 $(call include-depfiles-for-objs, $(objcpp_objects))
   1083 endif
   1084 
   1085 ###########################################################
   1086 ## AS: Compile .S files to .o.
   1087 ###########################################################
   1088 
   1089 asm_sources_S := $(filter %.S,$(my_src_files))
   1090 dotdot_sources := $(filter ../%,$(asm_sources_S))
   1091 asm_sources_S := $(filter-out ../%,$(asm_sources_S))
   1092 asm_objects_S := $(addprefix $(intermediates)/,$(asm_sources_S:.S=.o))
   1093 $(call track-src-file-obj,$(asm_sources_S),$(asm_objects_S))
   1094 
   1095 dotdot_objects_S :=
   1096 $(foreach s,$(dotdot_sources),\
   1097   $(eval $(call compile-dotdot-s-file,$(s),\
   1098     $(my_additional_dependencies),\
   1099     dotdot_objects_S)))
   1100 $(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects_S))
   1101 
   1102 ifneq ($(strip $(asm_objects_S)),)
   1103 $(asm_objects_S): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.S \
   1104     $(my_additional_dependencies)
   1105 	$(transform-$(PRIVATE_HOST)s-to-o)
   1106 $(call include-depfiles-for-objs, $(asm_objects_S))
   1107 endif
   1108 
   1109 asm_sources_s := $(filter %.s,$(my_src_files))
   1110 dotdot_sources := $(filter ../%,$(asm_sources_s))
   1111 asm_sources_s := $(filter-out ../%,$(asm_sources_s))
   1112 asm_objects_s := $(addprefix $(intermediates)/,$(asm_sources_s:.s=.o))
   1113 $(call track-src-file-obj,$(asm_sources_s),$(asm_objects_s))
   1114 
   1115 dotdot_objects_s :=
   1116 $(foreach s,$(dotdot_sources),\
   1117   $(eval $(call compile-dotdot-s-file-no-deps,$(s),\
   1118     $(my_additional_dependencies),\
   1119     dotdot_objects_s)))
   1120 $(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects_s))
   1121 
   1122 ifneq ($(strip $(asm_objects_s)),)
   1123 $(asm_objects_s): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.s \
   1124     $(my_additional_dependencies)
   1125 	$(transform-$(PRIVATE_HOST)s-to-o-no-deps)
   1126 endif
   1127 
   1128 asm_objects := $(dotdot_objects_S) $(dotdot_objects_s) $(asm_objects_S) $(asm_objects_s)
   1129 $(asm_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
   1130 
   1131 
   1132 # .asm for x86/x86_64 needs to be compiled with yasm.
   1133 asm_sources_asm := $(filter %.asm,$(my_src_files))
   1134 ifneq ($(strip $(asm_sources_asm)),)
   1135 asm_objects_asm := $(addprefix $(intermediates)/,$(asm_sources_asm:.asm=.o))
   1136 $(asm_objects_asm): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.asm \
   1137     $(my_additional_dependencies)
   1138 	$(transform-asm-to-o)
   1139 $(call track-src-file-obj,$(asm_sources_asm),$(asm_objects_asm))
   1140 
   1141 asm_objects += $(asm_objects_asm)
   1142 endif
   1143 
   1144 
   1145 ##########################################################
   1146 ## Set up installed module dependency
   1147 ## We cannot compute the full path of the LOCAL_SHARED_LIBRARIES for
   1148 ## they may cusomize their install path with LOCAL_MODULE_PATH
   1149 ##########################################################
   1150 # Get the list of INSTALLED libraries as module names.
   1151 ifdef LOCAL_SDK_VERSION
   1152   installed_shared_library_module_names := \
   1153       $(my_shared_libraries)
   1154 else
   1155   installed_shared_library_module_names := \
   1156       $(my_shared_libraries) $(my_system_shared_libraries)
   1157 endif
   1158 
   1159 # The real dependency will be added after all Android.mks are loaded and the install paths
   1160 # of the shared libraries are determined.
   1161 ifdef LOCAL_INSTALLED_MODULE
   1162 ifdef installed_shared_library_module_names
   1163 $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += \
   1164     $(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(sort $(installed_shared_library_module_names)))
   1165 endif
   1166 endif
   1167 
   1168 
   1169 ####################################################
   1170 ## Import includes
   1171 ####################################################
   1172 import_includes := $(intermediates)/import_includes
   1173 import_includes_deps := $(strip \
   1174     $(foreach l, $(installed_shared_library_module_names), \
   1175       $(call intermediates-dir-for,SHARED_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/export_includes) \
   1176     $(foreach l, $(my_static_libraries) $(my_whole_static_libraries), \
   1177       $(call intermediates-dir-for,STATIC_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/export_includes))
   1178 $(import_includes): PRIVATE_IMPORT_EXPORT_INCLUDES := $(import_includes_deps)
   1179 $(import_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(import_includes_deps)
   1180 	@echo Import includes file: $@
   1181 	$(hide) mkdir -p $(dir $@) && rm -f $@
   1182 ifdef import_includes_deps
   1183 	$(hide) for f in $(PRIVATE_IMPORT_EXPORT_INCLUDES); do \
   1184 	  cat $$f >> $@; \
   1185 	done
   1186 else
   1187 	$(hide) touch $@
   1188 endif
   1189 
   1190 ###########################################################
   1191 ## Common object handling.
   1192 ###########################################################
   1193 
   1194 my_unused_src_files := $(filter-out $(logtags_sources) $(my_tracked_src_files),$(my_src_files) $(my_gen_src_files))
   1195 ifneq ($(my_unused_src_files),)
   1196   $(warning $(LOCAL_MODULE_MAKEFILE): $(LOCAL_MODULE): Unused source files: $(my_unused_src_files))
   1197 endif
   1198 
   1199 # some rules depend on asm_objects being first.  If your code depends on
   1200 # being first, it's reasonable to require it to be assembly
   1201 normal_objects := \
   1202     $(asm_objects) \
   1203     $(cpp_objects) \
   1204     $(gen_cpp_objects) \
   1205     $(gen_asm_objects) \
   1206     $(c_objects) \
   1207     $(gen_c_objects) \
   1208     $(objc_objects) \
   1209     $(objcpp_objects) \
   1210     $(proto_generated_objects)
   1211 
   1212 new_order_normal_objects := $(foreach f,$(my_src_files),$(my_src_file_obj_$(f)))
   1213 new_order_normal_objects += $(foreach f,$(my_gen_src_files),$(my_src_file_obj_$(f)))
   1214 
   1215 ifneq ($(sort $(normal_objects)),$(sort $(new_order_normal_objects)))
   1216 $(warning $(LOCAL_MODULE_MAKEFILE) Internal build system warning: New object list does not match old)
   1217 $(info Only in old: $(filter-out $(new_order_normal_objects),$(sort $(normal_objects))))
   1218 $(info Only in new: $(filter-out $(normal_objects),$(sort $(new_order_normal_objects))))
   1219 endif
   1220 
   1221 ifeq ($(BINARY_OBJECTS_ORDER),soong)
   1222 normal_objects := $(new_order_normal_objects)
   1223 endif
   1224 
   1225 normal_objects += $(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES))
   1226 
   1227 all_objects := $(normal_objects) $(gen_o_objects)
   1228 
   1229 # Cleanup file tracking
   1230 $(foreach f,$(my_tracked_gen_files),$(eval my_src_file_gen_$(s):=))
   1231 my_tracked_gen_files :=
   1232 $(foreach f,$(my_tracked_src_files),$(eval my_src_file_obj_$(s):=))
   1233 my_tracked_src_files :=
   1234 
   1235 my_c_includes += $(TOPDIR)$(LOCAL_PATH) $(intermediates) $(generated_sources_dir)
   1236 
   1237 ifndef LOCAL_SDK_VERSION
   1238   my_c_includes += $(JNI_H_INCLUDE)
   1239 endif
   1240 
   1241 # all_objects includes gen_o_objects which were part of LOCAL_GENERATED_SOURCES;
   1242 # use normal_objects here to avoid creating circular dependencies. This assumes
   1243 # that custom build rules which generate .o files don't consume other generated
   1244 # sources as input (or if they do they take care of that dependency themselves).
   1245 $(normal_objects) : | $(my_generated_sources)
   1246 ifeq ($(BUILDING_WITH_NINJA),true)
   1247 $(all_objects) : $(import_includes)
   1248 else
   1249 $(all_objects) : | $(import_includes)
   1250 endif
   1251 ALL_C_CPP_ETC_OBJECTS += $(all_objects)
   1252 
   1253 
   1254 ###########################################################
   1255 # Standard library handling.
   1256 ###########################################################
   1257 
   1258 ###########################################################
   1259 # The list of libraries that this module will link against are in
   1260 # these variables.  Each is a list of bare module names like "libc libm".
   1261 #
   1262 # LOCAL_SHARED_LIBRARIES
   1263 # LOCAL_STATIC_LIBRARIES
   1264 # LOCAL_WHOLE_STATIC_LIBRARIES
   1265 #
   1266 # We need to convert the bare names into the dependencies that
   1267 # we'll use for LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE.
   1268 # LOCAL_BUILT_MODULE should depend on the BUILT versions of the
   1269 # libraries, so that simply building this module doesn't force
   1270 # an install of a library.  Similarly, LOCAL_INSTALLED_MODULE
   1271 # should depend on the INSTALLED versions of the libraries so
   1272 # that they get installed when this module does.
   1273 ###########################################################
   1274 # NOTE:
   1275 # WHOLE_STATIC_LIBRARIES are libraries that are pulled into the
   1276 # module without leaving anything out, which is useful for turning
   1277 # a collection of .a files into a .so file.  Linking against a
   1278 # normal STATIC_LIBRARY will only pull in code/symbols that are
   1279 # referenced by the module. (see gcc/ld's --whole-archive option)
   1280 ###########################################################
   1281 
   1282 # Get the list of BUILT libraries, which are under
   1283 # various intermediates directories.
   1284 so_suffix := $($(my_prefix)SHLIB_SUFFIX)
   1285 a_suffix := $($(my_prefix)STATIC_LIB_SUFFIX)
   1286 
   1287 ifdef LOCAL_SDK_VERSION
   1288 built_shared_libraries := \
   1289     $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
   1290       $(addsuffix $(so_suffix), \
   1291         $(my_shared_libraries)))
   1292 built_shared_library_deps := $(addsuffix .toc, $(built_shared_libraries))
   1293 
   1294 # Add the NDK libraries to the built module dependency
   1295 my_system_shared_libraries_fullpath := \
   1296     $(my_ndk_stl_shared_lib_fullpath) \
   1297     $(addprefix $(my_ndk_sysroot_lib)/, \
   1298         $(addsuffix $(so_suffix), $(my_system_shared_libraries)))
   1299 
   1300 built_shared_libraries += $(my_system_shared_libraries_fullpath)
   1301 else
   1302 built_shared_libraries := \
   1303     $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
   1304       $(addsuffix $(so_suffix), \
   1305         $(installed_shared_library_module_names)))
   1306 ifdef LOCAL_IS_HOST_MODULE
   1307 # Disable .toc optimization for host modules: we may run the host binaries during the build process
   1308 # and the libraries' implementation matters.
   1309 built_shared_library_deps := $(built_shared_libraries)
   1310 else
   1311 built_shared_library_deps := $(addsuffix .toc, $(built_shared_libraries))
   1312 endif
   1313 my_system_shared_libraries_fullpath :=
   1314 endif
   1315 
   1316 built_static_libraries := \
   1317     $(foreach lib,$(my_static_libraries), \
   1318       $(call intermediates-dir-for, \
   1319         STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/$(lib)$(a_suffix))
   1320 
   1321 ifdef LOCAL_SDK_VERSION
   1322 built_static_libraries += $(my_ndk_stl_static_lib)
   1323 endif
   1324 
   1325 built_whole_libraries := \
   1326     $(foreach lib,$(my_whole_static_libraries), \
   1327       $(call intermediates-dir-for, \
   1328         STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/$(lib)$(a_suffix))
   1329 
   1330 # We don't care about installed static libraries, since the
   1331 # libraries have already been linked into the module at that point.
   1332 # We do, however, care about the NOTICE files for any static
   1333 # libraries that we use. (see notice_files.mk)
   1334 
   1335 installed_static_library_notice_file_targets := \
   1336     $(foreach lib,$(my_static_libraries) $(my_whole_static_libraries), \
   1337       NOTICE-$(if $(LOCAL_IS_HOST_MODULE),HOST,TARGET)-STATIC_LIBRARIES-$(lib))
   1338 
   1339 # Default is -fno-rtti.
   1340 ifeq ($(strip $(LOCAL_RTTI_FLAG)),)
   1341 LOCAL_RTTI_FLAG := -fno-rtti
   1342 endif
   1343 
   1344 ###########################################################
   1345 # Rule-specific variable definitions
   1346 ###########################################################
   1347 
   1348 ifeq ($(my_clang),true)
   1349 my_cflags += $(LOCAL_CLANG_CFLAGS)
   1350 my_conlyflags += $(LOCAL_CLANG_CONLYFLAGS)
   1351 my_cppflags += $(LOCAL_CLANG_CPPFLAGS)
   1352 my_cflags_no_override += $(GLOBAL_CLANG_CFLAGS_NO_OVERRIDE)
   1353 my_cppflags_no_override += $(GLOBAL_CLANG_CPPFLAGS_NO_OVERRIDE)
   1354 my_asflags += $(LOCAL_CLANG_ASFLAGS)
   1355 my_ldflags += $(LOCAL_CLANG_LDFLAGS)
   1356 my_cflags += $(LOCAL_CLANG_CFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_CFLAGS_$(my_32_64_bit_suffix))
   1357 my_conlyflags += $(LOCAL_CLANG_CONLYFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_CONLYFLAGS_$(my_32_64_bit_suffix))
   1358 my_cppflags += $(LOCAL_CLANG_CPPFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_CPPFLAGS_$(my_32_64_bit_suffix))
   1359 my_ldflags += $(LOCAL_CLANG_LDFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_LDFLAGS_$(my_32_64_bit_suffix))
   1360 my_asflags += $(LOCAL_CLANG_ASFLAGS_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_CLANG_ASFLAGS_$(my_32_64_bit_suffix))
   1361 my_cflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(my_cflags))
   1362 my_cppflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(my_cppflags))
   1363 my_asflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(my_asflags))
   1364 my_ldflags := $(call $(LOCAL_2ND_ARCH_VAR_PREFIX)convert-to-$(my_host)clang-flags,$(my_ldflags))
   1365 endif
   1366 
   1367 ifeq ($(my_fdo_build), true)
   1368   my_cflags := $(patsubst -Os,-O2,$(my_cflags))
   1369   fdo_incompatible_flags := -fno-early-inlining -finline-limit=%
   1370   my_cflags := $(filter-out $(fdo_incompatible_flags),$(my_cflags))
   1371 endif
   1372 
   1373 # No one should ever use this flag. On GCC it's mere presence will disable all
   1374 # warnings, even those that are specified after it (contrary to typical warning
   1375 # flag behavior). This circumvents CFLAGS_NO_OVERRIDE from forcibly enabling the
   1376 # warnings that are *always* bugs.
   1377 my_illegal_flags := -w
   1378 my_cflags := $(filter-out $(my_illegal_flags),$(my_cflags))
   1379 my_cppflags := $(filter-out $(my_illegal_flags),$(my_cppflags))
   1380 my_conlyflags := $(filter-out $(my_illegal_flags),$(my_conlyflags))
   1381 
   1382 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)
   1383 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(my_asflags)
   1384 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CONLYFLAGS := $(my_conlyflags)
   1385 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS := $(my_cflags)
   1386 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS := $(my_cppflags)
   1387 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS_NO_OVERRIDE := $(my_cflags_no_override)
   1388 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS_NO_OVERRIDE := $(my_cppflags_no_override)
   1389 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)
   1390 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)
   1391 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(my_c_includes)
   1392 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_IMPORT_INCLUDES := $(import_includes)
   1393 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDFLAGS := $(my_ldflags)
   1394 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(my_ldlibs)
   1395 
   1396 # this is really the way to get the files onto the command line instead
   1397 # of using $^, because then LOCAL_ADDITIONAL_DEPENDENCIES doesn't work
   1398 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_SHARED_LIBRARIES := $(built_shared_libraries)
   1399 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_STATIC_LIBRARIES := $(built_static_libraries)
   1400 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES := $(built_whole_libraries)
   1401 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_OBJECTS := $(all_objects)
   1402 
   1403 ###########################################################
   1404 # Define library dependencies.
   1405 ###########################################################
   1406 # all_libraries is used for the dependencies on LOCAL_BUILT_MODULE.
   1407 all_libraries := \
   1408     $(built_shared_library_deps) \
   1409     $(my_system_shared_libraries_fullpath) \
   1410     $(built_static_libraries) \
   1411     $(built_whole_libraries)
   1412 
   1413 # Also depend on the notice files for any static libraries that
   1414 # are linked into this module.  This will force them to be installed
   1415 # when this module is.
   1416 $(LOCAL_INSTALLED_MODULE): | $(installed_static_library_notice_file_targets)
   1417 
   1418 ###########################################################
   1419 # Export includes
   1420 ###########################################################
   1421 export_includes := $(intermediates)/export_includes
   1422 $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(my_export_c_include_dirs)
   1423 # Make sure .pb.h are already generated before any dependent source files get compiled.
   1424 # Similarly, the generated DBus headers need to exist before we export their location.
   1425 # People are not going to consume the aidl generated cpp file, but the cpp file is
   1426 # generated after the headers, so this is a convenient way to ensure the headers exist.
   1427 $(export_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(proto_generated_headers) $(dbus_generated_headers) $(aidl_gen_cpp) $(vts_gen_cpp)
   1428 	@echo Export includes file: $< -- $@
   1429 	$(hide) mkdir -p $(dir $@) && rm -f $@.tmp
   1430 ifdef my_export_c_include_dirs
   1431 	$(hide) for d in $(PRIVATE_EXPORT_C_INCLUDE_DIRS); do \
   1432 	        echo "-I $$d" >> $@.tmp; \
   1433 	        done
   1434 else
   1435 	$(hide) touch $@.tmp
   1436 endif
   1437 ifeq ($(BUILDING_WITH_NINJA),true)
   1438 	$(hide) if cmp -s $@.tmp $@ ; then \
   1439 	  rm $@.tmp ; \
   1440 	else \
   1441 	  mv $@.tmp $@ ; \
   1442 	fi
   1443 else
   1444 	mv $@.tmp $@ ;
   1445 endif
   1446 
   1447 # Kati adds restat=1 to ninja. GNU make does nothing for this.
   1448 .KATI_RESTAT: $(export_includes)
   1449 
   1450 # Make sure export_includes gets generated when you are running mm/mmm
   1451 $(LOCAL_BUILT_MODULE) : | $(export_includes)
   1452