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