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