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